Browse Source

Capture rough update script

rsheeter 4 years ago
parent
commit
860547b234
3 changed files with 1536 additions and 0 deletions
  1. 1309 0
      update/current_versions.json
  2. 15 0
      update/requirements.txt
  3. 212 0
      update/update_repo.py

+ 1309 - 0
update/current_versions.json

@@ -0,0 +1,1309 @@
+{
+    "action::3d_rotation": 10,
+    "action::accessibility": 6,
+    "action::accessibility_new": 6,
+    "action::accessible": 6,
+    "action::accessible_forward": 6,
+    "action::account_balance": 9,
+    "action::account_balance_wallet": 6,
+    "action::account_box": 6,
+    "action::account_circle": 7,
+    "action::add_shopping_cart": 5,
+    "action::add_task": 1,
+    "action::addchart": 7,
+    "action::admin_panel_settings": 6,
+    "action::alarm": 6,
+    "action::alarm_add": 6,
+    "action::alarm_off": 6,
+    "action::alarm_on": 6,
+    "action::all_inbox": 5,
+    "action::all_out": 6,
+    "action::analytics": 6,
+    "action::anchor": 2,
+    "action::android": 6,
+    "action::announcement": 8,
+    "action::api": 2,
+    "action::app_blocking": 7,
+    "action::arrow_circle_down": 3,
+    "action::arrow_circle_up": 3,
+    "action::arrow_right_alt": 6,
+    "action::article": 6,
+    "action::aspect_ratio": 6,
+    "action::assessment": 6,
+    "action::assignment": 6,
+    "action::assignment_ind": 6,
+    "action::assignment_late": 6,
+    "action::assignment_return": 6,
+    "action::assignment_returned": 6,
+    "action::assignment_turned_in": 7,
+    "action::autorenew": 6,
+    "action::backup": 6,
+    "action::backup_table": 6,
+    "action::batch_prediction": 7,
+    "action::book": 8,
+    "action::book_online": 5,
+    "action::bookmark": 6,
+    "action::bookmark_border": 7,
+    "action::bookmarks": 6,
+    "action::bug_report": 6,
+    "action::build": 6,
+    "action::build_circle": 9,
+    "action::cached": 6,
+    "action::calendar_today": 6,
+    "action::calendar_view_day": 6,
+    "action::camera_enhance": 6,
+    "action::cancel_schedule_send": 6,
+    "action::card_giftcard": 7,
+    "action::card_membership": 7,
+    "action::card_travel": 7,
+    "action::change_history": 5,
+    "action::check_circle": 6,
+    "action::check_circle_outline": 6,
+    "action::chrome_reader_mode": 5,
+    "action::class": 6,
+    "action::close_fullscreen": 2,
+    "action::code": 5,
+    "action::comment_bank": 5,
+    "action::commute": 6,
+    "action::compare_arrows": 7,
+    "action::contact_page": 1,
+    "action::contact_support": 6,
+    "action::contactless": 5,
+    "action::copyright": 7,
+    "action::credit_card": 6,
+    "action::dashboard": 6,
+    "action::date_range": 6,
+    "action::delete": 7,
+    "action::delete_forever": 6,
+    "action::delete_outline": 6,
+    "action::description": 6,
+    "action::disabled_by_default": 1,
+    "action::dns": 6,
+    "action::done": 9,
+    "action::done_all": 6,
+    "action::done_outline": 6,
+    "action::donut_large": 7,
+    "action::donut_small": 6,
+    "action::drag_indicator": 6,
+    "action::dynamic_form": 2,
+    "action::eco": 5,
+    "action::eject": 5,
+    "action::euro_symbol": 6,
+    "action::event": 7,
+    "action::event_seat": 8,
+    "action::exit_to_app": 6,
+    "action::explore": 6,
+    "action::explore_off": 6,
+    "action::extension": 6,
+    "action::face": 6,
+    "action::fact_check": 8,
+    "action::favorite": 6,
+    "action::favorite_border": 7,
+    "action::feedback": 6,
+    "action::filter_alt": 5,
+    "action::find_in_page": 6,
+    "action::find_replace": 6,
+    "action::fingerprint": 6,
+    "action::flaky": 8,
+    "action::flight_land": 7,
+    "action::flight_takeoff": 7,
+    "action::flip_to_back": 6,
+    "action::flip_to_front": 6,
+    "action::g_translate": 5,
+    "action::gavel": 7,
+    "action::get_app": 6,
+    "action::gif": 7,
+    "action::grade": 7,
+    "action::grading": 5,
+    "action::group_work": 6,
+    "action::help": 6,
+    "action::help_center": 3,
+    "action::help_outline": 6,
+    "action::highlight_alt": 6,
+    "action::highlight_off": 7,
+    "action::history": 6,
+    "action::history_toggle_off": 4,
+    "action::home": 7,
+    "action::horizontal_split": 6,
+    "action::hourglass_disabled": 7,
+    "action::hourglass_empty": 6,
+    "action::hourglass_full": 6,
+    "action::http": 5,
+    "action::https": 7,
+    "action::important_devices": 5,
+    "action::info": 9,
+    "action::input": 6,
+    "action::integration_instructions": 5,
+    "action::invert_colors": 6,
+    "action::label": 7,
+    "action::label_important": 7,
+    "action::label_off": 6,
+    "action::language": 6,
+    "action::launch": 6,
+    "action::leaderboard": 1,
+    "action::line_style": 8,
+    "action::line_weight": 8,
+    "action::list": 6,
+    "action::lock": 6,
+    "action::lock_open": 6,
+    "action::login": 5,
+    "action::loyalty": 6,
+    "action::markunread_mailbox": 6,
+    "action::maximize": 5,
+    "action::mediation": 9,
+    "action::minimize": 5,
+    "action::model_training": 7,
+    "action::next_plan": 6,
+    "action::not_accessible": 8,
+    "action::not_started": 7,
+    "action::note_add": 6,
+    "action::offline_bolt": 6,
+    "action::offline_pin": 8,
+    "action::online_prediction": 7,
+    "action::opacity": 5,
+    "action::open_in_browser": 6,
+    "action::open_in_full": 2,
+    "action::open_in_new": 7,
+    "action::open_with": 6,
+    "action::outbond": 1,
+    "action::outlet": 2,
+    "action::pageview": 6,
+    "action::pan_tool": 8,
+    "action::payment": 6,
+    "action::pending": 7,
+    "action::pending_actions": 2,
+    "action::perm_camera_mic": 6,
+    "action::perm_contact_calendar": 7,
+    "action::perm_data_setting": 6,
+    "action::perm_device_information": 7,
+    "action::perm_identity": 6,
+    "action::perm_media": 6,
+    "action::perm_phone_msg": 6,
+    "action::perm_scan_wifi": 6,
+    "action::pets": 6,
+    "action::picture_in_picture": 6,
+    "action::picture_in_picture_alt": 6,
+    "action::plagiarism": 5,
+    "action::play_for_work": 6,
+    "action::polymer": 6,
+    "action::power_settings_new": 6,
+    "action::pregnant_woman": 8,
+    "action::preview": 2,
+    "action::print": 7,
+    "action::privacy_tip": 7,
+    "action::published_with_changes": 1,
+    "action::query_builder": 7,
+    "action::question_answer": 6,
+    "action::quickreply": 7,
+    "action::receipt": 6,
+    "action::record_voice_over": 6,
+    "action::redeem": 6,
+    "action::remove_shopping_cart": 6,
+    "action::reorder": 7,
+    "action::report_problem": 8,
+    "action::request_page": 2,
+    "action::restore": 6,
+    "action::restore_from_trash": 6,
+    "action::restore_page": 6,
+    "action::room": 6,
+    "action::rounded_corner": 8,
+    "action::rowing": 8,
+    "action::rule": 2,
+    "action::schedule": 7,
+    "action::search": 7,
+    "action::search_off": 6,
+    "action::settings": 7,
+    "action::settings_applications": 6,
+    "action::settings_backup_restore": 6,
+    "action::settings_bluetooth": 6,
+    "action::settings_brightness": 7,
+    "action::settings_cell": 6,
+    "action::settings_ethernet": 6,
+    "action::settings_input_antenna": 6,
+    "action::settings_input_component": 6,
+    "action::settings_input_composite": 6,
+    "action::settings_input_hdmi": 6,
+    "action::settings_input_svideo": 6,
+    "action::settings_overscan": 6,
+    "action::settings_phone": 6,
+    "action::settings_power": 6,
+    "action::settings_remote": 6,
+    "action::settings_voice": 6,
+    "action::shop": 6,
+    "action::shop_two": 6,
+    "action::shopping_bag": 3,
+    "action::shopping_basket": 6,
+    "action::shopping_cart": 6,
+    "action::smart_button": 2,
+    "action::source": 2,
+    "action::speaker_notes": 6,
+    "action::speaker_notes_off": 6,
+    "action::spellcheck": 6,
+    "action::star_rate": 6,
+    "action::stars": 6,
+    "action::sticky_note_2": 1,
+    "action::store": 5,
+    "action::subject": 6,
+    "action::subtitles_off": 5,
+    "action::supervised_user_circle": 6,
+    "action::supervisor_account": 6,
+    "action::support": 5,
+    "action::swap_horiz": 6,
+    "action::swap_horizontal_circle": 6,
+    "action::swap_vert": 6,
+    "action::swap_vertical_circle": 7,
+    "action::sync_alt": 5,
+    "action::system_update_alt": 7,
+    "action::tab": 6,
+    "action::tab_unselected": 6,
+    "action::table_view": 3,
+    "action::text_rotate_up": 6,
+    "action::text_rotate_vertical": 6,
+    "action::text_rotation_angledown": 6,
+    "action::text_rotation_angleup": 6,
+    "action::text_rotation_down": 6,
+    "action::text_rotation_none": 6,
+    "action::theaters": 6,
+    "action::thumb_down": 7,
+    "action::thumb_up": 7,
+    "action::thumbs_up_down": 6,
+    "action::timeline": 7,
+    "action::toc": 6,
+    "action::today": 7,
+    "action::toll": 5,
+    "action::touch_app": 7,
+    "action::tour": 6,
+    "action::track_changes": 5,
+    "action::translate": 6,
+    "action::trending_down": 6,
+    "action::trending_flat": 7,
+    "action::trending_up": 6,
+    "action::turned_in": 6,
+    "action::turned_in_not": 6,
+    "action::unpublished": 1,
+    "action::update": 7,
+    "action::upgrade": 7,
+    "action::verified": 5,
+    "action::verified_user": 6,
+    "action::vertical_split": 6,
+    "action::view_agenda": 6,
+    "action::view_array": 6,
+    "action::view_carousel": 6,
+    "action::view_column": 6,
+    "action::view_day": 6,
+    "action::view_headline": 5,
+    "action::view_list": 6,
+    "action::view_module": 6,
+    "action::view_quilt": 6,
+    "action::view_sidebar": 7,
+    "action::view_stream": 6,
+    "action::view_week": 6,
+    "action::visibility": 6,
+    "action::visibility_off": 6,
+    "action::voice_over_off": 5,
+    "action::watch_later": 8,
+    "action::wifi_protected_setup": 7,
+    "action::work": 6,
+    "action::work_off": 6,
+    "action::work_outline": 7,
+    "action::wysiwyg": 2,
+    "action::youtube_searched_for": 6,
+    "action::zoom_in": 5,
+    "action::zoom_out": 5,
+    "alert::add_alert": 5,
+    "alert::auto_delete": 5,
+    "alert::error": 8,
+    "alert::error_outline": 6,
+    "alert::notification_important": 5,
+    "alert::warning": 6,
+    "av::4k": 5,
+    "av::5g": 7,
+    "av::add_to_queue": 5,
+    "av::airplay": 7,
+    "av::album": 6,
+    "av::art_track": 7,
+    "av::av_timer": 6,
+    "av::branding_watermark": 5,
+    "av::call_to_action": 5,
+    "av::closed_caption": 6,
+    "av::closed_caption_disabled": 3,
+    "av::control_camera": 6,
+    "av::equalizer": 6,
+    "av::explicit": 6,
+    "av::fast_forward": 9,
+    "av::fast_rewind": 6,
+    "av::featured_play_list": 5,
+    "av::featured_video": 5,
+    "av::fiber_dvr": 7,
+    "av::fiber_manual_record": 7,
+    "av::fiber_new": 7,
+    "av::fiber_pin": 6,
+    "av::fiber_smart_record": 6,
+    "av::forward_10": 7,
+    "av::forward_30": 7,
+    "av::forward_5": 7,
+    "av::games": 6,
+    "av::hd": 6,
+    "av::hearing": 6,
+    "av::hearing_disabled": 8,
+    "av::high_quality": 6,
+    "av::library_add": 7,
+    "av::library_add_check": 10,
+    "av::library_books": 7,
+    "av::library_music": 7,
+    "av::loop": 6,
+    "av::mic": 7,
+    "av::mic_none": 6,
+    "av::mic_off": 8,
+    "av::missed_video_call": 6,
+    "av::movie": 6,
+    "av::music_video": 5,
+    "av::new_releases": 6,
+    "av::not_interested": 6,
+    "av::note": 5,
+    "av::pause": 6,
+    "av::pause_circle_filled": 7,
+    "av::pause_circle_outline": 6,
+    "av::play_arrow": 6,
+    "av::play_circle_filled": 7,
+    "av::play_circle_outline": 6,
+    "av::playlist_add": 6,
+    "av::playlist_add_check": 8,
+    "av::playlist_play": 5,
+    "av::queue": 6,
+    "av::queue_music": 9,
+    "av::queue_play_next": 8,
+    "av::radio": 6,
+    "av::recent_actors": 6,
+    "av::remove_from_queue": 7,
+    "av::repeat": 6,
+    "av::repeat_one": 6,
+    "av::replay": 7,
+    "av::replay_10": 8,
+    "av::replay_30": 8,
+    "av::replay_5": 8,
+    "av::shuffle": 8,
+    "av::skip_next": 6,
+    "av::skip_previous": 6,
+    "av::slow_motion_video": 5,
+    "av::snooze": 6,
+    "av::sort_by_alpha": 5,
+    "av::speed": 6,
+    "av::stop": 6,
+    "av::stop_circle": 9,
+    "av::subscriptions": 5,
+    "av::subtitles": 6,
+    "av::surround_sound": 7,
+    "av::video_call": 5,
+    "av::video_label": 5,
+    "av::video_library": 7,
+    "av::video_settings": 5,
+    "av::videocam": 6,
+    "av::videocam_off": 6,
+    "av::volume_down": 6,
+    "av::volume_mute": 6,
+    "av::volume_off": 6,
+    "av::volume_up": 6,
+    "av::web": 7,
+    "av::web_asset": 6,
+    "communication::add_ic_call": 6,
+    "communication::alternate_email": 7,
+    "communication::business": 6,
+    "communication::call": 7,
+    "communication::call_end": 6,
+    "communication::call_made": 6,
+    "communication::call_merge": 6,
+    "communication::call_missed": 6,
+    "communication::call_missed_outgoing": 8,
+    "communication::call_received": 6,
+    "communication::call_split": 6,
+    "communication::cancel_presentation": 6,
+    "communication::chat": 6,
+    "communication::chat_bubble": 7,
+    "communication::chat_bubble_outline": 7,
+    "communication::clear_all": 6,
+    "communication::comment": 6,
+    "communication::contact_mail": 7,
+    "communication::contact_phone": 7,
+    "communication::contacts": 5,
+    "communication::desktop_access_disabled": 5,
+    "communication::dialer_sip": 6,
+    "communication::dialpad": 6,
+    "communication::domain_disabled": 6,
+    "communication::domain_verification": 5,
+    "communication::duo": 6,
+    "communication::email": 6,
+    "communication::forum": 7,
+    "communication::forward_to_inbox": 3,
+    "communication::hourglass_bottom": 5,
+    "communication::hourglass_top": 5,
+    "communication::import_contacts": 8,
+    "communication::import_export": 6,
+    "communication::invert_colors_off": 5,
+    "communication::list_alt": 6,
+    "communication::live_help": 6,
+    "communication::location_off": 5,
+    "communication::location_on": 6,
+    "communication::mail_outline": 6,
+    "communication::mark_chat_read": 3,
+    "communication::mark_chat_unread": 3,
+    "communication::mark_email_read": 3,
+    "communication::mark_email_unread": 3,
+    "communication::message": 6,
+    "communication::mobile_screen_share": 5,
+    "communication::more_time": 5,
+    "communication::nat": 5,
+    "communication::no_sim": 6,
+    "communication::pause_presentation": 6,
+    "communication::person_add_disabled": 5,
+    "communication::person_search": 7,
+    "communication::phone": 6,
+    "communication::phone_disabled": 6,
+    "communication::phone_enabled": 7,
+    "communication::phonelink_erase": 6,
+    "communication::phonelink_lock": 6,
+    "communication::phonelink_ring": 6,
+    "communication::phonelink_setup": 7,
+    "communication::portable_wifi_off": 5,
+    "communication::present_to_all": 5,
+    "communication::print_disabled": 6,
+    "communication::qr_code": 7,
+    "communication::qr_code_scanner": 2,
+    "communication::read_more": 7,
+    "communication::ring_volume": 7,
+    "communication::rss_feed": 6,
+    "communication::screen_share": 5,
+    "communication::sentiment_satisfied_alt": 5,
+    "communication::speaker_phone": 6,
+    "communication::stay_current_landscape": 6,
+    "communication::stay_current_portrait": 6,
+    "communication::stay_primary_landscape": 6,
+    "communication::stay_primary_portrait": 6,
+    "communication::stop_screen_share": 6,
+    "communication::swap_calls": 6,
+    "communication::textsms": 6,
+    "communication::unsubscribe": 5,
+    "communication::voicemail": 6,
+    "communication::vpn_key": 6,
+    "communication::wifi_calling": 5,
+    "content::add": 7,
+    "content::add_box": 6,
+    "content::add_circle": 6,
+    "content::add_circle_outline": 6,
+    "content::amp_stories": 5,
+    "content::archive": 7,
+    "content::backspace": 6,
+    "content::ballot": 8,
+    "content::biotech": 5,
+    "content::block": 6,
+    "content::calculate": 5,
+    "content::clear": 6,
+    "content::content_copy": 7,
+    "content::content_cut": 7,
+    "content::content_paste": 7,
+    "content::create": 6,
+    "content::delete_sweep": 6,
+    "content::drafts": 7,
+    "content::dynamic_feed": 5,
+    "content::file_copy": 6,
+    "content::filter_list": 6,
+    "content::flag": 6,
+    "content::font_download": 5,
+    "content::forward": 7,
+    "content::gesture": 6,
+    "content::how_to_reg": 7,
+    "content::how_to_vote": 5,
+    "content::inbox": 6,
+    "content::insights": 7,
+    "content::link": 7,
+    "content::link_off": 6,
+    "content::low_priority": 6,
+    "content::mail": 7,
+    "content::markunread": 6,
+    "content::move_to_inbox": 5,
+    "content::next_week": 7,
+    "content::outlined_flag": 6,
+    "content::policy": 5,
+    "content::push_pin": 8,
+    "content::redo": 6,
+    "content::remove": 7,
+    "content::remove_circle": 8,
+    "content::remove_circle_outline": 6,
+    "content::reply": 7,
+    "content::reply_all": 7,
+    "content::report": 7,
+    "content::report_off": 6,
+    "content::save": 6,
+    "content::save_alt": 6,
+    "content::select_all": 6,
+    "content::send": 8,
+    "content::sort": 6,
+    "content::square_foot": 5,
+    "content::text_format": 6,
+    "content::unarchive": 7,
+    "content::undo": 6,
+    "content::waves": 5,
+    "content::weekend": 6,
+    "content::where_to_vote": 5,
+    "device::access_alarm": 6,
+    "device::access_alarms": 6,
+    "device::access_time": 6,
+    "device::ad_units": 7,
+    "device::add_alarm": 6,
+    "device::add_to_home_screen": 5,
+    "device::airplanemode_active": 10,
+    "device::airplanemode_inactive": 11,
+    "device::battery_alert": 6,
+    "device::battery_charging_full": 6,
+    "device::battery_full": 6,
+    "device::battery_std": 6,
+    "device::battery_unknown": 6,
+    "device::bluetooth": 5,
+    "device::bluetooth_connected": 6,
+    "device::bluetooth_disabled": 6,
+    "device::bluetooth_searching": 6,
+    "device::brightness_auto": 6,
+    "device::brightness_high": 6,
+    "device::brightness_low": 6,
+    "device::brightness_medium": 6,
+    "device::data_usage": 6,
+    "device::developer_mode": 6,
+    "device::devices": 7,
+    "device::dvr": 6,
+    "device::gps_fixed": 6,
+    "device::gps_not_fixed": 6,
+    "device::gps_off": 6,
+    "device::graphic_eq": 7,
+    "device::location_disabled": 6,
+    "device::location_searching": 6,
+    "device::mobile_friendly": 6,
+    "device::mobile_off": 6,
+    "device::nfc": 6,
+    "device::screen_lock_landscape": 6,
+    "device::screen_lock_portrait": 6,
+    "device::screen_lock_rotation": 6,
+    "device::screen_rotation": 6,
+    "device::sd_storage": 6,
+    "device::settings_system_daydream": 6,
+    "device::signal_cellular_4_bar": 6,
+    "device::signal_cellular_alt": 6,
+    "device::signal_cellular_connected_no_internet_4_bar": 6,
+    "device::signal_cellular_no_sim": 5,
+    "device::signal_cellular_null": 6,
+    "device::signal_cellular_off": 6,
+    "device::signal_wifi_4_bar": 6,
+    "device::signal_wifi_4_bar_lock": 6,
+    "device::signal_wifi_off": 6,
+    "device::storage": 6,
+    "device::usb": 6,
+    "device::wallpaper": 7,
+    "device::widgets": 7,
+    "device::wifi_lock": 6,
+    "device::wifi_tethering": 6,
+    "editor::add_comment": 5,
+    "editor::attach_file": 7,
+    "editor::attach_money": 7,
+    "editor::bar_chart": 6,
+    "editor::border_all": 6,
+    "editor::border_bottom": 6,
+    "editor::border_clear": 6,
+    "editor::border_horizontal": 6,
+    "editor::border_inner": 6,
+    "editor::border_left": 6,
+    "editor::border_outer": 6,
+    "editor::border_right": 6,
+    "editor::border_style": 6,
+    "editor::border_top": 6,
+    "editor::border_vertical": 6,
+    "editor::bubble_chart": 6,
+    "editor::drag_handle": 8,
+    "editor::format_align_center": 6,
+    "editor::format_align_justify": 6,
+    "editor::format_align_left": 6,
+    "editor::format_align_right": 6,
+    "editor::format_bold": 6,
+    "editor::format_clear": 6,
+    "editor::format_color_reset": 5,
+    "editor::format_indent_decrease": 6,
+    "editor::format_indent_increase": 6,
+    "editor::format_italic": 6,
+    "editor::format_line_spacing": 6,
+    "editor::format_list_bulleted": 5,
+    "editor::format_list_numbered": 6,
+    "editor::format_list_numbered_rtl": 6,
+    "editor::format_paint": 6,
+    "editor::format_quote": 6,
+    "editor::format_shapes": 6,
+    "editor::format_size": 6,
+    "editor::format_strikethrough": 6,
+    "editor::format_textdirection_l_to_r": 6,
+    "editor::format_textdirection_r_to_l": 6,
+    "editor::format_underlined": 7,
+    "editor::functions": 6,
+    "editor::height": 5,
+    "editor::highlight": 8,
+    "editor::horizontal_rule": 8,
+    "editor::insert_chart": 6,
+    "editor::insert_chart_outlined": 6,
+    "editor::insert_comment": 6,
+    "editor::insert_drive_file": 7,
+    "editor::insert_emoticon": 6,
+    "editor::insert_invitation": 6,
+    "editor::insert_link": 6,
+    "editor::insert_photo": 6,
+    "editor::linear_scale": 8,
+    "editor::merge_type": 6,
+    "editor::mode_comment": 6,
+    "editor::monetization_on": 6,
+    "editor::money_off": 6,
+    "editor::multiline_chart": 6,
+    "editor::notes": 5,
+    "editor::pie_chart": 5,
+    "editor::post_add": 5,
+    "editor::publish": 6,
+    "editor::scatter_plot": 6,
+    "editor::score": 6,
+    "editor::short_text": 8,
+    "editor::show_chart": 6,
+    "editor::space_bar": 5,
+    "editor::stacked_line_chart": 1,
+    "editor::strikethrough_s": 8,
+    "editor::subscript": 7,
+    "editor::superscript": 7,
+    "editor::table_chart": 6,
+    "editor::table_rows": 7,
+    "editor::text_fields": 8,
+    "editor::title": 5,
+    "editor::vertical_align_bottom": 6,
+    "editor::vertical_align_center": 6,
+    "editor::vertical_align_top": 6,
+    "editor::wrap_text": 6,
+    "file::attach_email": 5,
+    "file::attachment": 6,
+    "file::cloud": 6,
+    "file::cloud_circle": 6,
+    "file::cloud_done": 6,
+    "file::cloud_download": 6,
+    "file::cloud_off": 6,
+    "file::cloud_queue": 6,
+    "file::cloud_upload": 6,
+    "file::create_new_folder": 5,
+    "file::folder": 6,
+    "file::folder_open": 6,
+    "file::folder_shared": 6,
+    "file::request_quote": 2,
+    "file::rule_folder": 2,
+    "file::snippet_folder": 2,
+    "file::text_snippet": 2,
+    "file::topic": 2,
+    "hardware::browser_not_supported": 7,
+    "hardware::cast": 7,
+    "hardware::cast_connected": 7,
+    "hardware::cast_for_education": 8,
+    "hardware::computer": 6,
+    "hardware::desktop_mac": 6,
+    "hardware::desktop_windows": 6,
+    "hardware::developer_board": 6,
+    "hardware::device_hub": 6,
+    "hardware::device_unknown": 6,
+    "hardware::devices_other": 6,
+    "hardware::dock": 6,
+    "hardware::gamepad": 6,
+    "hardware::headset": 6,
+    "hardware::headset_mic": 6,
+    "hardware::keyboard": 7,
+    "hardware::keyboard_arrow_down": 7,
+    "hardware::keyboard_arrow_left": 7,
+    "hardware::keyboard_arrow_right": 7,
+    "hardware::keyboard_arrow_up": 7,
+    "hardware::keyboard_backspace": 6,
+    "hardware::keyboard_capslock": 6,
+    "hardware::keyboard_hide": 6,
+    "hardware::keyboard_return": 6,
+    "hardware::keyboard_tab": 6,
+    "hardware::keyboard_voice": 8,
+    "hardware::laptop": 7,
+    "hardware::laptop_chromebook": 6,
+    "hardware::laptop_mac": 6,
+    "hardware::laptop_windows": 6,
+    "hardware::memory": 6,
+    "hardware::mouse": 6,
+    "hardware::phone_android": 6,
+    "hardware::phone_iphone": 6,
+    "hardware::phonelink": 6,
+    "hardware::phonelink_off": 6,
+    "hardware::point_of_sale": 3,
+    "hardware::power_input": 5,
+    "hardware::router": 6,
+    "hardware::scanner": 6,
+    "hardware::security": 6,
+    "hardware::sim_card": 6,
+    "hardware::smartphone": 7,
+    "hardware::speaker": 7,
+    "hardware::speaker_group": 6,
+    "hardware::tablet": 6,
+    "hardware::tablet_android": 8,
+    "hardware::tablet_mac": 6,
+    "hardware::toys": 6,
+    "hardware::tv": 7,
+    "hardware::videogame_asset": 5,
+    "hardware::watch": 6,
+    "home::sensor_door": 3,
+    "home::sensor_window": 3,
+    "image::add_a_photo": 8,
+    "image::add_photo_alternate": 6,
+    "image::add_to_photos": 6,
+    "image::adjust": 6,
+    "image::assistant": 6,
+    "image::assistant_photo": 6,
+    "image::audiotrack": 6,
+    "image::bedtime": 7,
+    "image::blur_circular": 6,
+    "image::blur_linear": 6,
+    "image::blur_off": 6,
+    "image::blur_on": 6,
+    "image::brightness_1": 6,
+    "image::brightness_2": 6,
+    "image::brightness_3": 6,
+    "image::brightness_4": 6,
+    "image::brightness_5": 6,
+    "image::brightness_6": 6,
+    "image::brightness_7": 6,
+    "image::broken_image": 5,
+    "image::brush": 6,
+    "image::burst_mode": 6,
+    "image::camera": 6,
+    "image::camera_alt": 6,
+    "image::camera_front": 6,
+    "image::camera_rear": 6,
+    "image::camera_roll": 6,
+    "image::center_focus_strong": 6,
+    "image::center_focus_weak": 6,
+    "image::collections": 6,
+    "image::collections_bookmark": 6,
+    "image::color_lens": 7,
+    "image::colorize": 6,
+    "image::compare": 6,
+    "image::control_point": 6,
+    "image::control_point_duplicate": 6,
+    "image::crop": 6,
+    "image::crop_16_9": 6,
+    "image::crop_3_2": 6,
+    "image::crop_5_4": 6,
+    "image::crop_7_5": 6,
+    "image::crop_din": 6,
+    "image::crop_free": 6,
+    "image::crop_landscape": 6,
+    "image::crop_original": 6,
+    "image::crop_portrait": 6,
+    "image::crop_rotate": 6,
+    "image::crop_square": 6,
+    "image::dehaze": 6,
+    "image::details": 9,
+    "image::edit": 6,
+    "image::euro": 5,
+    "image::exposure": 6,
+    "image::exposure_neg_1": 7,
+    "image::exposure_neg_2": 7,
+    "image::exposure_plus_1": 6,
+    "image::exposure_plus_2": 6,
+    "image::exposure_zero": 6,
+    "image::filter": 6,
+    "image::filter_1": 6,
+    "image::filter_2": 6,
+    "image::filter_3": 6,
+    "image::filter_4": 6,
+    "image::filter_5": 6,
+    "image::filter_6": 6,
+    "image::filter_7": 6,
+    "image::filter_8": 6,
+    "image::filter_9": 6,
+    "image::filter_9_plus": 6,
+    "image::filter_b_and_w": 6,
+    "image::filter_center_focus": 6,
+    "image::filter_drama": 6,
+    "image::filter_frames": 6,
+    "image::filter_hdr": 7,
+    "image::filter_none": 7,
+    "image::filter_tilt_shift": 7,
+    "image::filter_vintage": 7,
+    "image::flare": 6,
+    "image::flash_auto": 6,
+    "image::flash_off": 6,
+    "image::flash_on": 6,
+    "image::flip": 6,
+    "image::flip_camera_android": 6,
+    "image::flip_camera_ios": 6,
+    "image::gradient": 6,
+    "image::grain": 6,
+    "image::grid_off": 6,
+    "image::grid_on": 6,
+    "image::hdr_off": 5,
+    "image::hdr_on": 5,
+    "image::hdr_strong": 6,
+    "image::hdr_weak": 6,
+    "image::healing": 6,
+    "image::image": 7,
+    "image::image_aspect_ratio": 6,
+    "image::image_not_supported": 8,
+    "image::image_search": 6,
+    "image::iso": 5,
+    "image::landscape": 6,
+    "image::leak_add": 6,
+    "image::leak_remove": 6,
+    "image::lens": 6,
+    "image::linked_camera": 5,
+    "image::looks": 6,
+    "image::looks_3": 6,
+    "image::looks_4": 6,
+    "image::looks_5": 6,
+    "image::looks_6": 6,
+    "image::looks_one": 6,
+    "image::looks_two": 6,
+    "image::loupe": 6,
+    "image::monochrome_photos": 5,
+    "image::motion_photos_on": 11,
+    "image::motion_photos_pause": 1,
+    "image::motion_photos_paused": 10,
+    "image::movie_creation": 6,
+    "image::movie_filter": 6,
+    "image::music_note": 6,
+    "image::music_off": 6,
+    "image::nature": 6,
+    "image::nature_people": 6,
+    "image::navigate_before": 6,
+    "image::navigate_next": 6,
+    "image::palette": 6,
+    "image::panorama": 6,
+    "image::panorama_fish_eye": 7,
+    "image::panorama_horizontal": 6,
+    "image::panorama_vertical": 7,
+    "image::panorama_wide_angle": 7,
+    "image::photo": 6,
+    "image::photo_album": 6,
+    "image::photo_camera": 6,
+    "image::photo_filter": 6,
+    "image::photo_library": 6,
+    "image::photo_size_select_actual": 6,
+    "image::photo_size_select_large": 6,
+    "image::photo_size_select_small": 6,
+    "image::picture_as_pdf": 6,
+    "image::portrait": 6,
+    "image::receipt_long": 5,
+    "image::remove_red_eye": 6,
+    "image::rotate_90_degrees_ccw": 6,
+    "image::rotate_left": 6,
+    "image::rotate_right": 6,
+    "image::shutter_speed": 5,
+    "image::slideshow": 6,
+    "image::straighten": 6,
+    "image::style": 6,
+    "image::switch_camera": 6,
+    "image::switch_video": 6,
+    "image::tag_faces": 7,
+    "image::texture": 6,
+    "image::timelapse": 6,
+    "image::timer": 6,
+    "image::timer_10": 6,
+    "image::timer_3": 6,
+    "image::timer_off": 6,
+    "image::tonality": 6,
+    "image::transform": 6,
+    "image::tune": 6,
+    "image::view_comfy": 7,
+    "image::view_compact": 6,
+    "image::vignette": 5,
+    "image::wb_auto": 6,
+    "image::wb_cloudy": 6,
+    "image::wb_incandescent": 6,
+    "image::wb_iridescent": 5,
+    "image::wb_sunny": 6,
+    "maps::360": 6,
+    "maps::add_business": 8,
+    "maps::add_location": 6,
+    "maps::add_location_alt": 6,
+    "maps::add_road": 5,
+    "maps::agriculture": 5,
+    "maps::alt_route": 3,
+    "maps::atm": 6,
+    "maps::beenhere": 6,
+    "maps::bike_scooter": 5,
+    "maps::category": 6,
+    "maps::cleaning_services": 7,
+    "maps::compass_calibration": 6,
+    "maps::departure_board": 5,
+    "maps::design_services": 7,
+    "maps::directions": 6,
+    "maps::directions_bike": 6,
+    "maps::directions_boat": 7,
+    "maps::directions_bus": 6,
+    "maps::directions_car": 6,
+    "maps::directions_railway": 7,
+    "maps::directions_run": 6,
+    "maps::directions_subway": 6,
+    "maps::directions_transit": 6,
+    "maps::directions_walk": 6,
+    "maps::edit_attributes": 6,
+    "maps::edit_location": 6,
+    "maps::edit_road": 5,
+    "maps::electric_bike": 8,
+    "maps::electric_car": 8,
+    "maps::electric_moped": 8,
+    "maps::electric_scooter": 8,
+    "maps::electrical_services": 7,
+    "maps::ev_station": 5,
+    "maps::fastfood": 6,
+    "maps::flight": 6,
+    "maps::handyman": 7,
+    "maps::home_repair_service": 7,
+    "maps::hotel": 6,
+    "maps::hvac": 7,
+    "maps::layers": 6,
+    "maps::layers_clear": 6,
+    "maps::local_activity": 7,
+    "maps::local_airport": 8,
+    "maps::local_atm": 6,
+    "maps::local_bar": 6,
+    "maps::local_cafe": 5,
+    "maps::local_car_wash": 6,
+    "maps::local_convenience_store": 6,
+    "maps::local_dining": 7,
+    "maps::local_drink": 6,
+    "maps::local_fire_department": 6,
+    "maps::local_florist": 6,
+    "maps::local_gas_station": 6,
+    "maps::local_grocery_store": 6,
+    "maps::local_hospital": 6,
+    "maps::local_hotel": 6,
+    "maps::local_laundry_service": 6,
+    "maps::local_library": 6,
+    "maps::local_mall": 6,
+    "maps::local_movies": 6,
+    "maps::local_offer": 7,
+    "maps::local_parking": 6,
+    "maps::local_pharmacy": 6,
+    "maps::local_phone": 6,
+    "maps::local_pizza": 6,
+    "maps::local_play": 6,
+    "maps::local_police": 7,
+    "maps::local_post_office": 6,
+    "maps::local_printshop": 7,
+    "maps::local_see": 6,
+    "maps::local_shipping": 6,
+    "maps::local_taxi": 6,
+    "maps::map": 6,
+    "maps::maps_ugc": 7,
+    "maps::medical_services": 7,
+    "maps::menu_book": 5,
+    "maps::miscellaneous_services": 7,
+    "maps::money": 5,
+    "maps::moped": 8,
+    "maps::multiple_stop": 2,
+    "maps::museum": 5,
+    "maps::my_location": 6,
+    "maps::navigation": 6,
+    "maps::near_me": 5,
+    "maps::near_me_disabled": 1,
+    "maps::no_meals": 2,
+    "maps::no_transfer": 2,
+    "maps::not_listed_location": 6,
+    "maps::pedal_bike": 8,
+    "maps::person_pin": 7,
+    "maps::person_pin_circle": 8,
+    "maps::pest_control": 7,
+    "maps::pest_control_rodent": 7,
+    "maps::pin_drop": 8,
+    "maps::place": 6,
+    "maps::plumbing": 7,
+    "maps::rate_review": 5,
+    "maps::restaurant": 6,
+    "maps::restaurant_menu": 6,
+    "maps::run_circle": 6,
+    "maps::satellite": 6,
+    "maps::set_meal": 1,
+    "maps::store_mall_directory": 6,
+    "maps::streetview": 6,
+    "maps::subway": 5,
+    "maps::terrain": 6,
+    "maps::traffic": 6,
+    "maps::train": 5,
+    "maps::tram": 5,
+    "maps::transfer_within_a_station": 6,
+    "maps::transit_enterexit": 6,
+    "maps::trip_origin": 6,
+    "maps::two_wheeler": 8,
+    "maps::wine_bar": 1,
+    "maps::wrong_location": 5,
+    "maps::zoom_out_map": 7,
+    "navigation::app_settings_alt": 6,
+    "navigation::apps": 6,
+    "navigation::arrow_back": 7,
+    "navigation::arrow_back_ios": 6,
+    "navigation::arrow_downward": 6,
+    "navigation::arrow_drop_down": 7,
+    "navigation::arrow_drop_down_circle": 6,
+    "navigation::arrow_drop_up": 6,
+    "navigation::arrow_forward": 6,
+    "navigation::arrow_forward_ios": 6,
+    "navigation::arrow_left": 5,
+    "navigation::arrow_right": 5,
+    "navigation::arrow_upward": 5,
+    "navigation::campaign": 6,
+    "navigation::cancel": 6,
+    "navigation::check": 6,
+    "navigation::chevron_left": 7,
+    "navigation::chevron_right": 7,
+    "navigation::close": 8,
+    "navigation::double_arrow": 5,
+    "navigation::east": 2,
+    "navigation::expand_less": 6,
+    "navigation::expand_more": 6,
+    "navigation::first_page": 5,
+    "navigation::fullscreen": 6,
+    "navigation::fullscreen_exit": 6,
+    "navigation::home_work": 6,
+    "navigation::last_page": 5,
+    "navigation::legend_toggle": 3,
+    "navigation::menu": 6,
+    "navigation::menu_open": 6,
+    "navigation::more_horiz": 7,
+    "navigation::more_vert": 7,
+    "navigation::north": 2,
+    "navigation::north_east": 2,
+    "navigation::north_west": 2,
+    "navigation::payments": 6,
+    "navigation::refresh": 7,
+    "navigation::south": 2,
+    "navigation::south_east": 2,
+    "navigation::south_west": 2,
+    "navigation::subdirectory_arrow_left": 5,
+    "navigation::subdirectory_arrow_right": 5,
+    "navigation::switch_left": 3,
+    "navigation::switch_right": 3,
+    "navigation::unfold_less": 6,
+    "navigation::unfold_more": 6,
+    "navigation::west": 2,
+    "notification::account_tree": 6,
+    "notification::adb": 6,
+    "notification::airline_seat_flat": 6,
+    "notification::airline_seat_flat_angled": 6,
+    "notification::airline_seat_individual_suite": 5,
+    "notification::airline_seat_legroom_extra": 6,
+    "notification::airline_seat_legroom_normal": 6,
+    "notification::airline_seat_legroom_reduced": 6,
+    "notification::airline_seat_recline_extra": 6,
+    "notification::airline_seat_recline_normal": 6,
+    "notification::bluetooth_audio": 6,
+    "notification::confirmation_number": 9,
+    "notification::directions_off": 7,
+    "notification::disc_full": 6,
+    "notification::drive_eta": 6,
+    "notification::enhanced_encryption": 7,
+    "notification::event_available": 8,
+    "notification::event_busy": 10,
+    "notification::event_note": 6,
+    "notification::folder_special": 5,
+    "notification::live_tv": 5,
+    "notification::mms": 6,
+    "notification::more": 6,
+    "notification::network_check": 6,
+    "notification::network_locked": 6,
+    "notification::no_encryption": 5,
+    "notification::ondemand_video": 5,
+    "notification::personal_video": 6,
+    "notification::phone_bluetooth_speaker": 6,
+    "notification::phone_callback": 6,
+    "notification::phone_forwarded": 6,
+    "notification::phone_in_talk": 6,
+    "notification::phone_locked": 6,
+    "notification::phone_missed": 6,
+    "notification::phone_paused": 7,
+    "notification::power": 6,
+    "notification::power_off": 6,
+    "notification::priority_high": 7,
+    "notification::sd_card": 6,
+    "notification::sms": 6,
+    "notification::sms_failed": 6,
+    "notification::support_agent": 7,
+    "notification::sync": 6,
+    "notification::sync_disabled": 6,
+    "notification::sync_problem": 7,
+    "notification::system_update": 6,
+    "notification::tap_and_play": 6,
+    "notification::time_to_leave": 6,
+    "notification::tv_off": 5,
+    "notification::vibration": 6,
+    "notification::voice_chat": 6,
+    "notification::vpn_lock": 6,
+    "notification::wc": 5,
+    "notification::wifi": 6,
+    "notification::wifi_off": 6,
+    "places::ac_unit": 6,
+    "places::airport_shuttle": 6,
+    "places::all_inclusive": 5,
+    "places::apartment": 5,
+    "places::baby_changing_station": 3,
+    "places::backpack": 3,
+    "places::bathtub": 5,
+    "places::beach_access": 6,
+    "places::bento": 1,
+    "places::business_center": 6,
+    "places::carpenter": 1,
+    "places::casino": 6,
+    "places::charging_station": 3,
+    "places::checkroom": 3,
+    "places::child_care": 6,
+    "places::child_friendly": 6,
+    "places::corporate_fare": 2,
+    "places::countertops": 1,
+    "places::do_not_step": 3,
+    "places::do_not_touch": 3,
+    "places::dry": 3,
+    "places::elevator": 3,
+    "places::escalator": 3,
+    "places::escalator_warning": 3,
+    "places::family_restroom": 3,
+    "places::fence": 1,
+    "places::fire_extinguisher": 2,
+    "places::fitness_center": 6,
+    "places::food_bank": 1,
+    "places::foundation": 1,
+    "places::free_breakfast": 5,
+    "places::golf_course": 5,
+    "places::grass": 2,
+    "places::hot_tub": 6,
+    "places::house": 5,
+    "places::house_siding": 1,
+    "places::kitchen": 5,
+    "places::meeting_room": 5,
+    "places::microwave": 1,
+    "places::night_shelter": 1,
+    "places::no_backpack": 1,
+    "places::no_cell": 3,
+    "places::no_drinks": 3,
+    "places::no_flash": 3,
+    "places::no_food": 3,
+    "places::no_meeting_room": 5,
+    "places::no_photography": 3,
+    "places::no_stroller": 3,
+    "places::pool": 6,
+    "places::rice_bowl": 1,
+    "places::roofing": 1,
+    "places::room_preferences": 2,
+    "places::room_service": 5,
+    "places::rv_hookup": 6,
+    "places::smoke_free": 6,
+    "places::smoking_rooms": 6,
+    "places::soap": 3,
+    "places::spa": 6,
+    "places::sports_bar": 1,
+    "places::stairs": 3,
+    "places::storefront": 5,
+    "places::stroller": 3,
+    "places::tapas": 1,
+    "places::tty": 3,
+    "places::umbrella": 3,
+    "places::wash": 3,
+    "places::water_damage": 1,
+    "places::wheelchair_pickup": 3,
+    "social::6_ft_apart": 2,
+    "social::architecture": 5,
+    "social::cake": 6,
+    "social::clean_hands": 2,
+    "social::connect_without_contact": 1,
+    "social::construction": 5,
+    "social::coronavirus": 1,
+    "social::deck": 5,
+    "social::domain": 7,
+    "social::elderly": 1,
+    "social::emoji_emotions": 5,
+    "social::emoji_events": 6,
+    "social::emoji_flags": 5,
+    "social::emoji_food_beverage": 5,
+    "social::emoji_nature": 5,
+    "social::emoji_objects": 5,
+    "social::emoji_people": 5,
+    "social::emoji_symbols": 5,
+    "social::emoji_transportation": 5,
+    "social::engineering": 5,
+    "social::facebook": 1,
+    "social::fireplace": 5,
+    "social::follow_the_signs": 1,
+    "social::group": 7,
+    "social::group_add": 7,
+    "social::groups": 1,
+    "social::history_edu": 5,
+    "social::king_bed": 5,
+    "social::location_city": 6,
+    "social::luggage": 2,
+    "social::masks": 1,
+    "social::military_tech": 5,
+    "social::mood": 6,
+    "social::mood_bad": 6,
+    "social::nights_stay": 5,
+    "social::no_luggage": 2,
+    "social::notifications": 8,
+    "social::notifications_active": 7,
+    "social::notifications_none": 6,
+    "social::notifications_off": 6,
+    "social::notifications_paused": 6,
+    "social::outdoor_grill": 5,
+    "social::pages": 5,
+    "social::party_mode": 6,
+    "social::people": 7,
+    "social::people_alt": 7,
+    "social::people_outline": 6,
+    "social::person": 7,
+    "social::person_add": 7,
+    "social::person_add_alt_1": 8,
+    "social::person_outline": 6,
+    "social::person_remove": 6,
+    "social::person_remove_alt_1": 8,
+    "social::plus_one": 6,
+    "social::poll": 6,
+    "social::psychology": 5,
+    "social::public": 6,
+    "social::public_off": 3,
+    "social::reduce_capacity": 1,
+    "social::sanitizer": 1,
+    "social::school": 6,
+    "social::science": 5,
+    "social::self_improvement": 5,
+    "social::sentiment_dissatisfied": 5,
+    "social::sentiment_satisfied": 5,
+    "social::sentiment_very_dissatisfied": 5,
+    "social::sentiment_very_satisfied": 5,
+    "social::share": 6,
+    "social::sick": 1,
+    "social::single_bed": 5,
+    "social::sports": 5,
+    "social::sports_baseball": 5,
+    "social::sports_basketball": 5,
+    "social::sports_cricket": 5,
+    "social::sports_esports": 5,
+    "social::sports_football": 5,
+    "social::sports_golf": 5,
+    "social::sports_handball": 5,
+    "social::sports_hockey": 5,
+    "social::sports_kabaddi": 5,
+    "social::sports_mma": 5,
+    "social::sports_motorsports": 5,
+    "social::sports_rugby": 5,
+    "social::sports_soccer": 5,
+    "social::sports_tennis": 5,
+    "social::sports_volleyball": 5,
+    "social::thumb_down_alt": 5,
+    "social::thumb_up_alt": 5,
+    "social::whatshot": 6,
+    "toggle::check_box": 7,
+    "toggle::check_box_outline_blank": 7,
+    "toggle::indeterminate_check_box": 9,
+    "toggle::radio_button_checked": 7,
+    "toggle::radio_button_unchecked": 7,
+    "toggle::star": 8,
+    "toggle::star_border": 8,
+    "toggle::star_half": 9,
+    "toggle::star_outline": 5,
+    "toggle::toggle_off": 6,
+    "toggle::toggle_on": 6
+}

+ 15 - 0
update/requirements.txt

@@ -0,0 +1,15 @@
+absl-py==0.9.0
+appdirs==1.4.4
+attrs==19.3.0
+black==19.10b0
+certifi==2020.6.20
+chardet==3.0.4
+click==7.1.2
+idna==2.10
+pathspec==0.8.0
+regex==2020.7.14
+requests==2.24.0
+six==1.15.0
+toml==0.10.1
+typed-ast==1.4.1
+urllib3==1.25.10

+ 212 - 0
update/update_repo.py

@@ -0,0 +1,212 @@
+# Copyright 2020 Google LLC
+#
+# 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
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Quick and dirty utility to download latest icon assets for github."""
+
+from absl import app
+from absl import flags
+import json
+from pathlib import Path
+import requests
+import time
+from typing import NamedTuple, Sequence, Tuple
+from zipfile import ZipFile
+
+
+FLAGS = flags.FLAGS
+
+
+flags.DEFINE_bool(
+    "skip_existing",
+    False,
+    "Do not download if local file exists, even if an update is available.",
+)
+flags.DEFINE_bool("fetch", True, "Whether we can attempt to download assets.")
+flags.DEFINE_bool("explode_zips", True, "Whether to unzip any zip assets.")
+flags.DEFINE_integer("icon_limit", 0, "If > 0, the max # of icons to process.")
+
+
+_METADATA_URL = "http://fonts.google.com/metadata/icons"
+
+
+class Asset(NamedTuple):
+    src_url_pattern: str
+    dest_dir_pattern: str
+
+
+class Fetch(NamedTuple):
+    src_url: str
+    dest_file: Path
+
+
+class Icon(NamedTuple):
+    name: str
+    category: str
+    version: int
+    sizes_px: Tuple[int, ...]
+
+
+_ASSETS = (
+    Asset(
+        "https://{host}/s/i/{stylistic_set}/{icon.name}/v{icon.version}/{size_px}px.svg",
+        "src/{icon.category}/{icon.name}/{stylistic_set}/{size_px}px.svg",
+    ),
+    Asset(
+        "https://{host}/s/i/{stylistic_set}/{icon.name}/v{icon.version}/black-android.zip",
+        "android/{icon.category}/{icon.name}/{stylistic_set}/black.zip",
+    ),
+)
+
+
+def _latest_metadata():
+    resp = requests.get(_METADATA_URL)
+    resp.raise_for_status()
+    raw_json = resp.text[5:]
+    return json.loads(raw_json)
+
+
+def _current_versions():
+    return Path("current_versions.json")
+
+
+def _version_key(icon: Icon):
+    return f"{icon.category}::{icon.name}"
+
+
+def _icons(metadata):
+    for raw_icon in metadata["icons"]:
+        yield Icon(
+            raw_icon["name"],
+            raw_icon["categories"][0],
+            raw_icon["version"],
+            tuple(raw_icon["sizes_px"]),
+        )
+
+
+def _create_fetch(asset, args):
+    src_url = asset.src_url_pattern.format(**args)
+    dest_file = asset.dest_dir_pattern.format(**args)
+    dest_file = (Path(__file__) / "../.." / dest_file).resolve()
+    return Fetch(src_url, dest_file)
+
+
+def _do_fetch(fetch):
+    resp = requests.get(fetch.src_url)
+    resp.raise_for_status()
+    fetch.dest_file.parent.mkdir(parents=True, exist_ok=True)
+    fetch.dest_file.write_bytes(resp.content)
+
+
+def _do_fetches(fetches):
+    print(f"Starting {len(fetches)} fetches")
+    start_t = time.monotonic()
+    print_t = start_t
+    for idx, fetch in enumerate(fetches):
+        _do_fetch(fetch)
+        t = time.monotonic()
+        if t - print_t > 5:
+            print_t = t
+            est_complete = (t - start_t) * (len(fetches) / (idx + 1))
+            print(f"{idx}/{len(fetches)}, estimating {int(est_complete)}s left")
+
+
+def _unzip_target(zip_path: Path):
+    return zip_path.parent.resolve() / zip_path.stem
+
+
+def _explode_zips(zips: Sequence[Path]):
+    for zip_path in zips:
+        assert zip_path.suffix == ".zip", zip_path
+        if not zip_path.is_file():
+            continue
+
+        unzip_target = _unzip_target(zip_path)
+        print(f"Unzip {zip_path} => {unzip_target}")
+        with ZipFile(zip_path) as zip_file:
+            zip_file.extractall(unzip_target)
+        zip_path.unlink()
+
+
+def _is_zip(p: Path):
+    return p.suffix == ".zip"
+
+
+def _zips(fetches: Sequence[Fetch]):
+    return [f.dest_file for f in fetches if _is_zip(f.dest_file)]
+
+
+def _should_skip(fetch: Fetch):
+    if not FLAGS.skip_existing:
+        return False
+    if _is_zip(fetch.dest_file):
+        return _unzip_target(fetch.dest_file).is_dir()
+
+    return fetch.dest_file.is_file()
+
+
+def main(_):
+    metadata = _latest_metadata()
+    current_versions = json.loads(_current_versions().read_text())
+
+    host = metadata["host"]
+    stylistic_sets = tuple(s.replace(" ", "").lower() for s in metadata["families"])
+
+    fetches = []
+    skips = []
+    num_changed = 0
+    icons = tuple(_icons(metadata))
+    if FLAGS.icon_limit > 0:
+        icons = icons[: FLAGS.icon_limit]
+
+    for icon in icons:
+        ver_key = _version_key(icon)
+        if icon.version <= current_versions.get(ver_key, 0):
+            continue
+        current_versions[ver_key] = icon.version
+
+        num_changed += 1
+        for size_px in icon.sizes_px:
+            for stylistic_set in stylistic_sets:
+                pattern_args = {
+                    "host": host,
+                    "stylistic_set": stylistic_set,
+                    "icon": icon,
+                    "size_px": size_px,
+                }
+                for asset in _ASSETS:
+                    fetch = _create_fetch(asset, pattern_args)
+                    if _should_skip(fetch):
+                        skips.append(fetch)
+                    else:
+                        fetches.append(fetch)
+
+    print(f"{num_changed}/{len(icons)} have changed")
+    if skips:
+        print(f"{len(skips)} fetches skipped because assets exist")
+
+    if fetches:
+        if FLAGS.fetch:
+            _do_fetches(fetches)
+        else:
+            print(f"fetch disabled; not fetching {len(fetches)} assets")
+
+    if FLAGS.explode_zips:
+        _explode_zips([f.dest_file for f in fetches + skips if _is_zip(f.dest_file)])
+
+    with open(_current_versions(), "w") as f:
+        json.dump(current_versions, f, indent=4, sort_keys=True)
+
+
+if __name__ == "__main__":
+    app.run(main)