summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/activity_expiration_test.exs27
-rw-r--r--test/activity_expiration_worker_test.exs17
-rw-r--r--test/activity_test.exs78
-rw-r--r--test/bbs/handler_test.exs12
-rw-r--r--test/bookmark_test.exs4
-rw-r--r--test/config/transfer_task_test.exs51
-rw-r--r--test/conversation/participation_test.exs79
-rw-r--r--test/conversation_test.exs4
-rw-r--r--test/emails/admin_email_test.exs49
-rw-r--r--test/emails/mailer_test.exs53
-rw-r--r--test/emails/user_email_test.exs48
-rw-r--r--test/emoji_test.exs4
-rw-r--r--test/fixtures/host-meta-zetsubou.xn--q9jyb4c.xml5
-rw-r--r--test/fixtures/httpoison_mock/admin@mastdon.example.org.json1
-rw-r--r--test/fixtures/lain.xml12
-rw-r--r--test/fixtures/mastodon-delete-user.json24
-rw-r--r--test/fixtures/mastodon-question-activity.json99
-rw-r--r--test/fixtures/mastodon-update.json36
-rw-r--r--test/fixtures/mastodon-vote.json16
-rw-r--r--test/fixtures/nypd-facial-recognition-children-teenagers.html227
-rw-r--r--test/fixtures/nypd-facial-recognition-children-teenagers2.html226
-rw-r--r--test/fixtures/nypd-facial-recognition-children-teenagers3.html227
-rw-r--r--test/fixtures/rich_media/amz.html5
-rw-r--r--test/fixtures/rich_media/non_ogp_embed.html1479
-rw-r--r--test/fixtures/rich_media/ogp-missing-title.html12
-rw-r--r--test/fixtures/tesla_mock/7369654.atom (renamed from test/fixtures/httpoison_mock/7369654.atom)0
-rw-r--r--test/fixtures/tesla_mock/7369654.html (renamed from test/fixtures/httpoison_mock/7369654.html)0
-rw-r--r--test/fixtures/tesla_mock/7even.json (renamed from test/fixtures/httpoison_mock/7even.json)0
-rw-r--r--test/fixtures/tesla_mock/admin@mastdon.example.org.json54
-rw-r--r--test/fixtures/tesla_mock/atarifrosch_feed.xml (renamed from test/fixtures/httpoison_mock/atarifrosch_feed.xml)0
-rw-r--r--test/fixtures/tesla_mock/atarifrosch_webfinger.xml (renamed from test/fixtures/httpoison_mock/atarifrosch_webfinger.xml)0
-rw-r--r--test/fixtures/tesla_mock/baptiste.gelex.xyz-article.json (renamed from test/fixtures/httpoison_mock/baptiste.gelex.xyz-article.json)0
-rw-r--r--test/fixtures/tesla_mock/baptiste.gelex.xyz-user.json (renamed from test/fixtures/httpoison_mock/baptiste.gelex.xyz-user.json)0
-rw-r--r--test/fixtures/tesla_mock/eal_sakamoto.xml (renamed from test/fixtures/httpoison_mock/eal_sakamoto.xml)0
-rw-r--r--test/fixtures/tesla_mock/emelie.atom (renamed from test/fixtures/httpoison_mock/emelie.atom)0
-rw-r--r--test/fixtures/tesla_mock/emelie.json1
-rw-r--r--test/fixtures/tesla_mock/framasoft@framatube.org.json (renamed from test/fixtures/httpoison_mock/framasoft@framatube.org.json)0
-rw-r--r--test/fixtures/tesla_mock/framatube.org_host_meta (renamed from test/fixtures/httpoison_mock/framatube.org_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/gerzilla.de_host_meta (renamed from test/fixtures/httpoison_mock/gerzilla.de_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/gnusocial.de_host_meta (renamed from test/fixtures/httpoison_mock/gnusocial.de_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/gs.example.org_host_meta (renamed from test/fixtures/httpoison_mock/gs.example.org_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/hellpie.json (renamed from test/fixtures/httpoison_mock/hellpie.json)0
-rw-r--r--test/fixtures/tesla_mock/http___gs.example.org_4040_index.php_user_1.xml (renamed from test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml)0
-rw-r--r--test/fixtures/tesla_mock/http___mastodon.example.org_users_admin_status_1234.json (renamed from test/fixtures/httpoison_mock/http___mastodon.example.org_users_admin_status_1234.json)0
-rw-r--r--test/fixtures/tesla_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml (renamed from test/fixtures/httpoison_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___info.pleroma.site_actor.json (renamed from test/fixtures/httpoison_mock/https___info.pleroma.site_actor.json)0
-rw-r--r--test/fixtures/tesla_mock/https___mamot.fr_users_Skruyb.atom (renamed from test/fixtures/httpoison_mock/https___mamot.fr_users_Skruyb.atom)0
-rw-r--r--test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.atom (renamed from test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.atom)0
-rw-r--r--test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.xml (renamed from test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___osada.macgirvin.com_channel_mike.json (renamed from test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json)0
-rw-r--r--test/fixtures/tesla_mock/https___pawoo.net_users_aqidaqidaqid.xml (renamed from test/fixtures/httpoison_mock/https___pawoo.net_users_aqidaqidaqid.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.atom (renamed from test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.atom)0
-rw-r--r--test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.xml (renamed from test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain.xml (renamed from test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml (renamed from test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___prismo.news__mxb.json (renamed from test/fixtures/httpoison_mock/https___prismo.news__mxb.json)0
-rw-r--r--test/fixtures/tesla_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml (renamed from test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml (renamed from test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.html (renamed from test/fixtures/httpoison_mock/https___shitposter.club_notice_2827873.html)0
-rw-r--r--test/fixtures/tesla_mock/https___shitposter.club_user_1.xml (renamed from test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml (renamed from test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml (renamed from test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___social.heldscal.la_user_23211.xml (renamed from test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml)0
-rw-r--r--test/fixtures/tesla_mock/https___social.heldscal.la_user_29191.xml (renamed from test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml)0
-rw-r--r--test/fixtures/tesla_mock/https__info.pleroma.site_activity.json (renamed from test/fixtures/httpoison_mock/https__info.pleroma.site_activity.json)0
-rw-r--r--test/fixtures/tesla_mock/https__info.pleroma.site_activity2.json (renamed from test/fixtures/httpoison_mock/https__info.pleroma.site_activity2.json)0
-rw-r--r--test/fixtures/tesla_mock/https__info.pleroma.site_activity3.json (renamed from test/fixtures/httpoison_mock/https__info.pleroma.site_activity3.json)0
-rw-r--r--test/fixtures/tesla_mock/https__info.pleroma.site_activity4.json (renamed from test/fixtures/httpoison_mock/https__info.pleroma.site_activity4.json)0
-rw-r--r--test/fixtures/tesla_mock/kaniini@gerzilla.de.json (renamed from test/fixtures/httpoison_mock/kaniini@gerzilla.de.json)0
-rw-r--r--test/fixtures/tesla_mock/kaniini@hubzilla.example.org.json (renamed from test/fixtures/httpoison_mock/kaniini@hubzilla.example.org.json)0
-rw-r--r--test/fixtures/tesla_mock/kpherox@mstdn.jp.xml10
-rw-r--r--test/fixtures/tesla_mock/lain_squeet.me_webfinger.xml (renamed from test/fixtures/httpoison_mock/lain_squeet.me_webfinger.xml)0
-rw-r--r--test/fixtures/tesla_mock/lucifermysticus.json (renamed from test/fixtures/httpoison_mock/lucifermysticus.json)0
-rw-r--r--test/fixtures/tesla_mock/macgirvin.com_host_meta (renamed from test/fixtures/httpoison_mock/macgirvin.com_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/mamot.fr_host_meta (renamed from test/fixtures/httpoison_mock/mamot.fr_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/mastodon.social_host_meta (renamed from test/fixtures/httpoison_mock/mastodon.social_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/mastodon.xyz_host_meta (renamed from test/fixtures/httpoison_mock/mastodon.xyz_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/mayumayu.json (renamed from test/fixtures/httpoison_mock/mayumayu.json)0
-rw-r--r--test/fixtures/tesla_mock/mayumayupost.json (renamed from test/fixtures/httpoison_mock/mayumayupost.json)0
-rw-r--r--test/fixtures/tesla_mock/mike@osada.macgirvin.com.json (renamed from test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json)0
-rw-r--r--test/fixtures/tesla_mock/nonexistant@social.heldscal.la.xml (renamed from test/fixtures/httpoison_mock/nonexistant@social.heldscal.la.xml)0
-rw-r--r--test/fixtures/tesla_mock/pawoo.net_host_meta (renamed from test/fixtures/httpoison_mock/pawoo.net_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/peertube.moe-vid.json (renamed from test/fixtures/httpoison_mock/peertube.moe-vid.json)0
-rw-r--r--test/fixtures/tesla_mock/pleroma.soykaf.com_host_meta (renamed from test/fixtures/httpoison_mock/pleroma.soykaf.com_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/puckipedia.com.json (renamed from test/fixtures/httpoison_mock/puckipedia.com.json)0
-rw-r--r--test/fixtures/tesla_mock/rinpatch.json64
-rw-r--r--test/fixtures/tesla_mock/rye.json (renamed from test/fixtures/httpoison_mock/rye.json)0
-rw-r--r--test/fixtures/tesla_mock/sakamoto.atom (renamed from test/fixtures/httpoison_mock/sakamoto.atom)0
-rw-r--r--test/fixtures/tesla_mock/sakamoto_eal_feed.atom (renamed from test/fixtures/httpoison_mock/sakamoto_eal_feed.atom)0
-rw-r--r--test/fixtures/tesla_mock/shitposter.club_host_meta (renamed from test/fixtures/httpoison_mock/shitposter.club_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/shp@pleroma.soykaf.com.feed (renamed from test/fixtures/httpoison_mock/shp@pleroma.soykaf.com.feed)0
-rw-r--r--test/fixtures/tesla_mock/shp@pleroma.soykaf.com.webfigner (renamed from test/fixtures/httpoison_mock/shp@pleroma.soykaf.com.webfigner)0
-rw-r--r--test/fixtures/tesla_mock/shp@social.heldscal.la.xml (renamed from test/fixtures/httpoison_mock/shp@social.heldscal.la.xml)0
-rw-r--r--test/fixtures/tesla_mock/skruyb@mamot.fr.atom (renamed from test/fixtures/httpoison_mock/skruyb@mamot.fr.atom)0
-rw-r--r--test/fixtures/tesla_mock/social.heldscal.la_host_meta (renamed from test/fixtures/httpoison_mock/social.heldscal.la_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/social.sakamoto.gq_host_meta (renamed from test/fixtures/httpoison_mock/social.sakamoto.gq_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/social.stopwatchingus-heidelberg.de_host_meta (renamed from test/fixtures/httpoison_mock/social.stopwatchingus-heidelberg.de_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/social.wxcafe.net_host_meta (renamed from test/fixtures/httpoison_mock/social.wxcafe.net_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/spc_5381.atom (renamed from test/fixtures/httpoison_mock/spc_5381.atom)0
-rw-r--r--test/fixtures/tesla_mock/spc_5381_xrd.xml (renamed from test/fixtures/httpoison_mock/spc_5381_xrd.xml)0
-rw-r--r--test/fixtures/tesla_mock/squeet.me_host_meta (renamed from test/fixtures/httpoison_mock/squeet.me_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/status.alpicola.com_host_meta (renamed from test/fixtures/httpoison_mock/status.alpicola.com_host_meta)0
-rw-r--r--test/fixtures/tesla_mock/status.emelie.json (renamed from test/fixtures/httpoison_mock/status.emelie.json)0
-rw-r--r--test/fixtures/tesla_mock/webfinger_emelie.json (renamed from test/fixtures/httpoison_mock/webfinger_emelie.json)0
-rw-r--r--test/fixtures/tesla_mock/wedistribute-article.json18
-rw-r--r--test/fixtures/tesla_mock/wedistribute-user.json31
-rw-r--r--test/fixtures/tesla_mock/winterdienst_webfinger.json (renamed from test/fixtures/httpoison_mock/winterdienst_webfinger.json)0
-rw-r--r--test/fixtures/users_mock/masto_closed_followers.json7
-rw-r--r--test/fixtures/users_mock/masto_closed_followers_page.json1
-rw-r--r--test/fixtures/users_mock/masto_closed_following.json7
-rw-r--r--test/fixtures/users_mock/masto_closed_following_page.json1
-rw-r--r--test/fixtures/users_mock/pleroma_followers.json20
-rw-r--r--test/fixtures/users_mock/pleroma_following.json20
-rw-r--r--test/flake_id_test.exs5
-rw-r--r--test/healthcheck_test.exs4
-rw-r--r--test/html_test.exs69
-rw-r--r--test/http/request_builder_test.exs93
-rw-r--r--test/integration/mastodon_websocket_test.exs17
-rw-r--r--test/keys_test.exs4
-rw-r--r--test/list_test.exs26
-rw-r--r--test/notification_test.exs329
-rw-r--r--test/object/containment_test.exs45
-rw-r--r--test/object/fetcher_test.exs93
-rw-r--r--test/plugs/authentication_plug_test.exs29
-rw-r--r--test/plugs/ensure_public_or_authenticated_plug_test.exs17
-rw-r--r--test/plugs/http_security_plug_test.exs17
-rw-r--r--test/plugs/http_signature_plug_test.exs18
-rw-r--r--test/plugs/idempotency_plug_test.exs110
-rw-r--r--test/plugs/instance_static_test.exs10
-rw-r--r--test/plugs/legacy_authentication_plug_test.exs36
-rw-r--r--test/plugs/mapped_identity_to_signature_plug_test.exs59
-rw-r--r--test/plugs/rate_limit_plug_test.exs50
-rw-r--r--test/plugs/rate_limiter_test.exs174
-rw-r--r--test/plugs/set_format_plug_test.exs38
-rw-r--r--test/plugs/set_locale_plug_test.exs46
-rw-r--r--test/repo_test.exs4
-rw-r--r--test/reverse_proxy_test.exs300
-rw-r--r--test/signature_test.exs117
-rw-r--r--test/support/builders/user_builder.ex3
-rw-r--r--test/support/data_case.ex17
-rw-r--r--test/support/factory.ex71
-rw-r--r--test/support/helpers.ex59
-rw-r--r--test/support/http_request_mock.ex381
-rw-r--r--test/support/mrf_module_mock.ex13
-rw-r--r--test/tasks/config_test.exs66
-rw-r--r--test/tasks/database_test.exs83
-rw-r--r--test/tasks/digest_test.exs51
-rw-r--r--test/tasks/ecto/ecto_test.exs15
-rw-r--r--test/tasks/ecto/migrate_test.exs20
-rw-r--r--test/tasks/ecto/rollback_test.exs20
-rw-r--r--test/tasks/instance_test.exs (renamed from test/tasks/instance.exs)22
-rw-r--r--test/tasks/pleroma_test.exs50
-rw-r--r--test/tasks/relay_test.exs23
-rw-r--r--test/tasks/robots_txt_test.exs45
-rw-r--r--test/tasks/user_test.exs108
-rw-r--r--test/test_helper.exs5
-rw-r--r--test/upload/filter/anonymize_filename_test.exs40
-rw-r--r--test/upload/filter/dedupe_test.exs31
-rw-r--r--test/upload/filter/mogrifun_test.exs44
-rw-r--r--test/upload/filter/mogrify_test.exs45
-rw-r--r--test/upload/filter_test.exs33
-rw-r--r--test/upload_test.exs133
-rw-r--r--test/uploaders/local_test.exs32
-rw-r--r--test/uploaders/mdii_test.exs50
-rw-r--r--test/uploaders/s3_test.exs82
-rw-r--r--test/user_info_test.exs24
-rw-r--r--test/user_invite_token_test.exs4
-rw-r--r--test/user_search_test.exs311
-rw-r--r--test/user_test.exs664
-rw-r--r--test/web/activity_pub/activity_pub_controller_test.exs230
-rw-r--r--test/web/activity_pub/activity_pub_test.exs249
-rw-r--r--test/web/activity_pub/mrf/anti_link_spam_policy_test.exs145
-rw-r--r--test/web/activity_pub/mrf/ensure_re_prepended_test.exs82
-rw-r--r--test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs45
-rw-r--r--test/web/activity_pub/mrf/mention_policy_test.exs92
-rw-r--r--test/web/activity_pub/mrf/mrf_test.exs86
-rw-r--r--test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs37
-rw-r--r--test/web/activity_pub/mrf/normalize_markup_test.exs42
-rw-r--r--test/web/activity_pub/mrf/reject_non_public_test.exs100
-rw-r--r--test/web/activity_pub/mrf/simple_policy_test.exs101
-rw-r--r--test/web/activity_pub/mrf/subchain_policy_test.exs32
-rw-r--r--test/web/activity_pub/mrf/tag_policy_test.exs123
-rw-r--r--test/web/activity_pub/mrf/user_allowlist_policy_test.exs31
-rw-r--r--test/web/activity_pub/mrf/vocabulary_policy_test.exs106
-rw-r--r--test/web/activity_pub/publisher_test.exs266
-rw-r--r--test/web/activity_pub/relay_test.exs62
-rw-r--r--test/web/activity_pub/transmogrifier/follow_handling_test.exs143
-rw-r--r--test/web/activity_pub/transmogrifier_test.exs368
-rw-r--r--test/web/activity_pub/utils_test.exs95
-rw-r--r--test/web/activity_pub/views/object_view_test.exs14
-rw-r--r--test/web/activity_pub/views/user_view_test.exs44
-rw-r--r--test/web/activity_pub/visibilty_test.exs121
-rw-r--r--test/web/admin_api/admin_api_controller_test.exs831
-rw-r--r--test/web/admin_api/config_test.exs473
-rw-r--r--test/web/admin_api/views/report_view_test.exs130
-rw-r--r--test/web/common_api/common_api_test.exs202
-rw-r--r--test/web/common_api/common_api_utils_test.exs389
-rw-r--r--test/web/digest_email_worker_test.exs31
-rw-r--r--test/web/fallback_test.exs4
-rw-r--r--test/web/federator_test.exs35
-rw-r--r--test/web/instances/instance_test.exs10
-rw-r--r--test/web/instances/instances_test.exs10
-rw-r--r--test/web/mastodon_api/account_view_test.exs205
-rw-r--r--test/web/mastodon_api/conversation_view_test.exs34
-rw-r--r--test/web/mastodon_api/mastodon_api_controller/update_credentials_test.exs369
-rw-r--r--test/web/mastodon_api/mastodon_api_controller_test.exs1742
-rw-r--r--test/web/mastodon_api/mastodon_api_test.exs103
-rw-r--r--test/web/mastodon_api/search_controller_test.exs285
-rw-r--r--test/web/mastodon_api/status_view_test.exs266
-rw-r--r--test/web/media_proxy/media_proxy_controller_test.exs73
-rw-r--r--test/web/media_proxy/media_proxy_test.exs (renamed from test/media_proxy_test.exs)118
-rw-r--r--test/web/metadata/player_view_test.exs33
-rw-r--r--test/web/metadata/rel_me_test.exs4
-rw-r--r--test/web/metadata/twitter_card_test.exs123
-rw-r--r--test/web/node_info_test.exs51
-rw-r--r--test/web/oauth/ldap_authorization_test.exs17
-rw-r--r--test/web/oauth/oauth_controller_test.exs291
-rw-r--r--test/web/ostatus/activity_representer_test.exs19
-rw-r--r--test/web/ostatus/incoming_documents/delete_handling_test.exs13
-rw-r--r--test/web/ostatus/ostatus_controller_test.exs646
-rw-r--r--test/web/ostatus/ostatus_test.exs130
-rw-r--r--test/web/pleroma_api/pleroma_api_controller_test.exs94
-rw-r--r--test/web/plugs/federating_plug_test.exs5
-rw-r--r--test/web/push/impl_test.exs6
-rw-r--r--test/web/rel_me_test.exs4
-rw-r--r--test/web/rich_media/aws_signed_url_test.exs82
-rw-r--r--test/web/rich_media/helpers_test.exs51
-rw-r--r--test/web/rich_media/parser_test.exs45
-rw-r--r--test/web/rich_media/parsers/twitter_card_test.exs69
-rw-r--r--test/web/streamer_test.exs299
-rw-r--r--test/web/twitter_api/password_controller_test.exs60
-rw-r--r--test/web/twitter_api/twitter_api_controller_test.exs127
-rw-r--r--test/web/twitter_api/twitter_api_test.exs18
-rw-r--r--test/web/twitter_api/util_controller_test.exs469
-rw-r--r--test/web/twitter_api/views/activity_view_test.exs6
-rw-r--r--test/web/twitter_api/views/user_view_test.exs14
-rw-r--r--test/web/uploader_controller_test.exs43
-rw-r--r--test/web/web_finger/web_finger_controller_test.exs47
-rw-r--r--test/web/web_finger/web_finger_test.exs30
-rw-r--r--test/web/websub/websub_controller_test.exs4
240 files changed, 16202 insertions, 1806 deletions
diff --git a/test/activity_expiration_test.exs b/test/activity_expiration_test.exs
new file mode 100644
index 000000000..4948fae16
--- /dev/null
+++ b/test/activity_expiration_test.exs
@@ -0,0 +1,27 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.ActivityExpirationTest do
+ use Pleroma.DataCase
+ alias Pleroma.ActivityExpiration
+ import Pleroma.Factory
+
+ test "finds activities due to be deleted only" do
+ activity = insert(:note_activity)
+ expiration_due = insert(:expiration_in_the_past, %{activity_id: activity.id})
+ activity2 = insert(:note_activity)
+ insert(:expiration_in_the_future, %{activity_id: activity2.id})
+
+ expirations = ActivityExpiration.due_expirations()
+
+ assert length(expirations) == 1
+ assert hd(expirations) == expiration_due
+ end
+
+ test "denies expirations that don't live long enough" do
+ activity = insert(:note_activity)
+ now = NaiveDateTime.utc_now()
+ assert {:error, _} = ActivityExpiration.create(activity, now)
+ end
+end
diff --git a/test/activity_expiration_worker_test.exs b/test/activity_expiration_worker_test.exs
new file mode 100644
index 000000000..939d912f1
--- /dev/null
+++ b/test/activity_expiration_worker_test.exs
@@ -0,0 +1,17 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.ActivityExpirationWorkerTest do
+ use Pleroma.DataCase
+ alias Pleroma.Activity
+ import Pleroma.Factory
+
+ test "deletes an activity" do
+ activity = insert(:note_activity)
+ expiration = insert(:expiration_in_the_past, %{activity_id: activity.id})
+ Pleroma.ActivityExpirationWorker.perform(:execute, expiration.id)
+
+ refute Repo.get(Activity, activity.id)
+ end
+end
diff --git a/test/activity_test.exs b/test/activity_test.exs
index 15c95502a..785c4b3cf 100644
--- a/test/activity_test.exs
+++ b/test/activity_test.exs
@@ -6,6 +6,7 @@ defmodule Pleroma.ActivityTest do
use Pleroma.DataCase
alias Pleroma.Activity
alias Pleroma.Bookmark
+ alias Pleroma.Object
alias Pleroma.ThreadMute
import Pleroma.Factory
@@ -18,15 +19,18 @@ defmodule Pleroma.ActivityTest do
test "returns activities by it's objects AP ids" do
activity = insert(:note_activity)
- [found_activity] = Activity.get_all_create_by_object_ap_id(activity.data["object"]["id"])
+ object_data = Object.normalize(activity).data
+
+ [found_activity] = Activity.get_all_create_by_object_ap_id(object_data["id"])
assert activity == found_activity
end
test "returns the activity that created an object" do
activity = insert(:note_activity)
+ object_data = Object.normalize(activity).data
- found_activity = Activity.get_create_by_object_ap_id(activity.data["object"]["id"])
+ found_activity = Activity.get_create_by_object_ap_id(object_data["id"])
assert activity == found_activity
end
@@ -99,4 +103,74 @@ defmodule Pleroma.ActivityTest do
assert Activity.get_bookmark(queried_activity, user) == bookmark
end
end
+
+ describe "search" do
+ setup do
+ Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+
+ user = insert(:user)
+
+ params = %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "actor" => "http://mastodon.example.org/users/admin",
+ "type" => "Create",
+ "id" => "http://mastodon.example.org/users/admin/activities/1",
+ "object" => %{
+ "type" => "Note",
+ "content" => "find me!",
+ "id" => "http://mastodon.example.org/users/admin/objects/1",
+ "attributedTo" => "http://mastodon.example.org/users/admin"
+ },
+ "to" => ["https://www.w3.org/ns/activitystreams#Public"]
+ }
+
+ {:ok, local_activity} = Pleroma.Web.CommonAPI.post(user, %{"status" => "find me!"})
+ {:ok, remote_activity} = Pleroma.Web.Federator.incoming_ap_doc(params)
+ %{local_activity: local_activity, remote_activity: remote_activity, user: user}
+ end
+
+ test "find local and remote statuses for authenticated users", %{
+ local_activity: local_activity,
+ remote_activity: remote_activity,
+ user: user
+ } do
+ activities = Enum.sort_by(Activity.search(user, "find me"), & &1.id)
+
+ assert [^local_activity, ^remote_activity] = activities
+ end
+
+ test "find only local statuses for unauthenticated users", %{local_activity: local_activity} do
+ assert [^local_activity] = Activity.search(nil, "find me")
+ end
+
+ test "find only local statuses for unauthenticated users when `limit_to_local_content` is `:all`",
+ %{local_activity: local_activity} do
+ Pleroma.Config.put([:instance, :limit_to_local_content], :all)
+ assert [^local_activity] = Activity.search(nil, "find me")
+ Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
+ end
+
+ test "find all statuses for unauthenticated users when `limit_to_local_content` is `false`",
+ %{
+ local_activity: local_activity,
+ remote_activity: remote_activity
+ } do
+ Pleroma.Config.put([:instance, :limit_to_local_content], false)
+
+ activities = Enum.sort_by(Activity.search(nil, "find me"), & &1.id)
+
+ assert [^local_activity, ^remote_activity] = activities
+
+ Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
+ end
+ end
+
+ test "add an activity with an expiration" do
+ activity = insert(:note_activity)
+ insert(:expiration_in_the_future, %{activity_id: activity.id})
+
+ Pleroma.ActivityExpiration
+ |> where([a], a.activity_id == ^activity.id)
+ |> Repo.one!()
+ end
end
diff --git a/test/bbs/handler_test.exs b/test/bbs/handler_test.exs
index 7d5d68d11..4f0c13417 100644
--- a/test/bbs/handler_test.exs
+++ b/test/bbs/handler_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.BBS.HandlerTest do
use Pleroma.DataCase
alias Pleroma.Activity
@@ -59,6 +63,7 @@ defmodule Pleroma.BBS.HandlerTest do
another_user = insert(:user)
{:ok, activity} = CommonAPI.post(another_user, %{"status" => "this is a test post"})
+ activity_object = Object.normalize(activity)
output =
capture_io(fn ->
@@ -76,8 +81,9 @@ defmodule Pleroma.BBS.HandlerTest do
)
assert reply.actor == user.ap_id
- object = Object.normalize(reply)
- assert object.data["content"] == "this is a reply"
- assert object.data["inReplyTo"] == activity.data["object"]
+
+ reply_object_data = Object.normalize(reply).data
+ assert reply_object_data["content"] == "this is a reply"
+ assert reply_object_data["inReplyTo"] == activity_object.data["id"]
end
end
diff --git a/test/bookmark_test.exs b/test/bookmark_test.exs
index b81c102ef..e54bd359c 100644
--- a/test/bookmark_test.exs
+++ b/test/bookmark_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.BookmarkTest do
use Pleroma.DataCase
import Pleroma.Factory
diff --git a/test/config/transfer_task_test.exs b/test/config/transfer_task_test.exs
new file mode 100644
index 000000000..9074f3b97
--- /dev/null
+++ b/test/config/transfer_task_test.exs
@@ -0,0 +1,51 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Config.TransferTaskTest do
+ use Pleroma.DataCase
+
+ clear_config([:instance, :dynamic_configuration]) do
+ Pleroma.Config.put([:instance, :dynamic_configuration], true)
+ end
+
+ test "transfer config values from db to env" do
+ refute Application.get_env(:pleroma, :test_key)
+ refute Application.get_env(:idna, :test_key)
+
+ Pleroma.Web.AdminAPI.Config.create(%{
+ group: "pleroma",
+ key: "test_key",
+ value: [live: 2, com: 3]
+ })
+
+ Pleroma.Web.AdminAPI.Config.create(%{
+ group: "idna",
+ key: "test_key",
+ value: [live: 15, com: 35]
+ })
+
+ Pleroma.Config.TransferTask.start_link([])
+
+ assert Application.get_env(:pleroma, :test_key) == [live: 2, com: 3]
+ assert Application.get_env(:idna, :test_key) == [live: 15, com: 35]
+
+ on_exit(fn ->
+ Application.delete_env(:pleroma, :test_key)
+ Application.delete_env(:idna, :test_key)
+ end)
+ end
+
+ test "non existing atom" do
+ Pleroma.Web.AdminAPI.Config.create(%{
+ group: "pleroma",
+ key: "undefined_atom_key",
+ value: [live: 2, com: 3]
+ })
+
+ assert ExUnit.CaptureLog.capture_log(fn ->
+ Pleroma.Config.TransferTask.start_link([])
+ end) =~
+ "updating env causes error, key: \"undefined_atom_key\", error: %ArgumentError{message: \"argument error\"}"
+ end
+end
diff --git a/test/conversation/participation_test.exs b/test/conversation/participation_test.exs
index 568953b07..a27167d42 100644
--- a/test/conversation/participation_test.exs
+++ b/test/conversation/participation_test.exs
@@ -8,6 +8,50 @@ defmodule Pleroma.Conversation.ParticipationTest do
alias Pleroma.Conversation.Participation
alias Pleroma.Web.CommonAPI
+ test "getting a participation will also preload things" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, _activity} =
+ CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})
+
+ [participation] = Participation.for_user(user)
+
+ participation = Participation.get(participation.id, preload: [:conversation])
+
+ assert %Pleroma.Conversation{} = participation.conversation
+ end
+
+ test "for a new conversation, it sets the recipents of the participation" do
+ user = insert(:user)
+ other_user = insert(:user)
+ third_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{"status" => "Hey @#{other_user.nickname}.", "visibility" => "direct"})
+
+ [participation] = Participation.for_user(user)
+ participation = Pleroma.Repo.preload(participation, :recipients)
+
+ assert length(participation.recipients) == 2
+ assert user in participation.recipients
+ assert other_user in participation.recipients
+
+ # Mentioning another user in the same conversation will not add a new recipients.
+
+ {:ok, _activity} =
+ CommonAPI.post(user, %{
+ "in_reply_to_status_id" => activity.id,
+ "status" => "Hey @#{third_user.nickname}.",
+ "visibility" => "direct"
+ })
+
+ [participation] = Participation.for_user(user)
+ participation = Pleroma.Repo.preload(participation, :recipients)
+
+ assert length(participation.recipients) == 2
+ end
+
test "it creates a participation for a conversation and a user" do
user = insert(:user)
conversation = insert(:conversation)
@@ -72,8 +116,11 @@ defmodule Pleroma.Conversation.ParticipationTest do
object2 = Pleroma.Object.normalize(activity_two)
object3 = Pleroma.Object.normalize(activity_three)
+ user = Repo.get(Pleroma.User, user.id)
+
assert participation_one.conversation.ap_id == object3.data["context"]
assert participation_two.conversation.ap_id == object2.data["context"]
+ assert participation_one.conversation.users == [user]
# Pagination
assert [participation_one] = Participation.for_user(user, %{"limit" => 1})
@@ -86,4 +133,36 @@ defmodule Pleroma.Conversation.ParticipationTest do
assert participation_one.last_activity_id == activity_three.id
end
+
+ test "Doesn't die when the conversation gets empty" do
+ user = insert(:user)
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"})
+ [participation] = Participation.for_user_with_last_activity_id(user)
+
+ assert participation.last_activity_id == activity.id
+
+ {:ok, _} = CommonAPI.delete(activity.id, user)
+
+ [] = Participation.for_user_with_last_activity_id(user)
+ end
+
+ test "it sets recipients, always keeping the owner of the participation even when not explicitly set" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, _activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"})
+ [participation] = Participation.for_user_with_last_activity_id(user)
+
+ participation = Repo.preload(participation, :recipients)
+
+ assert participation.recipients |> length() == 1
+ assert user in participation.recipients
+
+ {:ok, participation} = Participation.set_recipients(participation, [other_user.id])
+
+ assert participation.recipients |> length() == 2
+ assert user in participation.recipients
+ assert other_user in participation.recipients
+ end
end
diff --git a/test/conversation_test.exs b/test/conversation_test.exs
index 5903d10ff..4e36494f8 100644
--- a/test/conversation_test.exs
+++ b/test/conversation_test.exs
@@ -11,6 +11,10 @@ defmodule Pleroma.ConversationTest do
import Pleroma.Factory
+ clear_config_all([:instance, :federating]) do
+ Pleroma.Config.put([:instance, :federating], true)
+ end
+
test "it goes through old direct conversations" do
user = insert(:user)
other_user = insert(:user)
diff --git a/test/emails/admin_email_test.exs b/test/emails/admin_email_test.exs
new file mode 100644
index 000000000..9e83c73c6
--- /dev/null
+++ b/test/emails/admin_email_test.exs
@@ -0,0 +1,49 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Emails.AdminEmailTest do
+ use Pleroma.DataCase
+ import Pleroma.Factory
+
+ alias Pleroma.Emails.AdminEmail
+ alias Pleroma.Web.Router.Helpers
+
+ test "build report email" do
+ config = Pleroma.Config.get(:instance)
+ to_user = insert(:user)
+ reporter = insert(:user)
+ account = insert(:user)
+
+ res =
+ AdminEmail.report(to_user, reporter, account, [%{name: "Test", id: "12"}], "Test comment")
+
+ status_url = Helpers.o_status_url(Pleroma.Web.Endpoint, :notice, "12")
+ reporter_url = Helpers.o_status_url(Pleroma.Web.Endpoint, :feed_redirect, reporter.nickname)
+ account_url = Helpers.o_status_url(Pleroma.Web.Endpoint, :feed_redirect, account.nickname)
+
+ assert res.to == [{to_user.name, to_user.email}]
+ assert res.from == {config[:name], config[:notify_email]}
+ assert res.subject == "#{config[:name]} Report"
+
+ assert res.html_body ==
+ "<p>Reported by: <a href=\"#{reporter_url}\">#{reporter.nickname}</a></p>\n<p>Reported Account: <a href=\"#{
+ account_url
+ }\">#{account.nickname}</a></p>\n<p>Comment: Test comment\n<p> Statuses:\n <ul>\n <li><a href=\"#{
+ status_url
+ }\">#{status_url}</li>\n </ul>\n</p>\n\n"
+ end
+
+ test "it works when the reporter is a remote user without email" do
+ config = Pleroma.Config.get(:instance)
+ to_user = insert(:user)
+ reporter = insert(:user, email: nil, local: false)
+ account = insert(:user)
+
+ res =
+ AdminEmail.report(to_user, reporter, account, [%{name: "Test", id: "12"}], "Test comment")
+
+ assert res.to == [{to_user.name, to_user.email}]
+ assert res.from == {config[:name], config[:notify_email]}
+ end
+end
diff --git a/test/emails/mailer_test.exs b/test/emails/mailer_test.exs
new file mode 100644
index 000000000..ae5effb7a
--- /dev/null
+++ b/test/emails/mailer_test.exs
@@ -0,0 +1,53 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Emails.MailerTest do
+ use Pleroma.DataCase
+ alias Pleroma.Emails.Mailer
+
+ import Swoosh.TestAssertions
+
+ @email %Swoosh.Email{
+ from: {"Pleroma", "noreply@example.com"},
+ html_body: "Test email",
+ subject: "Pleroma test email",
+ to: [{"Test User", "user1@example.com"}]
+ }
+
+ clear_config([Pleroma.Emails.Mailer, :enabled])
+
+ test "not send email when mailer is disabled" do
+ Pleroma.Config.put([Pleroma.Emails.Mailer, :enabled], false)
+ Mailer.deliver(@email)
+
+ refute_email_sent(
+ from: {"Pleroma", "noreply@example.com"},
+ to: [{"Test User", "user1@example.com"}],
+ html_body: "Test email",
+ subject: "Pleroma test email"
+ )
+ end
+
+ test "send email" do
+ Mailer.deliver(@email)
+
+ assert_email_sent(
+ from: {"Pleroma", "noreply@example.com"},
+ to: [{"Test User", "user1@example.com"}],
+ html_body: "Test email",
+ subject: "Pleroma test email"
+ )
+ end
+
+ test "perform" do
+ Mailer.perform(:deliver_async, @email, [])
+
+ assert_email_sent(
+ from: {"Pleroma", "noreply@example.com"},
+ to: [{"Test User", "user1@example.com"}],
+ html_body: "Test email",
+ subject: "Pleroma test email"
+ )
+ end
+end
diff --git a/test/emails/user_email_test.exs b/test/emails/user_email_test.exs
new file mode 100644
index 000000000..7d8df6abc
--- /dev/null
+++ b/test/emails/user_email_test.exs
@@ -0,0 +1,48 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Emails.UserEmailTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Emails.UserEmail
+ alias Pleroma.Web.Endpoint
+ alias Pleroma.Web.Router
+
+ import Pleroma.Factory
+
+ test "build password reset email" do
+ config = Pleroma.Config.get(:instance)
+ user = insert(:user)
+ email = UserEmail.password_reset_email(user, "test_token")
+ assert email.from == {config[:name], config[:notify_email]}
+ assert email.to == [{user.name, user.email}]
+ assert email.subject == "Password reset"
+ assert email.html_body =~ Router.Helpers.reset_password_url(Endpoint, :reset, "test_token")
+ end
+
+ test "build user invitation email" do
+ config = Pleroma.Config.get(:instance)
+ user = insert(:user)
+ token = %Pleroma.UserInviteToken{token: "test-token"}
+ email = UserEmail.user_invitation_email(user, token, "test@test.com", "Jonh")
+ assert email.from == {config[:name], config[:notify_email]}
+ assert email.subject == "Invitation to Pleroma"
+ assert email.to == [{"Jonh", "test@test.com"}]
+
+ assert email.html_body =~
+ Router.Helpers.redirect_url(Endpoint, :registration_page, token.token)
+ end
+
+ test "build account confirmation email" do
+ config = Pleroma.Config.get(:instance)
+ user = insert(:user, info: %Pleroma.User.Info{confirmation_token: "conf-token"})
+ email = UserEmail.account_confirmation_email(user)
+ assert email.from == {config[:name], config[:notify_email]}
+ assert email.to == [{user.name, user.email}]
+ assert email.subject == "#{config[:name]} account confirmation"
+
+ assert email.html_body =~
+ Router.Helpers.confirm_email_url(Endpoint, :confirm_email, user.id, "conf-token")
+ end
+end
diff --git a/test/emoji_test.exs b/test/emoji_test.exs
index 2eaa26be6..07ac6ff1d 100644
--- a/test/emoji_test.exs
+++ b/test/emoji_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.EmojiTest do
use ExUnit.Case, async: true
alias Pleroma.Emoji
diff --git a/test/fixtures/host-meta-zetsubou.xn--q9jyb4c.xml b/test/fixtures/host-meta-zetsubou.xn--q9jyb4c.xml
new file mode 100644
index 000000000..df64d44b0
--- /dev/null
+++ b/test/fixtures/host-meta-zetsubou.xn--q9jyb4c.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD
+ xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+ <Link rel="lrdd" template="https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource={uri}" type="application/xrd+xml" />
+</XRD>
diff --git a/test/fixtures/httpoison_mock/admin@mastdon.example.org.json b/test/fixtures/httpoison_mock/admin@mastdon.example.org.json
deleted file mode 100644
index c297e4349..000000000
--- a/test/fixtures/httpoison_mock/admin@mastdon.example.org.json
+++ /dev/null
@@ -1 +0,0 @@
-{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","sensitive":"as:sensitive","movedTo":"as:movedTo","Hashtag":"as:Hashtag","ostatus":"http://ostatus.org#","atomUri":"ostatus:atomUri","inReplyToAtomUri":"ostatus:inReplyToAtomUri","conversation":"ostatus:conversation","toot":"http://joinmastodon.org/ns#","Emoji":"toot:Emoji"}],"id":"http://mastodon.example.org/users/admin","type":"Person","following":"http://mastodon.example.org/users/admin/following","followers":"http://mastodon.example.org/users/admin/followers","inbox":"http://mastodon.example.org/users/admin/inbox","outbox":"http://mastodon.example.org/users/admin/outbox","preferredUsername":"admin","name":null,"summary":"\u003cp\u003e\u003c/p\u003e","url":"http://mastodon.example.org/@admin","manuallyApprovesFollowers":false,"publicKey":{"id":"http://mastodon.example.org/users/admin#main-key","owner":"http://mastodon.example.org/users/admin","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtc4Tir+3ADhSNF6VKrtW\nOU32T01w7V0yshmQei38YyiVwVvFu8XOP6ACchkdxbJ+C9mZud8qWaRJKVbFTMUG\nNX4+6Q+FobyuKrwN7CEwhDALZtaN2IPbaPd6uG1B7QhWorrY+yFa8f2TBM3BxnUy\nI4T+bMIZIEYG7KtljCBoQXuTQmGtuffO0UwJksidg2ffCF5Q+K//JfQagJ3UzrR+\nZXbKMJdAw4bCVJYs4Z5EhHYBwQWiXCyMGTd7BGlmMkY6Av7ZqHKC/owp3/0EWDNz\nNqF09Wcpr3y3e8nA10X40MJqp/wR+1xtxp+YGbq/Cj5hZGBG7etFOmIpVBrDOhry\nBwIDAQAB\n-----END PUBLIC KEY-----\n"},"endpoints":{"sharedInbox":"http://mastodon.example.org/inbox"},"icon":{"type":"Image","mediaType":"image/jpeg","url":"https://cdn.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg"},"image":{"type":"Image","mediaType":"image/png","url":"https://cdn.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"}}
diff --git a/test/fixtures/lain.xml b/test/fixtures/lain.xml
new file mode 100644
index 000000000..332b3b28d
--- /dev/null
+++ b/test/fixtures/lain.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD
+ xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+ <Subject>acct:lain@zetsubou.xn--q9jyb4c</Subject>
+ <Alias>https://zetsubou.xn--q9jyb4c/users/lain</Alias>
+ <Link href="https://zetsubou.xn--q9jyb4c/users/lain/feed.atom" rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" />
+ <Link href="https://zetsubou.xn--q9jyb4c/users/lain" rel="http://webfinger.net/rel/profile-page" type="text/html" />
+ <Link href="https://zetsubou.xn--q9jyb4c/users/lain/salmon" rel="salmon" />
+ <Link href="data:application/magic-public-key,RSA.7yTJNuPH7wSsg6sMH4XLi-OL6JL8idyRMwNsWy2xzKWPJRWVK5hxG1kMGQ4qC_9ksqIaT7c7DIQFJYYbhRTnXYdac1UxaWivzl5l2HYPOOF1_-gbE6TCaI4ItTQo5eB4yyy3zozrIuv_GY8W0Ww58Re8Z_G4DFFmnipgiBKNaHthxNQqtxcK-o4rUv3xdyr_M9KYi3QISCGiaV_t8xkdVREixzNmWpsqM5YZ46xXT0SiGSHDubLE_OGhyvWqf_WkJrnDBETL3WjXU4QsPmBbVBgLvLcHei_uAD-9d3QImSuWwBXXQZIzY7Diro6u8dZuPIoLmnbUp1-mViBwCUMWSQ==.AQAB" rel="magic-public-key" />
+ <Link href="https://zetsubou.xn--q9jyb4c/users/lain" rel="self" type="application/activity+json" />
+ <Link rel="http://ostatus.org/schema/1.0/subscribe" template="https://zetsubou.xn--q9jyb4c/ostatus_subscribe?acct={uri}" />
+</XRD>
diff --git a/test/fixtures/mastodon-delete-user.json b/test/fixtures/mastodon-delete-user.json
new file mode 100644
index 000000000..f19088fec
--- /dev/null
+++ b/test/fixtures/mastodon-delete-user.json
@@ -0,0 +1,24 @@
+{
+ "type": "Delete",
+ "object": {
+ "type": "Person",
+ "id": "http://mastodon.example.org/users/admin",
+ "atomUri": "http://mastodon.example.org/users/admin"
+ },
+ "id": "http://mastodon.example.org/users/admin#delete",
+ "actor": "http://mastodon.example.org/users/admin",
+ "@context": [
+ {
+ "toot": "http://joinmastodon.org/ns#",
+ "sensitive": "as:sensitive",
+ "ostatus": "http://ostatus.org#",
+ "movedTo": "as:movedTo",
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "atomUri": "ostatus:atomUri",
+ "Hashtag": "as:Hashtag",
+ "Emoji": "toot:Emoji"
+ }
+ ]
+}
diff --git a/test/fixtures/mastodon-question-activity.json b/test/fixtures/mastodon-question-activity.json
new file mode 100644
index 000000000..ac329c7d5
--- /dev/null
+++ b/test/fixtures/mastodon-question-activity.json
@@ -0,0 +1,99 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "ostatus": "http://ostatus.org#",
+ "atomUri": "ostatus:atomUri",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "focalPoint": {
+ "@container": "@list",
+ "@id": "toot:focalPoint"
+ }
+ }
+ ],
+ "id": "https://mastodon.sdf.org/users/rinpatch/statuses/102070944809637304/activity",
+ "type": "Create",
+ "actor": "https://mastodon.sdf.org/users/rinpatch",
+ "published": "2019-05-10T09:03:36Z",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://mastodon.sdf.org/users/rinpatch/followers"
+ ],
+ "object": {
+ "id": "https://mastodon.sdf.org/users/rinpatch/statuses/102070944809637304",
+ "type": "Question",
+ "summary": null,
+ "inReplyTo": null,
+ "published": "2019-05-10T09:03:36Z",
+ "url": "https://mastodon.sdf.org/@rinpatch/102070944809637304",
+ "attributedTo": "https://mastodon.sdf.org/users/rinpatch",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://mastodon.sdf.org/users/rinpatch/followers"
+ ],
+ "sensitive": false,
+ "atomUri": "https://mastodon.sdf.org/users/rinpatch/statuses/102070944809637304",
+ "inReplyToAtomUri": null,
+ "conversation": "tag:mastodon.sdf.org,2019-05-10:objectId=15095122:objectType=Conversation",
+ "content": "<p>Why is Tenshi eating a corndog so cute?</p>",
+ "contentMap": {
+ "en": "<p>Why is Tenshi eating a corndog so cute?</p>"
+ },
+ "endTime": "2019-05-11T09:03:36Z",
+ "closed": "2019-05-11T09:03:36Z",
+ "attachment": [],
+ "tag": [],
+ "replies": {
+ "id": "https://mastodon.sdf.org/users/rinpatch/statuses/102070944809637304/replies",
+ "type": "Collection",
+ "first": {
+ "type": "CollectionPage",
+ "partOf": "https://mastodon.sdf.org/users/rinpatch/statuses/102070944809637304/replies",
+ "items": []
+ }
+ },
+ "oneOf": [
+ {
+ "type": "Note",
+ "name": "Dunno",
+ "replies": {
+ "type": "Collection",
+ "totalItems": 0
+ }
+ },
+ {
+ "type": "Note",
+ "name": "Everyone knows that!",
+ "replies": {
+ "type": "Collection",
+ "totalItems": 1
+ }
+ },
+ {
+ "type": "Note",
+ "name": "25 char limit is dumb",
+ "replies": {
+ "type": "Collection",
+ "totalItems": 0
+ }
+ },
+ {
+ "type": "Note",
+ "name": "I can't even fit a funny",
+ "replies": {
+ "type": "Collection",
+ "totalItems": 1
+ }
+ }
+ ]
+ }
+}
diff --git a/test/fixtures/mastodon-update.json b/test/fixtures/mastodon-update.json
index f6713fea5..dbf8b6dff 100644
--- a/test/fixtures/mastodon-update.json
+++ b/test/fixtures/mastodon-update.json
@@ -1,10 +1,10 @@
-{
- "type": "Update",
- "object": {
- "url": "http://mastodon.example.org/@gargron",
- "type": "Person",
- "summary": "<p>Some bio</p>",
- "publicKey": {
+{
+ "type": "Update",
+ "object": {
+ "url": "http://mastodon.example.org/@gargron",
+ "type": "Person",
+ "summary": "<p>Some bio</p>",
+ "publicKey": {
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0gs3VnQf6am3R+CeBV4H\nlfI1HZTNRIBHgvFszRZkCERbRgEWMu+P+I6/7GJC5H5jhVQ60z4MmXcyHOGmYMK/\n5XyuHQz7V2Ssu1AxLfRN5Biq1ayb0+DT/E7QxNXDJPqSTnstZ6C7zKH/uAETqg3l\nBonjCQWyds+IYbQYxf5Sp3yhvQ80lMwHML3DaNCMlXWLoOnrOX5/yK5+dedesg2\n/HIvGk+HEt36vm6hoH7bwPuEkgA++ACqwjXRe5Mta7i3eilHxFaF8XIrJFARV0t\nqOu4GID/jG6oA+swIWndGrtR2QRJIt9QIBFfK3HG5M0koZbY1eTqwNFRHFL3xaD\nUQIDAQAB\n-----END PUBLIC KEY-----\n",
"owner": "http://mastodon.example.org/users/gargron",
"id": "http://mastodon.example.org/users/gargron#main-key"
@@ -20,7 +20,27 @@
"endpoints": {
"sharedInbox": "http://mastodon.example.org/inbox"
},
- "icon":{"type":"Image","mediaType":"image/jpeg","url":"https://cd.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg"},"image":{"type":"Image","mediaType":"image/png","url":"https://cd.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"}
+ "attachment": [{
+ "type": "PropertyValue",
+ "name": "foo",
+ "value": "updated"
+ },
+ {
+ "type": "PropertyValue",
+ "name": "foo1",
+ "value": "updated"
+ }
+ ],
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "url": "https://cd.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg"
+ },
+ "image": {
+ "type": "Image",
+ "mediaType": "image/png",
+ "url": "https://cd.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"
+ }
},
"id": "http://mastodon.example.org/users/gargron#updates/1519563538",
"actor": "http://mastodon.example.org/users/gargron",
diff --git a/test/fixtures/mastodon-vote.json b/test/fixtures/mastodon-vote.json
new file mode 100644
index 000000000..c2c5f40c0
--- /dev/null
+++ b/test/fixtures/mastodon-vote.json
@@ -0,0 +1,16 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "actor": "https://mastodon.sdf.org/users/rinpatch",
+ "id": "https://mastodon.sdf.org/users/rinpatch#votes/387/activity",
+ "nickname": "rin",
+ "object": {
+ "attributedTo": "https://mastodon.sdf.org/users/rinpatch",
+ "id": "https://mastodon.sdf.org/users/rinpatch#votes/387",
+ "inReplyTo": "https://testing.uguu.ltd/objects/9d300947-2dcb-445d-8978-9a3b4b84fa14",
+ "name": "suya..",
+ "to": "https://testing.uguu.ltd/users/rin",
+ "type": "Note"
+ },
+ "to": "https://testing.uguu.ltd/users/rin",
+ "type": "Create"
+}
diff --git a/test/fixtures/nypd-facial-recognition-children-teenagers.html b/test/fixtures/nypd-facial-recognition-children-teenagers.html
new file mode 100644
index 000000000..5702c4484
--- /dev/null
+++ b/test/fixtures/nypd-facial-recognition-children-teenagers.html
@@ -0,0 +1,227 @@
+<!DOCTYPE html>
+<html lang="en" itemId="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html" itemType="http://schema.org/NewsArticle" itemScope="" class="story" xmlns:og="http://opengraphprotocol.org/schema/">
+ <head>
+ <title data-rh="true">She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database. - The New York Times</title>
+ <meta data-rh="true" itemprop="inLanguage" content="en-US"/><meta data-rh="true" property="article:published" itemprop="datePublished dateCreated" content="2019-08-01T17:15:31.000Z"/><meta data-rh="true" property="article:modified" itemprop="dateModified" content="2019-08-02T09:30:23.000Z"/><meta data-rh="true" http-equiv="Content-Language" content="en"/><meta data-rh="true" name="robots" content="noarchive"/><meta data-rh="true" name="articleid" itemprop="identifier" content="100000006583622"/><meta data-rh="true" name="nyt_uri" itemprop="identifier" content="nyt://article/9da58246-2495-505f-9abd-b5fda8e67b56"/><meta data-rh="true" name="pubp_event_id" itemprop="identifier" content="pubp://event/47a657bafa8a476bb36832f90ee5ac6e"/><meta data-rh="true" name="description" itemprop="description" content="With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers."/><meta data-rh="true" name="image" itemprop="image" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-facebookJumbo.jpg"/><meta data-rh="true" name="byl" content="By Joseph Goldstein and Ali Watkins"/><meta data-rh="true" name="thumbnail" itemprop="thumbnailUrl" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-thumbStandard.jpg"/><meta data-rh="true" name="news_keywords" content="NYPD,Juvenile delinquency,Facial Recognition,Privacy,Government Surveillance,Police,Civil Rights,NYC"/><meta data-rh="true" name="pdate" content="20190801"/><meta data-rh="true" property="og:url" content="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="og:title" content="She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database."/><meta data-rh="true" property="og:image" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-facebookJumbo.jpg"/><meta data-rh="true" property="og:description" content="With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers."/><meta data-rh="true" property="twitter:url" content="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="twitter:title" content="She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database."/><meta data-rh="true" property="twitter:description" content="With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers."/><meta data-rh="true" property="twitter:image" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg"/><meta data-rh="true" property="twitter:image:alt" content=""/><meta data-rh="true" property="twitter:card" content="summary_large_image"/><meta data-rh="true" property="article:section" itemprop="articleSection" content="New York"/><meta data-rh="true" property="article:tag" content="Police Department (NYC)"/><meta data-rh="true" property="article:tag" content="Juvenile Delinquency"/><meta data-rh="true" property="article:tag" content="Facial Recognition Software"/><meta data-rh="true" property="article:tag" content="Privacy"/><meta data-rh="true" property="article:tag" content="Surveillance of Citizens by Government"/><meta data-rh="true" property="article:tag" content="Police"/><meta data-rh="true" property="article:tag" content="Civil Rights and Liberties"/><meta data-rh="true" property="article:tag" content="New York City"/><meta data-rh="true" name="CG" content="nyregion"/><meta data-rh="true" name="SCG" content=""/><meta data-rh="true" name="CN" content="experience-tech-and-society"/><meta data-rh="true" name="CT" content="spotlight"/><meta data-rh="true" name="PT" content="article"/><meta data-rh="true" name="PST" content="News"/><meta data-rh="true" name="url" itemprop="url" content="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" name="msapplication-starturl" content="https://www.nytimes.com"/><meta data-rh="true" property="al:android:url" content="nytimes://reader/id/100000006583622"/><meta data-rh="true" property="al:android:package" content="com.nytimes.android"/><meta data-rh="true" property="al:android:app_name" content="NYTimes"/><meta data-rh="true" name="twitter:app:name:googleplay" content="NYTimes"/><meta data-rh="true" name="twitter:app:id:googleplay" content="com.nytimes.android"/><meta data-rh="true" name="twitter:app:url:googleplay" content="nytimes://reader/id/100000006583622"/><meta data-rh="true" property="al:iphone:url" content="nytimes://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="al:iphone:app_store_id" content="284862083"/><meta data-rh="true" property="al:iphone:app_name" content="NYTimes"/><meta data-rh="true" property="al:ipad:url" content="nytimes://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="al:ipad:app_store_id" content="357066198"/><meta data-rh="true" property="al:ipad:app_name" content="NYTimes"/>
+ <meta charset="utf-8" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
+<meta property="fb:app_id" content="9869919170" />
+<meta name="twitter:site" value="@nytimes" />
+
+
+ <script type="text/javascript">
+ // 20.585kB
+ window.viHeadScriptSize = 20.585;
+ (function () { var _f=function(e){window.vi=window.vi||{},window.vi.env=Object.freeze(e)};;_f.apply(null, [{"JKIDD_PATH":"https://a.nytimes.com/svc/nyt/data-layer","ET2_URL":"https://a.et.nytimes.com","WEDDINGS_PATH":"https://content.api.nytimes.com","GDPR_PATH":"https://us-central1-nyt-wfvi-prd.cloudfunctions.net/gdpr-email-form","RECAPTCHA_SITEKEY":"6LevSGcUAAAAAF-7fVZF05VTRiXvBDAY4vBSPaTF","ABRA_ET_URL":"//et.nytimes.com","NODE_ENV":"production","SENTRY_SAMPLE_RATE":"10","EXPERIMENTAL_ROUTE_PREFIX":"","ENVIRONMENT":"prd","RELEASE":"034494769d779a637c178f47c2096df69b7c07a4","AUTH_HOST":"https://myaccount.nytimes.com","SWG_PUBLICATION_ID":"nytimes.com","GQL_FETCH_TIMEOUT":"4000"}]); })();;
+ !function(){if('PerformanceLongTaskTiming' in window){var g=window.__tti={e:[]};
+ g.o=new PerformanceObserver(function(l){g.e=g.e.concat(l.getEntries())});
+ g.o.observe({entryTypes:['longtask']})}}();
+;
+ !function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);
+;try {
+ var observer = new window.PerformanceObserver(function (list) {
+ var entries = list.getEntries();
+
+ for (var i = 0; i < entries.length; i += 1) {
+ var entry = entries[i];
+ var performance = {};
+
+ performance[entry.name] = Math.round(entry.startTime + entry.duration);
+ (window.dataLayer = window.dataLayer || []).push({
+ event: "performance",
+ pageview: {
+ performance: performance
+ }
+ });
+ }
+ });
+ observer.observe({
+ entryTypes: ["paint"]
+ });
+} catch (e) {};
+!function(i,e){var a,s,c,p,u,g=[],
+l="object"==typeof i.navigator&&"string"==typeof i.navigator.userAgent&&/iP(ad|hone|od)/.test(
+i.navigator.userAgent),f="object"==typeof i.navigator&&i.navigator.sendBeacon,
+y=f?l?"xhr_ios":"beacon":"xhr";function d(){var e,t,n=i.crypto||i.msCrypto;if(n)t=n.getRandomValues(
+new Uint8Array(18));else for(t=[];t.length<18;)t.push(256*Math.random()^255&(e=e||+new Date)),
+e=Math.floor(e/256);return btoa(String.fromCharCode.apply(String,t)).replace(/\+/g,"-").replace(
+/\//g,"_")}if(i.nyt_et)try{console.warn("et2 snippet should only load once per page")}catch(e
+){}else i.nyt_et=function(){var e,t,n,o=arguments;function r(r){g.length&&(function(e,t,n){if(
+"beacon"===y||f&&r)return i.navigator.sendBeacon(e,t)
+;var o="undefined"!=typeof XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP")
+;o.open("POST",e),o.withCredentials=!0,o.setRequestHeader("Accept","*/*"),
+"string"==typeof t?o.setRequestHeader("Content-Type","text/plain;charset=UTF-8"
+):"[object Blob]"==={}.toString.call(t)&&t.type&&o.setRequestHeader("Content-Type",t.type);try{
+o.send(t)}catch(e){}}(a+"/track",JSON.stringify(g)),g.length=0,clearTimeout(u),u=null)}if(
+"string"==typeof o[0]&&/init/.test(o[0])&&(c=d(),"init"==o[0]&&!s)){if(s=d(),
+"string"!=typeof o[1]||!/^http/.test(o[1]))throw new Error("init must include an et host url")
+;a=String(o[1]).replace(/\/$/,""),"string"==typeof o[2]&&(p=o[2])}n="page_exit"==(e=o[o.length-1]
+).subject||"ob_click"==(e.eventData||{}).type,a&&"object"==typeof e&&(t="page"==e.subject?c:d(),
+e.sourceApp&&(p=e.sourceApp),e.sourceApp=p,g.push({context_id:s,pageview_id:c,event_id:t,
+client_lib:"v1.0.5",sourceApp:p,how:n&&l&&f?"beacon_ios":y,client_ts:+new Date,data:JSON.parse(
+JSON.stringify(e))}),"send"==o[0]||t==c||n?r(n):u||(u=setTimeout(r,5500)))},
+i.nyt_et.get_pageview_id=function(){return c}}(window);
+;
+var NYTD=NYTD||{};NYTD.Abra=function(t){"use strict";function e(t){var e=r[t];return e&&e[1]||null}function n(t,e){if(t){var n,r,o=e[0],i=e[1],c=0,u=0;if(1!==i.length||4294967296!==i[0])for(n=a(t+" "+o)>>>0,c=0,u=0;r=i[c++];)if(n<(u+=r[0]))return r}}function a(t){for(var e,n,a,r,o,i,c,u=0,h=0,l=[],s=[e=1732584193,n=4023233417,~e,~n,3285377520],f=[],p=t.length;h<=p;)f[h>>2]|=(h<p?t.charCodeAt(h):128)<<8*(3-h++%4);for(f[c=p+8>>2|15]=p<<3;u<=c;u+=16){for(e=s,h=0;h<80;e=[0|[(i=((t=e[0])<<5|t>>>27)+e[4]+(l[h]=h<16?~~f[u+h]:i<<1|i>>>31)+1518500249)+((n=e[1])&(a=e[2])|~n&(r=e[3])),o=i+(n^a^r)+341275144,i+(n&a|n&r|a&r)+882459459,o+1535694389][0|h++/20],t,n<<30|n>>>2,a,r])i=l[h-3]^l[h-8]^l[h-14]^l[h-16];for(h=5;h;)s[--h]=s[h]+e[h]|0}return s[0]}var r,o={};return t.dataLayer=t.dataLayer||[],e.init=function(e){var a,o,i,c,u,h,l,s,f,p,d=[],v=[],m=(t.document.cookie.match(/(?:^|;) *nyt-a=([^;]*)/)||[])[1],b=(t.document.cookie.match(/(?:^|;) *ab7=([^;]*)/)||[])[1],g=(t.location.search.match(/(?:^\?|&)abra=([^&]*)/)||[])[1];if(r)throw new Error("can't init twice");for(r={},u=(decodeURIComponent(b||"")+"&"+decodeURIComponent(g||"")).split("&"),a=u.length-1;a>=0;a--)h=u[a].split("="),h.length<2||(l=h[0])&&!r[l]&&(s=h[1]||null,r[l]=[,s,1],s&&d.push(l+"="+s),v.push({test:l,variant:s||"0"}));for(a=0;a<e.length;a++)i=e[a],(o=i[0])in r||(c=n(m,i)||[],c[0],f=c[1],p=!!c[2],r[o]=c,f&&d.push(o.replace(/[^\w-]/g)+"="+(""+f).replace(/[^\w-]/g)),p&&v.push({test:o,variant:f||"0"}));d.length&&t.document.documentElement.setAttribute("data-nyt-ab",d.join(" ")),v.length&&t.dataLayer.push({event:"ab-alloc",abtest:{batch:v}})},e.reportExposure=function(e,n){if(!o[e]){o[e]=1;var a=r[e];if(a){var i=a[1];a[2]&&t.dataLayer.push({event:"ab-expose",abtest:{test:e,variant:i||"0"}})}n&&t.setTimeout(function(){n(null)},0)}},e}(this);
+;(function () { var NYTD=window.NYTD||{};function setupTimeZone(){var e='[data-timezone][data-timezone~="'+(new Date).getHours()+'"] { display: block }',t=document.createElement("style");t.innerHTML=e,document.head.appendChild(t)}function addNYTAppClass(){var e=window.navigator.userAgent||window.navigator.vendor||window.opera,t=-1!==e.indexOf("nyt_android"),n=-1!==e.indexOf("nytios");(t||n)&&document.documentElement.classList.add("NYTApp")}function setupPageViewId(){NYTD.PageViewId={},NYTD.PageViewId.update=function(){return"undefined"!=typeof nyt_et&&"function"==typeof window.nyt_et.get_pageview_id?(window.nyt_et("pageinit"),NYTD.PageViewId.current=window.nyt_et.get_pageview_id()):NYTD.PageViewId.current="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}),NYTD.PageViewId.current}}var _f=function(e){try{document.domain="nytimes.com"}catch(e){}window.swgUserInfoXhrObject=new XMLHttpRequest,window.__emotion=e.emotionIds,setupPageViewId(),setupTimeZone(),addNYTAppClass(),window.nyt_et("init",vi.env.ET2_URL,"nyt-vi",{subject:"page",canonicalUrl:(document.querySelector("link[rel=canonical]")||{}).href,articleId:(document.querySelector("meta[name=articleid]")||{}).content,nyt_uri:(document.querySelector("meta[name=nyt_uri]")||{}).content,pubpEventId:(document.querySelector("meta[name=pubp_event_id]")||{}).content,url:location.href,referrer:document.referrer||void 0,client_tz_offset:(new Date).getTimezoneOffset()}),"undefined"!=typeof nyt_et&&"function"==typeof window.nyt_et.get_pageview_id?NYTD.PageViewId.current=window.nyt_et.get_pageview_id():NYTD.PageViewId.update(),NYTD.Abra.init(e.abraConfig,vi.env.ABRA_ET_URL)};;_f.apply(null, [{"emotionIds":["0","1dv1kvn","v89234","nuvmzp","1gz70xg","9e9ivx","2bwtzy","1hyfx7x","6n7j50","1kj7lfb","10m9xeu","vz7hjd","1fe7a5q","1rn5q1r","10488qs","1iruc8t","1ropbjl","uw59u","jxzr5i","oylsik","1otr2jl","1c8n994","qtw155","v0l3hm","g4gku8","1rr4qq7","6xhk3s","rxqrcl","tj0ten","ist4u3","1gprdgz","10t7hia","mzqdl","kwpx34","1k2cjfc","1vhk1ks","6td9kr","r5ic95","15uy5yv","1p8nkc0","5j8bii","1am0aiv","1g7m0tk","d8bdto","y8aj3r","60hakz","i29ckm","acwcvw","1baulvz","f8wsfj","mhvv8m","m6999o","i9gxme","1m9j9gf","1sy8kpn","19vbshk","l9onyx","79elbk","1q1yk17","g7rb99","k008qs","bsn42l","11cwn6f","ghw4n2","1c5cfvc","htgkrt","e64et","9zaqp9","16fq4rz","1kjk1j2","88g286","12yx39b","4hu8jm","1wqz2f4","yl3z84","1q3gjvc","nc39ev","amd09y","ru1vxe","ajnadh","1ri25x2","12fr9lp","1hfdzay","4g4cvq","m6xlts","1ahhg7f","fwqvlz","17xtcya","x15j1o","1705lsu","1iwv8en","b7n1on","1b9egsl","1rj8to8","4w91ra","wg1cha","1ubp8k9","1egl8em","vdv0al","1i2y565","o6xoe7","1fanzo5","53u6y8","1m50asq","z3e15g","uwwqev","1ly73wi","7y3qfv","l72opv","4skfbu","1fcn4th","13zu7ev","f7l8cz","16ogagc","17ai7jg","8i9d0s","1nwzsjy","10698na","nhjhh0","1nuro5j","1w5cs23","4brsb6","uhuo44","exrw3m","1a48zt4","1xdhyk6","vuqh7u","1l44abu","jcw7oy","10raysz","ar1l6a","1ede5it","mn5hq9","1qmnftd","1ho5u4o","13o0c9t","1yo489b","ulr03x","1bymuyk","1waixk9","1f7ibof","l2ztic","19lv58h","mgtjo2","1wr3we4","y3sf94","1bnxwmn","1i8g3m4","3qijnq","uqyvli","1uqjmks","1bvtpon","1vxca1d","1vkm6nb","1ox9jel","1riqqik","2fg4z9","11n4cex","1ifw933","1rjmmt7","rqb9bm","19hdyf3","15g2oxy","2b3w4o","14b9hti","1j8dw05","1vm5oi9","32rbo2","llk6mt","1s4ffep","pdw9fk","1txwxcy","1soubk3"],"abraConfig":[["vi-ads-et",[[257698038,"2_remainder",1],[4037269258,null,0]]],["messaging-optimizely",[[4294967296,"1",0]]],["dfp_adslot4v2",[[4294967296,"1_external",1]]],["DFP_als",[[4294967296,"1_als",1]]],["DFP_als_home",[[214748365,"1_als",1],[214748365,"1_als",1],[429496730,"1_als",1],[429496729,"1_als",1],[858993459,"1_als",1],[1073741824,"1_als",1],[1073741824,null,0]]],["medianet_toggle",[[4294967296,"0_default",0]]],["amazon_toggle",[[4294967296,null,0]]],["index_toggle",[[4294967296,"1_block",0]]],["dfp_home_toggle",[[4294967296,null,0]]],["dfp_story_toggle",[[4294967296,null,0]]],["dfp_interactive_toggle",[[4294967296,null,0]]],["FREEX_Best_In_Show",[[2147483648,"0_Control",1],[2147483648,"1_Best",1]]],["MKT_dfp_ocean_language",[[2147483648,"0_control",1],[2147483648,"1_language",1]]],["MC_magnolia_0519",[[4294967296,"1_magnolia",1]]],["STORY_topical_recirc",[[2147483648,"0_control",1],[2147483648,"1_variant",1]]],["HOME_timesExclusive",[[2147483648,"0_control",1],[2147483648,"1_variant",1]]],["ON_daily_digest_NL_0719",[[644245095,"0_control",1],[644245094,"1_daily_digest",1],[3006477107,null,0]]],["HOME_discovery_automation",[[2147483648,"0_control",1],[2147483648,"1_automation",1]]],["MKT_GateDockMsgTap",[[1431655766,"0_control",1],[1431655765,"2_BAUDockTapGate",1],[1431655765,"4_BAUDockRBGate",1]]],["FREEX_RegiWall_Messaging",[[214748365,"0_Control",1],[214748365,"1_Continue_Reading",1],[214748365,"2_For_Free",1],[214748365,"3_Keep_Reading",1],[214748364,"4_Continue_Reading_NoHeader",1],[214748365,"5_For_Free_NoHeader",1],[214748365,"6_Keep_Reading_NoHeader",1],[858993459,"0_Control",1],[858993459,"6_Keep_Reading_NoHeader",1],[1073741824,null,0]]],["MC_briefing_bar_anon_test_0519",[[1431655766,"0_control",1],[1431655765,"1_subscribe",1],[1431655765,"2_regi",1]]],["MC_briefing_bar_regi_test_0519",[[2147483648,"0_control",1],[2147483648,"1_subscribe",1]]],["SEARCH_FACET_DROPDOWN",[[2147483648,"0_FACET_MULTI_SELECT",1],[2147483648,"1_DYNAMIC_FACET_SELECT",1]]],["VG_gift_upsell_x_only",[[429496730,"0_control",1],[3865470566,"1_upsell",1]]],["ON_allocator_0719",[[356482286,"ON_login_interrupt_0819-0_control",0],[356482286,"ON_login_interrupt_0819-1_app_experience",0],[356482285,"ON_login_interrupt_0819-2_login_value",0],[356482286,"ON_login_interrupt_0819-3_login_return",0],[356482285,"ON_app_dl_getstarted_0819-0_control",0],[356482286,"ON_app_dl_getstarted_0819-1_appExperience",0],[356482285,"ON_app_dl_getstarted_0819-2_bestApp",0],[356482286,"ON_app_dl_getstarted_0819-3_magicLink",0],[236223201,"ON_app_dl_mc4-6_0819-0_control",0],[236223202,"ON_app_dl_mc4-6_0819-1_dockTrunc",0],[236223201,"ON_app_dl_mc4-6_0819-2_newDock",0],[236223201,"ON_app_dl_mc4-6_0819-3_stdNew",0],[236223201,"ON_app_dl_mc4-6_0819-4_stdDockTrunc",0],[236223202,"ON_app_dl_mc4-6_0819-5_truncator",0],[25769803,null,0]]],["MKT_dfp_ocean_bundle_light",[[1431655766,"0_control",1],[1431655765,"1_design",1],[1431655765,"2_design_light",1]]],["MKT_dfp_ocean_bundle_family",[[1431655766,"0_control",1],[1431655765,"1_design",1],[1431655765,"2_family",1]]],["HL_sample",[[2147483648,"0",1],[2147483648,"1",1]]],["HL_100000006614214",[[2147483648,"0",1],[2147483648,"1",1]]],["HL_100000006641840",[[2147483648,"0",1],[2147483648,"1",1]]]]}]); })();;(function () { var _f=function(e){var r=function(){var r=e.url;try{r+=window.location.search.slice(1).split("&").reduce(function(e,r){return"ip-override"===r.split("=")[0]?"?"+r:e},"")}catch(e){console.warn(e)}var n=new XMLHttpRequest;for(var t in n.withCredentials=!0,n.open("POST",r,!0),n.setRequestHeader("Content-Type","application/json"),e.headers)n.setRequestHeader(t,e.headers[t]);return n.send(e.body),n};window.userXhrObject=r(),window.userXhrRefresh=function(){return window.userXhrObject=r(),window.userXhrObject}};;_f.apply(null, [{"url":"https://samizdat-graphql.nytimes.com/graphql/v2","body":"{\"operationName\":\"UserQuery\",\"variables\":{},\"query\":\" query UserQuery { user { __typename profile { displayName } userInfo { regiId entitlements demographics { emailSubscriptions wat bundleSubscriptions { bundle inGrace promotion source } } } subscriptionDetails { graceStartDate graceEndDate isFreeTrial hasQueuedSub startDate endDate status entitlements } } } \"}","headers":{"nyt-app-type":"project-vi","nyt-app-version":"0.0.5","nyt-token":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs+/oUCTBmD/cLdmcecrnBMHiU/pxQCn2DDyaPKUOXxi4p0uUSZQzsuq1pJ1m5z1i0YGPd1U1OeGHAChWtqoxC7bFMCXcwnE1oyui9G1uobgpm1GdhtwkR7ta7akVTcsF8zxiXx7DNXIPd2nIJFH83rmkZueKrC4JVaNzjvD+Z03piLn5bHWU6+w+rA+kyJtGgZNTXKyPh6EC6o5N+rknNMG5+CdTq35p8f99WjFawSvYgP9V64kgckbTbtdJ6YhVP58TnuYgr12urtwnIqWP9KSJ1e5vmgf3tunMqWNm6+AnsqNj8mCLdCuc5cEB74CwUeQcP2HQQmbCddBy2y0mEwIDAQAB"}}]); })();;100*Math.random()<=vi.env.SENTRY_SAMPLE_RATE?(window.INSTALL_RAVEN=!0,window.nyt_errors={ravenInstalled:!1,list:[],tags:[]},window.onerror=function(n,r,o,w,i){if(!window.nyt_errors.ravenInstalled){var t={err:i,data:{}};window.nyt_errors.list.push(t)}}):window.INSTALL_RAVEN=!1;;(function () { var _f=function(t,e,n){var a=window,A=document,o=function(t){var e=A.createElement("style");e.appendChild(A.createTextNode(t)),A.querySelector("head").appendChild(e)},r=function(t,e,n,a,A){var r=new XMLHttpRequest;r.open("GET",t,!0),r.onreadystatechange=function(){if(4===r.readyState&&200===r.status){o(r.responseText);try{localStorage.setItem("nyt-fontFormat",e),localStorage.setItem(a,n)}catch(t){return}localStorage.setItem(A,r.responseText)}return!0},r.send(null)},c=function(e,n){var A;try{A=localStorage.getItem("nyt-fontFormat")}catch(t){}A||(A=function(){if(!("FontFace"in a))return!1;var t=new FontFace("t",'url("data:application/font-woff2;base64,d09GMgABAAAAAADcAAoAAAAAAggAAACWAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABk4ALAoUNAE2AiQDCAsGAAQgBSAHIBtvAcieB3aD8wURQ+TZazbRE9HvF5vde4KCYGhiCgq/NKPF0i6UIsZynbP+Xi9Ng+XLbNlmNz/xIBBqq61FIQRJhC/+QA/08PJQJ3sK5TZFMlWzC/iK5GUN40psgqvxwBjBOg6JUSJ7ewyKE2AAaXZrfUB4v+hze37ugJ9d+DeYqiDwVgCawviwVFGnuttkLqIMGivmDg") format("woff2")',{});return t.load().catch(function(){}),"loading"==t.status||"loaded"==t.status}()?"woff2":"woff");for(var c=0;c<e.length;c++){var i=e[c],l="shared"!==i?"-"+i:"",d="nyt-fontHash"+l,s="nyt-fontFace"+l,f=t[i][A],u=localStorage.getItem(d),g=localStorage.getItem(s);if(u===f.hash&&g)o(g);else{var h=function(t,e,n,a,A){return function(){r(t,e,n,a,A)}}(f.url,A,f.hash,d,s);n?h():document.addEventListener("DOMContentLoaded",h)}}};c(e),window.addEventListener("load",function(){c(n,!0)})};;_f.apply(null, [{"shared":{"woff":{"hash":"f2adc73415c5bbb437e993c14559e70e","url":"/vi-assets/static-assets/shared-woff.fonts-f2adc73415c5bbb437e993c14559e70e.css"},"woff2":{"hash":"22b34a6a6fd840943496b658184afdd3","url":"/vi-assets/static-assets/shared-woff2.fonts-22b34a6a6fd840943496b658184afdd3.css"}},"story":{"woff":{"hash":"3c668927c32fbefb440b4024d5da6351","url":"/vi-assets/static-assets/story-woff.fonts-3c668927c32fbefb440b4024d5da6351.css"},"woff2":{"hash":"acec1a902e1795b20a0204af82726cd2","url":"/vi-assets/static-assets/story-woff2.fonts-acec1a902e1795b20a0204af82726cd2.css"}},"opinion":{"woff":{"hash":"dfc5106c9c0aaa76688687e664474b04","url":"/vi-assets/static-assets/opinion-woff.fonts-dfc5106c9c0aaa76688687e664474b04.css"},"woff2":{"hash":"e2b27ff317927dfd77bdd429409627e0","url":"/vi-assets/static-assets/opinion-woff2.fonts-e2b27ff317927dfd77bdd429409627e0.css"}},"tmag":{"woff":{"hash":"4634f3c7ddebb9113b69d4578d9a0ba0","url":"/vi-assets/static-assets/tmag-woff.fonts-4634f3c7ddebb9113b69d4578d9a0ba0.css"},"woff2":{"hash":"8622c93c260fa93b229b7249df708fb1","url":"/vi-assets/static-assets/tmag-woff2.fonts-8622c93c260fa93b229b7249df708fb1.css"}},"mag":{"woff":{"hash":"109e6d301ed49c8078086b5892696adf","url":"/vi-assets/static-assets/mag-woff.fonts-109e6d301ed49c8078086b5892696adf.css"},"woff2":{"hash":"fb42c728dc70cc4ef6010a60cb10b0bd","url":"/vi-assets/static-assets/mag-woff2.fonts-fb42c728dc70cc4ef6010a60cb10b0bd.css"}},"well":{"woff":{"hash":"f0e613b89006e99b4622d88aa5563a81","url":"/vi-assets/static-assets/well-woff.fonts-f0e613b89006e99b4622d88aa5563a81.css"},"woff2":{"hash":"77806b85de524283fe742b916c9d0ee4","url":"/vi-assets/static-assets/well-woff2.fonts-77806b85de524283fe742b916c9d0ee4.css"}}},["shared","story"],["opinion","tmag","mag","well"]]); })();;(function () { function swgDataLayer(e){return!!window.dataLayer&&((window.dataLayer=window.dataLayer||[]).push({event:"impression",module:e}),!0)}function checkSwgOptOut(){if(!window.localStorage)return!1;var e=window.localStorage.getItem("nyt-swgOptOut");if(!e)return!1;var t=parseInt(e,10);return((new Date).getTime()-t)/864e5<1||(window.localStorage.removeItem("nyt-swgOptOut"),!1)}function swgDeferredAccount(e,t){return e.completeDeferredAccountCreation({entitlements:t,consent:!1}).then(function(e){var t=vi.env.AUTH_HOST+"/svc/account/auth/v1/swg-dal-web",n=e.purchaseData.raw.data?e.purchaseData.raw.data:e.purchaseData.raw,o=JSON.parse(n),a={package_name:o.packageName,product_id:o.productId,purchase_token:o.purchaseToken,google_id_token:e.userData.idToken,google_user_email:e.userData.email,google_user_id:e.userData.id,google_user_name:e.userData.name},r=new XMLHttpRequest;r.withCredentials=!0,r.open("POST",t,!0),r.setRequestHeader("Content-Type","application/json"),r.send(JSON.stringify(a)),r.onload=function(){200===r.status?(swgDataLayer({name:"swg",context:"Deferred",label:"Seamless Signin",region:"swg-modal"}),e.complete().then(function(){window.location.reload(!0)})):(e.complete(),window.location=encodeURI(vi.env.AUTH_HOST+"/get-started/swg-link?redirect="+window.location.href))}}).catch(function(){return!!window.localStorage&&(!window.localStorage.getItem("nyt-swgOptOut")&&(window.localStorage.setItem("nyt-swgOptOut",(new Date).getTime()),!0))}),!0}function loginWithGoogle(){return"undefined"!=typeof window&&(-1===document.cookie.indexOf("NYT-S")&&(!0!==checkSwgOptOut()&&(!!window.SWG&&((window.SWG=window.SWG||[]).push(function(e){return e.init(vi.env.SWG_PUBLICATION_ID),e.getEntitlements().then(function(t){if(void 0===t||!t.raw)return!1;var n={entitlements_token:t.raw};return window.swgUserInfoXhrObject.withCredentials=!0,window.swgUserInfoXhrObject.open("POST",vi.env.AUTH_HOST+"/svc/account/auth/v1/login-swg-web",!0),window.swgUserInfoXhrObject.setRequestHeader("Content-Type","application/json"),window.swgUserInfoXhrObject.send(JSON.stringify(n)),window.swgUserInfoXhrObject.onload=function(){switch(window.swgUserInfoXhrObject.status){case 200:return swgDataLayer({name:"swg",context:"Seamless",label:"Seamless Signin",region:"login"}),window.location.reload(!0),!0;case 412:return swgDeferredAccount(e,t);default:return!1}},t}).catch(function(){return!1}),!0}),!0))))}var _f=function(){if(window.swgUserInfoXhrObject.checkSwgResponse=!1,-1===document.cookie.indexOf("NYT-S")){var e=document.createElement("script");e.src="https://news.google.com/swg/js/v1/swg.js",e.setAttribute("subscriptions-control","manual"),e.setAttribute("async",!0),e.onload=function(){loginWithGoogle()},document.getElementsByTagName("head")[0].appendChild(e)}};;_f.apply(null, []); })();
+ </script>
+
+ <link data-rh="true" rel="shortcut icon" href="/vi-assets/static-assets/favicon-4bf96cb6a1093748bf5b3c429accb9b4.ico"/><link data-rh="true" rel="apple-touch-icon" href="/vi-assets/static-assets/apple-touch-icon-319373aaf4524d94d38aa599c56b8655.png"/><link data-rh="true" rel="apple-touch-icon-precomposed" sizes="144×144" href="/vi-assets/static-assets/ios-ipad-144x144-319373aaf4524d94d38aa599c56b8655.png"/><link data-rh="true" rel="apple-touch-icon-precomposed" sizes="114×114" href="/vi-assets/static-assets/ios-iphone-114x144-61d373c43aa8365d3940c5f1135f4597.png"/><link data-rh="true" rel="apple-touch-icon-precomposed" href="/vi-assets/static-assets/ios-default-homescreen-57x57-7cccbfb151c7db793e92ea58c30b9e72.png"/><link data-rh="true" rel="alternate" itemprop="mainEntityOfPage" hrefLang="en-US" href="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><link data-rh="true" rel="canonical" href="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><link data-rh="true" rel="alternate" href="android-app://com.nytimes.android/nytimes/reader/id/100000006583622"/><link data-rh="true" rel="amphtml" href="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.amp.html"/><link data-rh="true" rel="alternate" type="application/json+oembed" href="https://www.nytimes.com/svc/oembed/json/?url=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" title="She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database."/>
+ <script data-rh="true" >
+ if (typeof testCookie === 'undefined') {
+ var testCookie = function (name) {
+ var match = document.cookie.match(new RegExp(name + '=([^;]+)'));
+ if (match) return match[1];
+ }
+ }
+</script><script data-rh="true" >if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+
+ if (testCookie('nyt-gdpr') !== '1') {
+ var gptScript = document.createElement('script');
+ gptScript.async = 'async';
+ gptScript.src = '//securepubads.g.doubleclick.net/tag/js/gpt.js';
+ document.head.appendChild(gptScript);
+ }
+ }</script><script data-rh="true" >if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+
+ var googletag = googletag || {};
+ googletag.cmd = googletag.cmd || [];
+
+ if (testCookie('nyt-gdpr') == '1') {
+ googletag.cmd.push(function() {
+ googletag.pubads().setRequestNonPersonalizedAds(1);
+ });
+ }
+ }</script><script data-rh="true" >if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+ (function () { var _f=function(){var t,e,o=50,n=50;function i(t){if(!document.getElementById("3pCheckIframeId")){if(t||(t=1),!document.body){if(t>o)return;return t+=1,setTimeout(i.bind(null,t),n)}var e,a,r;e="https://static01.nyt.com/ads/tpc-check.html",a=document.body,(r=document.createElement("iframe")).src=e,r.id="3pCheckIframeId",r.style="display:none;",r.height=0,r.width=0,a.insertBefore(r,a.firstChild)}}function a(t){if("https://static01.nyt.com"===t.origin)try{"3PCookieSupported"===t.data&&googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","true")}),"3PCookieNotSupported"===t.data&&googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","false")})}catch(t){}}function r(){if(function(){if(Object.prototype.toString.call(window.HTMLElement).indexOf("Constructor")>0)return!0;if("[object SafariRemoteNotification]"===(!window.safari||safari.pushNotification).toString())return!0;try{return window.localStorage&&/Safari/.test(window.navigator.userAgent)}catch(t){return!1}}()){try{window.openDatabase(null,null,null,null)}catch(e){return t(),!0}try{localStorage.length?e():(localStorage.x=1,localStorage.removeItem("x"),e())}catch(o){navigator.cookieEnabled?t():e()}return!0}}!function(){try{googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","unknown")})}catch(t){}}(),t=function(){try{googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","private")})}catch(t){}}||function(){},e=function(){window.addEventListener("message",a,!1),i(0)}||function(){},function(){if(window.webkitRequestFileSystem)return window.webkitRequestFileSystem(window.TEMPORARY,1,e,t),!0}()||r()||function(){if(!window.indexedDB&&(window.PointerEvent||window.MSPointerEvent))return t(),!0}()||e()};;_f.apply(null, []); })();
+ }</script><script data-rh="true" >(function() {
+ var AdSlot4=function(){"use strict";function D(n,i,o){var t=document.getElementsByTagName("head")[0],e=document.createElement("script");i&&(e.onload=i),o&&(e.onerror=o),e.src=n,e.async=!0,t.appendChild(e)}return function(){var A=window.AdSlot4||{};A.cmd=A.cmd||[];var b=!1;if(A.loadScripts)return A;function z(t){"art, oak"!==t&&"art,oak"!==t||(t="art"),A.cmd.push(function(){A.events.subscribe({name:"AdDefined",scope:"all",callback:function(n){var o,i=[-1];n.sizes.forEach(function(n){n[0]<window.innerWidth&&n[0]>i[0]&&(i=[]).push(n)}),i[0][1]&&window.apstag.fetchBids({slots:[{slotID:n.id,slotName:"".concat(n.id,"_").concat(t,"_web"),sizes:(o=i[0][1],Array.isArray(o)?[[300,250],[728,90],[970,90],[970,250]].filter(function(i){return o.some(function(n){return n[0]===i[0]&&n[1]===i[1]})}):(console.warn("filterSizes() did not receive an array"),[]))}]},function(){window.googletag.cmd.push(function(){window.apstag.setDisplayBids()})})}})})}return A.loadScripts=function(n){var i,o,t,e,d,a,c,s,r=n||{},w=r.loadMnet,u=void 0===w||w,l=r.loadAmazon,p=void 0===l||l,f=r.loadBait,m=void 0===f||f,v=r.section,g=void 0===v?"none":v,h=r.pageViewId,y=void 0===h?"":h,B=r.pageType,x=void 0===B?"":B;b||("1"===(c="nyt-gdpr",(s=document.cookie.match(new RegExp("".concat(c,"=([^;]+)"))))?s[1]:"")||(d=document.referrer||"",(a=/([a-zA-Z0-9_\-.]+)(@|%40)([a-zA-Z0-9_\-.]+).([a-zA-Z]{2,5})/).test(d)||a.test(window.location.href))||(!u||window.advBidxc&&window.advBidxc.isLoaded||(t=y,e="8CU2553YN",window.innerWidth<740&&(e="8CULO58R6"),D("https://contextual.media.net/bidexchange.js?cid=".concat(e,"&dn=").concat("www.nytimes.com","&https=1"),function(){window.advBidxc&&window.advBidxc.isLoaded||console.warn("Media.net not loading properly")},function(){A.cmd.push(function(){A.events.publish({name:"BidderError",value:{type:"Mnet"}})})}),window.advBidxc=window.advBidxc||{},window.advBidxc.renderAd=function(){},window.advBidxc.startTime=(new Date).getTime(),window.advBidxc.customerId={mediaNetCID:e},window.advBidxc.misc={isGptDisabled:1},t&&(window.advBidxc.misc.keywords=t)),p&&!window.apstag&&(i=g,o=x,function(o,t){function n(n,i){t[o]._Q.push([n,i])}t[o]||(t[o]={init:function(){n("i",arguments)},fetchBids:function(){n("f",arguments)},setDisplayBids:function(){},targetingKeys:function(){return[]},_Q:[]})}("apstag",window),D("//c.amazon-adsystem.com/aax2/apstag.js",function(){window.apstag||console.warn("A9 not loading properly")},function(){A.cmd.push(function(){A.events.publish({name:"BidderError",value:{type:"A9"}})})}),window.apstag.init({pubID:"3030",adServer:"googletag",params:{si_section:i}}),z(o))),m&&D("https://static01.nyt.com/ads/google/adsbygoogle.js",function(){},function(){A.cmd.push(function(){A.events.publish({name:"AdEmpty",value:{type:"AdBlockOn"}})})}),b=!0)},window.AdSlot4=A}()}();
+ AdSlot4.loadScripts({
+ loadMnet: window.NYTD.Abra('medianet_toggle') !== '1_block',
+ loadAmazon: window.NYTD.Abra('amazon_toggle') !== '1_block',
+ section: 'nyregion',
+ pageType: 'art,oak',
+ pageViewId: window.NYTD.PageViewId.current,
+ });
+ (function () { var _f=function(e){var o=performance.navigation&&1===performance.navigation.type;function t(){return window.matchMedia("(max-width: 739px)").matches}function n(e){var n,r,i,d,a,p,u=function(){var e=window.userXhrObject&&""!==window.userXhrObject.responseText&&JSON.parse(window.userXhrObject.responseText).data||null,o=null;return e&&e.user&&e.user.userInfo&&(o=e.user.userInfo.demographics),o}();return u?(r=e,d=(n=u)&&n.emailSubscriptions,(a=n&&n.bundleSubscriptions)&&r&&(r.sub="reg",d&&d.length&&(r.em=d.toString().toLowerCase()),n.wat&&(r.wat=n.wat.toLowerCase()),a&&a.length&&a[0].bundle&&(i=a[0],r.sub=i.bundle.toLowerCase(),i.source&&(r.subsrc=i.source.toLowerCase()),i.promotion&&(r.subprm=i.promotion),i.in_grace&&(r.grace=i.in_grace.toString()))),e=r):e.sub="anon",t()?(e.prop="mnyt",e.plat="mweb",e.ver="mvi"):(e.prop="nyt",e.plat="web",e.ver="vi"),"hp"===e.typ&&(document.referrer&&(e.topref=document.referrer),o&&(e.refresh="manual")),e.abra_dfp=(p=document.documentElement.getAttribute("data-nyt-ab"))?p.split(" ").reduce(function(e,o){var t=o.split("="),n=t[0].toLowerCase(),r=t[1];return(n.indexOf("dfp")>-1||n.indexOf("redbird")>-1)&&e.push(n+"_"+r),e},[]):"",e.page_view_id=window.NYTD.PageViewId&&window.NYTD.PageViewId.current,e}var r=e||{},i=r.adTargeting||{},d=r.adUnitPath||"/29390238/nyt/homepage",a=r.offset||400,p=r.hideTopAd||t(),u=r.lockdownAds||!1,s=r.sizeMapping||{top:[[970,["fluid",[728,90],[970,90],[970,250],[1605,300]]],[728,["fluid",[728,90],[1605,300]]],[0,["fluid",[300,250],[300,420]]]],fp1:[[0,[195,250]]],fp2:[[0,[195,250]]],fp3:[[0,[195,250]]],interstitial:[[0,[[1,1],[640,480]]]],mktg:[[1020,[300,250]],[0,[]]],pencil:[[728,[[336,46]],[0,[]]]],pp_edpick:[[0,["fluid"]]],pp_morein:[[0,["fluid"],[210,218]]],ribbon:[[0,["fluid"]]],sponsor:[[765,[150,50]],[0,[320,25]]],supplemental:[[1020,[[300,250],[300,600]]],[0,[]]],default:[[970,["fluid",[728,90],[970,90],[970,250],[1605,300]]],[728,["fluid",[728,90],[300,250],[1605,300]]],[0,["fluid",[300,250],[300,420]]]]},l=r.dfpToggleName||"dfp_home_toggle";window.AdSlot4=window.AdSlot4||{},window.AdSlot4.cmd=window.AdSlot4.cmd||[],window.AdSlot4.cmd.push(function(){window.AdSlot4.init({adTargeting:n(i),adUnitPath:d,sizeMapping:s,offset:a,haltDFP:"1_block"===window.NYTD.Abra(l),hideTopAd:p,lockdownAds:u}),window.NYTD.Abra.reportExposure("dfp_adslot4v2")})};;_f.apply(null, [{"adTargeting":{"edn":"us","sov":"3","test":"projectvi","ver":"vi","hasVideo":false,"template":"article","als_test":"1565027040168","prop":"nyt","plat":"web","brandsensitive":"false","org":"policedepartmentnyc","geo":"newyorkcity","des":"juveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties","auth":"aliwatkins,josephgoldstein","coll":"newyork,usnews,technology,techandsociety","artlen":"medium","ledemedsz":"none","typ":"art,oak","section":"nyregion","si_section":"nyregion","id":"100000006583622","pt":"nt10,nt15,nt16,nt18,nt3,nt4,nt9","gscat":"neg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education"},"adUnitPath":"/29390238/nyt/nyregion/","dfpToggleName":"dfp_story_toggle"}]); })();
+ })();</script><script data-rh="true" id="als-svc">var alsVariant = window.NYTD.Abra('DFP_als');
+ if (alsVariant != null && alsVariant.match(/(0_control|1_als)/)) {
+ window.NYTD.Abra.reportExposure('DFP_als');
+ }
+ if (window.NYTD.Abra('DFP_als') === '1_als') {
+ (function () { var _f=function(){window.googletag=window.googletag||{},googletag.cmd=googletag.cmd||[];var e=new XMLHttpRequest,t="prd"===window.vi.env.ENVIRONMENT?"als-svc.nytimes.com":"als-svc.dev.nytimes.com",n=document.querySelector('[name="nyt_uri"]'),o=null==n?"":encodeURIComponent(n.content),l=document.querySelector('[name="template"]'),s=document.querySelector('[name="prop"]'),a=document.querySelector('[name="plat"]'),i=null==l||null==l.content?"":l.content,c=null==s||null==s.content?"nyt":s.content,r=null==a||null==a.content?"web":a.content;window.innerWidth<740&&(c="mnyt",r="mweb"),"/"===location.pathname&&(o=encodeURIComponent("https://www.nytimes.com/pages/index.html"));var d=window.localStorage.getItem("als_test_clientside");void 0!==d&&window.googletag.cmd.push(function(){googletag.pubads().setTargeting("als_test_clientside",d)}),e.open("GET","https://"+t+"/als?uri="+o+"&typ="+i+"&prop="+c+"&plat="+r),e.withCredentials=!0,e.send(),e.onreadystatechange=function(){if(4===e.readyState)if(200===e.status){var t=JSON.parse(e.responseText);window.googletag.cmd.push(function(){void 0!==t.als_test_clientside&&(googletag.pubads().setTargeting("als_test_clientside",t.als_test_clientside),window.localStorage.setItem("als_test_clientside","ls-"+t.als_test_clientside)),Object.keys(t).forEach(function(e){"User"===e&&void 0!==t[e]&&window.localStorage.setItem("UTS_User",JSON.stringify(t[e]))})})}else{console.error("Error "+e.responseText);(window.dataLayer=window.dataLayer||[]).push({event:"impression",module:{name:"timing",context:"script-load",label:"alsService-als-error"}})}}};;_f.apply(null, []); })();
+ }
+ </script>
+ <link rel="stylesheet" href="/vi-assets/static-assets/global-42db6c8821fec0e2b3837b2ea2ece8fe.css" />
+ <style>.css-1dv1kvn{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.css-v89234{overflow:hidden;height:100%;}.css-nuvmzp{font-size:14.25px;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;text-transform:uppercase;-webkit-letter-spacing:0.7px;-moz-letter-spacing:0.7px;-ms-letter-spacing:0.7px;letter-spacing:0.7px;line-height:19px;}.css-nuvmzp:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1gz70xg{border-left:1px solid #ccc;color:#326891;height:12px;margin-left:8px;padding-left:8px;}.css-9e9ivx{display:none;font-size:10px;margin-left:auto;text-transform:uppercase;}.hasLinks .css-9e9ivx{display:block;}@media (min-width:740px){.hasLinks .css-9e9ivx{margin:none;position:absolute;right:20px;}}@media (min-width:1024px){.hasLinks .css-9e9ivx{display:none;}}.css-2bwtzy{display:inline-block;padding:6px 4px 4px;margin-bottom:12px;font-size:12px;border-radius:3px;-webkit-transition:background 0.6s ease;transition:background 0.6s ease;}.css-2bwtzy:hover{background-color:#f7f7f7;}.css-1hyfx7x{display:none;}.css-6n7j50{display:inline;}.css-1kj7lfb{display:none;}@media (min-width:1024px){.css-1kj7lfb{display:inline-block;margin-right:7px;}}.css-10m9xeu{display:block;width:16px;height:16px;}.css-vz7hjd{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.css-1fe7a5q{display:inline-block;height:16px;vertical-align:sub;width:16px;}.css-1rn5q1r{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;background:#fff;display:inline-block;left:44px;text-transform:uppercase;-webkit-transition:none;transition:none;}.css-1rn5q1r:active,.css-1rn5q1r:focus{-webkit-clip:auto;clip:auto;overflow:visible;width:auto;height:auto;}.css-1rn5q1r::-moz-focus-inner{padding:0;border:0;}.css-1rn5q1r:-moz-focusring{outline:1px dotted;}.css-1rn5q1r:disabled,.css-1rn5q1r.disabled{opacity:0.5;cursor:default;}.css-1rn5q1r:active,.css-1rn5q1r.active{background-color:#f7f7f7;}@media (min-width:740px){.css-1rn5q1r:hover{background-color:#f7f7f7;}}.css-1rn5q1r:focus{margin-top:3px;padding:8px 8px 6px;}@media (min-width:1024px){.css-1rn5q1r{left:112px;}}.css-10488qs{display:none;}@media (min-width:1024px){.css-10488qs{display:inline-block;position:relative;}}.css-1iruc8t{list-style:none;margin:0;padding:0;}.css-1ropbjl::before{background-color:$white;border-bottom:1px solid #e2e2e2;border-top:2px solid #e2e2e2;content:'';display:block;height:1px;margin-top:0;}@media (min-width:1150px){.css-1ropbjl{margin:0 auto;max-width:1200px;padding:0 3% 9px;}}.NYTApp .css-1ropbjl{display:none;}@media print{.css-1ropbjl{display:none;}}.css-uw59u{padding:0 20px;}@media (min-width:740px){.css-uw59u{padding:0 3%;}}@media (min-width:1150px){.css-uw59u{padding:0;}}.css-jxzr5i{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;}.css-oylsik{display:block;height:44px;vertical-align:middle;width:184px;}.css-1otr2jl{margin:18px 0 0 auto;}.css-1c8n994{color:#6288a5;font-family:nyt-franklin;font-size:11px;font-style:normal;font-weight:400;line-height:11px;-webkit-text-decoration:none;text-decoration:none;}.css-qtw155{display:block;}@media (min-width:1150px){.css-qtw155{display:none;}}.css-v0l3hm{display:none;}@media (min-width:1150px){.css-v0l3hm{display:block;}}.css-g4gku8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:10px;min-width:600px;}.css-1rr4qq7{-webkit-flex:1;-ms-flex:1;flex:1;}.css-6xhk3s{border-left:1px solid #e2e2e2;-webkit-flex:1;-ms-flex:1;flex:1;padding-left:15px;}.css-rxqrcl{color:#333;font-size:13px;font-weight:700;font-family:nyt-franklin;height:25px;line-height:15px;margin:0;text-transform:uppercase;width:150px;}.css-tj0ten{margin-bottom:5px;white-space:nowrap;}.css-tj0ten:last-child{margin-bottom:10px;}.css-ist4u3.desktop{display:none;}@media (min-width:740px){.css-ist4u3.desktop{display:block;}.css-ist4u3.smartphone{display:none;}}.css-1gprdgz{list-style:none;margin:0;padding:0;-webkit-columns:2;columns:2;padding:0 0 15px;}.css-10t7hia{height:34px;line-height:34px;list-style-type:none;}.css-10t7hia.desktop{display:none;}@media (min-width:740px){.css-10t7hia.desktop{display:block;}.css-10t7hia.smartphone{display:none;}}.css-mzqdl{color:#333;display:block;font-family:nyt-franklin;font-size:15px;font-weight:500;height:34px;line-height:34px;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;}.css-kwpx34{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:14px;font-weight:500;height:23px;line-height:16px;}.css-kwpx34:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-kwpx34{color:#fff;}.css-1k2cjfc{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:16px;font-weight:700;height:25px;line-height:15px;padding-bottom:0;}.css-1k2cjfc:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-1k2cjfc{color:#fff;}.css-1vhk1ks{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:11px;font-weight:500;height:23px;line-height:21px;}.css-1vhk1ks:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-1vhk1ks{color:#fff;}.css-6td9kr{list-style:none;margin:0;padding:0;border-top:1px solid #e2e2e2;margin-top:2px;padding-top:10px;}.css-r5ic95{display:inline-block;height:13px;width:13px;margin-right:7px;vertical-align:middle;}.css-15uy5yv{border-top:1px solid #ebebeb;padding-top:9px;}.css-1p8nkc0{color:#999;font-family:nyt-franklin,helvetica,arial,sans-serif;padding:10px 0;-webkit-text-decoration:none;text-decoration:none;white-space:nowrap;}.css-1p8nkc0:hover{-webkit-text-decoration:underline;text-decoration:underline;}@-webkit-keyframes animation-5j8bii{from{opacity:0;}to{opacity:1;}}@keyframes animation-5j8bii{from{opacity:0;}to{opacity:1;}}@-webkit-keyframes animation-1am0aiv{from{visibility:visible;opacity:1;}to{visibility:visible;opacity:0;}}@keyframes animation-1am0aiv{from{visibility:visible;opacity:1;}to{visibility:visible;opacity:0;}}.css-1g7m0tk{color:#326891;}.css-1g7m0tk:visited{color:#326891;}.css-d8bdto{color:#999;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:17px;margin-bottom:5px;}@media print{.css-d8bdto{display:none;}}.css-y8aj3r{padding:0;}.css-60hakz{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-60hakz a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-60hakz:nth-of-type(3),.css-60hakz:nth-of-type(4){display:none;}}.css-60hakz:last-of-type{margin-right:0;}.css-i29ckm{width:calc(100% - 40px);max-width:600px;margin:1.5rem auto 2rem;}@media (min-width:1440px){.css-i29ckm{width:600px;max-width:600px;}}@media (min-width:600px){.css-i29ckm{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}@media (max-width:600px){.css-i29ckm .facebook,.css-i29ckm .twitter,.css-i29ckm .email{display:inline-block;}}.css-acwcvw{margin-bottom:1rem;}.css-1baulvz{display:inline-block;}@-webkit-keyframes animation-f8wsfj{0%{opacity:1;}50%{opacity:0;}100%{opacity:0;}}@keyframes animation-f8wsfj{0%{opacity:1;}50%{opacity:0;}100%{opacity:0;}}@-webkit-keyframes animation-mhvv8m{0%{opacity:0;}50%{opacity:0;}100%{opacity:1;}}@keyframes animation-mhvv8m{0%{opacity:0;}50%{opacity:0;}100%{opacity:1;}}@-webkit-keyframes animation-m6999o{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}}@keyframes animation-m6999o{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}}.css-i9gxme{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}@-webkit-keyframes animation-1m9j9gf{from{background-color:#f7f7f5;}to{background-color:transparent;}}@keyframes animation-1m9j9gf{from{background-color:#f7f7f5;}to{background-color:transparent;}}.css-1sy8kpn{display:none;}@media (min-width:765px){.css-1sy8kpn{background-color:#f7f7f7;border-bottom:1px solid #f3f3f3;display:block;padding-bottom:15px;padding-top:15px;margin:0;min-height:90px;}}@media print{.css-1sy8kpn{display:none;}}.css-19vbshk{color:#ccc;display:none;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.5625rem;font-weight:300;-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;line-height:0.5625rem;margin-left:auto;text-align:center;text-transform:uppercase;}@media (min-width:600px){.css-19vbshk{display:inline-block;}}.css-19vbshk p{margin-bottom:auto;margin-right:7px;margin-top:auto;text-transform:none;}.css-l9onyx{color:#ccc;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.5625rem;font-weight:300;-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;line-height:0.5625rem;margin-bottom:9px;text-align:center;text-transform:uppercase;}.css-79elbk{position:relative;}@-webkit-keyframes animation-1q1yk17{to{width:11px;}}@keyframes animation-1q1yk17{to{width:11px;}}@-webkit-keyframes animation-g7rb99{0%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0);}100%{-webkit-transform:scale(1.05) rotate(-90deg);-ms-transform:scale(1.05) rotate(-90deg);transform:scale(1.05) rotate(-90deg);}}@keyframes animation-g7rb99{0%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0);}100%{-webkit-transform:scale(1.05) rotate(-90deg);-ms-transform:scale(1.05) rotate(-90deg);transform:scale(1.05) rotate(-90deg);}}.css-k008qs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.sizeSmall .css-bsn42l{width:50%;}@media (min-width:600px){.sizeSmall .css-bsn42l{width:300px;}}@media (min-width:1440px){.sizeSmall .css-bsn42l{width:300px;}}@media (max-width:600px){.sizeSmall .css-bsn42l{width:50%;}}.sizeSmall.sizeSmallNoCaption .css-bsn42l{margin-left:auto;margin-right:auto;}@media (min-width:740px){.sizeSmall.layoutVertical .css-bsn42l{max-width:250px;}}@media (min-width:1024px){.sizeSmall.layoutVertical .css-bsn42l{width:250px;}}@media (max-width:740px){.sizeSmall.layoutVertical .css-bsn42l{max-width:250px;}}@media (min-width:740px){.sizeSmall.layoutHorizontal .css-bsn42l{max-width:300px;}}@media (min-width:1024px){.sizeSmall.layoutHorizontal .css-bsn42l{width:300px;}}@media (max-width:740px){.sizeSmall.layoutHorizontal .css-bsn42l{max-width:300px;}}@media (min-width:600px){.sizeMedium.layoutVertical.verticalVideo .css-bsn42l{width:310px;}}.css-11cwn6f{width:100%;vertical-align:top;}.css-11cwn6f img{width:100%;vertical-align:top;}@-webkit-keyframes animation-ghw4n2{0%{opacity:0;-webkit-transform:translateY(100px);-ms-transform:translateY(100px);transform:translateY(100px);}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}}@keyframes animation-ghw4n2{0%{opacity:0;-webkit-transform:translateY(100px);-ms-transform:translateY(100px);transform:translateY(100px);}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}}@-webkit-keyframes animation-1c5cfvc{0%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}50%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}75%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}}@keyframes animation-1c5cfvc{0%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}50%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}75%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}}@-webkit-keyframes animation-htgkrt{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}50%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}75%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}}@keyframes animation-htgkrt{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}50%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}75%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}}@-webkit-keyframes animation-e64et{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}25%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}75%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}}@keyframes animation-e64et{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}25%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}75%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}}@-webkit-keyframes animation-9zaqp9{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}25%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}75%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}}@keyframes animation-9zaqp9{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}25%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}75%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}}@-webkit-keyframes animation-16fq4rz{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}25%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}50%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}}@keyframes animation-16fq4rz{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}25%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}50%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}}@-webkit-keyframes animation-1kjk1j2{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}25%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}50%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}}@keyframes animation-1kjk1j2{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}25%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}50%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}}@-webkit-keyframes animation-88g286{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}25%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}50%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}75%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}}@keyframes animation-88g286{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}25%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}50%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}75%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}}@-webkit-keyframes animation-12yx39b{0%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}25%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}50%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}75%{-webkit-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);transform:translate(34px,0px) scale(1,1) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}}@keyframes animation-12yx39b{0%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}25%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}50%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}75%{-webkit-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);transform:translate(34px,0px) scale(1,1) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}}@-webkit-keyframes animation-4hu8jm{0%{-webkit-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);}33.33%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);}}@keyframes animation-4hu8jm{0%{-webkit-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);}33.33%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);}}@-webkit-keyframes animation-1wqz2f4{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);}}@keyframes animation-1wqz2f4{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);}}@-webkit-keyframes animation-yl3z84{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);}}@keyframes animation-yl3z84{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);}}@-webkit-keyframes animation-1q3gjvc{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);}}@keyframes animation-1q3gjvc{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);}}@-webkit-keyframes animation-nc39ev{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);}}@keyframes animation-nc39ev{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);}}@-webkit-keyframes animation-amd09y{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);}}@keyframes animation-amd09y{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);}}@-webkit-keyframes animation-ru1vxe{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);}}@keyframes animation-ru1vxe{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);}}@-webkit-keyframes animation-ajnadh{0%{-webkit-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);}33.33%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);}}@keyframes animation-ajnadh{0%{-webkit-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);}33.33%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);}}.css-1ri25x2{display:none;}@media (min-width:740px){.css-1ri25x2{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:16px;height:31px;}}@media (min-width:1024px){.css-1ri25x2{display:none;}}.css-12fr9lp{height:23px;margin-top:6px;}.css-1hfdzay{display:none;}@media (min-width:1024px){.css-1hfdzay{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:0;}}.css-4g4cvq{display:none;}@media (min-width:740px){.css-4g4cvq{position:fixed;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;opacity:0;z-index:1;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;width:100%;height:32.063px;background:white;padding:5px 0;top:0;text-align:center;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;box-shadow:rgba(0,0,0,0.08) 0 0 5px 1px;border-bottom:1px solid #e2e2e2;}}.css-m6xlts{margin-left:20px;margin-right:20px;max-width:1605px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;width:100%;}@media (min-width:1360px){.css-m6xlts{margin-left:20px;margin-right:20px;}}@media (min-width:1780px){.css-m6xlts{margin-left:auto;margin-right:auto;}}.css-1ahhg7f{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;max-width:1605px;overflow:hidden;position:absolute;width:56%;margin-left:calc((100% - 56%) / 2);}@media (min-width:1024px){.css-1ahhg7f{width:56%;margin-left:calc((100% - 56%) / 2);}}@media (min-width:1024px){.css-1ahhg7f{width:53%;margin-left:calc((100% - 53%) / 2);}}.css-fwqvlz{font-family:nyt-cheltenham-small,georgia,'times new roman';font-weight:400;font-size:13px;-webkit-letter-spacing:0.015em;-moz-letter-spacing:0.015em;-ms-letter-spacing:0.015em;letter-spacing:0.015em;margin-top:10.5px;margin-right:auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.css-17xtcya{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;font-size:12.5px;text-transform:uppercase;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;margin-top:12.5px;margin-bottom:auto;margin-left:auto;white-space:nowrap;}.css-17xtcya:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-x15j1o{display:inline-block;padding-left:7px;padding-right:7px;font-size:13px;margin-top:10px;margin-bottom:auto;color:#ccc;}.css-1705lsu{margin-top:auto;margin-bottom:auto;margin-left:auto;background-color:#fff;z-index:50;box-shadow:-14px 2px 7px -2px rgba(255,255,255,0.7);}@media (min-width:740px){.css-1iwv8en{margin-top:1px;}}@media (min-width:1024px){.css-1iwv8en{margin-top:0;}}@-webkit-keyframes animation-b7n1on{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-b7n1on{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@-webkit-keyframes animation-1b9egsl{0%{-webkit-transform:rotate(20deg);-ms-transform:rotate(20deg);transform:rotate(20deg);}100%{-webkit-transform:rotate(380deg);-ms-transform:rotate(380deg);transform:rotate(380deg);}}@keyframes animation-1b9egsl{0%{-webkit-transform:rotate(20deg);-ms-transform:rotate(20deg);transform:rotate(20deg);}100%{-webkit-transform:rotate(380deg);-ms-transform:rotate(380deg);transform:rotate(380deg);}}.css-1rj8to8{display:inline-block;line-height:1em;}.css-1rj8to8 .css-0{-webkit-text-decoration:none;text-decoration:none;display:inline-block;}.css-4w91ra{display:inline-block;padding-left:3px;}.css-wg1cha{margin-left:20px;margin-right:20px;}@media (min-width:600px){.css-wg1cha{width:calc(100% - 40px);max-width:600px;margin:1.5rem auto 1em;}}@media (min-width:1440px){.css-wg1cha{width:600px;max-width:600px;margin:1.5rem auto 1em;}}.css-1ubp8k9{font-family:nyt-imperial,georgia,'times new roman',times,serif;font-style:italic;font-size:1.0625rem;line-height:1.5rem;width:calc(100% - 40px);max-width:600px;margin:1rem auto 0.75rem;}@media (min-width:740px){.css-1ubp8k9{font-size:1.1875rem;line-height:1.75rem;margin-bottom:1.25rem;}}@media (min-width:1440px){.css-1ubp8k9{width:600px;max-width:600px;}}@media print{.css-1ubp8k9{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@-webkit-keyframes animation-1egl8em{from{opacity:0;-webkit-transform:translate3d(0,13%,0);-ms-transform:translate3d(0,13%,0);transform:translate3d(0,13%,0);}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}@keyframes animation-1egl8em{from{opacity:0;-webkit-transform:translate3d(0,13%,0);-ms-transform:translate3d(0,13%,0);transform:translate3d(0,13%,0);}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.css-vdv0al{font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.75rem;line-height:1rem;width:calc(100% - 40px);max-width:600px;margin:0 auto 1em;color:#999;}.css-vdv0al a{color:#999;-webkit-text-decoration:none;text-decoration:none;}.css-vdv0al a:hover{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:1440px){.css-vdv0al{width:600px;max-width:600px;}}@media print{.css-vdv0al{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-vdv0al span{display:none;}}.css-1i2y565 .e6idgb70 + .e1h9rw200{margin-top:0;}.css-1i2y565 .eoo0vm40 + .e1gnsphs0{margin-top:-0.3em;}.css-1i2y565 .e6idgb70 + .eoo0vm40{margin-top:0;}.css-1i2y565 .eoo0vm40 + figure{margin-top:1.2rem;}.css-1i2y565 .e1gnsphs0 + figure{margin-top:1.2rem;}.css-o6xoe7{display:none;}@media (min-width:1024px){.css-o6xoe7{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:0;margin-left:auto;width:130px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}@media (min-width:1150px){.css-o6xoe7{width:210px;}}@media print{.css-o6xoe7{display:none;}}.css-1fanzo5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-bottom:1rem;}@media (min-width:1024px){.css-1fanzo5{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;height:100%;width:945px;margin-left:auto;margin-right:auto;}}@media (min-width:1150px){.css-1fanzo5{width:1110px;margin-left:auto;margin-right:auto;}}@media (min-width:1280px){.css-1fanzo5{width:1170px;}}@media (min-width:1440px){.css-1fanzo5{width:1200px;}}@media print{.css-1fanzo5{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-1fanzo5{margin-bottom:1em;display:block;}}.css-53u6y8{margin-left:auto;margin-right:auto;width:100%;}@media (min-width:1024px){.css-53u6y8{margin-left:calc((100% - 600px) / 2);margin-right:0;width:600px;}}@media (min-width:1440px){.css-53u6y8{max-width:600px;width:600px;margin-left:calc((100% - 600px) / 2);}}@media print{.css-53u6y8{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1m50asq{width:100%;vertical-align:top;}.css-z3e15g{position:fixed;opacity:0;-webkit-scroll-events:none;-moz-scroll-events:none;-ms-scroll-events:none;scroll-events:none;top:0;left:0;bottom:0;right:0;-webkit-transition:opacity 0.2s;transition:opacity 0.2s;background-color:#fff;pointer-events:none;}.css-uwwqev{width:100%;height:100%;}.css-1ly73wi{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);overflow:hidden;}@-webkit-keyframes animation-7y3qfv{0%{opacity:0;}10%,90%{opacity:1;}100%{opacity:0;}}@keyframes animation-7y3qfv{0%{opacity:0;}10%,90%{opacity:1;}100%{opacity:0;}}.css-l72opv{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;position:relative;right:3px;}.css-l72opv a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-l72opv:nth-of-type(3),.css-l72opv:nth-of-type(4){display:none;}}.css-l72opv:last-of-type{margin-right:0;}.css-4skfbu{color:#999;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:17px;margin-bottom:5px;margin-bottom:0;}@media print{.css-4skfbu{display:none;}}.css-1fcn4th{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-1fcn4th a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-1fcn4th:nth-of-type(3),.css-1fcn4th:nth-of-type(4){display:none;}}.css-1fcn4th:last-of-type{margin-right:0;}@media (max-width:1150px){.css-1fcn4th:nth-of-type(1),.css-1fcn4th:nth-of-type(2),.css-1fcn4th:nth-of-type(3){display:none;}}.css-13zu7ev{display:inline-block;height:15px;vertical-align:middle;width:15px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:14px;height:14px;}.css-13zu7ev.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-13zu7ev.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-13zu7ev.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-13zu7ev.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-13zu7ev.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-13zu7ev.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-13zu7ev.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-13zu7ev:hover{background-color:#fff;border:1px solid #ccc;}.css-f7l8cz{display:inline-block;height:15px;vertical-align:middle;width:15px;bottom:5px;position:relative;width:14px;height:14px;bottom:4px;}.css-f7l8cz.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-f7l8cz.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-f7l8cz.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-f7l8cz.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-f7l8cz.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-f7l8cz.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-f7l8cz.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-16ogagc{background:transparent;display:inline-block;height:20px;width:20px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:27px;height:27px;}.css-16ogagc.hidden{opacity:0;visibility:hidden;}.css-16ogagc.hidden:focus{opacity:1;}.css-16ogagc:hover{background-color:#fff;border:1px solid #ccc;}.css-17ai7jg{color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;margin:10px 20px 0;text-align:left;}.css-17ai7jg a{color:#326891;-webkit-text-decoration:none;text-decoration:none;}.css-17ai7jg a:hover,.css-17ai7jg a:focus{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:600px){.css-17ai7jg{margin-left:0;}}.sizeSmall .css-17ai7jg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:calc(50% - 15px);margin:auto 0 15px 15px;}@media (min-width:600px){.sizeSmall .css-17ai7jg{width:260px;margin-left:15px;}}@media (min-width:740px){.sizeSmall .css-17ai7jg{margin-left:15px;}}@media (min-width:1440px){.sizeSmall .css-17ai7jg{width:330px;margin-left:15px;}}@media (max-width:600px){.sizeSmall .css-17ai7jg{margin:auto 0 0 15px;}}.sizeSmall.sizeSmallNoCaption .css-17ai7jg{margin-left:auto;margin-right:auto;margin-top:10px;}.sizeMedium .css-17ai7jg{max-width:900px;}.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{margin-left:0;margin-right:0;}@media (min-width:600px){.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:255px;margin:auto 0 15px 15px;}}@media (min-width:1440px){.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{width:325px;}}.sizeLarge .css-17ai7jg{max-width:none;}@media (min-width:600px){.sizeLarge .css-17ai7jg{margin-left:20px;}}@media (min-width:740px){.sizeLarge .css-17ai7jg{margin-left:20px;max-width:900px;}}@media (min-width:1024px){.sizeLarge .css-17ai7jg{margin-left:0;max-width:720px;}}@media (min-width:1440px){.sizeLarge .css-17ai7jg{margin-left:0;max-width:900px;}}@media (min-width:740px){.sizeLarge.layoutVertical .css-17ai7jg{margin-left:0;}}.sizeFull .css-17ai7jg{margin-left:20px;}@media (min-width:600px){.sizeFull .css-17ai7jg{max-width:900px;}}@media (min-width:740px){.sizeFull .css-17ai7jg{max-width:900px;}}@media (min-width:1440px){.sizeFull .css-17ai7jg{max-width:900px;}}@media print{.css-17ai7jg{display:none;}}.css-8i9d0s{margin-right:7px;color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:0.875rem;line-height:1.125rem;}@media (min-width:740px){.css-8i9d0s{font-size:0.9375rem;line-height:1.25rem;}}.css-8i9d0s strong{font-weight:700;}.css-8i9d0s em{font-style:italic;}.css-8i9d0s a{color:#326891;}.css-8i9d0s a:visited{color:#326891;}.css-1nwzsjy{display:inline-block;color:#888;font-family:nyt-imperial,georgia,'times new roman',times,serif;line-height:1.125rem;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;font-size:0.75rem;}@media (min-width:740px){.css-1nwzsjy{font-size:0.75rem;}}@media (min-width:1150px){.css-1nwzsjy{font-size:0.8125rem;}}@media (min-width:600px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:5px;}}@media (min-width:1024px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:5px;}}@media (min-width:1440px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:40px;}}@media (max-width:600px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:-8px;}}@media print{.css-1nwzsjy{display:none;}}.css-10698na{text-align:center;}@media (min-width:740px){.css-10698na{padding-top:0;}}@media (min-width:1024px){}@media print{.css-10698na a[href]::after{content:'';}.css-10698na svg{fill:black;}}.css-nhjhh0{display:block;width:189px;height:26px;margin:5px auto 0;}@media (min-width:740px){.css-nhjhh0{width:225px;height:31px;margin:4px auto 0;}}@media (min-width:1024px){.css-nhjhh0{width:195px;height:26px;margin:6px auto 0;}}.css-1nuro5j{display:inline-block;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.875rem;line-height:1.125rem;margin:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;color:#333;}@media (min-width:740px){.css-1nuro5j{font-size:0.9375rem;line-height:1.25rem;}}.css-1w5cs23{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.css-1w5cs23 li{list-style:none;}.css-4brsb6{display:inline-block;height:15px;vertical-align:middle;width:15px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:15px;height:15px;}.css-4brsb6.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-4brsb6.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-4brsb6.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-4brsb6.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-4brsb6.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-4brsb6.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-4brsb6.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-4brsb6:hover{background-color:#fff;border:1px solid #ccc;}.css-uhuo44{display:inline-block;height:15px;vertical-align:middle;width:15px;bottom:5px;position:relative;width:15px;height:15px;bottom:4px;}.css-uhuo44.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-uhuo44.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-uhuo44.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-uhuo44.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-uhuo44.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-uhuo44.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-uhuo44.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-exrw3m{margin-bottom:0.78125rem;margin-top:0;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:1.125rem;line-height:1.5625rem;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:740px){.css-exrw3m{margin-bottom:0.9375rem;margin-top:0;}}.css-exrw3m .css-1g7m0tk{-webkit-text-decoration:underline;text-decoration:underline;}.css-exrw3m .css-1g7m0tk:hover,.css-exrw3m .css-1g7m0tk:focus{-webkit-text-decoration:none;text-decoration:none;}@media (min-width:740px){.css-exrw3m{font-size:1.25rem;line-height:1.875rem;}}.css-exrw3m:first-child{margin-top:0;}.css-exrw3m:last-child{margin-bottom:0;}.css-exrw3m.e1h9rw200:last-child{margin-bottom:0.75rem;}@media (min-width:600px){.css-exrw3m{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-exrw3m{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-exrw3m{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1a48zt4{opacity:1;-webkit-transition:opacity 0.3s 0.2s;transition:opacity 0.3s 0.2s;}.css-vuqh7u{display:inline-block;color:#888;font-family:nyt-imperial,georgia,'times new roman',times,serif;line-height:1.125rem;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;font-size:0.75rem;}@media (min-width:740px){.css-vuqh7u{font-size:0.75rem;}}@media (min-width:1150px){.css-vuqh7u{font-size:0.8125rem;}}.css-1l44abu{font-family:nyt-imperial,georgia,'times new roman',times,serif;color:#666;margin:10px 20px 0 20px;text-align:left;}.css-1l44abu a{color:#326891;-webkit-text-decoration:none;text-decoration:none;}.css-1l44abu a:hover,.css-1l44abu a:focus{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:600px){.css-1l44abu{margin-left:0;margin-right:20px;}}@media (min-width:1440px){.css-1l44abu{max-width:px;}}.css-jcw7oy{width:100%;max-width:600px;margin:2.3125rem auto;}@media (min-width:600px){.css-jcw7oy{width:calc(100% - 40px);}}@media (min-width:740px){.css-jcw7oy{width:auto;max-width:600px;}}@media (min-width:1440px){.css-jcw7oy{max-width:720px;}}.css-jcw7oy strong{font-weight:700;}.css-jcw7oy em{font-style:italic;}@media (min-width:740px){.css-jcw7oy{margin:2.6875rem auto;}}.css-10raysz{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;width:calc(100% - 40px);max-width:600px;padding:0 1rem 0 0;}.css-10raysz a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-10raysz:nth-of-type(3),.css-10raysz:nth-of-type(4){display:none;}}.css-10raysz:last-of-type{margin-right:0;}.css-10raysz:nth-of-type(1),.css-10raysz:nth-of-type(2),.css-10raysz:nth-of-type(3),.css-10raysz:nth-of-type(4){display:inline;}@media (min-width:600px){.css-10raysz{width:330px;}}.css-ar1l6a{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-ar1l6a a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-ar1l6a:nth-of-type(3),.css-ar1l6a:nth-of-type(4){display:none;}}.css-ar1l6a:last-of-type{margin-right:0;}.css-ar1l6a:nth-of-type(1),.css-ar1l6a:nth-of-type(2),.css-ar1l6a:nth-of-type(3),.css-ar1l6a:nth-of-type(4){display:inline;}.css-1ede5it{background-color:#f7f7f7;border-bottom:1px solid #f3f3f3;border-top:1px solid #f3f3f3;margin:37px auto;padding-bottom:30px;padding-top:12px;text-align:center;margin-top:60px;}@media (min-width:740px){.css-1ede5it{margin:43px auto;}}@media print{.css-1ede5it{display:none;}}@media (min-width:740px){.css-1ede5it{margin-bottom:0;margin-top:0;}}.css-mn5hq9{cursor:pointer;margin:0;border-top:1px solid #ebebeb;color:#333;font-family:nyt-franklin;font-size:13px;font-weight:700;height:44px;-webkit-letter-spacing:0.04rem;-moz-letter-spacing:0.04rem;-ms-letter-spacing:0.04rem;letter-spacing:0.04rem;line-height:44px;text-transform:uppercase;}.accordionExpanded .css-mn5hq9{color:#b3b3b3;}.css-1qmnftd{font-size:11px;text-align:center;}@media (max-width:600px){.css-1qmnftd{padding-bottom:25px;}}@media (min-width:600px){.css-1qmnftd{padding-bottom:25px;}}@media (min-width:1024px){.css-1qmnftd{padding:0 3% 9px;}}@media (min-width:1150px){.css-1qmnftd{margin:0 auto;max-width:1200px;}}.NYTApp .css-1qmnftd{display:none;}@media print{.css-1qmnftd{display:none;}}.css-1ho5u4o{list-style:none;margin:0 0 15px;padding:0;}@media (min-width:600px){.css-1ho5u4o{display:inline-block;}}.css-13o0c9t{list-style:none;line-height:8px;margin:0 0 35px;padding:0;}@media (min-width:600px){.css-13o0c9t{display:inline-block;}}.css-1yo489b{display:inline-block;line-height:20px;padding:0 10px;}.css-1yo489b:first-child{border-left:none;}.css-1yo489b.desktop{display:none;}@media (min-width:740px){.css-1yo489b.smartphone{display:none;}.css-1yo489b.desktop{display:inline-block;}}.css-ulr03x{opacity:1;visibility:visible;-webkit-animation-name:animation-5j8bii;animation-name:animation-5j8bii;-webkit-animation-duration:300ms;animation-duration:300ms;-webkit-animation-delay:0ms;animation-delay:0ms;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;}@media print{.css-ulr03x{margin-bottom:15px;}}@media (min-width:1024px){.css-ulr03x{position:fixed;width:100%;top:0;left:0;z-index:200;background-color:#fff;border-bottom:none;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}}@media (min-width:1024px){.css-1bymuyk{position:relative;border-bottom:1px solid #e2e2e2;}}.css-1waixk9{background:#fff;border-bottom:1px solid #e2e2e2;height:36px;padding:8px 15px 3px;position:relative;}@media (min-width:740px){.css-1waixk9{background:#fff;padding:10px 15px 6px;}}@media (min-width:1024px){.css-1waixk9{background:transparent;border-bottom:0;padding:4px 15px 2px;}}@media print{.css-1waixk9{background:transparent;}}@media (min-width:740px){}@media (min-width:1024px){.css-1waixk9{margin:0 auto;max-width:1605px;}}.css-1f7ibof{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;left:10px;position:absolute;}@media (min-width:1024px){}@media print{.css-1f7ibof{display:none;}}.css-l2ztic{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;padding:8px 9px;text-transform:uppercase;}.css-l2ztic.hidden{opacity:0;visibility:hidden;}.css-l2ztic.hidden:focus{opacity:1;}.css-l2ztic::-moz-focus-inner{padding:0;border:0;}.css-l2ztic:-moz-focusring{outline:1px dotted;}.css-l2ztic:disabled,.css-l2ztic.disabled{opacity:0.5;cursor:default;}.css-l2ztic:active,.css-l2ztic.active{background-color:#f7f7f7;}@media (min-width:740px){.css-l2ztic:hover{background-color:#f7f7f7;}}@media (min-width:1024px){.css-l2ztic{display:none;}}.css-19lv58h{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;-webkit-appearance:button;-moz-appearance:button;appearance:button;background-color:#fff;border:1px solid #ebebeb;color:#333;display:inline-block;font-size:11px;font-weight:500;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;line-height:13px;margin:0;padding:8px 9px;text-transform:uppercase;vertical-align:middle;display:none;}.css-19lv58h::-moz-focus-inner{padding:0;border:0;}.css-19lv58h:-moz-focusring{outline:1px dotted;}.css-19lv58h:disabled,.css-19lv58h.disabled{opacity:0.5;cursor:default;}.css-19lv58h:active,.css-19lv58h.active{background-color:#f7f7f7;}@media (min-width:740px){.css-19lv58h:hover{background-color:#f7f7f7;}}@media (min-width:1024px){.css-19lv58h{border:0;display:inline-block;margin-right:8px;}}.css-mgtjo2{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;}.css-mgtjo2::-moz-focus-inner{padding:0;border:0;}.css-mgtjo2:-moz-focusring{outline:1px dotted;}.css-mgtjo2:disabled,.css-mgtjo2.disabled{opacity:0.5;cursor:default;}.css-mgtjo2:active,.css-mgtjo2.active{background-color:#f7f7f7;}@media (min-width:740px){.css-mgtjo2:hover{background-color:#f7f7f7;}}.css-mgtjo2.activeSearchButton{background-color:#f7f7f7;}@media (min-width:1024px){.css-mgtjo2{padding:8px 9px 9px;}}.css-1wr3we4{display:none;}@media (min-width:1024px){.css-1wr3we4{display:block;position:absolute;left:105px;line-height:19px;top:10px;}}.css-y3sf94{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;position:absolute;right:10px;top:9px;}@media (min-width:1024px){.css-y3sf94{top:4px;}}@media print{.css-y3sf94{display:none;}}.css-1bnxwmn{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:#6288a5;border:1px solid #326891;color:#fff;font-size:11px;font-weight:700;-webkit-letter-spacing:0.05em;-moz-letter-spacing:0.05em;-ms-letter-spacing:0.05em;letter-spacing:0.05em;line-height:11px;padding:8px 9px 6px;text-transform:uppercase;}.css-1bnxwmn::-moz-focus-inner{padding:0;border:0;}.css-1bnxwmn:-moz-focusring{outline:1px dotted;}.css-1bnxwmn:disabled,.css-1bnxwmn.disabled{opacity:0.5;cursor:default;}@media (min-width:740px){.css-1bnxwmn:hover{background-color:#326891;}}@media (min-width:1024px){.css-1bnxwmn{padding:11px 12px 8px;}}.css-1bnxwmn:hover{border:1px solid #326891;}.css-1i8g3m4{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;display:block;}.css-1i8g3m4.hidden{opacity:0;visibility:hidden;}.css-1i8g3m4.hidden:focus{opacity:1;}.css-1i8g3m4::-moz-focus-inner{padding:0;border:0;}.css-1i8g3m4:-moz-focusring{outline:1px dotted;}.css-1i8g3m4:disabled,.css-1i8g3m4.disabled{opacity:0.5;cursor:default;}.css-1i8g3m4:active,.css-1i8g3m4.active{background-color:#f7f7f7;}@media (min-width:740px){.css-1i8g3m4:hover{background-color:#f7f7f7;}}@media (min-width:740px){.css-1i8g3m4{border:none;line-height:13px;padding:9px 9px 12px;}}@media (min-width:1024px){.css-1i8g3m4{display:none;}}@media (min-width:1150px){}.css-3qijnq{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:11px;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;padding:13px 20px 12px;}@media (min-width:740px){.css-3qijnq{position:relative;}}@media (min-width:1024px){.css-3qijnq{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;border:none;padding:0;height:0;-webkit-transform:translateY(42px);-ms-transform:translateY(42px);transform:translateY(42px);}}@media print{.css-3qijnq{display:none;}}.css-uqyvli{color:#121212;font-size:13px;font-family:nyt-franklin,helvetica,arial,sans-serif;display:none;width:auto;}@media (min-width:740px){.css-uqyvli{text-align:center;width:100%;}}@media (min-width:1024px){.css-uqyvli{font-size:12px;margin-bottom:10px;width:auto;}}.css-1uqjmks{color:#121212;font-size:12px;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;display:none;}@media (min-width:740px){.css-1uqjmks{margin:0;position:absolute;left:20px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0;}}@media (min-width:1024px){.css-1uqjmks{display:none;}}.css-1bvtpon{display:none;}@media (min-width:1024px){}.css-1vxca1d{position:relative;margin:0 auto;}@media (min-width:600px){.css-1vxca1d{margin:0 auto 20px;}}.css-1vxca1d .relatedcoverage + .recirculation{margin-top:20px;}.css-1vxca1d .wrap + .recirculation{margin-top:20px;}@media (min-width:1024px){.css-1vxca1d{padding-top:40px;}}.css-1ox9jel{margin:37px auto;margin-top:20px;margin-bottom:32px;}.css-1ox9jel strong{font-weight:700;}.css-1ox9jel em{font-style:italic;}.css-1ox9jel.sizeSmall{width:calc(100% - 40px);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}@media (min-width:600px){.css-1ox9jel.sizeSmall{max-width:600px;margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1ox9jel.sizeSmall{width:100%;}}@media (min-width:1440px){.css-1ox9jel.sizeSmall{max-width:600px;}}.css-1ox9jel.sizeSmall.sizeSmallNoCaption{display:block;}@media print{.css-1ox9jel.sizeSmall.sizeSmallNoCaption{display:none;}}.css-1ox9jel.sizeMedium{width:100%;max-width:600px;margin-right:auto;margin-left:auto;}@media (min-width:600px){.css-1ox9jel.sizeMedium{width:calc(100% - 40px);}}@media (min-width:740px){.css-1ox9jel.sizeMedium{max-width:600px;}}@media (min-width:1440px){.css-1ox9jel.sizeMedium{max-width:720px;}}@media (min-width:600px){.css-1ox9jel.sizeMedium.layoutVertical{width:420px;}}@media (min-width:1440px){.css-1ox9jel.sizeMedium.layoutVertical{width:480px;}}.css-1ox9jel.sizeMedium.layoutVertical.verticalVideo{width:calc(100% - 40px);}@media (min-width:600px){.css-1ox9jel.sizeMedium.layoutVertical.verticalVideo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:600px;}}@media (min-width:1440px){.css-1ox9jel.sizeMedium.layoutVertical.verticalVideo{width:600px;}}.css-1ox9jel.sizeLarge{width:100%;max-width:1200px;margin-left:auto;margin-right:auto;}@media (min-width:600px){.css-1ox9jel.sizeLarge{width:auto;}}@media (min-width:740px){.css-1ox9jel.sizeLarge.layoutVertical{width:600px;}.css-1ox9jel.sizeLarge.layoutVertical.verticalVideo{width:600px;}}@media (min-width:1024px){.css-1ox9jel.sizeLarge{width:945px;}}@media (min-width:1440px){.css-1ox9jel.sizeLarge{width:1200px;}.css-1ox9jel.sizeLarge.layoutVertical{width:720px;}.css-1ox9jel.sizeLarge.layoutVertical.verticalVideo{width:600px;}}@media (min-width:600px){.css-1ox9jel{margin:43px auto;}}@media print{.css-1ox9jel{display:none;}}@media (min-width:740px){.css-1ox9jel{margin-top:25px;}}.css-1riqqik{display:inline;color:#333;}.css-1riqqik span{-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration-color:#ccc;text-decoration-color:#ccc;}.css-1riqqik span:hover,.css-1riqqik span:focus{-webkit-text-decoration:none;text-decoration:none;}.css-2fg4z9{font-style:italic;}.css-11n4cex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:15px;margin-top:4px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:600px){.css-11n4cex{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-11n4cex{width:600px;}}.css-11n4cex .e6idgb70{font-size:14px;margin:0;}.css-1ifw933{font-style:normal;font-stretch:normal;margin-bottom:1.6rem;color:#333;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:300;-webkit-letter-spacing:0.005em;-moz-letter-spacing:0.005em;-ms-letter-spacing:0.005em;letter-spacing:0.005em;font-size:1.3125rem;line-height:1.6875rem;}@media (min-width:740px){.css-1ifw933{font-size:1.5rem;line-height:1.9375rem;}}.css-1rjmmt7{width:50px;vertical-align:bottom;margin-right:10px;}.css-rqb9bm{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;color:#333;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.875rem;line-height:1.125rem;margin-bottom:1rem;}.css-19hdyf3{font-family:nyt-franklin,helvetica,arial,sans-serif;color:#333;font-size:0.9375rem;line-height:1.25rem;font-family:nyt-franklin,helvetica,arial,sans-serif;color:#333;font-size:0.9375rem;line-height:1.25rem;}.css-19hdyf3 p{margin-bottom:0.75rem;}.css-19hdyf3 a,.css-19hdyf3 a:visited{color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-19hdyf3 a:hover,.css-19hdyf3 a:focus{color:#326891;-webkit-text-decoration:none;text-decoration:none;}@media print{.css-19hdyf3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:740px){.css-19hdyf3{font-size:1rem;line-height:1.375rem;}}.css-19hdyf3 p{margin-bottom:0.75rem;}.css-19hdyf3 a,.css-19hdyf3 a:visited{color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-19hdyf3 a:hover,.css-19hdyf3 a:focus{color:#326891;-webkit-text-decoration:none;text-decoration:none;}@media print{.css-19hdyf3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-15g2oxy{margin-top:1rem;}.css-2b3w4o{margin-bottom:1rem;}.css-2b3w4o .e16638kd0{margin-top:5px;margin-bottom:0;display:inline-block;color:#999;font-size:0.75rem;line-height:1.0625rem;}.css-2b3w4o:hover .e16ij5yr2,.css-2b3w4o:visited .e16ij5yr2{color:#666;}.css-2b3w4o .css-1g7m0tk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:100px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-14b9hti{font-weight:500;color:#a19d9d;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-size:1.125rem;line-height:1.375rem;}@media (min-width:740px){.css-14b9hti{font-size:1.1875rem;line-height:1.4375rem;}}.css-1j8dw05{margin-right:10px;display:inline;font-weight:500;color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-size:1.125rem;line-height:1.375rem;}@media (min-width:740px){.css-1j8dw05{font-size:1.1875rem;line-height:1.4375rem;}}.css-1vm5oi9{margin-left:10px;width:120px;min-width:120px;}@media (min-width:740px){.css-1vm5oi9{width:165px;min-width:165px;}}.css-32rbo2{width:100%;min-width:120px;}.css-llk6mt{margin-top:5px;}@media (min-width:740px){.css-llk6mt{margin-top:45px;margin-bottom:0;}}.css-llk6mt .e6idgb70{margin-top:1.875rem;color:#121212;font-weight:700;line-height:0.75rem;margin-bottom:0.625rem;}@media print{.css-llk6mt .e6idgb70{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-llk6mt .e1h9rw200{margin-bottom:16px;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;margin-top:0;}@media (min-width:600px){.css-llk6mt .e1h9rw200{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .e1h9rw200{width:600px;}}@media (min-width:740px){.css-llk6mt .e1h9rw200{max-width:none;margin-left:calc((100% - 600px) / 2);margin-right:auto;position:relative;width:660px;}}.css-llk6mt .euiyums3 .e6idgb70{margin:0;}.css-llk6mt .e1wiw3jv0{color:#333;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:600px){.css-llk6mt .e1wiw3jv0{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .e1wiw3jv0{width:600px;}}.css-llk6mt .e16638kd0{width:auto;margin-bottom:0;margin-left:0;display:inline-block;margin-top:0;margin-bottom:0;width:auto;}.css-llk6mt .eatfx1z0{margin-right:15px;font-weight:700;font-size:14px;line-height:1;}.css-llk6mt .section-kicker .opinion-bar{font-size:25px;}.css-llk6mt .epjyd6m0{margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:600px){.css-llk6mt .epjyd6m0{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .epjyd6m0{width:600px;}}.css-llk6mt .e1g7ppur0{margin-bottom:32px;margin-top:20px;}@media (min-width:740px){.css-llk6mt .e1g7ppur0{margin-top:25px;}}@media (min-width:1024px){.css-llk6mt .e1g7ppur0{margin-bottom:43px;}}.css-llk6mt .e1q76eii0{margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;max-width:600px;}@media (min-width:600px){.css-llk6mt .e1q76eii0{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .e1q76eii0{width:600px;}}.css-llk6mt .euiyums1{margin-bottom:20px;color:#121212;}@media print{.css-llk6mt .euiyums1{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1s4ffep{color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:700;font-style:italic;font-size:1.9375rem;line-height:2.25rem;text-align:left;}@media (min-width:740px){.css-1s4ffep{font-size:2.5rem;line-height:3rem;}}.css-pdw9fk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;width:100%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}@media (min-width:1024px){.css-pdw9fk{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}.css-pdw9fk > img,.css-pdw9fk a > img,.css-pdw9fk div > img{margin-right:10px;}.css-1txwxcy{min-width:100px;display:block;width:100%;margin-bottom:10px;margin-left:-3px;}@media (min-width:1024px){.css-1txwxcy{display:inline-block;width:auto;margin-bottom:0;}}.css-1soubk3{margin:0.5rem 0 1.5rem;padding-top:1rem;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}.css-1soubk3:before{content:'';display:block;width:100%;margin-bottom:0.5rem;border-bottom:1px solid #e2e2e2;}.css-1soubk3:after{content:'';display:block;width:100%;margin-top:0.5rem;border-bottom:1px solid #e2e2e2;}.css-1soubk3 .e16ij5yr6{border-top:none;}@media (min-width:600px){.css-1soubk3{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1soubk3{width:600px;}}@media (min-width:1440px){.css-1soubk3{width:600px;max-width:600px;}}@media print{.css-1soubk3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}</style>
+
+
+
+ <style>[data-timezone] { display: none }</style>
+
+ </head>
+ <body>
+ <div id="app"><div class="css-v89234" role="main"><div class=""><div><div class="css-ulr03x e1suatyy0"><header class="css-1bymuyk e1suatyy1"><section class="css-1waixk9 e1suatyy2"><div class="css-1f7ibof er09x8g0"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="Sections Navigation &amp; Search" class="er09x8g1 css-l2ztic" data-testid="nav-button"><svg class="css-1fe7a5q" viewBox="0 0 16 16"><rect x="1" y="3" fill="#333333" width="14" height="2"></rect><rect x="1" y="7" fill="#333333" width="14" height="2"></rect><rect x="1" y="11" fill="#333333" width="14" height="2"></rect></svg></button></div><button id="desktop-sections-button" aria-label="Sections Navigation" class="css-19lv58h er09x8g2"><span class="css-vz7hjd">Sections</span><svg class="css-1fe7a5q" viewBox="0 0 16 16"><rect x="1" y="3" fill="#333333" width="14" height="2"></rect><rect x="1" y="7" fill="#333333" width="14" height="2"></rect><rect x="1" y="11" fill="#333333" width="14" height="2"></rect></svg></button><div class="css-10488qs"><button class="css-mgtjo2 ewfai8r0" data-test-id="search-button"><span class="css-vz7hjd">SEARCH</span><svg class="css-1fe7a5q" viewBox="0 0 16 16"><path fill="#333" d="M11.3,9.2C11.7,8.4,12,7.5,12,6.5C12,3.5,9.5,1,6.5,1S1,3.5,1,6.5S3.5,12,6.5,12c1,0,1.9-0.3,2.7-0.7l3.3,3.3c0.3,0.3,0.7,0.4,1.1,0.4s0.8-0.1,1.1-0.4c0.6-0.6,0.6-1.5,0-2.1L11.3,9.2zM6.5,10.3c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8c2.1,0,3.8,1.7,3.8,3.8C10.3,8.6,8.6,10.3,6.5,10.3z"></path></svg></button></div><a class="css-1rn5q1r" href="#site-content">Skip to content</a><a class="css-1rn5q1r" href="#site-index">Skip to site index</a></div><div class="css-1wr3we4 eaxe0e00"><a href="https://www.nytimes.com/section/nyregion" class="css-nuvmzp">New York</a></div><div class="css-10698na e1huz5gh0"><a aria-label="New York Times Logo. Click to visit the homepage" class="css-nhjhh0 e1huz5gh1" href="/"><svg xmlns="http://www.w3.org/2000/svg" class="" viewBox="0 0 184 25" fill="#000"><path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a></div><div class="css-y3sf94 ez4a0qj1"><a href="https://myaccount.nytimes.com/auth/login?response_type=cookie&amp;client_id=vi" class="css-1kj7lfb"><button class="css-1bnxwmn ez4a0qj0" data-testid="login-button">Log In</button></a><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="User Settings" class="ez4a0qj4 css-1i8g3m4" data-testid="user-settings-button"><svg class="css-10m9xeu" viewBox="0 0 16 16" fill="#333"><path d="M8,10c-2.5,0-7,1.1-7,3.5V16h14v-2.5C15,11.1,10.5,10,8,10z"></path><circle cx="8" cy="4" r="4"></circle></svg></button></div></div></section><section class="hasLinks css-3qijnq e1csuq9d3"><div class="css-uqyvli e1csuq9d0"></div><div class="css-1uqjmks e1csuq9d1"></div><div class="css-9e9ivx"><a href="https://myaccount.nytimes.com/auth/login?response_type=cookie&amp;client_id=vi" class="css-1gz70xg">Log In</a></div><div class="css-1bvtpon e1csuq9d2"><a href="https://www.nytimes.com/section/todayspaper" class="css-2bwtzy">Today’s Paper</a></div></section></header></div></div><div aria-hidden="false"><main id="site-content"><div><div class="css-4g4cvq" style="opacity:0.000000001;z-index:-1;visibility:hidden"><div class="css-m6xlts"><div class="css-1ahhg7f"><span class="css-17xtcya"><a href="/section/nyregion">New York</a></span><span class="css-x15j1o">|</span><span class="css-fwqvlz">She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.</span></div><div class="css-k008qs"><div class="css-1iwv8en"><a href="/"><svg class="css-1ri25x2" viewBox="0 0 16 22"><path d="M15.863 13.08c-.687 1.818-1.923 3.147-3.64 3.916v-3.917l2.129-1.958-2.129-1.889V6.505c1.923-.14 3.228-1.609 3.228-3.358C15.45.84 13.32 0 12.086 0c-.275 0-.55 0-.962.14v.14h.481c.824 0 1.51.42 1.51 1.189 0 .63-.48 1.189-1.304 1.189-2.129 0-4.6-1.749-7.279-1.749C2.13.91.481 2.728.481 4.546c0 1.819 1.03 2.448 2.128 2.798v-.14c-.343-.21-.618-.63-.618-1.189 0-.84.756-1.469 1.648-1.469 2.267 0 5.906 1.959 8.172 1.959h.206v2.727l-2.129 1.889 2.13 1.958v3.987c-.894.35-1.786.49-2.748.49-3.502 0-5.768-2.169-5.768-5.806 0-.839.137-1.678.344-2.518l1.785-.769v7.973l3.57-1.608V6.575L3.984 8.953c.55-1.61 1.648-2.728 2.953-3.358v-.07C3.433 6.295 0 9.023 0 13.08c0 4.686 3.914 7.974 8.446 7.974 4.807 0 7.485-3.288 7.554-7.974h-.137z" fill="#000"></path></svg></a><span class="css-1hfdzay"><div><a href="/" aria-label="New York Times Logo. Click to visit the homepage"><svg xmlns="http://www.w3.org/2000/svg" class="css-12fr9lp" viewBox="0 0 184 25" fill="#000"><path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a></div></span></div><div class="css-1705lsu"><div class=""><div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-4skfbu" data-testid="share-tools"><ul class="css-y8aj3r"><li class="css-1fcn4th"><a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html&amp;smid=fb-share&amp;name=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-13zu7ev" viewBox="0 0 7 15" width="7" height="15"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a></li><li class="css-1fcn4th"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2GEzuZ8&amp;text=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewBox="0 0 13 10" class="css-13zu7ev" width="13" height="10"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a></li><li class="css-1fcn4th"><a href="mailto:?subject=NYTimes.com%3A%20She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AShe%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.%0A%0AWith%20little%20oversight%2C%20the%20N.Y.P.D.%20has%20been%20using%20powerful%20surveillance%20technology%20on%20photos%20of%20children%20and%20teenagers.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewBox="0 0 15 9" class="css-13zu7ev" width="15" height="9"><path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a></li><li class="css-1fcn4th"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-f7l8cz" viewBox="0 0 16 13" width="16" height="13"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button></div></li><li class="css-60hakz"></li><li class="css-l72opv"></li></ul></div></div></div></div></div></div><meta itemProp="isAccessibleForFree" content="false"/><span itemProp="isPartOf" itemscope="" itemType="http://schema.org/CreativeWork http://schema.org/Product"><meta itemProp="name" content="The New York Times"/><meta itemProp="productID" content="nytimes.com:basic"/></span><article id="story" class="css-1vxca1d e1qksbhf0"><div id="top-wrapper" class="css-1sy8kpn"><div id="top-slug" class="css-l9onyx"><p>Advertisement</p></div><div class="ad top-wrapper" style="text-align:center;height:100%;display:block;min-height:250px"><div id="top" class="place-ad" data-position="top"></div></div></div><span itemProp="hasPart" itemscope="" itemType="http://schema.org/WebPageElement"><meta itemProp="isAccessibleForFree" content="False"/><meta itemProp="cssSelector" content=".meteredContent"/></span><div><header class="css-llk6mt euiyums4"><div id="sponsor-wrapper" class="css-1hyfx7x"><div id="sponsor-slug" class="css-19vbshk"><p>Supported by</p></div><div class="ad sponsor-wrapper" style="text-align:center;height:100%;display:block"><div id="sponsor" class="" data-position="sponsor"></div></div></div><div class="css-11n4cex euiyums3"></div><div class="css-1vkm6nb ehdk2mb0"><h1 itemProp="headline" class="css-1s4ffep e1h9rw200" id="link-2df79d6c"><span>She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.</span></h1></div><p class="css-1ifw933 e1wiw3jv0">With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.</p><div class="css-79elbk" data-testid="photoviewer-wrapper"><div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div><div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r15"><figure class="sizeMedium layoutVertical css-1ox9jel" aria-label="media" role="group" itemscope="" itemProp="associatedMedia" itemID="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=90&amp;auto=webp" itemType="http://schema.org/ImageObject"><div class="css-bsn42l"><span class="css-1dv1kvn">Image</span><img alt="“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14." class="css-11cwn6f" src="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcSet="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg?quality=90&amp;auto=webp 683w,https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg?quality=90&amp;auto=webp 1366w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 60vw, 100vw" itemProp="url" itemID="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale"/></div><figcaption itemProp="caption description" class="css-17ai7jg emkp2hg0"><span aria-hidden="true" class="css-8i9d0s e13ogyst0">“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14.</span><span itemProp="copyrightHolder" class="emkp2hg2 css-1nwzsjy e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span><span class="css-1dv1kvn">Credit</span><span>Sarah Blesener for The New York Times</span></span></span></figcaption></figure></div></div><div class="css-acwcvw epjyd6m0"><div class="css-pdw9fk epjyd6m1"><div class="css-1txwxcy ey68jwv0"><a href="https://www.nytimes.com/by/joseph-goldstein" class="css-uwwqev"><img alt="Joseph Goldstein" title="Joseph Goldstein" src="https://static01.nyt.com/images/2018/07/16/multimedia/author-joseph-goldstein/author-joseph-goldstein-thumbLarge.png" class="css-1rjmmt7 ey68jwv2"/></a><a href="https://www.nytimes.com/by/ali-watkins" class="css-uwwqev"><img alt="Ali Watkins" title="Ali Watkins" src="https://static01.nyt.com/images/2019/02/20/multimedia/author-ali-watkins/author-ali-watkins-thumbLarge.png" class="css-1rjmmt7 ey68jwv2"/></a></div><div class="css-1baulvz"><p class="css-1nuro5j e1jsehar1" itemProp="author" itemscope="" itemType="http://schema.org/Person">By<!-- --> <a href="https://www.nytimes.com/by/joseph-goldstein" class="css-1riqqik e1jsehar0"><span class="css-1baulvz" itemProp="name">Joseph Goldstein</span></a> and <a href="https://www.nytimes.com/by/ali-watkins" class="css-1riqqik e1jsehar0"><span class="css-1baulvz last-byline" itemProp="name">Ali Watkins</span></a></p></div></div><ul class="css-1w5cs23 epjyd6m2"><li><time class="css-rqb9bm e16638kd0" dateTime="2019-08-01">Aug 1, 2019</time></li><li class="css-6n7j50"><div class=""><div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-d8bdto" data-testid="share-tools"><ul class="css-y8aj3r"><li class="css-60hakz"><a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html&amp;smid=fb-share&amp;name=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-4brsb6" viewBox="0 0 7 15" width="7" height="15"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a></li><li class="css-60hakz"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2GEzuZ8&amp;text=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewBox="0 0 13 10" class="css-4brsb6" width="13" height="10"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a></li><li class="css-60hakz"><a href="mailto:?subject=NYTimes.com%3A%20She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AShe%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.%0A%0AWith%20little%20oversight%2C%20the%20N.Y.P.D.%20has%20been%20using%20powerful%20surveillance%20technology%20on%20photos%20of%20children%20and%20teenagers.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewBox="0 0 15 9" class="css-4brsb6" width="15" height="9"><path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a></li><li class="css-60hakz"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-uhuo44" viewBox="0 0 16 13" width="16" height="13"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button></div></li><li class="css-60hakz"></li><li class="css-l72opv"></li></ul></div></div></li></ul></div></header></div><section name="articleBody" itemProp="articleBody" class="meteredContent css-1i2y565"><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0"><em class="css-2fg4z9 e1gzwzxm0">[What you need to know to start the day: </em><a class="css-1g7m0tk" href="https://www.nytimes.com/newsletters/newyorktoday?module=inline" title=""><em class="css-2fg4z9 e1gzwzxm0">Get New York Today in your inbox</em></a><em class="css-2fg4z9 e1gzwzxm0">.]</em></p><p class="css-exrw3m evys1bk0">The New York Police Department has been loading <!-- -->thousands of arrest photos of children and teenagers<!-- --> into a facial recognition database despite evidence the technology has a higher risk of false matches in younger faces. </p><p class="css-exrw3m evys1bk0">For about four years, internal records show, the department has used the technology to compare crime scene images with its collection of juvenile mug <!-- -->shots<!-- -->, the photos that are taken at an arrest. Most of the photos are of teenagers, largely 13 to 16 years old, but children as young as 11 have been included. </p><p class="css-exrw3m evys1bk0">Elected officials and civil rights groups said the disclosure that the city was deploying a powerful surveillance tool on adolescents — whose privacy seems sacrosanct and whose status is protected in the criminal justice system — was a striking example of the Police Department’s ability to adopt advancing technology with little public scrutiny.</p><p class="css-exrw3m evys1bk0">Several members of the City Council as well as a range of civil liberties groups said they were unaware of the policy until they were contacted by The New York Times. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">Police <!-- -->Department officials defended the decision, <!-- -->saying it was just the latest evolution of a longstanding policing technique: using arrest photos to identify suspects.</p><p class="css-exrw3m evys1bk0">“I don’t think this is any secret decision that’s made behind closed doors,” the city’s chief of detectives, Dermot F. Shea, said in an interview. “This is just process, and making sure we’re doing everything to fight crime.” </p><p class="css-exrw3m evys1bk0">Other cities have begun to debate whether law enforcement should use facial recognition, which relies on an algorithm to quickly pore through images and suggest matches. In May, <a class="css-1g7m0tk" href="https://www.nytimes.com/2019/05/14/us/facial-recognition-ban-san-francisco.html?module=inline" title="">San Francisco blocked city agencies, including the police</a>, from using the tool amid unease about potential government <!-- -->abuse<!-- -->. <a class="css-1g7m0tk" href="https://www.nytimes.com/2019/07/08/us/detroit-facial-recognition-cameras.html?module=inline" title="">Detroit is facing public resistance to a technology </a>that has been shown to have lower accuracy with people with darker skin. </p><p class="css-exrw3m evys1bk0">In New York, the state Education Department recently told the Lockport, N.Y., <!-- -->school district to delay a plan to use facial recognition on students, citing privacy concerns. </p><p class="css-exrw3m evys1bk0">“At the end <!-- -->of the day, it should be banned — no young people,” said <!-- -->Councilman Donovan Richards<!-- -->, a Queens Democrat who heads the Public Safety Committee, which oversees the Police Department. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">The department said its legal bureau had approved using facial recognition on juveniles. <a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/09/opinion/facial-recognition-police-new-york-city.html?module=inline" title="">The algorithm may suggest a lead, but detectives would not make an arrest based solely on </a><a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/09/opinion/facial-recognition-police-new-york-city.html?module=inline" title="">that</a>, Chief Shea said.</p></div><aside class="css-o6xoe7"></aside></div><div class="css-79elbk" data-testid="photoviewer-wrapper"><div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div><div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r15"><figure class="css-jcw7oy e1g7ppur0" aria-label="media" role="group" itemProp="associatedMedia" itemscope="" itemID="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=90&amp;auto=webp" itemType="http://schema.org/ImageObject"><div class="css-1xdhyk6 erfvjey0"><span class="css-1ly73wi e1tej78p0">Image</span><img alt="Dermot Shea, the city&amp;rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match." class="css-1m50asq" src="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcSet="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg?quality=90&amp;auto=webp 1024w,https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg?quality=90&amp;auto=webp 2048w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 60vw, 100vw" itemProp="url" itemID="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale"/></div><figcaption itemProp="caption description" class="css-1l44abu e1xdpqjp0"><span aria-hidden="true" class="css-8i9d0s e13ogyst0">Dermot Shea, the city&rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match.</span><span itemProp="copyrightHolder" class="css-vuqh7u e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span>Chang W. Lee/The New York Times</span></span></figcaption></figure></div></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">Still, facial recognition has not been widely tested on children. Most algorithms are taught to “think” based on adult faces, and there is growing evidence that they do not work as well on children. </p><p class="css-exrw3m evys1bk0">The National Institute of Standards and Technology<!-- -->, which is part of the Commerce Department and <a class="css-1g7m0tk" href="https://nvlpubs.nist.gov/nistpubs/ir/2018/NIST.IR.8238.pdf" title="" rel="noopener noreferrer" target="_blank">evaluates facial recognition </a><a class="css-1g7m0tk" href="https://nvlpubs.nist.gov/nistpubs/ir/2018/NIST.IR.8238.pdf" title="" rel="noopener noreferrer" target="_blank">algorithms</a> for accuracy, recently found the <!-- -->vast majority of more than 100 <!-- -->facial recognition <!-- -->algorithms had a higher rate of mistaken matches among children. The <!-- -->e<!-- -->rror rate was most pronounced in young children but was also seen in those aged 10 to 16.</p><p class="css-exrw3m evys1bk0">Aging poses another problem:<!-- --> The appearance of children and adolescents can change <!-- --> drastically as bones stretch and shift, altering the underlying facial structure. </p><p class="css-exrw3m evys1bk0">“I would use extreme caution in using those algorithms,” said <!-- -->Karl Ricanek Jr.<!-- -->, a computer science professor and <!-- -->co-founder of the Face Aging Group at the University of North Carolina-<!-- -->Wilmington<!-- -->. </p><p class="css-exrw3m evys1bk0">Technology that can match an image of a younger teenager to a recent arrest photo may be less effective at finding the same person even one or two years later, he said. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0"> “The systems do not have the capacity to understand the dynamic changes that occur to a child’s face,” Dr. Ricanek said. </p><p class="css-exrw3m evys1bk0">Idemia<!-- --> and <!-- -->DataWorks Plus<!-- -->, the two companies that provide facial recognition software to the Police Department, did not respond to requests for comment. </p><p class="css-exrw3m evys1bk0">The New York Police Department can take arrest photos of minors as young as <!-- -->11<!-- --> who are charged with a felony, depending on the severity of the charge. </p><p class="css-exrw3m evys1bk0">And in many cases, the department keeps the photos for years, making facial recognition comparisons to what may have effectively become outdated images. There are photos of 5,500 individuals in the juvenile database, 4,100 of whom are no longer 16 or under, the department said. Teenagers 17 and older are considered adults in the criminal justice system. </p><p class="css-exrw3m evys1bk0">Police officials declined to provide statistics on how often their facial recognition systems provide false matches, or to explain how they evaluate the system’s effectiveness.</p><p class="css-exrw3m evys1bk0">“We are comfortable with this technology because it has proved to be a valuable investigative method,” Chief Shea said. Facial recognition has helped lead to thousands of arrests of both adults and juveniles, the department has said. </p><p class="css-exrw3m evys1bk0">Mayor Bill de Blasio had been aware the department was using the technology on minors, said Freddi Goldstein, a spokeswoman for the mayor. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">She said the Police Department followed “strict guidelines” in applying the technology and City Hall monitored the agency’s compliance with the policies. </p><p class="css-exrw3m evys1bk0">The Times learned details of the department’s use of facial recognition by reviewing documents posted online earlier this year by <a class="css-1g7m0tk" href="https://www.flawedfacedata.com/#footnote5" title="" rel="noopener noreferrer" target="_blank">Clare Garvie, a senior associate</a><a class="css-1g7m0tk" href="https://www.flawedfacedata.com/#footnote5" title="" rel="noopener noreferrer" target="_blank"> at the Center on Privacy and Technology at Georgetown Law</a>. Ms. Garvie received the documents as part of an open records lawsuit. </p><p class="css-exrw3m evys1bk0">It could not be determined whether other large police departments used facial recognition with juveniles because very few have written policies governing the use of the technology, Ms. Garvie said. </p><p class="css-exrw3m evys1bk0">New York detectives rely on a vast network<!-- --> of surveillance cameras throughout the city to provide images of people believed to have committed a crime. Since 2011, the department has had a dedicated unit of officers who use facial recognition to compare those images against millions of photos, usually mug shots. The software proposes matches, which have led to thousands of arrests, the department said. </p><p class="css-exrw3m evys1bk0">By 2013, top police officials were meeting to discuss including juveniles in the program, the documents reviewed by The Times showed. </p><p class="css-exrw3m evys1bk0">The documents showed that the juvenile database had been integrated into the system by 2015. </p><p class="css-exrw3m evys1bk0">“We have these photos. It makes sense,” Chief Shea said in the interview. </p><p class="css-exrw3m evys1bk0">State law requires that arrest photos be destroyed if the case is resolved in the juvenile’s favor, or if the child is found to have committed only a misdemeanor, rather than a felony. The photos also must be destroyed if a person reaches age 21 without a criminal record. <!-- --> </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">When children are charged with crimes, the court system usually takes some steps to prevent their acts from defining them in later years. Children who are 16 and under, for instance, are generally sent to Family Court, where records are not public. </p><p class="css-exrw3m evys1bk0">Yet including their photos in a facial recognition database runs the risk that an imperfect algorithm identifies them as possible suspects in later crimes, civil rights advocates said. A mistaken match could lead investigators to focus on the wrong person from the outset, they said. </p><p class="css-exrw3m evys1bk0">“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, a 17-year-old Brooklyn girl who had admitted guilt in Family Court to a group attack that happened when she was 14. She said she was present at the attack but did not participate. </p><p class="css-exrw3m evys1bk0">Bailey, who asked that she be identified only by her <!-- -->last name<!-- --> because she did not want her juvenile arrest to be public, has not been arrested again and is now a student at John Jay College of Criminal Justice. </p><p class="css-exrw3m evys1bk0">R<!-- -->ecent studies indicate that people of color, as well as children and women, have a greater risk of misidentification than their counterparts, sai<!-- -->d <!-- -->Joy Buolamwini<!-- -->, <!-- -->the founder of the Algorithmic Justice League and graduate researcher at the M.I.T. Media Lab<!-- -->, who has examined how human biases are built into artificial intelligence. </p><p class="css-exrw3m evys1bk0">The racial disparities in the juvenile justice system are stark: In New York, black and Latino juveniles were charged with crimes at far higher rates than whites in 2017, the most recent year for which numbers were available. Black juveniles outnumbered white juveniles <a class="css-1g7m0tk" href="https://www.criminaljustice.ny.gov/crimnet/ojsa/jj-reports/newyorkcity.pdf" title="" rel="noopener noreferrer" target="_blank">more than 15 to 1</a>.</p><p class="css-exrw3m evys1bk0">“If the facial recognition algorithm has a negative bias toward a black population, that will get magnified more toward children,” Dr. Ricanek said, adding that in terms of diminished accuracy, “you’re now putting yourself in unknown territory.”</p></div><aside class="css-o6xoe7"></aside></div><div class="css-1soubk3 epkadsg3"><div class="css-15g2oxy epkadsg2"><div class="css-2b3w4o e16ij5yr6"><a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/09/opinion/facial-recognition-police-new-york-city.html?action=click&amp;module=RelatedLinks&amp;pgtype=Article"><div class="css-i9gxme e16ij5yr4"><div class="css-14b9hti e16ij5yr5">Opinion | James O’Neill</div><div class="css-1j8dw05 e16ij5yr2">How Facial Recognition Makes You Safer</div><time class="css-rqb9bm e16638kd0" dateTime="2019-06-09">Jun 9, 2019</time></div><div class="css-1vm5oi9 e16ij5yr0"><img src="https://static01.nyt.com/images/2019/06/07/opinion/sunday/07Oneill/07Oneill-threeByTwoSmallAt2X.jpg" class="css-32rbo2 e16ij5yr1"/></div></a></div><div class="css-2b3w4o e16ij5yr6"><a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/07/opinion/lockport-facial-recognition-schools.html?action=click&amp;module=RelatedLinks&amp;pgtype=Article"><div class="css-i9gxme e16ij5yr4"><div class="css-14b9hti e16ij5yr5">Opinion | Jim Shultz</div><div class="css-1j8dw05 e16ij5yr2">Spying on Children Won’t Keep Them Safe</div><time class="css-rqb9bm e16638kd0" dateTime="2019-06-07">Jun 7, 2019</time></div><div class="css-1vm5oi9 e16ij5yr0"><img src="https://static01.nyt.com/images/2019/06/07/opinion/07shultz-privacy/07shultz-privacy-threeByTwoSmallAt2X.jpg" class="css-32rbo2 e16ij5yr1"/></div></a></div></div></div></section><div class="bottom-of-article"><div class="css-1ubp8k9"></div><div class="css-wg1cha"><div class="css-19hdyf3 e1e7j8ap0"><div><p>Joseph Goldstein writes about policing and the criminal justice system. He has been a reporter at The Times since 2011, and is based in New York. He also worked for a year in the Kabul bureau, reporting on Afghanistan. <span class="css-4w91ra"> <a href="https://twitter.com/JoeKGoldstein" class="css-1rj8to8" rel="noopener noreferrer" target="_blank"><span class="css-0">@</span>JoeKGoldstein</a> </span></p></div></div><div class="css-19hdyf3 e1e7j8ap0"><div><p>Ali Watkins is a reporter on the Metro Desk, covering courts and social services. Previously, she covered national security in Washington for The Times, BuzzFeed and McClatchy Newspapers. <span class="css-4w91ra"> <a href="https://twitter.com/AliWatkins" class="css-1rj8to8" rel="noopener noreferrer" target="_blank"><span class="css-0">@</span>AliWatkins</a> </span></p></div></div></div><div class="css-vdv0al">A version of this article appears in print on <!-- -->, Section <!-- -->A<!-- -->, Page <!-- -->1<!-- --> of the New York edition<!-- --> with the headline: <!-- -->In New York, Police Computers Scan Faces, Some as Young as 11<span>. <a href="http://www.nytreprints.com/">Order Reprints</a> | <a href="http://www.nytimes.com/pages/todayspaper/index.html">Today’s Paper</a> | <a href="https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY">Subscribe</a></span></div><div class="css-i29ckm"><div class="css-10raysz"></div><div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-d8bdto" data-testid="share-tools"><ul class="css-y8aj3r"><li class="css-ar1l6a"><a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html&amp;smid=fb-share&amp;name=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-4brsb6" viewBox="0 0 7 15" width="7" height="15"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a></li><li class="css-ar1l6a"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2GEzuZ8&amp;text=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewBox="0 0 13 10" class="css-4brsb6" width="13" height="10"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a></li><li class="css-ar1l6a"><a href="mailto:?subject=NYTimes.com%3A%20She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AShe%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.%0A%0AWith%20little%20oversight%2C%20the%20N.Y.P.D.%20has%20been%20using%20powerful%20surveillance%20technology%20on%20photos%20of%20children%20and%20teenagers.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewBox="0 0 15 9" class="css-4brsb6" width="15" height="9"><path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a></li><li class="css-ar1l6a"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-uhuo44" viewBox="0 0 16 13" width="16" height="13"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button></div></li></ul></div></div></div><div></div><div><div id="bottom-wrapper" class="css-1ede5it"><div id="bottom-slug" class="css-l9onyx"><p>Advertisement</p></div><div class="ad bottom-wrapper" style="text-align:center;height:100%;display:block;min-height:90px"><div id="bottom" class="" data-position="bottom"></div></div></div></div></article></div></main><nav class="css-1ropbjl" id="site-index" aria-labelledby="site-index-label" data-testid="site-index"><div class="css-uw59u"><header class="css-jxzr5i" data-testid="site-index-header"><h2 class="css-vz7hjd" id="site-index-label">Site Index</h2><a href="/"><svg xmlns="http://www.w3.org/2000/svg" class="css-oylsik" viewBox="0 0 184 25" fill="#000"><path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a><div class="css-1otr2jl" data-testid="go-to-homepage"><a class="css-1c8n994" href="/">Go to Home Page »</a></div></header><div class="css-qtw155" data-testid="site-index-accordion"><div class=" " role="tablist" aria-multiselectable="true" data-testid="accordion"><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-0" id="item-siteindex-0" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">news</header><div class="css-1hyfx7x" id="body-siteindex-0" aria-labelledby="item-siteindex-0" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com" data-testid="accordion-item-list-link">home page</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/world" data-testid="accordion-item-list-link">world</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/us" data-testid="accordion-item-list-link">U.S.</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/politics" data-testid="accordion-item-list-link">politics</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/news-event/2020-election" data-testid="accordion-item-list-link">Election 2020</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/nyregion" data-testid="accordion-item-list-link">New York</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/business" data-testid="accordion-item-list-link">business</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/technology" data-testid="accordion-item-list-link">tech</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/science" data-testid="accordion-item-list-link">science</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://www.nytimes.com/section/climate" data-testid="accordion-item-list-link">climate</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/sports" data-testid="accordion-item-list-link">sports</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/obituaries" data-testid="accordion-item-list-link">obituaries</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://www.nytimes.com/section/upshot" data-testid="accordion-item-list-link">the upshot</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/todayspaper" data-testid="accordion-item-list-link">today&#x27;s paper</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/corrections" data-testid="accordion-item-list-link">corrections</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-1" id="item-siteindex-1" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">opinion</header><div class="css-1hyfx7x" id="body-siteindex-1" aria-labelledby="item-siteindex-1" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion" data-testid="accordion-item-list-link">today&#x27;s opinion</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/columnists" data-testid="accordion-item-list-link">op-ed columnists</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/editorials" data-testid="accordion-item-list-link">editorials</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/contributors" data-testid="accordion-item-list-link">op-ed Contributors</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/letters" data-testid="accordion-item-list-link">letters</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/sunday" data-testid="accordion-item-list-link">sunday review</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/video/opinion" data-testid="accordion-item-list-link">video: opinion</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-2" id="item-siteindex-2" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">arts</header><div class="css-1hyfx7x" id="body-siteindex-2" aria-labelledby="item-siteindex-2" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts" data-testid="accordion-item-list-link">today&#x27;s arts</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/design" data-testid="accordion-item-list-link">art &amp; design</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/books" data-testid="accordion-item-list-link">books</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/dance" data-testid="accordion-item-list-link">dance</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/movies" data-testid="accordion-item-list-link">movies</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/music" data-testid="accordion-item-list-link">music</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/spotlight/pop-culture" data-testid="accordion-item-list-link">Pop Culture</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/television" data-testid="accordion-item-list-link">television</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/theater" data-testid="accordion-item-list-link">theater</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://www.nytimes.com/watching" data-testid="accordion-item-list-link">watching</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/video/arts" data-testid="accordion-item-list-link">video: arts</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-3" id="item-siteindex-3" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">living</header><div class="css-1hyfx7x" id="body-siteindex-3" aria-labelledby="item-siteindex-3" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/automobiles" data-testid="accordion-item-list-link">automobiles</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://cooking.nytimes.com/" data-testid="accordion-item-list-link">Cooking</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/crosswords" data-testid="accordion-item-list-link">crossword</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/education" data-testid="accordion-item-list-link">education</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/food" data-testid="accordion-item-list-link">food</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/health" data-testid="accordion-item-list-link">health</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/jobs" data-testid="accordion-item-list-link">jobs</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/magazine" data-testid="accordion-item-list-link">magazine</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://parenting.nytimes.com/" data-testid="accordion-item-list-link">parenting</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/realestate" data-testid="accordion-item-list-link">real estate</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/style" data-testid="accordion-item-list-link">style</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/t-magazine" data-testid="accordion-item-list-link">t magazine</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/travel" data-testid="accordion-item-list-link">travel</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/fashion/weddings" data-testid="accordion-item-list-link">love</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-4" id="item-siteindex-4" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">listings &amp; more</header><div class="css-1hyfx7x" id="body-siteindex-4" aria-labelledby="item-siteindex-4" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/reader-center" data-testid="accordion-item-list-link">Reader Center</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://thewirecutter.com" data-testid="accordion-item-list-link">Wirecutter</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="http://nytconferences.com/" data-testid="accordion-item-list-link">Live Events</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/learning" data-testid="accordion-item-list-link">The Learning Network</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="http://www.nytimes.com/marketing/tools-and-services" data-testid="accordion-item-list-link">tools &amp; services</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/events" data-testid="accordion-item-list-link">N.Y.C. events guide</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/multimedia" data-testid="accordion-item-list-link">multimedia</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/lens" data-testid="accordion-item-list-link">photography</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/video" data-testid="accordion-item-list-link">video</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/newsletters" data-testid="accordion-item-list-link">Newsletters</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/store" data-testid="accordion-item-list-link">NYT store</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/times-journeys" data-testid="accordion-item-list-link">times journeys</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://myaccount.nytimes.com/membercenter/myaccount.html" data-testid="accordion-item-list-link">manage my account</a></li></ul></div></div></div></div><div class="css-v0l3hm" data-testid="site-index-sections"><div class="css-g4gku8" data-testid="site-index-section"><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-0"><h3 class="css-rxqrcl" id="site-index-section-label-0">news</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com" data-testid="site-index-section-list-link">home page</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/world" data-testid="site-index-section-list-link">world</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/us" data-testid="site-index-section-list-link">U.S.</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/politics" data-testid="site-index-section-list-link">politics</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/news-event/2020-election" data-testid="site-index-section-list-link">Election 2020</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/nyregion" data-testid="site-index-section-list-link">New York</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/business" data-testid="site-index-section-list-link">business</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/technology" data-testid="site-index-section-list-link">tech</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/science" data-testid="site-index-section-list-link">science</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://www.nytimes.com/section/climate" data-testid="site-index-section-list-link">climate</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/sports" data-testid="site-index-section-list-link">sports</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/obituaries" data-testid="site-index-section-list-link">obituaries</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://www.nytimes.com/section/upshot" data-testid="site-index-section-list-link">the upshot</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/todayspaper" data-testid="site-index-section-list-link">today&#x27;s paper</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/corrections" data-testid="site-index-section-list-link">corrections</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-1"><h3 class="css-rxqrcl" id="site-index-section-label-1">opinion</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion" data-testid="site-index-section-list-link">today&#x27;s opinion</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/columnists" data-testid="site-index-section-list-link">op-ed columnists</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/editorials" data-testid="site-index-section-list-link">editorials</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/contributors" data-testid="site-index-section-list-link">op-ed Contributors</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/letters" data-testid="site-index-section-list-link">letters</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/sunday" data-testid="site-index-section-list-link">sunday review</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/video/opinion" data-testid="site-index-section-list-link">video: opinion</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-2"><h3 class="css-rxqrcl" id="site-index-section-label-2">arts</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts" data-testid="site-index-section-list-link">today&#x27;s arts</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/design" data-testid="site-index-section-list-link">art &amp; design</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/books" data-testid="site-index-section-list-link">books</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/dance" data-testid="site-index-section-list-link">dance</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/movies" data-testid="site-index-section-list-link">movies</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/music" data-testid="site-index-section-list-link">music</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/spotlight/pop-culture" data-testid="site-index-section-list-link">Pop Culture</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/television" data-testid="site-index-section-list-link">television</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/theater" data-testid="site-index-section-list-link">theater</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://www.nytimes.com/watching" data-testid="site-index-section-list-link">watching</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/video/arts" data-testid="site-index-section-list-link">video: arts</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-3"><h3 class="css-rxqrcl" id="site-index-section-label-3">living</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/automobiles" data-testid="site-index-section-list-link">automobiles</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://cooking.nytimes.com/" data-testid="site-index-section-list-link">Cooking</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/crosswords" data-testid="site-index-section-list-link">crossword</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/education" data-testid="site-index-section-list-link">education</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/food" data-testid="site-index-section-list-link">food</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/health" data-testid="site-index-section-list-link">health</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/jobs" data-testid="site-index-section-list-link">jobs</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/magazine" data-testid="site-index-section-list-link">magazine</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://parenting.nytimes.com/" data-testid="site-index-section-list-link">parenting</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/realestate" data-testid="site-index-section-list-link">real estate</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/style" data-testid="site-index-section-list-link">style</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/t-magazine" data-testid="site-index-section-list-link">t magazine</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/travel" data-testid="site-index-section-list-link">travel</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/fashion/weddings" data-testid="site-index-section-list-link">love</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-4"><h3 class="css-rxqrcl" id="site-index-section-label-4">more</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/reader-center" data-testid="site-index-section-list-link">Reader Center</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://thewirecutter.com" data-testid="site-index-section-list-link">Wirecutter</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="http://nytconferences.com/" data-testid="site-index-section-list-link">Live Events</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/learning" data-testid="site-index-section-list-link">The Learning Network</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="http://www.nytimes.com/marketing/tools-and-services" data-testid="site-index-section-list-link">tools &amp; services</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/events" data-testid="site-index-section-list-link">N.Y.C. events guide</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/multimedia" data-testid="site-index-section-list-link">multimedia</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/lens" data-testid="site-index-section-list-link">photography</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/video" data-testid="site-index-section-list-link">video</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/newsletters" data-testid="site-index-section-list-link">Newsletters</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/store" data-testid="site-index-section-list-link">NYT store</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/times-journeys" data-testid="site-index-section-list-link">times journeys</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://myaccount.nytimes.com/membercenter/myaccount.html" data-testid="site-index-section-list-link">manage my account</a></li></ul></section><div class="css-6xhk3s" aria-labelledby="site-index-subscribe-label"><h3 class="css-rxqrcl" id="site-index-subscribe-label">Subscribe</h3><ul class="css-1iruc8t" data-testid="site-index-subscribe-list"><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/hdleftnav" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 14 13" fill="#000"><path d="M13.1,11.7H3.5V1.2h9.6V11.7zM13.1,0.4H3.5C3,0.4,2.6,0.8,2.6,1.2v2.2H0.9C0.4,3.4,0,3.8,0,4.3v5.2v1.5c0,0.8,0.8,1.5,1.8,1.5h1.7h0h7.4h2.2c0.5,0,0.9-0.4,0.9-0.9V1.2C14,0.8,13.6,0.4,13.1,0.4"></path><polygon points="10.9,3 5.2,3 5.2,3.9 11.4,3.9 11.4,3"></polygon><rect x="5.2" y="4.7" width="6.1" height="0.9"></rect><rect x="5.2" y="6.5" width="6.1" height="0.9"></rect></svg>home delivery</a></li><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/digitalleftnav" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 10 13"><path fill="#000" d="M9.9,8c-0.4,1.1-1.2,1.9-2.3,2.4V8l1.3-1.2L7.6,5.7V4c1.2-0.1,2-1,2-2c0-1.4-1.3-1.9-2.1-1.9c-0.2,0-0.3,0-0.6,0.1v0.1c0.1,0,0.2,0,0.3,0c0.5,0,0.9,0.2,0.9,0.7c0,0.4-0.3,0.7-0.8,0.7C6,1.7,4.5,0.6,2.8,0.6c-1.5,0-2.5,1.1-2.5,2.2C0.3,4,1,4.3,1.6,4.6l0-0.1C1.4,4.4,1.3,4.1,1.3,3.8c0-0.5,0.5-0.9,1-0.9C3.7,2.9,6,4,7.4,4h0.1v1.7L6.2,6.8L7.5,8v2.4c-0.5,0.2-1.1,0.3-1.7,0.3c-2.2,0-3.6-1.3-3.6-3.5c0-0.5,0.1-1,0.2-1.5l1.1-0.5V10l2.2-1v-5L2.5,5.5c0.3-1,1-1.7,1.8-2l0,0C2.2,3.9,0.1,5.6,0.1,8c0,2.9,2.4,4.8,5.2,4.8C8.2,12.9,9.9,10.9,9.9,8L9.9,8z"></path></svg>digital subscriptions</a></li><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/subscription/games/lp897H9.html" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 13 13" fill="#000"><polygon points="0,-93.6 0,-86.9 6.6,-93.6"></polygon><polygon points="0.9,-86 7.5,-86 7.5,-92.6"></polygon><polygon points="0,-98 0,-94.8 8.8,-94.8 8.8,-86 12,-86 12,-98"></polygon><path d="M11.9-40c-0.4,1.1-1.2,1.9-2.3,2.4V-40l1.3-1.2l-1.3-1.2V-44c1.2-0.1,2-1,2-2c0-1.4-1.3-1.9-2.1-1.9c-0.2,0-0.3,0-0.6,0.1v0.1c0.1,0,0.2,0,0.3,0c0.5,0,0.9,0.2,0.9,0.7c0,0.4-0.3,0.7-0.8,0.7c-1.3,0-2.8-1.1-4.5-1.1c-1.5,0-2.5,1.1-2.5,2.2c0,1.1,0.6,1.5,1.3,1.7l0-0.1c-0.2-0.1-0.4-0.4-0.4-0.7c0-0.5,0.5-0.9,1-0.9C5.7-45.1,8-44,9.4-44h0.1v1.7l-1.3,1.1L9.5-40v2.4c-0.5,0.2-1.1,0.3-1.7,0.3c-2.2,0-3.6-1.3-3.6-3.5c0-0.5,0.1-1,0.2-1.5l1.1-0.5v4.9l2.2-1v-5l-3.3,1.5c0.3-1,1-1.7,1.8-2l0,0c-2.2,0.5-4.3,2.1-4.3,4.6c0,2.9,2.4,4.8,5.2,4.8C10.2-35.1,11.9-37.1,11.9-40L11.9-40z"></path><path d="M12.2-23.7c-0.2,0-0.4,0.2-0.4,0.4v0.4L0.4-19.1v2.3l3,1l-0.2,0.6c-0.3,0.8,0.1,1.8,0.9,2.1l1.7,0.7c0.2,0.1,0.4,0.1,0.6,0.1c0.6,0,1.3-0.4,1.5-1l0.4-0.9l3.5,1.2v0.4c0,0.2,0.2,0.4,0.4,0.4c0.2,0,0.4-0.2,0.4-0.4v-10.7C12.6-23.5,12.4-23.7,12.2-23.7M7.1-13.6c-0.2,0.4-0.6,0.6-1,0.4l-1.7-0.7c-0.4-0.2-0.6-0.6-0.4-1l0.3-0.7l3.3,1.1L7.1-13.6z"></path><path d="M13.1-60.3H3.5v-10.5h9.6V-60.3zM13.1-71.6H3.5c-0.5,0-0.9,0.4-0.9,0.9v2.2H0.9c-0.5,0-0.9,0.4-0.9,0.9v5.2v1.5c0,0.8,0.8,1.5,1.8,1.5h1.7h0h7.4h2.2c0.5,0,0.9-0.4,0.9-0.9v-10.5C14-71.2,13.6-71.6,13.1-71.6"></path><polygon points="10.9,-69 5.2,-69 5.2,-68.1 11.4,-68.1 11.4,-69"></polygon><rect x="5.2" y="-67.3" width="6.1" height="0.9"></rect><rect x="5.2" y="-65.5" width="6.1" height="0.9"></rect><path d="M12,6.5H6.5V12H1V6.5h5.5V1H12V6.5zM12,0H1C0.4,0,0,0.5,0,1v11c0,0.6,0.4,1,1,1h11c0.5,0,1-0.4,1-1V1C13,0.5,12.5,0,12,0"></path></svg>Crossword</a></li><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/subscriptions/Multiproduct/lp8R3WU.html" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 13 13" fill="#000"><path d="M12,2.9L9.6,5.2c-0.1,0.1-0.3,0.1-0.4,0C9.1,5.2,9.1,5,9.3,4.9l2.4-2.4c-0.2-0.2-0.3-0.3-0.5-0.5L8.7,4.3c-0.1,0.1-0.3,0.1-0.4,0C8.2,4.3,8.2,4.1,8.4,4l2.4-2.4c-0.3-0.3-0.5-0.5-0.5-0.5L7.6,3.4C7.1,4,6.8,5.1,7.1,5.8c-1.4,1-4.6,3.5-5.1,4c-0.8,0.8-0.4,1.8-0.3,1.9c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0.1,1.1,0.5,1.9-0.3c0.4-0.4,2.9-3.6,3.9-5C8.4,6.9,9.6,6.6,10.2,6l2.3-2.6C12.5,3.4,12.3,3.2,12,2.9z"></path><path d="M0.8,1.9l0.3-0.3c0.9-0.9,3.2,1.1,3.8,1.7s0.9,1.8,0.4,2.6c1.4,1.1,4.6,3.5,5,3.9c0.8,0.8,0.4,1.8,0.3,1.9c0,0,0,0,0,0c0,0,0,0,0,0c-0.1,0.1-1.1,0.5-1.9-0.3c-0.4-0.4-2.9-3.7-4-5.1C3.9,6.7,2.9,6.4,2.3,5.8S-0.2,2.9,0.8,1.9z"></path></svg>Cooking</a></li></ul><ul class="css-1iruc8t" data-testid="site-index-corporate-links"><li><a class="css-1vhk1ks" href="https://www.nytimes.com/marketing/newsletters">email newsletters</a></li><li><a class="css-1vhk1ks" href="https://www.nytimes.com/corporateleftnav">corporate subscriptions</a></li><li><a class="css-1vhk1ks" href="https://www.nytimes.com/educationleftnav">education rate</a></li></ul><ul class="css-6td9kr" data-testid="site-index-alternate-links"><li><a class="css-1vhk1ks" href="https://www.nytimes.com/services/mobile/index.html">mobile applications</a></li><li><a class="css-1vhk1ks" href="http://eedition.nytimes.com/cgi-bin/signup.cgi?cc=37FYY">replica edition</a></li></ul></div></div></div></div></nav><footer role="contentinfo" class="css-1qmnftd e5u916q0"><nav data-testid="footer" class="css-15uy5yv"><h2 class="css-vz7hjd">Site Information Navigation</h2><ul class="css-1ho5u4o e5u916q1"><li data-testid="copyright"><a class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/copyright/copyright-notice.html">© <span itemProp="copyrightYear">2019</span><span itemProp="publisher copyrightHolder provider sourceOrganization" itemscope="" itemType="http://schema.org/NewsMediaOrganization" itemID="https://www.nytimes.com"> <meta itemProp="diversityPolicy" content="https://www.nytco.com/diversity-and-inclusion-at-the-new-york-times/"/><meta itemProp="ethicsPolicy" content="https://www.nytco.com/who-we-are/culture/standards-and-ethics/"/><meta itemProp="foundingDate" content="1851-09-18"/><span itemProp="logo" itemscope="" itemType="https://schema.org/ImageObject"><meta itemProp="url" content="https://static01.nyt.com/images/misc/NYT_logo_rss_250x40.png"/></span><meta itemProp="url" content="https://www.nytimes.com/"/><meta itemProp="masthead" content="https://www.nytimes.com/interactive/2018/09/28/admin/the-new-york-times-masthead.html"/><meta itemProp="name" content="The New York Times"/><span>The New York Times Company</span></span></a></li></ul><ul class="css-13o0c9t e5u916q2"><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://myaccount.nytimes.com/membercenter/feedback.html">Contact Us</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://www.nytco.com/careers">Work with us</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://nytmediakit.com/">Advertise</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://www.tbrandstudio.com/">T Brand Studio</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/privacy/policy/privacy-policy.html#pp">Your Ad Choices</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/privacy">Privacy</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/ref/membercenter/help/agree.html">Terms of Service</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/sale/terms-of-sale.html">Terms of Sale</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://spiderbites.nytimes.com">Site Map</a></li><li class="smartphone css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://mobile.nytimes.com/help">Help</a></li><li class="desktop css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/membercenter/sitehelp.html">Help</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/subscription/multiproduct/lp8HYKU?campaignId=37WXW">Subscriptions</a></li></ul></nav></footer></div></div></div></div>
+ <script>window.__preloadedData = {"initialState":{"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==":{"__typename":"Article","id":"QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==","compatibility":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.compatibility","typename":"CompatibilityFeatures"},"archiveProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.archiveProperties","typename":"ArticleArchiveProperties"},"collections@filterEmpty":[{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==","typename":"LegacyCollection"}],"tone":"NEWS","section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==","typename":"Section"},"subsection":null,"sprinkledBody":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody","typename":"DocumentBlock"},"url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F08\u002F01\u002Fnyregion\u002Fnypd-facial-recognition-children-teenagers.html","adTargetingParams({\"clientAdParams\":{\"edn\":\"us\",\"plat\":\"web\",\"prop\":\"nyt\"}})":[{"type":"id","generated":false,"id":"AdTargetingParam:als_test1565027040168","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:propnyt","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:platweb","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ednus","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:brandsensitivefalse","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:per","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:orgpolicedepartmentnyc","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:geonewyorkcity","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:desjuveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:spon","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:authaliwatkins,josephgoldstein","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:col","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:collnewyork,usnews,technology,techandsociety","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:artlenmedium","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ledemedsznone","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:gui","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:templatearticle","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:typart,oak","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:sectionnyregion","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:si_sectionnyregion","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:id100000006583622","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:trend","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ptnt10,nt15,nt16,nt18,nt3,nt4,nt9","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:gscatneg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education","typename":"AdTargetingParam"}],"sourceId":"100000006583622","type":"article","wordCount":1357,"bylines":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0","typename":"Byline"}],"displayProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.displayProperties","typename":"CreativeWorkDisplayProperties"},"typeOfMaterials":{"type":"json","json":["News"]},"collections":[{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==","typename":"LegacyCollection"}],"timesTags@filterEmpty":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.0","typename":"Organization"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.1","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.2","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.3","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.4","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.5","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.6","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.7","typename":"Location"}],"language":null,"desk":"Metro","kicker":"","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.headline","typename":"CreativeWorkHeadline"},"commentStatus":"ACCEPT_AND_DISPLAY_COMMENTS","firstPublished":"2019-08-01T17:15:31.000Z","lastModified":"2019-08-02T17:26:37.071Z","originalDesk":"Metro","source":{"type":"id","generated":false,"id":"Organization:T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=","typename":"Organization"},"printInformation":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.printInformation","typename":"PrintInformation"},"sprinkled":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled","typename":"SprinkledContent"},"followChannels":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.0","typename":"ChannelMetadata"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.1","typename":"ChannelMetadata"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.2","typename":"ChannelMetadata"}],"dfpTaxonomyException":null,"advertisingProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.advertisingProperties","typename":"CreativeWorkAdvertisingProperties"},"translations":[],"summary":"With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.","lastMajorModification":"2019-08-02T09:30:23.000Z","uri":"nyt:\u002F\u002Farticle\u002F9da58246-2495-505f-9abd-b5fda8e67b56","eventId":"pubp:\u002F\u002Fevent\u002F47a657bafa8a476bb36832f90ee5ac6e","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia","typename":"Image"},"newsStatus":"DEFAULT","episodeProperties":null,"column":null,"reviewItems":[],"shortUrl":"https:\u002F\u002Fnyti.ms\u002F2GEzuZ8","promotionalHeadline":"She Was Arrested at 14. Her Photo Went to a Facial Recognition Database.","promotionalSummary":"With little oversight, the police have been using the powerful surveillance technology on photos of children and teenagers.","reviewSummary":"","legacy":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.legacy","typename":"ArticleLegacyData"},"addendums":[],"related@filterEmpty":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.compatibility":{"isOak":true,"__typename":"CompatibilityFeatures","hasVideo":false,"hasOakConversionError":false,"isArtReview":false,"isBookReview":false,"isDiningReview":false,"isMovieReview":false,"isTheaterReview":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.archiveProperties":{"timesMachineUrl":"","lede@stripHtml":"","thumbnails":[],"__typename":"ArticleArchiveProperties"},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","slug":"nyregion","__typename":"LegacyCollection","name":"New York","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F19f66998-f562-5ec6-b3f9-298f1c76dd84","type":"legacycollection","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==","slug":"us","__typename":"LegacyCollection","name":"U.S. News","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F11f72ab4-7cd0-540a-93cc-f35b32cd013d","type":"legacycollection","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==","slug":"technology","__typename":"LegacyCollection","name":"Technology","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F58ece0d0-3c35-5fa9-b535-94997a7c8c0f","type":"legacycollection","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==","slug":"experience-tech-and-society","__typename":"LegacyCollection","name":"Tech and Society","collectionType":"SPOTLIGHT","uri":"nyt:\u002F\u002Flegacycollection\u002F9088cfe6-85e3-52fb-993e-6289702a11ff","type":"legacycollection","header":"","showCollectionStories":false},"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==":{"id":"U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==","name":"nyregion","displayName":"New York","url":"\u002Fsection\u002Fnyregion","uri":"nyt:\u002F\u002Fsection\u002F39480374-66d3-5603-9ce1-58cfa12988e2","__typename":"Section"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0":{"__typename":"HeaderBasicBlock","label":null,"headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline","typename":"Heading1Block"},"summary":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary","typename":"SummaryBlock"},"ledeMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.ledeMedia","typename":"ImageBlock"},"byline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline","typename":"BylineBlock"},"timestampBlock":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.timestampBlock","typename":"TimestampBlock"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.3":{"__typename":"Dropzone","index":0,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.5":{"__typename":"Dropzone","index":1,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.7":{"__typename":"Dropzone","index":2,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.9":{"__typename":"Dropzone","index":3,"bad":false,"adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.11":{"__typename":"Dropzone","index":4,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.13":{"__typename":"Dropzone","index":5,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.6","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.15":{"__typename":"Dropzone","index":6,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.1","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.17":{"__typename":"Dropzone","index":7,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.19":{"__typename":"Dropzone","index":8,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.21":{"__typename":"Dropzone","index":9,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.22":{"__typename":"ImageBlock","size":"MEDIUM","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.23":{"__typename":"Dropzone","index":10,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.25":{"__typename":"Dropzone","index":11,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.5","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.6","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.7","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.8","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.9","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.27":{"__typename":"Dropzone","index":12,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.29":{"__typename":"Dropzone","index":13,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.5","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.31":{"__typename":"Dropzone","index":14,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.33":{"__typename":"Dropzone","index":15,"bad":false,"adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.35":{"__typename":"Dropzone","index":16,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.37":{"__typename":"Dropzone","index":17,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.39":{"__typename":"Dropzone","index":18,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.41":{"__typename":"Dropzone","index":19,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.43":{"__typename":"Dropzone","index":20,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.45":{"__typename":"Dropzone","index":21,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.47":{"__typename":"Dropzone","index":22,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.49":{"__typename":"Dropzone","index":23,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.51":{"__typename":"Dropzone","index":24,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.53":{"__typename":"Dropzone","index":25,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.1","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.55":{"__typename":"Dropzone","index":26,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.57":{"__typename":"Dropzone","index":27,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.60":{"__typename":"Dropzone","index":28,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.1","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.62":{"__typename":"Dropzone","index":29,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.64":{"__typename":"Dropzone","index":30,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.66":{"__typename":"Dropzone","index":31,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.68":{"__typename":"Dropzone","index":32,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.70":{"__typename":"Dropzone","index":33,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.5","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.6","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.72":{"__typename":"Dropzone","index":34,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.74":{"__typename":"Dropzone","index":35,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.76":{"__typename":"Dropzone","index":36,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77":{"__typename":"RelatedLinksBlock","displayStyle":"STANDARD","title":[],"description":[],"related@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0","typename":"Article"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1","typename":"Article"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody":{"content@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.15","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.22","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.23","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.25","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.33","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.45","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.53","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.60","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.76","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77","typename":"RelatedLinksBlock"}],"__typename":"DocumentBlock","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.14","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.15","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.22","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.23","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.24","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.25","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.32","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.33","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.44","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.45","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.52","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.53","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.59","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.60","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.75","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.76","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.77","typename":"RelatedLinksBlock"}],"content@take({\"first\":10000})@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.14","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.15","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.22","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.23","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.24","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.25","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.32","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.33","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.44","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.45","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.52","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.53","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.59","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.60","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.75","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.76","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.77","typename":"RelatedLinksBlock"}]},"AdTargetingParam:als_test1565027040168":{"key":"als_test","value":"1565027040168","__typename":"AdTargetingParam"},"AdTargetingParam:propnyt":{"key":"prop","value":"nyt","__typename":"AdTargetingParam"},"AdTargetingParam:platweb":{"key":"plat","value":"web","__typename":"AdTargetingParam"},"AdTargetingParam:ednus":{"key":"edn","value":"us","__typename":"AdTargetingParam"},"AdTargetingParam:brandsensitivefalse":{"key":"brandsensitive","value":"false","__typename":"AdTargetingParam"},"AdTargetingParam:per":{"key":"per","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:orgpolicedepartmentnyc":{"key":"org","value":"policedepartmentnyc","__typename":"AdTargetingParam"},"AdTargetingParam:geonewyorkcity":{"key":"geo","value":"newyorkcity","__typename":"AdTargetingParam"},"AdTargetingParam:desjuveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties":{"key":"des","value":"juveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties","__typename":"AdTargetingParam"},"AdTargetingParam:spon":{"key":"spon","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:authaliwatkins,josephgoldstein":{"key":"auth","value":"aliwatkins,josephgoldstein","__typename":"AdTargetingParam"},"AdTargetingParam:col":{"key":"col","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:collnewyork,usnews,technology,techandsociety":{"key":"coll","value":"newyork,usnews,technology,techandsociety","__typename":"AdTargetingParam"},"AdTargetingParam:artlenmedium":{"key":"artlen","value":"medium","__typename":"AdTargetingParam"},"AdTargetingParam:ledemedsznone":{"key":"ledemedsz","value":"none","__typename":"AdTargetingParam"},"AdTargetingParam:gui":{"key":"gui","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:templatearticle":{"key":"template","value":"article","__typename":"AdTargetingParam"},"AdTargetingParam:typart,oak":{"key":"typ","value":"art,oak","__typename":"AdTargetingParam"},"AdTargetingParam:sectionnyregion":{"key":"section","value":"nyregion","__typename":"AdTargetingParam"},"AdTargetingParam:si_sectionnyregion":{"key":"si_section","value":"nyregion","__typename":"AdTargetingParam"},"AdTargetingParam:id100000006583622":{"key":"id","value":"100000006583622","__typename":"AdTargetingParam"},"AdTargetingParam:trend":{"key":"trend","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:ptnt10,nt15,nt16,nt18,nt3,nt4,nt9":{"key":"pt","value":"nt10,nt15,nt16,nt18,nt3,nt4,nt9","__typename":"AdTargetingParam"},"AdTargetingParam:gscatneg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education":{"key":"gscat","value":"neg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education","__typename":"AdTargetingParam"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0":{"displayName":"Joseph Goldstein","__typename":"Person","url":"","contactDetails":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails","typename":"ContactDetails"},"legacyData":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.legacyData","typename":"PersonLegacyData"}},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1":{"displayName":"Ali Watkins","__typename":"Person","url":"","contactDetails":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails","typename":"ContactDetails"},"legacyData":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.legacyData","typename":"PersonLegacyData"}},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0":{"creators":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0","typename":"Person"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1","typename":"Person"}],"__typename":"Byline","renderedRepresentation":"By Joseph Goldstein and Ali Watkins"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.displayProperties":{"fullBleedDisplayStyle":"","__typename":"CreativeWorkDisplayProperties","serveAsNyt4":false},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.0":{"__typename":"Organization","vernacular":"NYPD","isAdvertisingBrandSensitive":false,"displayName":"Police Department (NYC)"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.1":{"__typename":"Subject","vernacular":"Juvenile delinquency","isAdvertisingBrandSensitive":false,"displayName":"Juvenile Delinquency"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.2":{"__typename":"Subject","vernacular":"Facial Recognition","isAdvertisingBrandSensitive":false,"displayName":"Facial Recognition Software"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.3":{"__typename":"Subject","vernacular":"Privacy","isAdvertisingBrandSensitive":false,"displayName":"Privacy"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.4":{"__typename":"Subject","vernacular":"Government Surveillance","isAdvertisingBrandSensitive":false,"displayName":"Surveillance of Citizens by Government"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.5":{"__typename":"Subject","vernacular":"Police","isAdvertisingBrandSensitive":false,"displayName":"Police"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.6":{"__typename":"Subject","vernacular":"Civil Rights","isAdvertisingBrandSensitive":false,"displayName":"Civil Rights and Liberties"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.7":{"__typename":"Location","vernacular":"NYC","isAdvertisingBrandSensitive":false,"displayName":"New York City"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.headline":{"default":"She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.","__typename":"CreativeWorkHeadline","default@stripHtml":"She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.","seo@stripHtml":""},"Organization:T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=":{"id":"T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=","displayName":"New York Times","__typename":"Organization"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.printInformation":{"page":"1","section":"A","publicationDate":"2019-08-02T04:00:00.000Z","__typename":"PrintInformation","edition":"NewYork","headline@stripHtml":"In New York, Police Computers Scan Faces, Some as Young as 11"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.0":{"name":"mobile","stride":4,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.1":{"name":"desktop","stride":7,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.2":{"name":"mobileHoldout","stride":6,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.3":{"name":"desktopHoldout","stride":8,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.4":{"name":"hybrid","stride":4,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled":{"configs":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.0","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.1","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.2","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.3","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.4","typename":"SprinkledConfig"}],"__typename":"SprinkledContent"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.0":{"__typename":"HeaderBasicBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.1":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.2":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.3":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.4":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.5":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.6":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.7":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.8":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.9":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.10":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.11":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.12":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.13":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.14":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.15":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.16":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.17":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.18":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.19":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.20":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.21":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.22":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.23":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.24":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.25":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.26":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.27":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.28":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.29":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.30":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.31":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.32":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.33":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.34":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.35":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.36":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.37":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.38":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.39":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.40":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.41":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.42":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.43":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.44":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.45":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.46":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.47":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.48":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.49":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.50":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.51":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.52":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.53":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.54":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.55":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.56":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.57":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.58":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.59":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.60":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.61":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.62":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.63":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.64":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.65":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.66":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.67":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.68":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.69":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.70":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.71":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.72":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.73":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.74":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.75":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.76":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.77":{"__typename":"RelatedLinksBlock"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.0":{"uri":"nyt:\u002F\u002Fchannel\u002Fdd1a5725-c3be-4673-be2c-9055eb12c10f","__typename":"ChannelMetadata"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.1":{"uri":"nyt:\u002F\u002Fchannel\u002F7cf18b43-f1c6-4946-8a9c-4e24bad34c5c","__typename":"ChannelMetadata"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.2":{"uri":"nyt:\u002F\u002Fchannel\u002F679a17bb-20e6-40a7-a589-e7742a2a52ed","__typename":"ChannelMetadata"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.0":{"__typename":"HeaderBasicBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.1":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.2":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.3":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.4":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.5":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.6":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.7":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.8":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.9":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.10":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.11":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.12":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.13":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.14":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.15":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.16":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.17":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.18":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.19":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.20":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.21":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.22":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.23":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.24":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.25":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.26":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.27":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.28":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.29":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.30":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.31":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.32":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.33":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.34":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.35":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.36":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.37":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.38":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.39":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.40":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.41":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.42":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.43":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.44":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.45":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.46":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.47":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.48":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.49":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.50":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.51":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.52":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.53":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.54":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.55":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.56":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.57":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.58":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.59":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.60":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.61":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.62":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.63":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.64":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.65":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.66":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.67":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.68":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.69":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.70":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.71":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.72":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.73":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.74":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.75":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.76":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.77":{"__typename":"RelatedLinksBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.advertisingProperties":{"sensitivity":"SHOW_ADS","__typename":"CreativeWorkAdvertisingProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).0":{"name":"MASTER","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-articleLarge.jpg","height":400,"width":600,"name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-superJumbo.jpg","height":1365,"width":2048,"name":"superJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).1":{"name":"SMALL_SQUARE","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbStandard.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbLarge.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbStandard.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-thumbStandard.jpg","height":75,"width":75,"name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-thumbLarge.jpg","height":150,"width":150,"name":"thumbLarge","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).2":{"name":"SIXTEEN_BY_NINE","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg","height":900,"width":1600,"name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).3":{"name":"FACEBOOK","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-facebookJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-facebookJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-facebookJumbo.jpg","height":550,"width":1050,"name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).4":{"name":"WATCH","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-watch308.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-watch308.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-watch308.jpg","height":348,"width":312,"name":"watch308","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia":{"crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).4","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.caption":{"text":"","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline":{"textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline.content.0","typename":"TextInline"}],"__typename":"Heading1Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline.content.0":{"__typename":"TextInline","text@stripHtml":"She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary":{"textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary.content.0","typename":"TextInline"}],"__typename":"SummaryBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary.content.0":{"__typename":"TextInline","text":"With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.ledeMedia":{"__typename":"ImageBlock","size":"MEDIUM","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz","typename":"Image"}},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F00nypd-juveniles.html","uri":"nyt:\u002F\u002Fimage\u002F2ad4fe36-f59f-5211-a12e-6b1f5bce2fa3","credit":"Sarah Blesener for The New York Times","legacyHtmlCaption":"“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg","name":"articleLarge","width":600,"height":900,"__typename":"ImageRendition"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-popup.jpg","name":"popup","width":334,"height":500,"__typename":"ImageRendition"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg","name":"jumbo","width":683,"height":1024,"__typename":"ImageRendition"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg","name":"superJumbo","width":1366,"height":2048,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleInline.jpg","name":"articleInline","width":190,"height":285,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.caption":{"text":"“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline":{"textAlign":"LEFT","hideHeadshots":false,"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0","typename":"Byline"}],"role@filterEmpty":[],"__typename":"BylineBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0":{"prefix":"By","creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0","typename":"Person"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1","typename":"Person"}],"renderedRepresentation":null,"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0":{"displayName":"Joseph Goldstein","bioUrl":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fjoseph-goldstein","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia","typename":"Image"},"__typename":"Person"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-articleLarge.png","name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-popup.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-popup.png","name":"popup","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog480.png","name":"blog480","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog533.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog533.png","name":"blog533","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog427.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog427.png","name":"blog427","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagSF.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-tmagSF.png","name":"tmagSF","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagArticle.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-tmagArticle.png","name":"tmagArticle","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-slide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-slide.png","name":"slide","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-jumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-jumbo.png","name":"jumbo","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-superJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-superJumbo.png","name":"superJumbo","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog225.png","name":"blog225","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master675.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master675.png","name":"master675","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master495.png","name":"master495","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master180.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master180.png","name":"master180","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master315.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master315.png","name":"master315","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master768.png","name":"master768","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-popup.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog533.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog427.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagSF.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagArticle.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-slide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-jumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-superJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master675.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master180.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master315.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master768.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbStandard.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-thumbStandard.png","name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blogSmallThumb.png","name":"blogSmallThumb","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-thumbLarge.png","name":"thumbLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare168.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-smallSquare168.png","name":"smallSquare168","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-smallSquare252.png","name":"smallSquare252","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbStandard.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare168.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare252.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square320.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-square320.png","name":"square320","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-moth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-moth.png","name":"moth","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-filmstrip.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-filmstrip.png","name":"filmstrip","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square640.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-square640.png","name":"square640","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumSquare149.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumSquare149.png","name":"mediumSquare149","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square320.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-moth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-filmstrip.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square640.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumSquare149.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-sfSpan.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-sfSpan.png","name":"sfSpan","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontal375.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-largeHorizontal375.png","name":"largeHorizontal375","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontalJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-largeHorizontalJumbo.png","name":"largeHorizontalJumbo","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-horizontalMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-horizontalMediumAt2X.png","name":"horizontalMediumAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-sfSpan.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontal375.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontalJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-horizontalMediumAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-hpLarge.png","name":"hpLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeWidescreen573.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-largeWidescreen573.png","name":"largeWidescreen573","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeWidescreen573.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbWide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-thumbWide.png","name":"thumbWide","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoThumb.png","name":"videoThumb","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoLarge.png","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo210.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo210.png","name":"mediumThreeByTwo210","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo225.png","name":"mediumThreeByTwo225","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo440.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo440.png","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo252.png","name":"mediumThreeByTwo252","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo378.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo378.png","name":"mediumThreeByTwo378","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoLargeAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-threeByTwoLargeAt2X.png","name":"threeByTwoLargeAt2X","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-threeByTwoMediumAt2X.png","name":"threeByTwoMediumAt2X","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoSmallAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-threeByTwoSmallAt2X.png","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.5":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbWide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo210.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo440.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo252.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo378.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-articleInline.png","name":"articleInline","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-hpSmall.png","name":"hpSmall","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blogSmallInline.png","name":"blogSmallInline","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumFlexible177.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumFlexible177.png","name":"mediumFlexible177","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.6":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumFlexible177.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSmall.png","name":"videoSmall","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoHpMedium.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoHpMedium.png","name":"videoHpMedium","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine600.png","name":"videoSixteenByNine600","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine540.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine540.png","name":"videoSixteenByNine540","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine495.png","name":"videoSixteenByNine495","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine390.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine390.png","name":"videoSixteenByNine390","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine480.png","name":"videoSixteenByNine480","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine310.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine310.png","name":"videoSixteenByNine310","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine225.png","name":"videoSixteenByNine225","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine96.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine96.png","name":"videoSixteenByNine96","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine768.png","name":"videoSixteenByNine768","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine150.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine150.png","name":"videoSixteenByNine150","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNineJumbo1600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNineJumbo1600.png","name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.7":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoHpMedium.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine600.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine540.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine390.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine310.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine96.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine768.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine150.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNineJumbo1600.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-miniMoth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-miniMoth.png","name":"miniMoth","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-windowsTile336H.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-windowsTile336H.png","name":"windowsTile336H","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.8":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-miniMoth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-windowsTile336H.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.9":{"renditions":[],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-facebookJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-facebookJumbo.png","name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.10":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-facebookJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch308.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-watch308.png","name":"watch308","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch268.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-watch268.png","name":"watch268","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.11":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch308.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch268.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.12":{"renditions":[],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia":{"crops":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.4","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.5","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.6","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.7","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.8","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.9","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.10","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.11","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.12","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1":{"displayName":"Ali Watkins","bioUrl":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fali-watkins","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia","typename":"Image"},"__typename":"Person"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-articleLarge.png","name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-popup.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-popup.png","name":"popup","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog480.png","name":"blog480","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog533.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog533.png","name":"blog533","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog427.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog427.png","name":"blog427","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagSF.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-tmagSF.png","name":"tmagSF","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagArticle.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-tmagArticle.png","name":"tmagArticle","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-slide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-slide.png","name":"slide","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-jumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-jumbo.png","name":"jumbo","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-superJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-superJumbo.png","name":"superJumbo","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog225.png","name":"blog225","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master675.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master675.png","name":"master675","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master495.png","name":"master495","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master180.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master180.png","name":"master180","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master315.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master315.png","name":"master315","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master768.png","name":"master768","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-popup.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog533.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog427.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagSF.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagArticle.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-slide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-jumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-superJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master675.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master180.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master315.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master768.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbStandard.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-thumbStandard.png","name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blogSmallThumb.png","name":"blogSmallThumb","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-thumbLarge.png","name":"thumbLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare168.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-smallSquare168.png","name":"smallSquare168","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-smallSquare252.png","name":"smallSquare252","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbStandard.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare168.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare252.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square320.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-square320.png","name":"square320","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-moth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-moth.png","name":"moth","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-filmstrip.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-filmstrip.png","name":"filmstrip","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square640.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-square640.png","name":"square640","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumSquare149.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumSquare149.png","name":"mediumSquare149","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square320.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-moth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-filmstrip.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square640.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumSquare149.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-sfSpan.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-sfSpan.png","name":"sfSpan","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontal375.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeHorizontal375.png","name":"largeHorizontal375","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontalJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeHorizontalJumbo.png","name":"largeHorizontalJumbo","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-horizontalMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-horizontalMediumAt2X.png","name":"horizontalMediumAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-sfSpan.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontal375.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontalJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-horizontalMediumAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-hpLarge.png","name":"hpLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen573.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeWidescreen573.png","name":"largeWidescreen573","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen1050.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeWidescreen1050.png","name":"largeWidescreen1050","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen573.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen1050.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbWide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-thumbWide.png","name":"thumbWide","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoThumb.png","name":"videoThumb","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoLarge.png","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo210.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo210.png","name":"mediumThreeByTwo210","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo225.png","name":"mediumThreeByTwo225","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo440.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo440.png","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo252.png","name":"mediumThreeByTwo252","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo378.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo378.png","name":"mediumThreeByTwo378","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoLargeAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-threeByTwoLargeAt2X.png","name":"threeByTwoLargeAt2X","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-threeByTwoMediumAt2X.png","name":"threeByTwoMediumAt2X","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoSmallAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-threeByTwoSmallAt2X.png","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.5":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbWide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo210.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo440.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo252.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo378.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-articleInline.png","name":"articleInline","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-hpSmall.png","name":"hpSmall","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blogSmallInline.png","name":"blogSmallInline","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumFlexible177.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumFlexible177.png","name":"mediumFlexible177","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.6":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumFlexible177.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSmall.png","name":"videoSmall","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoHpMedium.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoHpMedium.png","name":"videoHpMedium","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine600.png","name":"videoSixteenByNine600","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine540.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine540.png","name":"videoSixteenByNine540","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine495.png","name":"videoSixteenByNine495","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine390.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine390.png","name":"videoSixteenByNine390","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine1050.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine1050.png","name":"videoSixteenByNine1050","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine480.png","name":"videoSixteenByNine480","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine310.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine310.png","name":"videoSixteenByNine310","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine225.png","name":"videoSixteenByNine225","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine96.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine96.png","name":"videoSixteenByNine96","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine768.png","name":"videoSixteenByNine768","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine150.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine150.png","name":"videoSixteenByNine150","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNineJumbo1600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNineJumbo1600.png","name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.7":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoHpMedium.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine600.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine540.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine390.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine1050.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine310.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine96.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine768.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine150.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNineJumbo1600.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-miniMoth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-miniMoth.png","name":"miniMoth","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-windowsTile336H.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-windowsTile336H.png","name":"windowsTile336H","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoFifteenBySeven1305.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoFifteenBySeven1305.png","name":"videoFifteenBySeven1305","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.8":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-miniMoth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-windowsTile336H.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoFifteenBySeven1305.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.9":{"renditions":[],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-facebookJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-facebookJumbo.png","name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.10":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-facebookJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch308.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-watch308.png","name":"watch308","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch268.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-watch268.png","name":"watch268","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.11":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch308.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch268.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.12":{"renditions":[],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia":{"crops":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.4","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.5","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.6","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.7","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.8","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.9","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.10","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.11","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.12","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.timestampBlock":{"timestamp":"2019-08-01T17:15:31.000Z","align":"LEFT","__typename":"TimestampBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0":{"__typename":"TextInline","text":"[What you need to know to start the day: ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0.formats.0","typename":"ItalicFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1":{"__typename":"TextInline","text":"Get New York Today in your inbox","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.0","typename":"ItalicFormat"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.1","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.1":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002Fnewsletters\u002Fnewyorktoday?module=inline","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2":{"__typename":"TextInline","text":".]","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2.formats.0","typename":"ItalicFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.0":{"__typename":"TextInline","text":"The New York Police Department has been loading ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.1":{"__typename":"TextInline","text":"thousands of arrest photos of children and teenagers","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.2":{"__typename":"TextInline","text":" into a facial recognition database despite evidence the technology has a higher risk of false matches in younger faces. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.0":{"__typename":"TextInline","text":"For about four years, internal records show, the department has used the technology to compare crime scene images with its collection of juvenile mug ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.1":{"__typename":"TextInline","text":"shots","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.2":{"__typename":"TextInline","text":", the photos that are taken at an arrest. Most of the photos are of teenagers, largely 13 to 16 years old, but children as young as 11 have been included. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6.content.0":{"__typename":"TextInline","text":"Elected officials and civil rights groups said the disclosure that the city was deploying a powerful surveillance tool on adolescents — whose privacy seems sacrosanct and whose status is protected in the criminal justice system — was a striking example of the Police Department’s ability to adopt advancing technology with little public scrutiny.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8.content.0":{"__typename":"TextInline","text":"Several members of the City Council as well as a range of civil liberties groups said they were unaware of the policy until they were contacted by The New York Times. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.0":{"__typename":"TextInline","text":"Police ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.1":{"__typename":"TextInline","text":"Department officials defended the decision, ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.2":{"__typename":"TextInline","text":"saying it was just the latest evolution of a longstanding policing technique: using arrest photos to identify suspects.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12.content.0":{"__typename":"TextInline","text":"“I don’t think this is any secret decision that’s made behind closed doors,” the city’s chief of detectives, Dermot F. Shea, said in an interview. “This is just process, and making sure we’re doing everything to fight crime.” ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.0":{"__typename":"TextInline","text":"Other cities have begun to debate whether law enforcement should use facial recognition, which relies on an algorithm to quickly pore through images and suggest matches. In May, ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1":{"__typename":"TextInline","text":"San Francisco blocked city agencies, including the police","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F05\u002F14\u002Fus\u002Ffacial-recognition-ban-san-francisco.html?module=inline","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.2":{"__typename":"TextInline","text":", from using the tool amid unease about potential government ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.3":{"__typename":"TextInline","text":"abuse","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.4":{"__typename":"TextInline","text":". ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5":{"__typename":"TextInline","text":"Detroit is facing public resistance to a technology ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F07\u002F08\u002Fus\u002Fdetroit-facial-recognition-cameras.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.6":{"__typename":"TextInline","text":"that has been shown to have lower accuracy with people with darker skin. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.0":{"__typename":"TextInline","text":"In New York, the state Education Department recently told the Lockport, N.Y., ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.1":{"__typename":"TextInline","text":"school district to delay a plan to use facial recognition on students, citing privacy concerns. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.0":{"__typename":"TextInline","text":"“At the end ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.1":{"__typename":"TextInline","text":"of the day, it should be banned — no young people,” said ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.2":{"__typename":"TextInline","text":"Councilman Donovan Richards","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.3":{"__typename":"TextInline","text":", a Queens Democrat who heads the Public Safety Committee, which oversees the Police Department. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.0":{"__typename":"TextInline","text":"The department said its legal bureau had approved using facial recognition on juveniles. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1":{"__typename":"TextInline","text":"The algorithm may suggest a lead, but detectives would not make an arrest based solely on ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F09\u002Fopinion\u002Ffacial-recognition-police-new-york-city.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2":{"__typename":"TextInline","text":"that","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F09\u002Fopinion\u002Ffacial-recognition-police-new-york-city.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.3":{"__typename":"TextInline","text":", Chief Shea said.","formats":[]},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F00nypd-juveniles2.html","uri":"nyt:\u002F\u002Fimage\u002F5a694c3e-2066-51a1-965d-4be8779badef","credit":"Chang W. Lee\u002FThe New York Times","legacyHtmlCaption":"Dermot Shea, the city&rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg","name":"articleLarge","width":600,"height":400,"__typename":"ImageRendition"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-popup.jpg","name":"popup","width":650,"height":433,"__typename":"ImageRendition"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg","name":"jumbo","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg","name":"superJumbo","width":2048,"height":1365,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleInline.jpg","name":"articleInline","width":190,"height":127,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.caption":{"text":"Dermot Shea, the city&rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24.content.0":{"__typename":"TextInline","text":"Still, facial recognition has not been widely tested on children. Most algorithms are taught to “think” based on adult faces, and there is growing evidence that they do not work as well on children. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.0":{"__typename":"TextInline","text":"The National Institute of Standards and Technology","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.1":{"__typename":"TextInline","text":", which is part of the Commerce Department and ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2":{"__typename":"TextInline","text":"evaluates facial recognition ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fnvlpubs.nist.gov\u002Fnistpubs\u002Fir\u002F2018\u002FNIST.IR.8238.pdf","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3":{"__typename":"TextInline","text":"algorithms","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fnvlpubs.nist.gov\u002Fnistpubs\u002Fir\u002F2018\u002FNIST.IR.8238.pdf","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.4":{"__typename":"TextInline","text":" for accuracy, recently found the ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.5":{"__typename":"TextInline","text":"vast majority of more than 100 ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.6":{"__typename":"TextInline","text":"facial recognition ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.7":{"__typename":"TextInline","text":"algorithms had a higher rate of mistaken matches among children. The ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.8":{"__typename":"TextInline","text":"e","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.9":{"__typename":"TextInline","text":"rror rate was most pronounced in young children but was also seen in those aged 10 to 16.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.0":{"__typename":"TextInline","text":"Aging poses another problem:","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.1":{"__typename":"TextInline","text":" The appearance of children and adolescents can change ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.2":{"__typename":"TextInline","text":" drastically as bones stretch and shift, altering the underlying facial structure. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.0":{"__typename":"TextInline","text":"“I would use extreme caution in using those algorithms,” said ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.1":{"__typename":"TextInline","text":"Karl Ricanek Jr.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.2":{"__typename":"TextInline","text":", a computer science professor and ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.3":{"__typename":"TextInline","text":"co-founder of the Face Aging Group at the University of North Carolina-","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.4":{"__typename":"TextInline","text":"Wilmington","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.5":{"__typename":"TextInline","text":". ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32.content.0":{"__typename":"TextInline","text":"Technology that can match an image of a younger teenager to a recent arrest photo may be less effective at finding the same person even one or two years later, he said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34.content.0":{"__typename":"TextInline","text":" “The systems do not have the capacity to understand the dynamic changes that occur to a child’s face,” Dr. Ricanek said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.0":{"__typename":"TextInline","text":"Idemia","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.1":{"__typename":"TextInline","text":" and ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.2":{"__typename":"TextInline","text":"DataWorks Plus","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.3":{"__typename":"TextInline","text":", the two companies that provide facial recognition software to the Police Department, did not respond to requests for comment. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.0":{"__typename":"TextInline","text":"The New York Police Department can take arrest photos of minors as young as ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.1":{"__typename":"TextInline","text":"11","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.2":{"__typename":"TextInline","text":" who are charged with a felony, depending on the severity of the charge. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40.content.0":{"__typename":"TextInline","text":"And in many cases, the department keeps the photos for years, making facial recognition comparisons to what may have effectively become outdated images. There are photos of 5,500 individuals in the juvenile database, 4,100 of whom are no longer 16 or under, the department said. Teenagers 17 and older are considered adults in the criminal justice system. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42.content.0":{"__typename":"TextInline","text":"Police officials declined to provide statistics on how often their facial recognition systems provide false matches, or to explain how they evaluate the system’s effectiveness.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44.content.0":{"__typename":"TextInline","text":"“We are comfortable with this technology because it has proved to be a valuable investigative method,” Chief Shea said. Facial recognition has helped lead to thousands of arrests of both adults and juveniles, the department has said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46.content.0":{"__typename":"TextInline","text":"Mayor Bill de Blasio had been aware the department was using the technology on minors, said Freddi Goldstein, a spokeswoman for the mayor. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48.content.0":{"__typename":"TextInline","text":"She said the Police Department followed “strict guidelines” in applying the technology and City Hall monitored the agency’s compliance with the policies. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.0":{"__typename":"TextInline","text":"The Times learned details of the department’s use of facial recognition by reviewing documents posted online earlier this year by ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1":{"__typename":"TextInline","text":"Clare Garvie, a senior associate","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.flawedfacedata.com\u002F#footnote5","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2":{"__typename":"TextInline","text":" at the Center on Privacy and Technology at Georgetown Law","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.flawedfacedata.com\u002F#footnote5","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.3":{"__typename":"TextInline","text":". Ms. Garvie received the documents as part of an open records lawsuit. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52.content.0":{"__typename":"TextInline","text":"It could not be determined whether other large police departments used facial recognition with juveniles because very few have written policies governing the use of the technology, Ms. Garvie said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.0":{"__typename":"TextInline","text":"New York detectives rely on a vast network","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.1":{"__typename":"TextInline","text":" of surveillance cameras throughout the city to provide images of people believed to have committed a crime. Since 2011, the department has had a dedicated unit of officers who use facial recognition to compare those images against millions of photos, usually mug shots. The software proposes matches, which have led to thousands of arrests, the department said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56.content.0":{"__typename":"TextInline","text":"By 2013, top police officials were meeting to discuss including juveniles in the program, the documents reviewed by The Times showed. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58.content.0":{"__typename":"TextInline","text":"The documents showed that the juvenile database had been integrated into the system by 2015. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59.content.0":{"__typename":"TextInline","text":"“We have these photos. It makes sense,” Chief Shea said in the interview. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.0":{"__typename":"TextInline","text":"State law requires that arrest photos be destroyed if the case is resolved in the juvenile’s favor, or if the child is found to have committed only a misdemeanor, rather than a felony. The photos also must be destroyed if a person reaches age 21 without a criminal record. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.1":{"__typename":"TextInline","text":" ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63.content.0":{"__typename":"TextInline","text":"When children are charged with crimes, the court system usually takes some steps to prevent their acts from defining them in later years. Children who are 16 and under, for instance, are generally sent to Family Court, where records are not public. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65.content.0":{"__typename":"TextInline","text":"Yet including their photos in a facial recognition database runs the risk that an imperfect algorithm identifies them as possible suspects in later crimes, civil rights advocates said. A mistaken match could lead investigators to focus on the wrong person from the outset, they said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67.content.0":{"__typename":"TextInline","text":"“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, a 17-year-old Brooklyn girl who had admitted guilt in Family Court to a group attack that happened when she was 14. She said she was present at the attack but did not participate. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.0":{"__typename":"TextInline","text":"Bailey, who asked that she be identified only by her ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.1":{"__typename":"TextInline","text":"last name","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.2":{"__typename":"TextInline","text":" because she did not want her juvenile arrest to be public, has not been arrested again and is now a student at John Jay College of Criminal Justice. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.0":{"__typename":"TextInline","text":"R","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.1":{"__typename":"TextInline","text":"ecent studies indicate that people of color, as well as children and women, have a greater risk of misidentification than their counterparts, sai","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.2":{"__typename":"TextInline","text":"d ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.3":{"__typename":"TextInline","text":"Joy Buolamwini","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.4":{"__typename":"TextInline","text":", ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.5":{"__typename":"TextInline","text":"the founder of the Algorithmic Justice League and graduate researcher at the M.I.T. Media Lab","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.6":{"__typename":"TextInline","text":", who has examined how human biases are built into artificial intelligence. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.0":{"__typename":"TextInline","text":"The racial disparities in the juvenile justice system are stark: In New York, black and Latino juveniles were charged with crimes at far higher rates than whites in 2017, the most recent year for which numbers were available. Black juveniles outnumbered white juveniles ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1":{"__typename":"TextInline","text":"more than 15 to 1","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.criminaljustice.ny.gov\u002Fcrimnet\u002Fojsa\u002Fjj-reports\u002Fnewyorkcity.pdf","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.2":{"__typename":"TextInline","text":".","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75.content.0":{"__typename":"TextInline","text":"“If the facial recognition algorithm has a negative bias toward a black population, that will get magnified more toward children,” Dr. Ricanek said, adding that in terms of diminished accuracy, “you’re now putting yourself in unknown territory.”","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0":{"__typename":"Article","promotionalHeadline":"Facial Recognition Makes You Safer","promotionalSummary":"Used properly, the software effectively identifies crime suspects without violating rights.","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.headline","typename":"CreativeWorkHeadline"},"summary":"Used properly, the software effectively identifies crime suspects without violating rights.","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F09\u002Fopinion\u002Ffacial-recognition-police-new-york-city.html","firstPublished":"2019-06-09T23:00:05.000Z","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia","typename":"Image"},"section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==","typename":"Section"},"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0","typename":"Byline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.headline":{"default":"How Facial Recognition Makes You Safer","__typename":"CreativeWorkHeadline"},"ImageRendition:images20190607opinionsunday07Oneill07Oneill-videoLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002Fsunday\u002F07Oneill\u002F07Oneill-videoLarge.jpg","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20190607opinionsunday07Oneill07Oneill-mediumThreeByTwo440.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002Fsunday\u002F07Oneill\u002F07Oneill-mediumThreeByTwo440.jpg","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20190607opinionsunday07Oneill07Oneill-threeByTwoSmallAt2X.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002Fsunday\u002F07Oneill\u002F07Oneill-threeByTwoSmallAt2X.jpg","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190607opinionsunday07Oneill07Oneill-videoLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinionsunday07Oneill07Oneill-mediumThreeByTwo440.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinionsunday07Oneill07Oneill-threeByTwoSmallAt2X.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia":{"crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1":{"__typename":"Article","promotionalHeadline":"Spying on Children Won’t Keep Them Safe","promotionalSummary":"This week my daughter’s school became the first in the nation to pilot facial-recognition software. The technology’s potential is chilling.","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.headline","typename":"CreativeWorkHeadline"},"summary":"This week my daughter’s school became the first in the nation to pilot facial-recognition software. The technology’s potential is chilling.","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F07\u002Fopinion\u002Flockport-facial-recognition-schools.html","firstPublished":"2019-06-07T15:00:05.000Z","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia","typename":"Image"},"section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==","typename":"Section"},"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0","typename":"Byline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.headline":{"default":"Spying on Children Won’t Keep Them Safe","__typename":"CreativeWorkHeadline"},"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-videoLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002F07shultz-privacy\u002F07shultz-privacy-videoLarge.jpg","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-mediumThreeByTwo440.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002F07shultz-privacy\u002F07shultz-privacy-mediumThreeByTwo440.jpg","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-threeByTwoSmallAt2X.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002F07shultz-privacy\u002F07shultz-privacy-threeByTwoSmallAt2X.jpg","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-videoLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-mediumThreeByTwo440.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-threeByTwoSmallAt2X.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia":{"crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0","typename":"ImageCrop"}],"__typename":"Image"},"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==":{"id":"U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==","displayName":"Opinion","__typename":"Section"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0.creators.0":{"displayName":"James O’Neill","__typename":"Person"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0":{"creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0.creators.0","typename":"Person"}],"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0.creators.0":{"displayName":"Jim Shultz","__typename":"Person"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0":{"creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0.creators.0","typename":"Person"}],"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.legacy":{"reviewInformation":"","__typename":"ArticleLegacyData","htmlExtendedAuthorOrArticleInformation":"","htmlInfoBox":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.0":{"type":"twitter","account":"JoeKGoldstein","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.1":{"type":"url","account":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fjoseph-goldstein","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails":{"socialMedia":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.0","typename":"ContactDetailsSocialMedia"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.1","typename":"ContactDetailsSocialMedia"}],"__typename":"ContactDetails"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.legacyData":{"htmlShortBiography":"\u003Cp\u003EJoseph Goldstein writes about policing and the criminal justice system. He has been a reporter at The Times since 2011, and is based in New York. He also worked for a year in the Kabul bureau, reporting on Afghanistan.\u003C\u002Fp\u003E","__typename":"PersonLegacyData"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.0":{"type":"url","account":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fali-watkins","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.1":{"type":"twitter","account":"AliWatkins","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails":{"socialMedia":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.0","typename":"ContactDetailsSocialMedia"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.1","typename":"ContactDetailsSocialMedia"}],"__typename":"ContactDetails"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.legacyData":{"htmlShortBiography":"\u003Cp\u003EAli Watkins is a reporter on the Metro Desk, covering courts and social services. Previously, she covered national security in Washington for The Times, BuzzFeed and McClatchy Newspapers.\u003C\u002Fp\u003E","__typename":"PersonLegacyData"},"ROOT_QUERY":{"workOrLocation({\"id\":\"\u002F2019\u002F08\u002F01\u002Fnyregion\u002Fnypd-facial-recognition-children-teenagers.html\"})":{"type":"id","generated":false,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==","typename":"Article"}}},"config":{"gqlUrl":"https:\u002F\u002Fsamizdat-graphql.nytimes.com\u002Fgraphql\u002Fv2","gqlRequestHeaders":{"nyt-app-type":"project-vi","nyt-app-version":"0.0.5","nyt-token":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs+\u002FoUCTBmD\u002FcLdmcecrnBMHiU\u002FpxQCn2DDyaPKUOXxi4p0uUSZQzsuq1pJ1m5z1i0YGPd1U1OeGHAChWtqoxC7bFMCXcwnE1oyui9G1uobgpm1GdhtwkR7ta7akVTcsF8zxiXx7DNXIPd2nIJFH83rmkZueKrC4JVaNzjvD+Z03piLn5bHWU6+w+rA+kyJtGgZNTXKyPh6EC6o5N+rknNMG5+CdTq35p8f99WjFawSvYgP9V64kgckbTbtdJ6YhVP58TnuYgr12urtwnIqWP9KSJ1e5vmgf3tunMqWNm6+AnsqNj8mCLdCuc5cEB74CwUeQcP2HQQmbCddBy2y0mEwIDAQAB"},"gqlFetchTimeout":4000,"disablePersistedQueries":false,"initialDeviceType":"desktop","fastlyAbraConfig":{},"serviceWorkerFile":"service-worker-test-1565019880489.js"},"ssrQuery":{},"initialLocation":{"pathname":"\u002F2019\u002F08\u002F01\u002Fnyregion\u002Fnypd-facial-recognition-children-teenagers.html"},"externalAssets":[]};</script>
+ <script>!function(e){function r(r){for(var n,i,a=r[0],f=r[1],l=r[2],p=0,s=[];p<a.length;p++)i=a[p],o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(c&&c(r);s.length;)s.shift()();return u.push.apply(u,l||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,a=1;a<t.length;a++){var f=t[a];0!==o[f]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={37:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="/vi-assets/static-assets/";var a=window.webpackJsonp=window.webpackJsonp||[],f=a.push.bind(a);a.push=r,a=a.slice();for(var l=0;l<a.length;l++)r(a[l]);var c=f;t()}([]);
+//# sourceMappingURL=runtime~adslot-a45e9d5711d983de8fda.js.map</script>
+ <script async src="/vi-assets/static-assets/adslot-88dc25fbfb7328ff1466.js"></script>
+ <script>!function(e){function r(r){for(var o,n,c=r[0],i=r[1],s=r[2],f=0,l=[];f<c.length;f++)n=c[f],d[n]&&l.push(d[n][0]),d[n]=0;for(o in i)Object.prototype.hasOwnProperty.call(i,o)&&(e[o]=i[o]);for(b&&b(r);l.length;)l.shift()();return a.push.apply(a,s||[]),t()}function t(){for(var e,r=0;r<a.length;r++){for(var t=a[r],o=!0,c=1;c<t.length;c++){var i=t[c];0!==d[i]&&(o=!1)}o&&(a.splice(r--,1),e=n(n.s=t[0]))}return e}var o={},d={39:0},a=[];function n(r){if(o[r])return o[r].exports;var t=o[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,n),t.l=!0,t.exports}n.e=function(e){var r=[],t=d[e];if(0!==t)if(t)r.push(t[2]);else{var o=new Promise(function(r,o){t=d[e]=[r,o]});r.push(t[2]=o);var a,c=document.createElement("script");c.charset="utf-8",c.timeout=120,n.nc&&c.setAttribute("nonce",n.nc),c.src=function(e){return n.p+""+({1:"answerpage~bestsellers~collections~hubpage~reviews~search~slideshow~timeswire~weddings",2:"vendors~audio~home~paidpost~story~trending~video",3:"bestsellers~byline~collections~reviews~trending",4:"vendors~answerpage~audio~slideshow~story",5:"vendors~audio~home~paidpost~story",6:"byline~timeswire~your-list",7:"answerpage~getstarted",8:"bestsellers~hubpage",9:"newsletter~regilite",10:"vendors~paidpost~video",11:"vendors~video~videoblock",13:"answerpage",14:"audio",15:"audioblock",16:"bestsellers",17:"blank",18:"byline",19:"coderedeem",20:"collections",21:"comments",22:"episodefooter",23:"getstarted",24:"home",25:"hubpage",28:"newsletter",29:"newsletters",30:"paidpost",31:"privacy",32:"programmables",33:"recirculation",34:"refer",35:"regilite",36:"reviews",40:"search",41:"slideshow",42:"stickyfilljs",43:"story",44:"timeswire",45:"trending",46:"vendors~audioblock",47:"vendors~collections",48:"vendors~episodefooter",49:"vendors~home",50:"vendors~slideshow",51:"video",52:"videoblock",53:"weddings",54:"your-list"}[e]||e)+"-"+{1:"3f4fa7221ef1476092a3",2:"99859b76d5b5d9a29339",3:"6f48de596aff21cee9e2",4:"4a8420b672b0eb786710",5:"ebc6aacf5f0b0f00d939",6:"cb31ca27d295accb8d47",7:"80921fe67fb06673afe2",8:"2cb427a40932c00d5467",9:"c17835f4020a81b3ebdf",10:"e6333c5f0c9d44a562b9",11:"340b908d6bbf26111cf8",13:"8c464e3538096d914776",14:"926f804d67e8a45a9f10",15:"287cb8154113b7f25784",16:"f4baccd76f2f8e8d9db8",17:"2102d3a3d664a932bad1",18:"7e235f2b3d6d19b68ded",19:"dd19d8e9f879d86abb75",20:"74e3e7b1d52b7fc14653",21:"bfae7d48bcf7e6c8ab89",22:"d32caaca6c5936978d4a",23:"300b3f609b3056db6c18",24:"e7c1959c1d8ba140707f",25:"c0e7bb29b120c3c2d802",28:"3ae59c9859d057a0249a",29:"e951dbf493cdf3558858",30:"c108afd87ed307bd7c43",31:"493cddaf9cad7abf670c",32:"3c3cfd695943ed02249d",33:"dc560ec354d5e74e6e39",34:"3202500fd0bc711d8680",35:"67182278afc38ad823b1",36:"f189bd767bbe13f59254",40:"33f98b7462fec3740a1d",41:"1d22c2cff98639b0c7b7",42:"8640087ba86873ebebae",43:"5230dd3423d03f5eb0b8",44:"2db55c4529c54890b4bd",45:"4614204aab86dd2d820f",46:"8574ab7f8faa5e4151d8",47:"07007634cf48d865ae1a",48:"1e063f58b4e3da82fc25",49:"6e63337189383a709584",50:"ab09592f64b71ce13dba",51:"35bd41b25aecc8dbc38b",52:"e71ac27943b9c0dc2f1c",53:"65894e06a558684c455b",54:"cf5b2e08b6f7a84842e2"}[e]+".js"}(e),a=function(r){c.onerror=c.onload=null,clearTimeout(i);var t=d[e];if(0!==t){if(t){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src,n=new Error("Loading chunk "+e+" failed.\n("+o+": "+a+")");n.type=o,n.request=a,t[1](n)}d[e]=void 0}};var i=setTimeout(function(){a({type:"timeout",target:c})},12e4);c.onerror=c.onload=a,document.head.appendChild(c)}return Promise.all(r)},n.m=e,n.c=o,n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,r){if(1&r&&(e=n(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(n.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)n.d(t,o,function(r){return e[r]}.bind(null,o));return t},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},n.p="/vi-assets/static-assets/",n.oe=function(e){throw console.error(e),e};var c=window.webpackJsonp=window.webpackJsonp||[],i=c.push.bind(c);c.push=r,c=c.slice();for(var s=0;s<c.length;s++)r(c[s]);var b=i;t()}([]);
+//# sourceMappingURL=runtime~main-262212ad851d651999bf.js.map</script>
+ <script defer src="/vi-assets/static-assets/vendor-3389f9c978bdc7cb443c.js"></script>
+ <script defer src="/vi-assets/static-assets/story-5230dd3423d03f5eb0b8.js"></script>
+ <script defer src="/vi-assets/static-assets/main-72d661c291004bc90d1b.js"></script>
+ <script>
+(function(w, l) {
+ w[l] = w[l] || [];
+ w[l].push({
+ 'gtm.start': new Date().getTime(),
+ event: 'gtm.js'
+ });
+})(window, 'dataLayer');
+(function(){
+ var url = 'https://et.nytimes.com/pixel' +
+ '?url=' + window.location.href +
+ '&referrer=' + document.referrer +
+ '&subject=module-interactions' +
+ '&moduleData=%7B%22module%22%3A%22nyt-vi-page-pixel%22%2C%22pgType%22%3A%22%22%2C%22eventName%22%3A%22Impression%22%2C%22action%22%3A%22Impression%22%7D' +
+ '&sourceApp=nyt-vi&instant=1' +
+ '&_=' + Date.now();
+ var img = document.createElement('img');
+ img.src = url;
+ img.alt = "";
+ img.style.cssText = 'position: absolute; z-index: -999999; left: -1000px; top: -1000px;';
+ document.body.appendChild(img);
+})();
+</script>
+ <script defer src="https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x"></script>
+<noscript>
+<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x" height="0" width="0" style="display:none;visibility:hidden"></iframe>
+</noscript>
+ <div id="RavenInstaller">
+<script>
+if (window.INSTALL_RAVEN) {
+ window.addEventListener('load', function(event) {
+ var includeRaven = document.getElementById("RavenInstaller");
+ var script = document.createElement("script");
+ script.src = "/vi-assets/static-assets/raven.min-830a6d04a55c283934dd1893d6ddc66d.js";
+ script.onload = function() {
+ /* eslint-disable */
+// Install Raven
+window.Raven.config('https://7bc8bccf5c254286a99b11c68f6bf4ce@sentry.io/178860', {
+ release: vi.env.RELEASE,
+ environment: vi.env.ENVIRONMENT,
+ ignoreErrors: [/SecurityError: Blocked a frame with origin.*/]
+}).install(); // Stop using our error handler
+
+window.nyt_errors.ravenInstalled = true;
+var regex = /nyt-a=(.*?)(;|$)/;
+var id = regex.exec(document.cookie);
+
+if (id !== null) {
+ id = id[1];
+} else {
+ id = '';
+} // Setting nyt-a as user context
+
+
+window.Raven.setUserContext({
+ id: id
+}); // Pass collected errors to Raven
+
+window.nyt_errors.list.forEach(function (err) {
+ // weird?
+ if (!err) {
+ return;
+ } // also weird ... ?
+
+
+ if (!err.err) {
+ // maybe err itself is an Error?
+ if (err instanceof Error) {
+ window.Raven.captureException(err, err.data || {});
+ } // else { silently ignore? }
+
+ } // just making sure ...
+
+
+ if (err.err instanceof Error) {
+ window.Raven.captureException(err.err, err.data || {});
+ } // else { silently ignore? }
+
+}); // Pass collected Tags to Raven
+
+window.nyt_errors.tags.forEach(function (tag) {
+ window.Raven.setTagsContext(tag);
+});
+ };
+ includeRaven.appendChild(script);
+ });
+}
+</script>
+</div>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/test/fixtures/nypd-facial-recognition-children-teenagers2.html b/test/fixtures/nypd-facial-recognition-children-teenagers2.html
new file mode 100644
index 000000000..ae8b26aff
--- /dev/null
+++ b/test/fixtures/nypd-facial-recognition-children-teenagers2.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html>
+<html lang="en" itemId="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html" itemType="http://schema.org/NewsArticle" itemScope="" class="story" xmlns:og="http://opengraphprotocol.org/schema/">
+ <head>
+ <title data-rh="true">She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database. - The New York Times</title>
+ <meta data-rh="true" itemprop="inLanguage" content="en-US"/><meta data-rh="true" property="article:published" itemprop="datePublished dateCreated" content="2019-08-01T17:15:31.000Z"/><meta data-rh="true" property="article:modified" itemprop="dateModified" content="2019-08-02T09:30:23.000Z"/><meta data-rh="true" http-equiv="Content-Language" content="en"/><meta data-rh="true" name="robots" content="noarchive"/><meta data-rh="true" name="articleid" itemprop="identifier" content="100000006583622"/><meta data-rh="true" name="nyt_uri" itemprop="identifier" content="nyt://article/9da58246-2495-505f-9abd-b5fda8e67b56"/><meta data-rh="true" name="pubp_event_id" itemprop="identifier" content="pubp://event/47a657bafa8a476bb36832f90ee5ac6e"/><meta data-rh="true" name="description" itemprop="description" content="With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers."/><meta data-rh="true" name="image" itemprop="image" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-facebookJumbo.jpg"/><meta data-rh="true" name="byl" content="By Joseph Goldstein and Ali Watkins"/><meta data-rh="true" name="thumbnail" itemprop="thumbnailUrl" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-thumbStandard.jpg"/><meta data-rh="true" name="news_keywords" content="NYPD,Juvenile delinquency,Facial Recognition,Privacy,Government Surveillance,Police,Civil Rights,NYC"/><meta data-rh="true" name="pdate" content="20190801"/><meta data-rh="true" property="og:url" content="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="og:title" content="She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database."/><meta data-rh="true" property="og:image" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-facebookJumbo.jpg"/><meta data-rh="true" property="og:description" content="With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers."/><meta data-rh="true" property="twitter:url" content="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="twitter:title" content="She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database."/><meta data-rh="true" property="twitter:description" content="With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers."/><meta data-rh="true" property="twitter:image" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg"/><meta data-rh="true" property="twitter:image:alt" content=""/><meta data-rh="true" property="twitter:card" content="summary_large_image"/><meta data-rh="true" property="article:section" itemprop="articleSection" content="New York"/><meta data-rh="true" property="article:tag" content="Police Department (NYC)"/><meta data-rh="true" property="article:tag" content="Juvenile Delinquency"/><meta data-rh="true" property="article:tag" content="Facial Recognition Software"/><meta data-rh="true" property="article:tag" content="Privacy"/><meta data-rh="true" property="article:tag" content="Surveillance of Citizens by Government"/><meta data-rh="true" property="article:tag" content="Police"/><meta data-rh="true" property="article:tag" content="Civil Rights and Liberties"/><meta data-rh="true" property="article:tag" content="New York City"/><meta data-rh="true" name="CG" content="nyregion"/><meta data-rh="true" name="SCG" content=""/><meta data-rh="true" name="CN" content="experience-tech-and-society"/><meta data-rh="true" name="CT" content="spotlight"/><meta data-rh="true" name="PT" content="article"/><meta data-rh="true" name="PST" content="News"/><meta data-rh="true" name="url" itemprop="url" content="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" name="msapplication-starturl" content="https://www.nytimes.com"/><meta data-rh="true" property="al:android:url" content="nytimes://reader/id/100000006583622"/><meta data-rh="true" property="al:android:package" content="com.nytimes.android"/><meta data-rh="true" property="al:android:app_name" content="NYTimes"/><meta data-rh="true" property="al:iphone:url" content="nytimes://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="al:iphone:app_store_id" content="284862083"/><meta data-rh="true" property="al:iphone:app_name" content="NYTimes"/><meta data-rh="true" property="al:ipad:url" content="nytimes://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="al:ipad:app_store_id" content="357066198"/><meta data-rh="true" property="al:ipad:app_name" content="NYTimes"/>
+ <meta charset="utf-8" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
+<meta property="fb:app_id" content="9869919170" />
+
+
+ <script type="text/javascript">
+ // 20.585kB
+ window.viHeadScriptSize = 20.585;
+ (function () { var _f=function(e){window.vi=window.vi||{},window.vi.env=Object.freeze(e)};;_f.apply(null, [{"JKIDD_PATH":"https://a.nytimes.com/svc/nyt/data-layer","ET2_URL":"https://a.et.nytimes.com","WEDDINGS_PATH":"https://content.api.nytimes.com","GDPR_PATH":"https://us-central1-nyt-wfvi-prd.cloudfunctions.net/gdpr-email-form","RECAPTCHA_SITEKEY":"6LevSGcUAAAAAF-7fVZF05VTRiXvBDAY4vBSPaTF","ABRA_ET_URL":"//et.nytimes.com","NODE_ENV":"production","SENTRY_SAMPLE_RATE":"10","EXPERIMENTAL_ROUTE_PREFIX":"","ENVIRONMENT":"prd","RELEASE":"034494769d779a637c178f47c2096df69b7c07a4","AUTH_HOST":"https://myaccount.nytimes.com","SWG_PUBLICATION_ID":"nytimes.com","GQL_FETCH_TIMEOUT":"4000"}]); })();;
+ !function(){if('PerformanceLongTaskTiming' in window){var g=window.__tti={e:[]};
+ g.o=new PerformanceObserver(function(l){g.e=g.e.concat(l.getEntries())});
+ g.o.observe({entryTypes:['longtask']})}}();
+;
+ !function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);
+;try {
+ var observer = new window.PerformanceObserver(function (list) {
+ var entries = list.getEntries();
+
+ for (var i = 0; i < entries.length; i += 1) {
+ var entry = entries[i];
+ var performance = {};
+
+ performance[entry.name] = Math.round(entry.startTime + entry.duration);
+ (window.dataLayer = window.dataLayer || []).push({
+ event: "performance",
+ pageview: {
+ performance: performance
+ }
+ });
+ }
+ });
+ observer.observe({
+ entryTypes: ["paint"]
+ });
+} catch (e) {};
+!function(i,e){var a,s,c,p,u,g=[],
+l="object"==typeof i.navigator&&"string"==typeof i.navigator.userAgent&&/iP(ad|hone|od)/.test(
+i.navigator.userAgent),f="object"==typeof i.navigator&&i.navigator.sendBeacon,
+y=f?l?"xhr_ios":"beacon":"xhr";function d(){var e,t,n=i.crypto||i.msCrypto;if(n)t=n.getRandomValues(
+new Uint8Array(18));else for(t=[];t.length<18;)t.push(256*Math.random()^255&(e=e||+new Date)),
+e=Math.floor(e/256);return btoa(String.fromCharCode.apply(String,t)).replace(/\+/g,"-").replace(
+/\//g,"_")}if(i.nyt_et)try{console.warn("et2 snippet should only load once per page")}catch(e
+){}else i.nyt_et=function(){var e,t,n,o=arguments;function r(r){g.length&&(function(e,t,n){if(
+"beacon"===y||f&&r)return i.navigator.sendBeacon(e,t)
+;var o="undefined"!=typeof XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP")
+;o.open("POST",e),o.withCredentials=!0,o.setRequestHeader("Accept","*/*"),
+"string"==typeof t?o.setRequestHeader("Content-Type","text/plain;charset=UTF-8"
+):"[object Blob]"==={}.toString.call(t)&&t.type&&o.setRequestHeader("Content-Type",t.type);try{
+o.send(t)}catch(e){}}(a+"/track",JSON.stringify(g)),g.length=0,clearTimeout(u),u=null)}if(
+"string"==typeof o[0]&&/init/.test(o[0])&&(c=d(),"init"==o[0]&&!s)){if(s=d(),
+"string"!=typeof o[1]||!/^http/.test(o[1]))throw new Error("init must include an et host url")
+;a=String(o[1]).replace(/\/$/,""),"string"==typeof o[2]&&(p=o[2])}n="page_exit"==(e=o[o.length-1]
+).subject||"ob_click"==(e.eventData||{}).type,a&&"object"==typeof e&&(t="page"==e.subject?c:d(),
+e.sourceApp&&(p=e.sourceApp),e.sourceApp=p,g.push({context_id:s,pageview_id:c,event_id:t,
+client_lib:"v1.0.5",sourceApp:p,how:n&&l&&f?"beacon_ios":y,client_ts:+new Date,data:JSON.parse(
+JSON.stringify(e))}),"send"==o[0]||t==c||n?r(n):u||(u=setTimeout(r,5500)))},
+i.nyt_et.get_pageview_id=function(){return c}}(window);
+;
+var NYTD=NYTD||{};NYTD.Abra=function(t){"use strict";function e(t){var e=r[t];return e&&e[1]||null}function n(t,e){if(t){var n,r,o=e[0],i=e[1],c=0,u=0;if(1!==i.length||4294967296!==i[0])for(n=a(t+" "+o)>>>0,c=0,u=0;r=i[c++];)if(n<(u+=r[0]))return r}}function a(t){for(var e,n,a,r,o,i,c,u=0,h=0,l=[],s=[e=1732584193,n=4023233417,~e,~n,3285377520],f=[],p=t.length;h<=p;)f[h>>2]|=(h<p?t.charCodeAt(h):128)<<8*(3-h++%4);for(f[c=p+8>>2|15]=p<<3;u<=c;u+=16){for(e=s,h=0;h<80;e=[0|[(i=((t=e[0])<<5|t>>>27)+e[4]+(l[h]=h<16?~~f[u+h]:i<<1|i>>>31)+1518500249)+((n=e[1])&(a=e[2])|~n&(r=e[3])),o=i+(n^a^r)+341275144,i+(n&a|n&r|a&r)+882459459,o+1535694389][0|h++/20],t,n<<30|n>>>2,a,r])i=l[h-3]^l[h-8]^l[h-14]^l[h-16];for(h=5;h;)s[--h]=s[h]+e[h]|0}return s[0]}var r,o={};return t.dataLayer=t.dataLayer||[],e.init=function(e){var a,o,i,c,u,h,l,s,f,p,d=[],v=[],m=(t.document.cookie.match(/(?:^|;) *nyt-a=([^;]*)/)||[])[1],b=(t.document.cookie.match(/(?:^|;) *ab7=([^;]*)/)||[])[1],g=(t.location.search.match(/(?:^\?|&)abra=([^&]*)/)||[])[1];if(r)throw new Error("can't init twice");for(r={},u=(decodeURIComponent(b||"")+"&"+decodeURIComponent(g||"")).split("&"),a=u.length-1;a>=0;a--)h=u[a].split("="),h.length<2||(l=h[0])&&!r[l]&&(s=h[1]||null,r[l]=[,s,1],s&&d.push(l+"="+s),v.push({test:l,variant:s||"0"}));for(a=0;a<e.length;a++)i=e[a],(o=i[0])in r||(c=n(m,i)||[],c[0],f=c[1],p=!!c[2],r[o]=c,f&&d.push(o.replace(/[^\w-]/g)+"="+(""+f).replace(/[^\w-]/g)),p&&v.push({test:o,variant:f||"0"}));d.length&&t.document.documentElement.setAttribute("data-nyt-ab",d.join(" ")),v.length&&t.dataLayer.push({event:"ab-alloc",abtest:{batch:v}})},e.reportExposure=function(e,n){if(!o[e]){o[e]=1;var a=r[e];if(a){var i=a[1];a[2]&&t.dataLayer.push({event:"ab-expose",abtest:{test:e,variant:i||"0"}})}n&&t.setTimeout(function(){n(null)},0)}},e}(this);
+;(function () { var NYTD=window.NYTD||{};function setupTimeZone(){var e='[data-timezone][data-timezone~="'+(new Date).getHours()+'"] { display: block }',t=document.createElement("style");t.innerHTML=e,document.head.appendChild(t)}function addNYTAppClass(){var e=window.navigator.userAgent||window.navigator.vendor||window.opera,t=-1!==e.indexOf("nyt_android"),n=-1!==e.indexOf("nytios");(t||n)&&document.documentElement.classList.add("NYTApp")}function setupPageViewId(){NYTD.PageViewId={},NYTD.PageViewId.update=function(){return"undefined"!=typeof nyt_et&&"function"==typeof window.nyt_et.get_pageview_id?(window.nyt_et("pageinit"),NYTD.PageViewId.current=window.nyt_et.get_pageview_id()):NYTD.PageViewId.current="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}),NYTD.PageViewId.current}}var _f=function(e){try{document.domain="nytimes.com"}catch(e){}window.swgUserInfoXhrObject=new XMLHttpRequest,window.__emotion=e.emotionIds,setupPageViewId(),setupTimeZone(),addNYTAppClass(),window.nyt_et("init",vi.env.ET2_URL,"nyt-vi",{subject:"page",canonicalUrl:(document.querySelector("link[rel=canonical]")||{}).href,articleId:(document.querySelector("meta[name=articleid]")||{}).content,nyt_uri:(document.querySelector("meta[name=nyt_uri]")||{}).content,pubpEventId:(document.querySelector("meta[name=pubp_event_id]")||{}).content,url:location.href,referrer:document.referrer||void 0,client_tz_offset:(new Date).getTimezoneOffset()}),"undefined"!=typeof nyt_et&&"function"==typeof window.nyt_et.get_pageview_id?NYTD.PageViewId.current=window.nyt_et.get_pageview_id():NYTD.PageViewId.update(),NYTD.Abra.init(e.abraConfig,vi.env.ABRA_ET_URL)};;_f.apply(null, [{"emotionIds":["0","1dv1kvn","v89234","nuvmzp","1gz70xg","9e9ivx","2bwtzy","1hyfx7x","6n7j50","1kj7lfb","10m9xeu","vz7hjd","1fe7a5q","1rn5q1r","10488qs","1iruc8t","1ropbjl","uw59u","jxzr5i","oylsik","1otr2jl","1c8n994","qtw155","v0l3hm","g4gku8","1rr4qq7","6xhk3s","rxqrcl","tj0ten","ist4u3","1gprdgz","10t7hia","mzqdl","kwpx34","1k2cjfc","1vhk1ks","6td9kr","r5ic95","15uy5yv","1p8nkc0","5j8bii","1am0aiv","1g7m0tk","d8bdto","y8aj3r","60hakz","i29ckm","acwcvw","1baulvz","f8wsfj","mhvv8m","m6999o","i9gxme","1m9j9gf","1sy8kpn","19vbshk","l9onyx","79elbk","1q1yk17","g7rb99","k008qs","bsn42l","11cwn6f","ghw4n2","1c5cfvc","htgkrt","e64et","9zaqp9","16fq4rz","1kjk1j2","88g286","12yx39b","4hu8jm","1wqz2f4","yl3z84","1q3gjvc","nc39ev","amd09y","ru1vxe","ajnadh","1ri25x2","12fr9lp","1hfdzay","4g4cvq","m6xlts","1ahhg7f","fwqvlz","17xtcya","x15j1o","1705lsu","1iwv8en","b7n1on","1b9egsl","1rj8to8","4w91ra","wg1cha","1ubp8k9","1egl8em","vdv0al","1i2y565","o6xoe7","1fanzo5","53u6y8","1m50asq","z3e15g","uwwqev","1ly73wi","7y3qfv","l72opv","4skfbu","1fcn4th","13zu7ev","f7l8cz","16ogagc","17ai7jg","8i9d0s","1nwzsjy","10698na","nhjhh0","1nuro5j","1w5cs23","4brsb6","uhuo44","exrw3m","1a48zt4","1xdhyk6","vuqh7u","1l44abu","jcw7oy","10raysz","ar1l6a","1ede5it","mn5hq9","1qmnftd","1ho5u4o","13o0c9t","1yo489b","ulr03x","1bymuyk","1waixk9","1f7ibof","l2ztic","19lv58h","mgtjo2","1wr3we4","y3sf94","1bnxwmn","1i8g3m4","3qijnq","uqyvli","1uqjmks","1bvtpon","1vxca1d","1vkm6nb","1ox9jel","1riqqik","2fg4z9","11n4cex","1ifw933","1rjmmt7","rqb9bm","19hdyf3","15g2oxy","2b3w4o","14b9hti","1j8dw05","1vm5oi9","32rbo2","llk6mt","1s4ffep","pdw9fk","1txwxcy","1soubk3"],"abraConfig":[["vi-ads-et",[[257698038,"2_remainder",1],[4037269258,null,0]]],["messaging-optimizely",[[4294967296,"1",0]]],["dfp_adslot4v2",[[4294967296,"1_external",1]]],["DFP_als",[[4294967296,"1_als",1]]],["DFP_als_home",[[214748365,"1_als",1],[214748365,"1_als",1],[429496730,"1_als",1],[429496729,"1_als",1],[858993459,"1_als",1],[1073741824,"1_als",1],[1073741824,null,0]]],["medianet_toggle",[[4294967296,"0_default",0]]],["amazon_toggle",[[4294967296,null,0]]],["index_toggle",[[4294967296,"1_block",0]]],["dfp_home_toggle",[[4294967296,null,0]]],["dfp_story_toggle",[[4294967296,null,0]]],["dfp_interactive_toggle",[[4294967296,null,0]]],["FREEX_Best_In_Show",[[2147483648,"0_Control",1],[2147483648,"1_Best",1]]],["MKT_dfp_ocean_language",[[2147483648,"0_control",1],[2147483648,"1_language",1]]],["MC_magnolia_0519",[[4294967296,"1_magnolia",1]]],["STORY_topical_recirc",[[2147483648,"0_control",1],[2147483648,"1_variant",1]]],["HOME_timesExclusive",[[2147483648,"0_control",1],[2147483648,"1_variant",1]]],["ON_daily_digest_NL_0719",[[644245095,"0_control",1],[644245094,"1_daily_digest",1],[3006477107,null,0]]],["HOME_discovery_automation",[[2147483648,"0_control",1],[2147483648,"1_automation",1]]],["MKT_GateDockMsgTap",[[1431655766,"0_control",1],[1431655765,"2_BAUDockTapGate",1],[1431655765,"4_BAUDockRBGate",1]]],["FREEX_RegiWall_Messaging",[[214748365,"0_Control",1],[214748365,"1_Continue_Reading",1],[214748365,"2_For_Free",1],[214748365,"3_Keep_Reading",1],[214748364,"4_Continue_Reading_NoHeader",1],[214748365,"5_For_Free_NoHeader",1],[214748365,"6_Keep_Reading_NoHeader",1],[858993459,"0_Control",1],[858993459,"6_Keep_Reading_NoHeader",1],[1073741824,null,0]]],["MC_briefing_bar_anon_test_0519",[[1431655766,"0_control",1],[1431655765,"1_subscribe",1],[1431655765,"2_regi",1]]],["MC_briefing_bar_regi_test_0519",[[2147483648,"0_control",1],[2147483648,"1_subscribe",1]]],["SEARCH_FACET_DROPDOWN",[[2147483648,"0_FACET_MULTI_SELECT",1],[2147483648,"1_DYNAMIC_FACET_SELECT",1]]],["VG_gift_upsell_x_only",[[429496730,"0_control",1],[3865470566,"1_upsell",1]]],["ON_allocator_0719",[[356482286,"ON_login_interrupt_0819-0_control",0],[356482286,"ON_login_interrupt_0819-1_app_experience",0],[356482285,"ON_login_interrupt_0819-2_login_value",0],[356482286,"ON_login_interrupt_0819-3_login_return",0],[356482285,"ON_app_dl_getstarted_0819-0_control",0],[356482286,"ON_app_dl_getstarted_0819-1_appExperience",0],[356482285,"ON_app_dl_getstarted_0819-2_bestApp",0],[356482286,"ON_app_dl_getstarted_0819-3_magicLink",0],[236223201,"ON_app_dl_mc4-6_0819-0_control",0],[236223202,"ON_app_dl_mc4-6_0819-1_dockTrunc",0],[236223201,"ON_app_dl_mc4-6_0819-2_newDock",0],[236223201,"ON_app_dl_mc4-6_0819-3_stdNew",0],[236223201,"ON_app_dl_mc4-6_0819-4_stdDockTrunc",0],[236223202,"ON_app_dl_mc4-6_0819-5_truncator",0],[25769803,null,0]]],["MKT_dfp_ocean_bundle_light",[[1431655766,"0_control",1],[1431655765,"1_design",1],[1431655765,"2_design_light",1]]],["MKT_dfp_ocean_bundle_family",[[1431655766,"0_control",1],[1431655765,"1_design",1],[1431655765,"2_family",1]]],["HL_sample",[[2147483648,"0",1],[2147483648,"1",1]]],["HL_100000006614214",[[2147483648,"0",1],[2147483648,"1",1]]],["HL_100000006641840",[[2147483648,"0",1],[2147483648,"1",1]]]]}]); })();;(function () { var _f=function(e){var r=function(){var r=e.url;try{r+=window.location.search.slice(1).split("&").reduce(function(e,r){return"ip-override"===r.split("=")[0]?"?"+r:e},"")}catch(e){console.warn(e)}var n=new XMLHttpRequest;for(var t in n.withCredentials=!0,n.open("POST",r,!0),n.setRequestHeader("Content-Type","application/json"),e.headers)n.setRequestHeader(t,e.headers[t]);return n.send(e.body),n};window.userXhrObject=r(),window.userXhrRefresh=function(){return window.userXhrObject=r(),window.userXhrObject}};;_f.apply(null, [{"url":"https://samizdat-graphql.nytimes.com/graphql/v2","body":"{\"operationName\":\"UserQuery\",\"variables\":{},\"query\":\" query UserQuery { user { __typename profile { displayName } userInfo { regiId entitlements demographics { emailSubscriptions wat bundleSubscriptions { bundle inGrace promotion source } } } subscriptionDetails { graceStartDate graceEndDate isFreeTrial hasQueuedSub startDate endDate status entitlements } } } \"}","headers":{"nyt-app-type":"project-vi","nyt-app-version":"0.0.5","nyt-token":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs+/oUCTBmD/cLdmcecrnBMHiU/pxQCn2DDyaPKUOXxi4p0uUSZQzsuq1pJ1m5z1i0YGPd1U1OeGHAChWtqoxC7bFMCXcwnE1oyui9G1uobgpm1GdhtwkR7ta7akVTcsF8zxiXx7DNXIPd2nIJFH83rmkZueKrC4JVaNzjvD+Z03piLn5bHWU6+w+rA+kyJtGgZNTXKyPh6EC6o5N+rknNMG5+CdTq35p8f99WjFawSvYgP9V64kgckbTbtdJ6YhVP58TnuYgr12urtwnIqWP9KSJ1e5vmgf3tunMqWNm6+AnsqNj8mCLdCuc5cEB74CwUeQcP2HQQmbCddBy2y0mEwIDAQAB"}}]); })();;100*Math.random()<=vi.env.SENTRY_SAMPLE_RATE?(window.INSTALL_RAVEN=!0,window.nyt_errors={ravenInstalled:!1,list:[],tags:[]},window.onerror=function(n,r,o,w,i){if(!window.nyt_errors.ravenInstalled){var t={err:i,data:{}};window.nyt_errors.list.push(t)}}):window.INSTALL_RAVEN=!1;;(function () { var _f=function(t,e,n){var a=window,A=document,o=function(t){var e=A.createElement("style");e.appendChild(A.createTextNode(t)),A.querySelector("head").appendChild(e)},r=function(t,e,n,a,A){var r=new XMLHttpRequest;r.open("GET",t,!0),r.onreadystatechange=function(){if(4===r.readyState&&200===r.status){o(r.responseText);try{localStorage.setItem("nyt-fontFormat",e),localStorage.setItem(a,n)}catch(t){return}localStorage.setItem(A,r.responseText)}return!0},r.send(null)},c=function(e,n){var A;try{A=localStorage.getItem("nyt-fontFormat")}catch(t){}A||(A=function(){if(!("FontFace"in a))return!1;var t=new FontFace("t",'url("data:application/font-woff2;base64,d09GMgABAAAAAADcAAoAAAAAAggAAACWAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABk4ALAoUNAE2AiQDCAsGAAQgBSAHIBtvAcieB3aD8wURQ+TZazbRE9HvF5vde4KCYGhiCgq/NKPF0i6UIsZynbP+Xi9Ng+XLbNlmNz/xIBBqq61FIQRJhC/+QA/08PJQJ3sK5TZFMlWzC/iK5GUN40psgqvxwBjBOg6JUSJ7ewyKE2AAaXZrfUB4v+hze37ugJ9d+DeYqiDwVgCawviwVFGnuttkLqIMGivmDg") format("woff2")',{});return t.load().catch(function(){}),"loading"==t.status||"loaded"==t.status}()?"woff2":"woff");for(var c=0;c<e.length;c++){var i=e[c],l="shared"!==i?"-"+i:"",d="nyt-fontHash"+l,s="nyt-fontFace"+l,f=t[i][A],u=localStorage.getItem(d),g=localStorage.getItem(s);if(u===f.hash&&g)o(g);else{var h=function(t,e,n,a,A){return function(){r(t,e,n,a,A)}}(f.url,A,f.hash,d,s);n?h():document.addEventListener("DOMContentLoaded",h)}}};c(e),window.addEventListener("load",function(){c(n,!0)})};;_f.apply(null, [{"shared":{"woff":{"hash":"f2adc73415c5bbb437e993c14559e70e","url":"/vi-assets/static-assets/shared-woff.fonts-f2adc73415c5bbb437e993c14559e70e.css"},"woff2":{"hash":"22b34a6a6fd840943496b658184afdd3","url":"/vi-assets/static-assets/shared-woff2.fonts-22b34a6a6fd840943496b658184afdd3.css"}},"story":{"woff":{"hash":"3c668927c32fbefb440b4024d5da6351","url":"/vi-assets/static-assets/story-woff.fonts-3c668927c32fbefb440b4024d5da6351.css"},"woff2":{"hash":"acec1a902e1795b20a0204af82726cd2","url":"/vi-assets/static-assets/story-woff2.fonts-acec1a902e1795b20a0204af82726cd2.css"}},"opinion":{"woff":{"hash":"dfc5106c9c0aaa76688687e664474b04","url":"/vi-assets/static-assets/opinion-woff.fonts-dfc5106c9c0aaa76688687e664474b04.css"},"woff2":{"hash":"e2b27ff317927dfd77bdd429409627e0","url":"/vi-assets/static-assets/opinion-woff2.fonts-e2b27ff317927dfd77bdd429409627e0.css"}},"tmag":{"woff":{"hash":"4634f3c7ddebb9113b69d4578d9a0ba0","url":"/vi-assets/static-assets/tmag-woff.fonts-4634f3c7ddebb9113b69d4578d9a0ba0.css"},"woff2":{"hash":"8622c93c260fa93b229b7249df708fb1","url":"/vi-assets/static-assets/tmag-woff2.fonts-8622c93c260fa93b229b7249df708fb1.css"}},"mag":{"woff":{"hash":"109e6d301ed49c8078086b5892696adf","url":"/vi-assets/static-assets/mag-woff.fonts-109e6d301ed49c8078086b5892696adf.css"},"woff2":{"hash":"fb42c728dc70cc4ef6010a60cb10b0bd","url":"/vi-assets/static-assets/mag-woff2.fonts-fb42c728dc70cc4ef6010a60cb10b0bd.css"}},"well":{"woff":{"hash":"f0e613b89006e99b4622d88aa5563a81","url":"/vi-assets/static-assets/well-woff.fonts-f0e613b89006e99b4622d88aa5563a81.css"},"woff2":{"hash":"77806b85de524283fe742b916c9d0ee4","url":"/vi-assets/static-assets/well-woff2.fonts-77806b85de524283fe742b916c9d0ee4.css"}}},["shared","story"],["opinion","tmag","mag","well"]]); })();;(function () { function swgDataLayer(e){return!!window.dataLayer&&((window.dataLayer=window.dataLayer||[]).push({event:"impression",module:e}),!0)}function checkSwgOptOut(){if(!window.localStorage)return!1;var e=window.localStorage.getItem("nyt-swgOptOut");if(!e)return!1;var t=parseInt(e,10);return((new Date).getTime()-t)/864e5<1||(window.localStorage.removeItem("nyt-swgOptOut"),!1)}function swgDeferredAccount(e,t){return e.completeDeferredAccountCreation({entitlements:t,consent:!1}).then(function(e){var t=vi.env.AUTH_HOST+"/svc/account/auth/v1/swg-dal-web",n=e.purchaseData.raw.data?e.purchaseData.raw.data:e.purchaseData.raw,o=JSON.parse(n),a={package_name:o.packageName,product_id:o.productId,purchase_token:o.purchaseToken,google_id_token:e.userData.idToken,google_user_email:e.userData.email,google_user_id:e.userData.id,google_user_name:e.userData.name},r=new XMLHttpRequest;r.withCredentials=!0,r.open("POST",t,!0),r.setRequestHeader("Content-Type","application/json"),r.send(JSON.stringify(a)),r.onload=function(){200===r.status?(swgDataLayer({name:"swg",context:"Deferred",label:"Seamless Signin",region:"swg-modal"}),e.complete().then(function(){window.location.reload(!0)})):(e.complete(),window.location=encodeURI(vi.env.AUTH_HOST+"/get-started/swg-link?redirect="+window.location.href))}}).catch(function(){return!!window.localStorage&&(!window.localStorage.getItem("nyt-swgOptOut")&&(window.localStorage.setItem("nyt-swgOptOut",(new Date).getTime()),!0))}),!0}function loginWithGoogle(){return"undefined"!=typeof window&&(-1===document.cookie.indexOf("NYT-S")&&(!0!==checkSwgOptOut()&&(!!window.SWG&&((window.SWG=window.SWG||[]).push(function(e){return e.init(vi.env.SWG_PUBLICATION_ID),e.getEntitlements().then(function(t){if(void 0===t||!t.raw)return!1;var n={entitlements_token:t.raw};return window.swgUserInfoXhrObject.withCredentials=!0,window.swgUserInfoXhrObject.open("POST",vi.env.AUTH_HOST+"/svc/account/auth/v1/login-swg-web",!0),window.swgUserInfoXhrObject.setRequestHeader("Content-Type","application/json"),window.swgUserInfoXhrObject.send(JSON.stringify(n)),window.swgUserInfoXhrObject.onload=function(){switch(window.swgUserInfoXhrObject.status){case 200:return swgDataLayer({name:"swg",context:"Seamless",label:"Seamless Signin",region:"login"}),window.location.reload(!0),!0;case 412:return swgDeferredAccount(e,t);default:return!1}},t}).catch(function(){return!1}),!0}),!0))))}var _f=function(){if(window.swgUserInfoXhrObject.checkSwgResponse=!1,-1===document.cookie.indexOf("NYT-S")){var e=document.createElement("script");e.src="https://news.google.com/swg/js/v1/swg.js",e.setAttribute("subscriptions-control","manual"),e.setAttribute("async",!0),e.onload=function(){loginWithGoogle()},document.getElementsByTagName("head")[0].appendChild(e)}};;_f.apply(null, []); })();
+ </script>
+
+ <link data-rh="true" rel="shortcut icon" href="/vi-assets/static-assets/favicon-4bf96cb6a1093748bf5b3c429accb9b4.ico"/><link data-rh="true" rel="apple-touch-icon" href="/vi-assets/static-assets/apple-touch-icon-319373aaf4524d94d38aa599c56b8655.png"/><link data-rh="true" rel="apple-touch-icon-precomposed" sizes="144×144" href="/vi-assets/static-assets/ios-ipad-144x144-319373aaf4524d94d38aa599c56b8655.png"/><link data-rh="true" rel="apple-touch-icon-precomposed" sizes="114×114" href="/vi-assets/static-assets/ios-iphone-114x144-61d373c43aa8365d3940c5f1135f4597.png"/><link data-rh="true" rel="apple-touch-icon-precomposed" href="/vi-assets/static-assets/ios-default-homescreen-57x57-7cccbfb151c7db793e92ea58c30b9e72.png"/><link data-rh="true" rel="alternate" itemprop="mainEntityOfPage" hrefLang="en-US" href="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><link data-rh="true" rel="canonical" href="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><link data-rh="true" rel="alternate" href="android-app://com.nytimes.android/nytimes/reader/id/100000006583622"/><link data-rh="true" rel="amphtml" href="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.amp.html"/><link data-rh="true" rel="alternate" type="application/json+oembed" href="https://www.nytimes.com/svc/oembed/json/?url=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" title="She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database."/>
+ <script data-rh="true" >
+ if (typeof testCookie === 'undefined') {
+ var testCookie = function (name) {
+ var match = document.cookie.match(new RegExp(name + '=([^;]+)'));
+ if (match) return match[1];
+ }
+ }
+</script><script data-rh="true" >if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+
+ if (testCookie('nyt-gdpr') !== '1') {
+ var gptScript = document.createElement('script');
+ gptScript.async = 'async';
+ gptScript.src = '//securepubads.g.doubleclick.net/tag/js/gpt.js';
+ document.head.appendChild(gptScript);
+ }
+ }</script><script data-rh="true" >if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+
+ var googletag = googletag || {};
+ googletag.cmd = googletag.cmd || [];
+
+ if (testCookie('nyt-gdpr') == '1') {
+ googletag.cmd.push(function() {
+ googletag.pubads().setRequestNonPersonalizedAds(1);
+ });
+ }
+ }</script><script data-rh="true" >if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+ (function () { var _f=function(){var t,e,o=50,n=50;function i(t){if(!document.getElementById("3pCheckIframeId")){if(t||(t=1),!document.body){if(t>o)return;return t+=1,setTimeout(i.bind(null,t),n)}var e,a,r;e="https://static01.nyt.com/ads/tpc-check.html",a=document.body,(r=document.createElement("iframe")).src=e,r.id="3pCheckIframeId",r.style="display:none;",r.height=0,r.width=0,a.insertBefore(r,a.firstChild)}}function a(t){if("https://static01.nyt.com"===t.origin)try{"3PCookieSupported"===t.data&&googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","true")}),"3PCookieNotSupported"===t.data&&googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","false")})}catch(t){}}function r(){if(function(){if(Object.prototype.toString.call(window.HTMLElement).indexOf("Constructor")>0)return!0;if("[object SafariRemoteNotification]"===(!window.safari||safari.pushNotification).toString())return!0;try{return window.localStorage&&/Safari/.test(window.navigator.userAgent)}catch(t){return!1}}()){try{window.openDatabase(null,null,null,null)}catch(e){return t(),!0}try{localStorage.length?e():(localStorage.x=1,localStorage.removeItem("x"),e())}catch(o){navigator.cookieEnabled?t():e()}return!0}}!function(){try{googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","unknown")})}catch(t){}}(),t=function(){try{googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","private")})}catch(t){}}||function(){},e=function(){window.addEventListener("message",a,!1),i(0)}||function(){},function(){if(window.webkitRequestFileSystem)return window.webkitRequestFileSystem(window.TEMPORARY,1,e,t),!0}()||r()||function(){if(!window.indexedDB&&(window.PointerEvent||window.MSPointerEvent))return t(),!0}()||e()};;_f.apply(null, []); })();
+ }</script><script data-rh="true" >(function() {
+ var AdSlot4=function(){"use strict";function D(n,i,o){var t=document.getElementsByTagName("head")[0],e=document.createElement("script");i&&(e.onload=i),o&&(e.onerror=o),e.src=n,e.async=!0,t.appendChild(e)}return function(){var A=window.AdSlot4||{};A.cmd=A.cmd||[];var b=!1;if(A.loadScripts)return A;function z(t){"art, oak"!==t&&"art,oak"!==t||(t="art"),A.cmd.push(function(){A.events.subscribe({name:"AdDefined",scope:"all",callback:function(n){var o,i=[-1];n.sizes.forEach(function(n){n[0]<window.innerWidth&&n[0]>i[0]&&(i=[]).push(n)}),i[0][1]&&window.apstag.fetchBids({slots:[{slotID:n.id,slotName:"".concat(n.id,"_").concat(t,"_web"),sizes:(o=i[0][1],Array.isArray(o)?[[300,250],[728,90],[970,90],[970,250]].filter(function(i){return o.some(function(n){return n[0]===i[0]&&n[1]===i[1]})}):(console.warn("filterSizes() did not receive an array"),[]))}]},function(){window.googletag.cmd.push(function(){window.apstag.setDisplayBids()})})}})})}return A.loadScripts=function(n){var i,o,t,e,d,a,c,s,r=n||{},w=r.loadMnet,u=void 0===w||w,l=r.loadAmazon,p=void 0===l||l,f=r.loadBait,m=void 0===f||f,v=r.section,g=void 0===v?"none":v,h=r.pageViewId,y=void 0===h?"":h,B=r.pageType,x=void 0===B?"":B;b||("1"===(c="nyt-gdpr",(s=document.cookie.match(new RegExp("".concat(c,"=([^;]+)"))))?s[1]:"")||(d=document.referrer||"",(a=/([a-zA-Z0-9_\-.]+)(@|%40)([a-zA-Z0-9_\-.]+).([a-zA-Z]{2,5})/).test(d)||a.test(window.location.href))||(!u||window.advBidxc&&window.advBidxc.isLoaded||(t=y,e="8CU2553YN",window.innerWidth<740&&(e="8CULO58R6"),D("https://contextual.media.net/bidexchange.js?cid=".concat(e,"&dn=").concat("www.nytimes.com","&https=1"),function(){window.advBidxc&&window.advBidxc.isLoaded||console.warn("Media.net not loading properly")},function(){A.cmd.push(function(){A.events.publish({name:"BidderError",value:{type:"Mnet"}})})}),window.advBidxc=window.advBidxc||{},window.advBidxc.renderAd=function(){},window.advBidxc.startTime=(new Date).getTime(),window.advBidxc.customerId={mediaNetCID:e},window.advBidxc.misc={isGptDisabled:1},t&&(window.advBidxc.misc.keywords=t)),p&&!window.apstag&&(i=g,o=x,function(o,t){function n(n,i){t[o]._Q.push([n,i])}t[o]||(t[o]={init:function(){n("i",arguments)},fetchBids:function(){n("f",arguments)},setDisplayBids:function(){},targetingKeys:function(){return[]},_Q:[]})}("apstag",window),D("//c.amazon-adsystem.com/aax2/apstag.js",function(){window.apstag||console.warn("A9 not loading properly")},function(){A.cmd.push(function(){A.events.publish({name:"BidderError",value:{type:"A9"}})})}),window.apstag.init({pubID:"3030",adServer:"googletag",params:{si_section:i}}),z(o))),m&&D("https://static01.nyt.com/ads/google/adsbygoogle.js",function(){},function(){A.cmd.push(function(){A.events.publish({name:"AdEmpty",value:{type:"AdBlockOn"}})})}),b=!0)},window.AdSlot4=A}()}();
+ AdSlot4.loadScripts({
+ loadMnet: window.NYTD.Abra('medianet_toggle') !== '1_block',
+ loadAmazon: window.NYTD.Abra('amazon_toggle') !== '1_block',
+ section: 'nyregion',
+ pageType: 'art,oak',
+ pageViewId: window.NYTD.PageViewId.current,
+ });
+ (function () { var _f=function(e){var o=performance.navigation&&1===performance.navigation.type;function t(){return window.matchMedia("(max-width: 739px)").matches}function n(e){var n,r,i,d,a,p,u=function(){var e=window.userXhrObject&&""!==window.userXhrObject.responseText&&JSON.parse(window.userXhrObject.responseText).data||null,o=null;return e&&e.user&&e.user.userInfo&&(o=e.user.userInfo.demographics),o}();return u?(r=e,d=(n=u)&&n.emailSubscriptions,(a=n&&n.bundleSubscriptions)&&r&&(r.sub="reg",d&&d.length&&(r.em=d.toString().toLowerCase()),n.wat&&(r.wat=n.wat.toLowerCase()),a&&a.length&&a[0].bundle&&(i=a[0],r.sub=i.bundle.toLowerCase(),i.source&&(r.subsrc=i.source.toLowerCase()),i.promotion&&(r.subprm=i.promotion),i.in_grace&&(r.grace=i.in_grace.toString()))),e=r):e.sub="anon",t()?(e.prop="mnyt",e.plat="mweb",e.ver="mvi"):(e.prop="nyt",e.plat="web",e.ver="vi"),"hp"===e.typ&&(document.referrer&&(e.topref=document.referrer),o&&(e.refresh="manual")),e.abra_dfp=(p=document.documentElement.getAttribute("data-nyt-ab"))?p.split(" ").reduce(function(e,o){var t=o.split("="),n=t[0].toLowerCase(),r=t[1];return(n.indexOf("dfp")>-1||n.indexOf("redbird")>-1)&&e.push(n+"_"+r),e},[]):"",e.page_view_id=window.NYTD.PageViewId&&window.NYTD.PageViewId.current,e}var r=e||{},i=r.adTargeting||{},d=r.adUnitPath||"/29390238/nyt/homepage",a=r.offset||400,p=r.hideTopAd||t(),u=r.lockdownAds||!1,s=r.sizeMapping||{top:[[970,["fluid",[728,90],[970,90],[970,250],[1605,300]]],[728,["fluid",[728,90],[1605,300]]],[0,["fluid",[300,250],[300,420]]]],fp1:[[0,[195,250]]],fp2:[[0,[195,250]]],fp3:[[0,[195,250]]],interstitial:[[0,[[1,1],[640,480]]]],mktg:[[1020,[300,250]],[0,[]]],pencil:[[728,[[336,46]],[0,[]]]],pp_edpick:[[0,["fluid"]]],pp_morein:[[0,["fluid"],[210,218]]],ribbon:[[0,["fluid"]]],sponsor:[[765,[150,50]],[0,[320,25]]],supplemental:[[1020,[[300,250],[300,600]]],[0,[]]],default:[[970,["fluid",[728,90],[970,90],[970,250],[1605,300]]],[728,["fluid",[728,90],[300,250],[1605,300]]],[0,["fluid",[300,250],[300,420]]]]},l=r.dfpToggleName||"dfp_home_toggle";window.AdSlot4=window.AdSlot4||{},window.AdSlot4.cmd=window.AdSlot4.cmd||[],window.AdSlot4.cmd.push(function(){window.AdSlot4.init({adTargeting:n(i),adUnitPath:d,sizeMapping:s,offset:a,haltDFP:"1_block"===window.NYTD.Abra(l),hideTopAd:p,lockdownAds:u}),window.NYTD.Abra.reportExposure("dfp_adslot4v2")})};;_f.apply(null, [{"adTargeting":{"edn":"us","sov":"3","test":"projectvi","ver":"vi","hasVideo":false,"template":"article","als_test":"1565027040168","prop":"nyt","plat":"web","brandsensitive":"false","org":"policedepartmentnyc","geo":"newyorkcity","des":"juveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties","auth":"aliwatkins,josephgoldstein","coll":"newyork,usnews,technology,techandsociety","artlen":"medium","ledemedsz":"none","typ":"art,oak","section":"nyregion","si_section":"nyregion","id":"100000006583622","pt":"nt10,nt15,nt16,nt18,nt3,nt4,nt9","gscat":"neg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education"},"adUnitPath":"/29390238/nyt/nyregion/","dfpToggleName":"dfp_story_toggle"}]); })();
+ })();</script><script data-rh="true" id="als-svc">var alsVariant = window.NYTD.Abra('DFP_als');
+ if (alsVariant != null && alsVariant.match(/(0_control|1_als)/)) {
+ window.NYTD.Abra.reportExposure('DFP_als');
+ }
+ if (window.NYTD.Abra('DFP_als') === '1_als') {
+ (function () { var _f=function(){window.googletag=window.googletag||{},googletag.cmd=googletag.cmd||[];var e=new XMLHttpRequest,t="prd"===window.vi.env.ENVIRONMENT?"als-svc.nytimes.com":"als-svc.dev.nytimes.com",n=document.querySelector('[name="nyt_uri"]'),o=null==n?"":encodeURIComponent(n.content),l=document.querySelector('[name="template"]'),s=document.querySelector('[name="prop"]'),a=document.querySelector('[name="plat"]'),i=null==l||null==l.content?"":l.content,c=null==s||null==s.content?"nyt":s.content,r=null==a||null==a.content?"web":a.content;window.innerWidth<740&&(c="mnyt",r="mweb"),"/"===location.pathname&&(o=encodeURIComponent("https://www.nytimes.com/pages/index.html"));var d=window.localStorage.getItem("als_test_clientside");void 0!==d&&window.googletag.cmd.push(function(){googletag.pubads().setTargeting("als_test_clientside",d)}),e.open("GET","https://"+t+"/als?uri="+o+"&typ="+i+"&prop="+c+"&plat="+r),e.withCredentials=!0,e.send(),e.onreadystatechange=function(){if(4===e.readyState)if(200===e.status){var t=JSON.parse(e.responseText);window.googletag.cmd.push(function(){void 0!==t.als_test_clientside&&(googletag.pubads().setTargeting("als_test_clientside",t.als_test_clientside),window.localStorage.setItem("als_test_clientside","ls-"+t.als_test_clientside)),Object.keys(t).forEach(function(e){"User"===e&&void 0!==t[e]&&window.localStorage.setItem("UTS_User",JSON.stringify(t[e]))})})}else{console.error("Error "+e.responseText);(window.dataLayer=window.dataLayer||[]).push({event:"impression",module:{name:"timing",context:"script-load",label:"alsService-als-error"}})}}};;_f.apply(null, []); })();
+ }
+ </script>
+ <link rel="stylesheet" href="/vi-assets/static-assets/global-42db6c8821fec0e2b3837b2ea2ece8fe.css" />
+ <style>.css-1dv1kvn{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.css-v89234{overflow:hidden;height:100%;}.css-nuvmzp{font-size:14.25px;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;text-transform:uppercase;-webkit-letter-spacing:0.7px;-moz-letter-spacing:0.7px;-ms-letter-spacing:0.7px;letter-spacing:0.7px;line-height:19px;}.css-nuvmzp:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1gz70xg{border-left:1px solid #ccc;color:#326891;height:12px;margin-left:8px;padding-left:8px;}.css-9e9ivx{display:none;font-size:10px;margin-left:auto;text-transform:uppercase;}.hasLinks .css-9e9ivx{display:block;}@media (min-width:740px){.hasLinks .css-9e9ivx{margin:none;position:absolute;right:20px;}}@media (min-width:1024px){.hasLinks .css-9e9ivx{display:none;}}.css-2bwtzy{display:inline-block;padding:6px 4px 4px;margin-bottom:12px;font-size:12px;border-radius:3px;-webkit-transition:background 0.6s ease;transition:background 0.6s ease;}.css-2bwtzy:hover{background-color:#f7f7f7;}.css-1hyfx7x{display:none;}.css-6n7j50{display:inline;}.css-1kj7lfb{display:none;}@media (min-width:1024px){.css-1kj7lfb{display:inline-block;margin-right:7px;}}.css-10m9xeu{display:block;width:16px;height:16px;}.css-vz7hjd{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.css-1fe7a5q{display:inline-block;height:16px;vertical-align:sub;width:16px;}.css-1rn5q1r{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;background:#fff;display:inline-block;left:44px;text-transform:uppercase;-webkit-transition:none;transition:none;}.css-1rn5q1r:active,.css-1rn5q1r:focus{-webkit-clip:auto;clip:auto;overflow:visible;width:auto;height:auto;}.css-1rn5q1r::-moz-focus-inner{padding:0;border:0;}.css-1rn5q1r:-moz-focusring{outline:1px dotted;}.css-1rn5q1r:disabled,.css-1rn5q1r.disabled{opacity:0.5;cursor:default;}.css-1rn5q1r:active,.css-1rn5q1r.active{background-color:#f7f7f7;}@media (min-width:740px){.css-1rn5q1r:hover{background-color:#f7f7f7;}}.css-1rn5q1r:focus{margin-top:3px;padding:8px 8px 6px;}@media (min-width:1024px){.css-1rn5q1r{left:112px;}}.css-10488qs{display:none;}@media (min-width:1024px){.css-10488qs{display:inline-block;position:relative;}}.css-1iruc8t{list-style:none;margin:0;padding:0;}.css-1ropbjl::before{background-color:$white;border-bottom:1px solid #e2e2e2;border-top:2px solid #e2e2e2;content:'';display:block;height:1px;margin-top:0;}@media (min-width:1150px){.css-1ropbjl{margin:0 auto;max-width:1200px;padding:0 3% 9px;}}.NYTApp .css-1ropbjl{display:none;}@media print{.css-1ropbjl{display:none;}}.css-uw59u{padding:0 20px;}@media (min-width:740px){.css-uw59u{padding:0 3%;}}@media (min-width:1150px){.css-uw59u{padding:0;}}.css-jxzr5i{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;}.css-oylsik{display:block;height:44px;vertical-align:middle;width:184px;}.css-1otr2jl{margin:18px 0 0 auto;}.css-1c8n994{color:#6288a5;font-family:nyt-franklin;font-size:11px;font-style:normal;font-weight:400;line-height:11px;-webkit-text-decoration:none;text-decoration:none;}.css-qtw155{display:block;}@media (min-width:1150px){.css-qtw155{display:none;}}.css-v0l3hm{display:none;}@media (min-width:1150px){.css-v0l3hm{display:block;}}.css-g4gku8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:10px;min-width:600px;}.css-1rr4qq7{-webkit-flex:1;-ms-flex:1;flex:1;}.css-6xhk3s{border-left:1px solid #e2e2e2;-webkit-flex:1;-ms-flex:1;flex:1;padding-left:15px;}.css-rxqrcl{color:#333;font-size:13px;font-weight:700;font-family:nyt-franklin;height:25px;line-height:15px;margin:0;text-transform:uppercase;width:150px;}.css-tj0ten{margin-bottom:5px;white-space:nowrap;}.css-tj0ten:last-child{margin-bottom:10px;}.css-ist4u3.desktop{display:none;}@media (min-width:740px){.css-ist4u3.desktop{display:block;}.css-ist4u3.smartphone{display:none;}}.css-1gprdgz{list-style:none;margin:0;padding:0;-webkit-columns:2;columns:2;padding:0 0 15px;}.css-10t7hia{height:34px;line-height:34px;list-style-type:none;}.css-10t7hia.desktop{display:none;}@media (min-width:740px){.css-10t7hia.desktop{display:block;}.css-10t7hia.smartphone{display:none;}}.css-mzqdl{color:#333;display:block;font-family:nyt-franklin;font-size:15px;font-weight:500;height:34px;line-height:34px;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;}.css-kwpx34{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:14px;font-weight:500;height:23px;line-height:16px;}.css-kwpx34:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-kwpx34{color:#fff;}.css-1k2cjfc{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:16px;font-weight:700;height:25px;line-height:15px;padding-bottom:0;}.css-1k2cjfc:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-1k2cjfc{color:#fff;}.css-1vhk1ks{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:11px;font-weight:500;height:23px;line-height:21px;}.css-1vhk1ks:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-1vhk1ks{color:#fff;}.css-6td9kr{list-style:none;margin:0;padding:0;border-top:1px solid #e2e2e2;margin-top:2px;padding-top:10px;}.css-r5ic95{display:inline-block;height:13px;width:13px;margin-right:7px;vertical-align:middle;}.css-15uy5yv{border-top:1px solid #ebebeb;padding-top:9px;}.css-1p8nkc0{color:#999;font-family:nyt-franklin,helvetica,arial,sans-serif;padding:10px 0;-webkit-text-decoration:none;text-decoration:none;white-space:nowrap;}.css-1p8nkc0:hover{-webkit-text-decoration:underline;text-decoration:underline;}@-webkit-keyframes animation-5j8bii{from{opacity:0;}to{opacity:1;}}@keyframes animation-5j8bii{from{opacity:0;}to{opacity:1;}}@-webkit-keyframes animation-1am0aiv{from{visibility:visible;opacity:1;}to{visibility:visible;opacity:0;}}@keyframes animation-1am0aiv{from{visibility:visible;opacity:1;}to{visibility:visible;opacity:0;}}.css-1g7m0tk{color:#326891;}.css-1g7m0tk:visited{color:#326891;}.css-d8bdto{color:#999;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:17px;margin-bottom:5px;}@media print{.css-d8bdto{display:none;}}.css-y8aj3r{padding:0;}.css-60hakz{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-60hakz a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-60hakz:nth-of-type(3),.css-60hakz:nth-of-type(4){display:none;}}.css-60hakz:last-of-type{margin-right:0;}.css-i29ckm{width:calc(100% - 40px);max-width:600px;margin:1.5rem auto 2rem;}@media (min-width:1440px){.css-i29ckm{width:600px;max-width:600px;}}@media (min-width:600px){.css-i29ckm{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}@media (max-width:600px){.css-i29ckm .facebook,.css-i29ckm .twitter,.css-i29ckm .email{display:inline-block;}}.css-acwcvw{margin-bottom:1rem;}.css-1baulvz{display:inline-block;}@-webkit-keyframes animation-f8wsfj{0%{opacity:1;}50%{opacity:0;}100%{opacity:0;}}@keyframes animation-f8wsfj{0%{opacity:1;}50%{opacity:0;}100%{opacity:0;}}@-webkit-keyframes animation-mhvv8m{0%{opacity:0;}50%{opacity:0;}100%{opacity:1;}}@keyframes animation-mhvv8m{0%{opacity:0;}50%{opacity:0;}100%{opacity:1;}}@-webkit-keyframes animation-m6999o{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}}@keyframes animation-m6999o{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}}.css-i9gxme{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}@-webkit-keyframes animation-1m9j9gf{from{background-color:#f7f7f5;}to{background-color:transparent;}}@keyframes animation-1m9j9gf{from{background-color:#f7f7f5;}to{background-color:transparent;}}.css-1sy8kpn{display:none;}@media (min-width:765px){.css-1sy8kpn{background-color:#f7f7f7;border-bottom:1px solid #f3f3f3;display:block;padding-bottom:15px;padding-top:15px;margin:0;min-height:90px;}}@media print{.css-1sy8kpn{display:none;}}.css-19vbshk{color:#ccc;display:none;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.5625rem;font-weight:300;-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;line-height:0.5625rem;margin-left:auto;text-align:center;text-transform:uppercase;}@media (min-width:600px){.css-19vbshk{display:inline-block;}}.css-19vbshk p{margin-bottom:auto;margin-right:7px;margin-top:auto;text-transform:none;}.css-l9onyx{color:#ccc;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.5625rem;font-weight:300;-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;line-height:0.5625rem;margin-bottom:9px;text-align:center;text-transform:uppercase;}.css-79elbk{position:relative;}@-webkit-keyframes animation-1q1yk17{to{width:11px;}}@keyframes animation-1q1yk17{to{width:11px;}}@-webkit-keyframes animation-g7rb99{0%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0);}100%{-webkit-transform:scale(1.05) rotate(-90deg);-ms-transform:scale(1.05) rotate(-90deg);transform:scale(1.05) rotate(-90deg);}}@keyframes animation-g7rb99{0%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0);}100%{-webkit-transform:scale(1.05) rotate(-90deg);-ms-transform:scale(1.05) rotate(-90deg);transform:scale(1.05) rotate(-90deg);}}.css-k008qs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.sizeSmall .css-bsn42l{width:50%;}@media (min-width:600px){.sizeSmall .css-bsn42l{width:300px;}}@media (min-width:1440px){.sizeSmall .css-bsn42l{width:300px;}}@media (max-width:600px){.sizeSmall .css-bsn42l{width:50%;}}.sizeSmall.sizeSmallNoCaption .css-bsn42l{margin-left:auto;margin-right:auto;}@media (min-width:740px){.sizeSmall.layoutVertical .css-bsn42l{max-width:250px;}}@media (min-width:1024px){.sizeSmall.layoutVertical .css-bsn42l{width:250px;}}@media (max-width:740px){.sizeSmall.layoutVertical .css-bsn42l{max-width:250px;}}@media (min-width:740px){.sizeSmall.layoutHorizontal .css-bsn42l{max-width:300px;}}@media (min-width:1024px){.sizeSmall.layoutHorizontal .css-bsn42l{width:300px;}}@media (max-width:740px){.sizeSmall.layoutHorizontal .css-bsn42l{max-width:300px;}}@media (min-width:600px){.sizeMedium.layoutVertical.verticalVideo .css-bsn42l{width:310px;}}.css-11cwn6f{width:100%;vertical-align:top;}.css-11cwn6f img{width:100%;vertical-align:top;}@-webkit-keyframes animation-ghw4n2{0%{opacity:0;-webkit-transform:translateY(100px);-ms-transform:translateY(100px);transform:translateY(100px);}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}}@keyframes animation-ghw4n2{0%{opacity:0;-webkit-transform:translateY(100px);-ms-transform:translateY(100px);transform:translateY(100px);}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}}@-webkit-keyframes animation-1c5cfvc{0%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}50%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}75%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}}@keyframes animation-1c5cfvc{0%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}50%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}75%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}}@-webkit-keyframes animation-htgkrt{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}50%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}75%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}}@keyframes animation-htgkrt{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}50%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}75%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}}@-webkit-keyframes animation-e64et{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}25%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}75%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}}@keyframes animation-e64et{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}25%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}75%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}}@-webkit-keyframes animation-9zaqp9{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}25%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}75%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}}@keyframes animation-9zaqp9{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}25%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}75%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}}@-webkit-keyframes animation-16fq4rz{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}25%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}50%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}}@keyframes animation-16fq4rz{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}25%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}50%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}}@-webkit-keyframes animation-1kjk1j2{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}25%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}50%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}}@keyframes animation-1kjk1j2{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}25%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}50%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}}@-webkit-keyframes animation-88g286{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}25%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}50%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}75%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}}@keyframes animation-88g286{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}25%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}50%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}75%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}}@-webkit-keyframes animation-12yx39b{0%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}25%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}50%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}75%{-webkit-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);transform:translate(34px,0px) scale(1,1) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}}@keyframes animation-12yx39b{0%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}25%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}50%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}75%{-webkit-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);transform:translate(34px,0px) scale(1,1) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}}@-webkit-keyframes animation-4hu8jm{0%{-webkit-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);}33.33%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);}}@keyframes animation-4hu8jm{0%{-webkit-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);}33.33%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);}}@-webkit-keyframes animation-1wqz2f4{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);}}@keyframes animation-1wqz2f4{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);}}@-webkit-keyframes animation-yl3z84{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);}}@keyframes animation-yl3z84{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);}}@-webkit-keyframes animation-1q3gjvc{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);}}@keyframes animation-1q3gjvc{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);}}@-webkit-keyframes animation-nc39ev{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);}}@keyframes animation-nc39ev{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);}}@-webkit-keyframes animation-amd09y{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);}}@keyframes animation-amd09y{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);}}@-webkit-keyframes animation-ru1vxe{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);}}@keyframes animation-ru1vxe{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);}}@-webkit-keyframes animation-ajnadh{0%{-webkit-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);}33.33%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);}}@keyframes animation-ajnadh{0%{-webkit-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);}33.33%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);}}.css-1ri25x2{display:none;}@media (min-width:740px){.css-1ri25x2{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:16px;height:31px;}}@media (min-width:1024px){.css-1ri25x2{display:none;}}.css-12fr9lp{height:23px;margin-top:6px;}.css-1hfdzay{display:none;}@media (min-width:1024px){.css-1hfdzay{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:0;}}.css-4g4cvq{display:none;}@media (min-width:740px){.css-4g4cvq{position:fixed;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;opacity:0;z-index:1;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;width:100%;height:32.063px;background:white;padding:5px 0;top:0;text-align:center;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;box-shadow:rgba(0,0,0,0.08) 0 0 5px 1px;border-bottom:1px solid #e2e2e2;}}.css-m6xlts{margin-left:20px;margin-right:20px;max-width:1605px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;width:100%;}@media (min-width:1360px){.css-m6xlts{margin-left:20px;margin-right:20px;}}@media (min-width:1780px){.css-m6xlts{margin-left:auto;margin-right:auto;}}.css-1ahhg7f{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;max-width:1605px;overflow:hidden;position:absolute;width:56%;margin-left:calc((100% - 56%) / 2);}@media (min-width:1024px){.css-1ahhg7f{width:56%;margin-left:calc((100% - 56%) / 2);}}@media (min-width:1024px){.css-1ahhg7f{width:53%;margin-left:calc((100% - 53%) / 2);}}.css-fwqvlz{font-family:nyt-cheltenham-small,georgia,'times new roman';font-weight:400;font-size:13px;-webkit-letter-spacing:0.015em;-moz-letter-spacing:0.015em;-ms-letter-spacing:0.015em;letter-spacing:0.015em;margin-top:10.5px;margin-right:auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.css-17xtcya{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;font-size:12.5px;text-transform:uppercase;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;margin-top:12.5px;margin-bottom:auto;margin-left:auto;white-space:nowrap;}.css-17xtcya:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-x15j1o{display:inline-block;padding-left:7px;padding-right:7px;font-size:13px;margin-top:10px;margin-bottom:auto;color:#ccc;}.css-1705lsu{margin-top:auto;margin-bottom:auto;margin-left:auto;background-color:#fff;z-index:50;box-shadow:-14px 2px 7px -2px rgba(255,255,255,0.7);}@media (min-width:740px){.css-1iwv8en{margin-top:1px;}}@media (min-width:1024px){.css-1iwv8en{margin-top:0;}}@-webkit-keyframes animation-b7n1on{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-b7n1on{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@-webkit-keyframes animation-1b9egsl{0%{-webkit-transform:rotate(20deg);-ms-transform:rotate(20deg);transform:rotate(20deg);}100%{-webkit-transform:rotate(380deg);-ms-transform:rotate(380deg);transform:rotate(380deg);}}@keyframes animation-1b9egsl{0%{-webkit-transform:rotate(20deg);-ms-transform:rotate(20deg);transform:rotate(20deg);}100%{-webkit-transform:rotate(380deg);-ms-transform:rotate(380deg);transform:rotate(380deg);}}.css-1rj8to8{display:inline-block;line-height:1em;}.css-1rj8to8 .css-0{-webkit-text-decoration:none;text-decoration:none;display:inline-block;}.css-4w91ra{display:inline-block;padding-left:3px;}.css-wg1cha{margin-left:20px;margin-right:20px;}@media (min-width:600px){.css-wg1cha{width:calc(100% - 40px);max-width:600px;margin:1.5rem auto 1em;}}@media (min-width:1440px){.css-wg1cha{width:600px;max-width:600px;margin:1.5rem auto 1em;}}.css-1ubp8k9{font-family:nyt-imperial,georgia,'times new roman',times,serif;font-style:italic;font-size:1.0625rem;line-height:1.5rem;width:calc(100% - 40px);max-width:600px;margin:1rem auto 0.75rem;}@media (min-width:740px){.css-1ubp8k9{font-size:1.1875rem;line-height:1.75rem;margin-bottom:1.25rem;}}@media (min-width:1440px){.css-1ubp8k9{width:600px;max-width:600px;}}@media print{.css-1ubp8k9{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@-webkit-keyframes animation-1egl8em{from{opacity:0;-webkit-transform:translate3d(0,13%,0);-ms-transform:translate3d(0,13%,0);transform:translate3d(0,13%,0);}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}@keyframes animation-1egl8em{from{opacity:0;-webkit-transform:translate3d(0,13%,0);-ms-transform:translate3d(0,13%,0);transform:translate3d(0,13%,0);}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.css-vdv0al{font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.75rem;line-height:1rem;width:calc(100% - 40px);max-width:600px;margin:0 auto 1em;color:#999;}.css-vdv0al a{color:#999;-webkit-text-decoration:none;text-decoration:none;}.css-vdv0al a:hover{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:1440px){.css-vdv0al{width:600px;max-width:600px;}}@media print{.css-vdv0al{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-vdv0al span{display:none;}}.css-1i2y565 .e6idgb70 + .e1h9rw200{margin-top:0;}.css-1i2y565 .eoo0vm40 + .e1gnsphs0{margin-top:-0.3em;}.css-1i2y565 .e6idgb70 + .eoo0vm40{margin-top:0;}.css-1i2y565 .eoo0vm40 + figure{margin-top:1.2rem;}.css-1i2y565 .e1gnsphs0 + figure{margin-top:1.2rem;}.css-o6xoe7{display:none;}@media (min-width:1024px){.css-o6xoe7{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:0;margin-left:auto;width:130px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}@media (min-width:1150px){.css-o6xoe7{width:210px;}}@media print{.css-o6xoe7{display:none;}}.css-1fanzo5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-bottom:1rem;}@media (min-width:1024px){.css-1fanzo5{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;height:100%;width:945px;margin-left:auto;margin-right:auto;}}@media (min-width:1150px){.css-1fanzo5{width:1110px;margin-left:auto;margin-right:auto;}}@media (min-width:1280px){.css-1fanzo5{width:1170px;}}@media (min-width:1440px){.css-1fanzo5{width:1200px;}}@media print{.css-1fanzo5{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-1fanzo5{margin-bottom:1em;display:block;}}.css-53u6y8{margin-left:auto;margin-right:auto;width:100%;}@media (min-width:1024px){.css-53u6y8{margin-left:calc((100% - 600px) / 2);margin-right:0;width:600px;}}@media (min-width:1440px){.css-53u6y8{max-width:600px;width:600px;margin-left:calc((100% - 600px) / 2);}}@media print{.css-53u6y8{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1m50asq{width:100%;vertical-align:top;}.css-z3e15g{position:fixed;opacity:0;-webkit-scroll-events:none;-moz-scroll-events:none;-ms-scroll-events:none;scroll-events:none;top:0;left:0;bottom:0;right:0;-webkit-transition:opacity 0.2s;transition:opacity 0.2s;background-color:#fff;pointer-events:none;}.css-uwwqev{width:100%;height:100%;}.css-1ly73wi{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);overflow:hidden;}@-webkit-keyframes animation-7y3qfv{0%{opacity:0;}10%,90%{opacity:1;}100%{opacity:0;}}@keyframes animation-7y3qfv{0%{opacity:0;}10%,90%{opacity:1;}100%{opacity:0;}}.css-l72opv{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;position:relative;right:3px;}.css-l72opv a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-l72opv:nth-of-type(3),.css-l72opv:nth-of-type(4){display:none;}}.css-l72opv:last-of-type{margin-right:0;}.css-4skfbu{color:#999;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:17px;margin-bottom:5px;margin-bottom:0;}@media print{.css-4skfbu{display:none;}}.css-1fcn4th{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-1fcn4th a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-1fcn4th:nth-of-type(3),.css-1fcn4th:nth-of-type(4){display:none;}}.css-1fcn4th:last-of-type{margin-right:0;}@media (max-width:1150px){.css-1fcn4th:nth-of-type(1),.css-1fcn4th:nth-of-type(2),.css-1fcn4th:nth-of-type(3){display:none;}}.css-13zu7ev{display:inline-block;height:15px;vertical-align:middle;width:15px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:14px;height:14px;}.css-13zu7ev.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-13zu7ev.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-13zu7ev.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-13zu7ev.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-13zu7ev.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-13zu7ev.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-13zu7ev.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-13zu7ev:hover{background-color:#fff;border:1px solid #ccc;}.css-f7l8cz{display:inline-block;height:15px;vertical-align:middle;width:15px;bottom:5px;position:relative;width:14px;height:14px;bottom:4px;}.css-f7l8cz.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-f7l8cz.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-f7l8cz.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-f7l8cz.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-f7l8cz.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-f7l8cz.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-f7l8cz.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-16ogagc{background:transparent;display:inline-block;height:20px;width:20px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:27px;height:27px;}.css-16ogagc.hidden{opacity:0;visibility:hidden;}.css-16ogagc.hidden:focus{opacity:1;}.css-16ogagc:hover{background-color:#fff;border:1px solid #ccc;}.css-17ai7jg{color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;margin:10px 20px 0;text-align:left;}.css-17ai7jg a{color:#326891;-webkit-text-decoration:none;text-decoration:none;}.css-17ai7jg a:hover,.css-17ai7jg a:focus{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:600px){.css-17ai7jg{margin-left:0;}}.sizeSmall .css-17ai7jg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:calc(50% - 15px);margin:auto 0 15px 15px;}@media (min-width:600px){.sizeSmall .css-17ai7jg{width:260px;margin-left:15px;}}@media (min-width:740px){.sizeSmall .css-17ai7jg{margin-left:15px;}}@media (min-width:1440px){.sizeSmall .css-17ai7jg{width:330px;margin-left:15px;}}@media (max-width:600px){.sizeSmall .css-17ai7jg{margin:auto 0 0 15px;}}.sizeSmall.sizeSmallNoCaption .css-17ai7jg{margin-left:auto;margin-right:auto;margin-top:10px;}.sizeMedium .css-17ai7jg{max-width:900px;}.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{margin-left:0;margin-right:0;}@media (min-width:600px){.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:255px;margin:auto 0 15px 15px;}}@media (min-width:1440px){.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{width:325px;}}.sizeLarge .css-17ai7jg{max-width:none;}@media (min-width:600px){.sizeLarge .css-17ai7jg{margin-left:20px;}}@media (min-width:740px){.sizeLarge .css-17ai7jg{margin-left:20px;max-width:900px;}}@media (min-width:1024px){.sizeLarge .css-17ai7jg{margin-left:0;max-width:720px;}}@media (min-width:1440px){.sizeLarge .css-17ai7jg{margin-left:0;max-width:900px;}}@media (min-width:740px){.sizeLarge.layoutVertical .css-17ai7jg{margin-left:0;}}.sizeFull .css-17ai7jg{margin-left:20px;}@media (min-width:600px){.sizeFull .css-17ai7jg{max-width:900px;}}@media (min-width:740px){.sizeFull .css-17ai7jg{max-width:900px;}}@media (min-width:1440px){.sizeFull .css-17ai7jg{max-width:900px;}}@media print{.css-17ai7jg{display:none;}}.css-8i9d0s{margin-right:7px;color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:0.875rem;line-height:1.125rem;}@media (min-width:740px){.css-8i9d0s{font-size:0.9375rem;line-height:1.25rem;}}.css-8i9d0s strong{font-weight:700;}.css-8i9d0s em{font-style:italic;}.css-8i9d0s a{color:#326891;}.css-8i9d0s a:visited{color:#326891;}.css-1nwzsjy{display:inline-block;color:#888;font-family:nyt-imperial,georgia,'times new roman',times,serif;line-height:1.125rem;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;font-size:0.75rem;}@media (min-width:740px){.css-1nwzsjy{font-size:0.75rem;}}@media (min-width:1150px){.css-1nwzsjy{font-size:0.8125rem;}}@media (min-width:600px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:5px;}}@media (min-width:1024px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:5px;}}@media (min-width:1440px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:40px;}}@media (max-width:600px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:-8px;}}@media print{.css-1nwzsjy{display:none;}}.css-10698na{text-align:center;}@media (min-width:740px){.css-10698na{padding-top:0;}}@media (min-width:1024px){}@media print{.css-10698na a[href]::after{content:'';}.css-10698na svg{fill:black;}}.css-nhjhh0{display:block;width:189px;height:26px;margin:5px auto 0;}@media (min-width:740px){.css-nhjhh0{width:225px;height:31px;margin:4px auto 0;}}@media (min-width:1024px){.css-nhjhh0{width:195px;height:26px;margin:6px auto 0;}}.css-1nuro5j{display:inline-block;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.875rem;line-height:1.125rem;margin:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;color:#333;}@media (min-width:740px){.css-1nuro5j{font-size:0.9375rem;line-height:1.25rem;}}.css-1w5cs23{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.css-1w5cs23 li{list-style:none;}.css-4brsb6{display:inline-block;height:15px;vertical-align:middle;width:15px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:15px;height:15px;}.css-4brsb6.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-4brsb6.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-4brsb6.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-4brsb6.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-4brsb6.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-4brsb6.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-4brsb6.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-4brsb6:hover{background-color:#fff;border:1px solid #ccc;}.css-uhuo44{display:inline-block;height:15px;vertical-align:middle;width:15px;bottom:5px;position:relative;width:15px;height:15px;bottom:4px;}.css-uhuo44.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-uhuo44.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-uhuo44.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-uhuo44.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-uhuo44.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-uhuo44.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-uhuo44.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-exrw3m{margin-bottom:0.78125rem;margin-top:0;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:1.125rem;line-height:1.5625rem;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:740px){.css-exrw3m{margin-bottom:0.9375rem;margin-top:0;}}.css-exrw3m .css-1g7m0tk{-webkit-text-decoration:underline;text-decoration:underline;}.css-exrw3m .css-1g7m0tk:hover,.css-exrw3m .css-1g7m0tk:focus{-webkit-text-decoration:none;text-decoration:none;}@media (min-width:740px){.css-exrw3m{font-size:1.25rem;line-height:1.875rem;}}.css-exrw3m:first-child{margin-top:0;}.css-exrw3m:last-child{margin-bottom:0;}.css-exrw3m.e1h9rw200:last-child{margin-bottom:0.75rem;}@media (min-width:600px){.css-exrw3m{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-exrw3m{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-exrw3m{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1a48zt4{opacity:1;-webkit-transition:opacity 0.3s 0.2s;transition:opacity 0.3s 0.2s;}.css-vuqh7u{display:inline-block;color:#888;font-family:nyt-imperial,georgia,'times new roman',times,serif;line-height:1.125rem;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;font-size:0.75rem;}@media (min-width:740px){.css-vuqh7u{font-size:0.75rem;}}@media (min-width:1150px){.css-vuqh7u{font-size:0.8125rem;}}.css-1l44abu{font-family:nyt-imperial,georgia,'times new roman',times,serif;color:#666;margin:10px 20px 0 20px;text-align:left;}.css-1l44abu a{color:#326891;-webkit-text-decoration:none;text-decoration:none;}.css-1l44abu a:hover,.css-1l44abu a:focus{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:600px){.css-1l44abu{margin-left:0;margin-right:20px;}}@media (min-width:1440px){.css-1l44abu{max-width:px;}}.css-jcw7oy{width:100%;max-width:600px;margin:2.3125rem auto;}@media (min-width:600px){.css-jcw7oy{width:calc(100% - 40px);}}@media (min-width:740px){.css-jcw7oy{width:auto;max-width:600px;}}@media (min-width:1440px){.css-jcw7oy{max-width:720px;}}.css-jcw7oy strong{font-weight:700;}.css-jcw7oy em{font-style:italic;}@media (min-width:740px){.css-jcw7oy{margin:2.6875rem auto;}}.css-10raysz{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;width:calc(100% - 40px);max-width:600px;padding:0 1rem 0 0;}.css-10raysz a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-10raysz:nth-of-type(3),.css-10raysz:nth-of-type(4){display:none;}}.css-10raysz:last-of-type{margin-right:0;}.css-10raysz:nth-of-type(1),.css-10raysz:nth-of-type(2),.css-10raysz:nth-of-type(3),.css-10raysz:nth-of-type(4){display:inline;}@media (min-width:600px){.css-10raysz{width:330px;}}.css-ar1l6a{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-ar1l6a a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-ar1l6a:nth-of-type(3),.css-ar1l6a:nth-of-type(4){display:none;}}.css-ar1l6a:last-of-type{margin-right:0;}.css-ar1l6a:nth-of-type(1),.css-ar1l6a:nth-of-type(2),.css-ar1l6a:nth-of-type(3),.css-ar1l6a:nth-of-type(4){display:inline;}.css-1ede5it{background-color:#f7f7f7;border-bottom:1px solid #f3f3f3;border-top:1px solid #f3f3f3;margin:37px auto;padding-bottom:30px;padding-top:12px;text-align:center;margin-top:60px;}@media (min-width:740px){.css-1ede5it{margin:43px auto;}}@media print{.css-1ede5it{display:none;}}@media (min-width:740px){.css-1ede5it{margin-bottom:0;margin-top:0;}}.css-mn5hq9{cursor:pointer;margin:0;border-top:1px solid #ebebeb;color:#333;font-family:nyt-franklin;font-size:13px;font-weight:700;height:44px;-webkit-letter-spacing:0.04rem;-moz-letter-spacing:0.04rem;-ms-letter-spacing:0.04rem;letter-spacing:0.04rem;line-height:44px;text-transform:uppercase;}.accordionExpanded .css-mn5hq9{color:#b3b3b3;}.css-1qmnftd{font-size:11px;text-align:center;}@media (max-width:600px){.css-1qmnftd{padding-bottom:25px;}}@media (min-width:600px){.css-1qmnftd{padding-bottom:25px;}}@media (min-width:1024px){.css-1qmnftd{padding:0 3% 9px;}}@media (min-width:1150px){.css-1qmnftd{margin:0 auto;max-width:1200px;}}.NYTApp .css-1qmnftd{display:none;}@media print{.css-1qmnftd{display:none;}}.css-1ho5u4o{list-style:none;margin:0 0 15px;padding:0;}@media (min-width:600px){.css-1ho5u4o{display:inline-block;}}.css-13o0c9t{list-style:none;line-height:8px;margin:0 0 35px;padding:0;}@media (min-width:600px){.css-13o0c9t{display:inline-block;}}.css-1yo489b{display:inline-block;line-height:20px;padding:0 10px;}.css-1yo489b:first-child{border-left:none;}.css-1yo489b.desktop{display:none;}@media (min-width:740px){.css-1yo489b.smartphone{display:none;}.css-1yo489b.desktop{display:inline-block;}}.css-ulr03x{opacity:1;visibility:visible;-webkit-animation-name:animation-5j8bii;animation-name:animation-5j8bii;-webkit-animation-duration:300ms;animation-duration:300ms;-webkit-animation-delay:0ms;animation-delay:0ms;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;}@media print{.css-ulr03x{margin-bottom:15px;}}@media (min-width:1024px){.css-ulr03x{position:fixed;width:100%;top:0;left:0;z-index:200;background-color:#fff;border-bottom:none;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}}@media (min-width:1024px){.css-1bymuyk{position:relative;border-bottom:1px solid #e2e2e2;}}.css-1waixk9{background:#fff;border-bottom:1px solid #e2e2e2;height:36px;padding:8px 15px 3px;position:relative;}@media (min-width:740px){.css-1waixk9{background:#fff;padding:10px 15px 6px;}}@media (min-width:1024px){.css-1waixk9{background:transparent;border-bottom:0;padding:4px 15px 2px;}}@media print{.css-1waixk9{background:transparent;}}@media (min-width:740px){}@media (min-width:1024px){.css-1waixk9{margin:0 auto;max-width:1605px;}}.css-1f7ibof{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;left:10px;position:absolute;}@media (min-width:1024px){}@media print{.css-1f7ibof{display:none;}}.css-l2ztic{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;padding:8px 9px;text-transform:uppercase;}.css-l2ztic.hidden{opacity:0;visibility:hidden;}.css-l2ztic.hidden:focus{opacity:1;}.css-l2ztic::-moz-focus-inner{padding:0;border:0;}.css-l2ztic:-moz-focusring{outline:1px dotted;}.css-l2ztic:disabled,.css-l2ztic.disabled{opacity:0.5;cursor:default;}.css-l2ztic:active,.css-l2ztic.active{background-color:#f7f7f7;}@media (min-width:740px){.css-l2ztic:hover{background-color:#f7f7f7;}}@media (min-width:1024px){.css-l2ztic{display:none;}}.css-19lv58h{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;-webkit-appearance:button;-moz-appearance:button;appearance:button;background-color:#fff;border:1px solid #ebebeb;color:#333;display:inline-block;font-size:11px;font-weight:500;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;line-height:13px;margin:0;padding:8px 9px;text-transform:uppercase;vertical-align:middle;display:none;}.css-19lv58h::-moz-focus-inner{padding:0;border:0;}.css-19lv58h:-moz-focusring{outline:1px dotted;}.css-19lv58h:disabled,.css-19lv58h.disabled{opacity:0.5;cursor:default;}.css-19lv58h:active,.css-19lv58h.active{background-color:#f7f7f7;}@media (min-width:740px){.css-19lv58h:hover{background-color:#f7f7f7;}}@media (min-width:1024px){.css-19lv58h{border:0;display:inline-block;margin-right:8px;}}.css-mgtjo2{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;}.css-mgtjo2::-moz-focus-inner{padding:0;border:0;}.css-mgtjo2:-moz-focusring{outline:1px dotted;}.css-mgtjo2:disabled,.css-mgtjo2.disabled{opacity:0.5;cursor:default;}.css-mgtjo2:active,.css-mgtjo2.active{background-color:#f7f7f7;}@media (min-width:740px){.css-mgtjo2:hover{background-color:#f7f7f7;}}.css-mgtjo2.activeSearchButton{background-color:#f7f7f7;}@media (min-width:1024px){.css-mgtjo2{padding:8px 9px 9px;}}.css-1wr3we4{display:none;}@media (min-width:1024px){.css-1wr3we4{display:block;position:absolute;left:105px;line-height:19px;top:10px;}}.css-y3sf94{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;position:absolute;right:10px;top:9px;}@media (min-width:1024px){.css-y3sf94{top:4px;}}@media print{.css-y3sf94{display:none;}}.css-1bnxwmn{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:#6288a5;border:1px solid #326891;color:#fff;font-size:11px;font-weight:700;-webkit-letter-spacing:0.05em;-moz-letter-spacing:0.05em;-ms-letter-spacing:0.05em;letter-spacing:0.05em;line-height:11px;padding:8px 9px 6px;text-transform:uppercase;}.css-1bnxwmn::-moz-focus-inner{padding:0;border:0;}.css-1bnxwmn:-moz-focusring{outline:1px dotted;}.css-1bnxwmn:disabled,.css-1bnxwmn.disabled{opacity:0.5;cursor:default;}@media (min-width:740px){.css-1bnxwmn:hover{background-color:#326891;}}@media (min-width:1024px){.css-1bnxwmn{padding:11px 12px 8px;}}.css-1bnxwmn:hover{border:1px solid #326891;}.css-1i8g3m4{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;display:block;}.css-1i8g3m4.hidden{opacity:0;visibility:hidden;}.css-1i8g3m4.hidden:focus{opacity:1;}.css-1i8g3m4::-moz-focus-inner{padding:0;border:0;}.css-1i8g3m4:-moz-focusring{outline:1px dotted;}.css-1i8g3m4:disabled,.css-1i8g3m4.disabled{opacity:0.5;cursor:default;}.css-1i8g3m4:active,.css-1i8g3m4.active{background-color:#f7f7f7;}@media (min-width:740px){.css-1i8g3m4:hover{background-color:#f7f7f7;}}@media (min-width:740px){.css-1i8g3m4{border:none;line-height:13px;padding:9px 9px 12px;}}@media (min-width:1024px){.css-1i8g3m4{display:none;}}@media (min-width:1150px){}.css-3qijnq{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:11px;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;padding:13px 20px 12px;}@media (min-width:740px){.css-3qijnq{position:relative;}}@media (min-width:1024px){.css-3qijnq{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;border:none;padding:0;height:0;-webkit-transform:translateY(42px);-ms-transform:translateY(42px);transform:translateY(42px);}}@media print{.css-3qijnq{display:none;}}.css-uqyvli{color:#121212;font-size:13px;font-family:nyt-franklin,helvetica,arial,sans-serif;display:none;width:auto;}@media (min-width:740px){.css-uqyvli{text-align:center;width:100%;}}@media (min-width:1024px){.css-uqyvli{font-size:12px;margin-bottom:10px;width:auto;}}.css-1uqjmks{color:#121212;font-size:12px;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;display:none;}@media (min-width:740px){.css-1uqjmks{margin:0;position:absolute;left:20px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0;}}@media (min-width:1024px){.css-1uqjmks{display:none;}}.css-1bvtpon{display:none;}@media (min-width:1024px){}.css-1vxca1d{position:relative;margin:0 auto;}@media (min-width:600px){.css-1vxca1d{margin:0 auto 20px;}}.css-1vxca1d .relatedcoverage + .recirculation{margin-top:20px;}.css-1vxca1d .wrap + .recirculation{margin-top:20px;}@media (min-width:1024px){.css-1vxca1d{padding-top:40px;}}.css-1ox9jel{margin:37px auto;margin-top:20px;margin-bottom:32px;}.css-1ox9jel strong{font-weight:700;}.css-1ox9jel em{font-style:italic;}.css-1ox9jel.sizeSmall{width:calc(100% - 40px);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}@media (min-width:600px){.css-1ox9jel.sizeSmall{max-width:600px;margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1ox9jel.sizeSmall{width:100%;}}@media (min-width:1440px){.css-1ox9jel.sizeSmall{max-width:600px;}}.css-1ox9jel.sizeSmall.sizeSmallNoCaption{display:block;}@media print{.css-1ox9jel.sizeSmall.sizeSmallNoCaption{display:none;}}.css-1ox9jel.sizeMedium{width:100%;max-width:600px;margin-right:auto;margin-left:auto;}@media (min-width:600px){.css-1ox9jel.sizeMedium{width:calc(100% - 40px);}}@media (min-width:740px){.css-1ox9jel.sizeMedium{max-width:600px;}}@media (min-width:1440px){.css-1ox9jel.sizeMedium{max-width:720px;}}@media (min-width:600px){.css-1ox9jel.sizeMedium.layoutVertical{width:420px;}}@media (min-width:1440px){.css-1ox9jel.sizeMedium.layoutVertical{width:480px;}}.css-1ox9jel.sizeMedium.layoutVertical.verticalVideo{width:calc(100% - 40px);}@media (min-width:600px){.css-1ox9jel.sizeMedium.layoutVertical.verticalVideo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:600px;}}@media (min-width:1440px){.css-1ox9jel.sizeMedium.layoutVertical.verticalVideo{width:600px;}}.css-1ox9jel.sizeLarge{width:100%;max-width:1200px;margin-left:auto;margin-right:auto;}@media (min-width:600px){.css-1ox9jel.sizeLarge{width:auto;}}@media (min-width:740px){.css-1ox9jel.sizeLarge.layoutVertical{width:600px;}.css-1ox9jel.sizeLarge.layoutVertical.verticalVideo{width:600px;}}@media (min-width:1024px){.css-1ox9jel.sizeLarge{width:945px;}}@media (min-width:1440px){.css-1ox9jel.sizeLarge{width:1200px;}.css-1ox9jel.sizeLarge.layoutVertical{width:720px;}.css-1ox9jel.sizeLarge.layoutVertical.verticalVideo{width:600px;}}@media (min-width:600px){.css-1ox9jel{margin:43px auto;}}@media print{.css-1ox9jel{display:none;}}@media (min-width:740px){.css-1ox9jel{margin-top:25px;}}.css-1riqqik{display:inline;color:#333;}.css-1riqqik span{-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration-color:#ccc;text-decoration-color:#ccc;}.css-1riqqik span:hover,.css-1riqqik span:focus{-webkit-text-decoration:none;text-decoration:none;}.css-2fg4z9{font-style:italic;}.css-11n4cex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:15px;margin-top:4px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:600px){.css-11n4cex{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-11n4cex{width:600px;}}.css-11n4cex .e6idgb70{font-size:14px;margin:0;}.css-1ifw933{font-style:normal;font-stretch:normal;margin-bottom:1.6rem;color:#333;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:300;-webkit-letter-spacing:0.005em;-moz-letter-spacing:0.005em;-ms-letter-spacing:0.005em;letter-spacing:0.005em;font-size:1.3125rem;line-height:1.6875rem;}@media (min-width:740px){.css-1ifw933{font-size:1.5rem;line-height:1.9375rem;}}.css-1rjmmt7{width:50px;vertical-align:bottom;margin-right:10px;}.css-rqb9bm{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;color:#333;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.875rem;line-height:1.125rem;margin-bottom:1rem;}.css-19hdyf3{font-family:nyt-franklin,helvetica,arial,sans-serif;color:#333;font-size:0.9375rem;line-height:1.25rem;font-family:nyt-franklin,helvetica,arial,sans-serif;color:#333;font-size:0.9375rem;line-height:1.25rem;}.css-19hdyf3 p{margin-bottom:0.75rem;}.css-19hdyf3 a,.css-19hdyf3 a:visited{color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-19hdyf3 a:hover,.css-19hdyf3 a:focus{color:#326891;-webkit-text-decoration:none;text-decoration:none;}@media print{.css-19hdyf3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:740px){.css-19hdyf3{font-size:1rem;line-height:1.375rem;}}.css-19hdyf3 p{margin-bottom:0.75rem;}.css-19hdyf3 a,.css-19hdyf3 a:visited{color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-19hdyf3 a:hover,.css-19hdyf3 a:focus{color:#326891;-webkit-text-decoration:none;text-decoration:none;}@media print{.css-19hdyf3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-15g2oxy{margin-top:1rem;}.css-2b3w4o{margin-bottom:1rem;}.css-2b3w4o .e16638kd0{margin-top:5px;margin-bottom:0;display:inline-block;color:#999;font-size:0.75rem;line-height:1.0625rem;}.css-2b3w4o:hover .e16ij5yr2,.css-2b3w4o:visited .e16ij5yr2{color:#666;}.css-2b3w4o .css-1g7m0tk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:100px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-14b9hti{font-weight:500;color:#a19d9d;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-size:1.125rem;line-height:1.375rem;}@media (min-width:740px){.css-14b9hti{font-size:1.1875rem;line-height:1.4375rem;}}.css-1j8dw05{margin-right:10px;display:inline;font-weight:500;color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-size:1.125rem;line-height:1.375rem;}@media (min-width:740px){.css-1j8dw05{font-size:1.1875rem;line-height:1.4375rem;}}.css-1vm5oi9{margin-left:10px;width:120px;min-width:120px;}@media (min-width:740px){.css-1vm5oi9{width:165px;min-width:165px;}}.css-32rbo2{width:100%;min-width:120px;}.css-llk6mt{margin-top:5px;}@media (min-width:740px){.css-llk6mt{margin-top:45px;margin-bottom:0;}}.css-llk6mt .e6idgb70{margin-top:1.875rem;color:#121212;font-weight:700;line-height:0.75rem;margin-bottom:0.625rem;}@media print{.css-llk6mt .e6idgb70{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-llk6mt .e1h9rw200{margin-bottom:16px;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;margin-top:0;}@media (min-width:600px){.css-llk6mt .e1h9rw200{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .e1h9rw200{width:600px;}}@media (min-width:740px){.css-llk6mt .e1h9rw200{max-width:none;margin-left:calc((100% - 600px) / 2);margin-right:auto;position:relative;width:660px;}}.css-llk6mt .euiyums3 .e6idgb70{margin:0;}.css-llk6mt .e1wiw3jv0{color:#333;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:600px){.css-llk6mt .e1wiw3jv0{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .e1wiw3jv0{width:600px;}}.css-llk6mt .e16638kd0{width:auto;margin-bottom:0;margin-left:0;display:inline-block;margin-top:0;margin-bottom:0;width:auto;}.css-llk6mt .eatfx1z0{margin-right:15px;font-weight:700;font-size:14px;line-height:1;}.css-llk6mt .section-kicker .opinion-bar{font-size:25px;}.css-llk6mt .epjyd6m0{margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:600px){.css-llk6mt .epjyd6m0{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .epjyd6m0{width:600px;}}.css-llk6mt .e1g7ppur0{margin-bottom:32px;margin-top:20px;}@media (min-width:740px){.css-llk6mt .e1g7ppur0{margin-top:25px;}}@media (min-width:1024px){.css-llk6mt .e1g7ppur0{margin-bottom:43px;}}.css-llk6mt .e1q76eii0{margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;max-width:600px;}@media (min-width:600px){.css-llk6mt .e1q76eii0{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .e1q76eii0{width:600px;}}.css-llk6mt .euiyums1{margin-bottom:20px;color:#121212;}@media print{.css-llk6mt .euiyums1{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1s4ffep{color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:700;font-style:italic;font-size:1.9375rem;line-height:2.25rem;text-align:left;}@media (min-width:740px){.css-1s4ffep{font-size:2.5rem;line-height:3rem;}}.css-pdw9fk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;width:100%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}@media (min-width:1024px){.css-pdw9fk{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}.css-pdw9fk > img,.css-pdw9fk a > img,.css-pdw9fk div > img{margin-right:10px;}.css-1txwxcy{min-width:100px;display:block;width:100%;margin-bottom:10px;margin-left:-3px;}@media (min-width:1024px){.css-1txwxcy{display:inline-block;width:auto;margin-bottom:0;}}.css-1soubk3{margin:0.5rem 0 1.5rem;padding-top:1rem;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}.css-1soubk3:before{content:'';display:block;width:100%;margin-bottom:0.5rem;border-bottom:1px solid #e2e2e2;}.css-1soubk3:after{content:'';display:block;width:100%;margin-top:0.5rem;border-bottom:1px solid #e2e2e2;}.css-1soubk3 .e16ij5yr6{border-top:none;}@media (min-width:600px){.css-1soubk3{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1soubk3{width:600px;}}@media (min-width:1440px){.css-1soubk3{width:600px;max-width:600px;}}@media print{.css-1soubk3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}</style>
+
+
+
+ <style>[data-timezone] { display: none }</style>
+
+ </head>
+ <body>
+ <div id="app"><div class="css-v89234" role="main"><div class=""><div><div class="css-ulr03x e1suatyy0"><header class="css-1bymuyk e1suatyy1"><section class="css-1waixk9 e1suatyy2"><div class="css-1f7ibof er09x8g0"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="Sections Navigation &amp; Search" class="er09x8g1 css-l2ztic" data-testid="nav-button"><svg class="css-1fe7a5q" viewBox="0 0 16 16"><rect x="1" y="3" fill="#333333" width="14" height="2"></rect><rect x="1" y="7" fill="#333333" width="14" height="2"></rect><rect x="1" y="11" fill="#333333" width="14" height="2"></rect></svg></button></div><button id="desktop-sections-button" aria-label="Sections Navigation" class="css-19lv58h er09x8g2"><span class="css-vz7hjd">Sections</span><svg class="css-1fe7a5q" viewBox="0 0 16 16"><rect x="1" y="3" fill="#333333" width="14" height="2"></rect><rect x="1" y="7" fill="#333333" width="14" height="2"></rect><rect x="1" y="11" fill="#333333" width="14" height="2"></rect></svg></button><div class="css-10488qs"><button class="css-mgtjo2 ewfai8r0" data-test-id="search-button"><span class="css-vz7hjd">SEARCH</span><svg class="css-1fe7a5q" viewBox="0 0 16 16"><path fill="#333" d="M11.3,9.2C11.7,8.4,12,7.5,12,6.5C12,3.5,9.5,1,6.5,1S1,3.5,1,6.5S3.5,12,6.5,12c1,0,1.9-0.3,2.7-0.7l3.3,3.3c0.3,0.3,0.7,0.4,1.1,0.4s0.8-0.1,1.1-0.4c0.6-0.6,0.6-1.5,0-2.1L11.3,9.2zM6.5,10.3c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8c2.1,0,3.8,1.7,3.8,3.8C10.3,8.6,8.6,10.3,6.5,10.3z"></path></svg></button></div><a class="css-1rn5q1r" href="#site-content">Skip to content</a><a class="css-1rn5q1r" href="#site-index">Skip to site index</a></div><div class="css-1wr3we4 eaxe0e00"><a href="https://www.nytimes.com/section/nyregion" class="css-nuvmzp">New York</a></div><div class="css-10698na e1huz5gh0"><a aria-label="New York Times Logo. Click to visit the homepage" class="css-nhjhh0 e1huz5gh1" href="/"><svg xmlns="http://www.w3.org/2000/svg" class="" viewBox="0 0 184 25" fill="#000"><path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a></div><div class="css-y3sf94 ez4a0qj1"><a href="https://myaccount.nytimes.com/auth/login?response_type=cookie&amp;client_id=vi" class="css-1kj7lfb"><button class="css-1bnxwmn ez4a0qj0" data-testid="login-button">Log In</button></a><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="User Settings" class="ez4a0qj4 css-1i8g3m4" data-testid="user-settings-button"><svg class="css-10m9xeu" viewBox="0 0 16 16" fill="#333"><path d="M8,10c-2.5,0-7,1.1-7,3.5V16h14v-2.5C15,11.1,10.5,10,8,10z"></path><circle cx="8" cy="4" r="4"></circle></svg></button></div></div></section><section class="hasLinks css-3qijnq e1csuq9d3"><div class="css-uqyvli e1csuq9d0"></div><div class="css-1uqjmks e1csuq9d1"></div><div class="css-9e9ivx"><a href="https://myaccount.nytimes.com/auth/login?response_type=cookie&amp;client_id=vi" class="css-1gz70xg">Log In</a></div><div class="css-1bvtpon e1csuq9d2"><a href="https://www.nytimes.com/section/todayspaper" class="css-2bwtzy">Today’s Paper</a></div></section></header></div></div><div aria-hidden="false"><main id="site-content"><div><div class="css-4g4cvq" style="opacity:0.000000001;z-index:-1;visibility:hidden"><div class="css-m6xlts"><div class="css-1ahhg7f"><span class="css-17xtcya"><a href="/section/nyregion">New York</a></span><span class="css-x15j1o">|</span><span class="css-fwqvlz">She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.</span></div><div class="css-k008qs"><div class="css-1iwv8en"><a href="/"><svg class="css-1ri25x2" viewBox="0 0 16 22"><path d="M15.863 13.08c-.687 1.818-1.923 3.147-3.64 3.916v-3.917l2.129-1.958-2.129-1.889V6.505c1.923-.14 3.228-1.609 3.228-3.358C15.45.84 13.32 0 12.086 0c-.275 0-.55 0-.962.14v.14h.481c.824 0 1.51.42 1.51 1.189 0 .63-.48 1.189-1.304 1.189-2.129 0-4.6-1.749-7.279-1.749C2.13.91.481 2.728.481 4.546c0 1.819 1.03 2.448 2.128 2.798v-.14c-.343-.21-.618-.63-.618-1.189 0-.84.756-1.469 1.648-1.469 2.267 0 5.906 1.959 8.172 1.959h.206v2.727l-2.129 1.889 2.13 1.958v3.987c-.894.35-1.786.49-2.748.49-3.502 0-5.768-2.169-5.768-5.806 0-.839.137-1.678.344-2.518l1.785-.769v7.973l3.57-1.608V6.575L3.984 8.953c.55-1.61 1.648-2.728 2.953-3.358v-.07C3.433 6.295 0 9.023 0 13.08c0 4.686 3.914 7.974 8.446 7.974 4.807 0 7.485-3.288 7.554-7.974h-.137z" fill="#000"></path></svg></a><span class="css-1hfdzay"><div><a href="/" aria-label="New York Times Logo. Click to visit the homepage"><svg xmlns="http://www.w3.org/2000/svg" class="css-12fr9lp" viewBox="0 0 184 25" fill="#000"><path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a></div></span></div><div class="css-1705lsu"><div class=""><div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-4skfbu" data-testid="share-tools"><ul class="css-y8aj3r"><li class="css-1fcn4th"><a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html&amp;smid=fb-share&amp;name=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-13zu7ev" viewBox="0 0 7 15" width="7" height="15"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a></li><li class="css-1fcn4th"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2GEzuZ8&amp;text=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewBox="0 0 13 10" class="css-13zu7ev" width="13" height="10"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a></li><li class="css-1fcn4th"><a href="mailto:?subject=NYTimes.com%3A%20She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AShe%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.%0A%0AWith%20little%20oversight%2C%20the%20N.Y.P.D.%20has%20been%20using%20powerful%20surveillance%20technology%20on%20photos%20of%20children%20and%20teenagers.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewBox="0 0 15 9" class="css-13zu7ev" width="15" height="9"><path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a></li><li class="css-1fcn4th"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-f7l8cz" viewBox="0 0 16 13" width="16" height="13"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button></div></li><li class="css-60hakz"></li><li class="css-l72opv"></li></ul></div></div></div></div></div></div><meta itemProp="isAccessibleForFree" content="false"/><span itemProp="isPartOf" itemscope="" itemType="http://schema.org/CreativeWork http://schema.org/Product"><meta itemProp="name" content="The New York Times"/><meta itemProp="productID" content="nytimes.com:basic"/></span><article id="story" class="css-1vxca1d e1qksbhf0"><div id="top-wrapper" class="css-1sy8kpn"><div id="top-slug" class="css-l9onyx"><p>Advertisement</p></div><div class="ad top-wrapper" style="text-align:center;height:100%;display:block;min-height:250px"><div id="top" class="place-ad" data-position="top"></div></div></div><span itemProp="hasPart" itemscope="" itemType="http://schema.org/WebPageElement"><meta itemProp="isAccessibleForFree" content="False"/><meta itemProp="cssSelector" content=".meteredContent"/></span><div><header class="css-llk6mt euiyums4"><div id="sponsor-wrapper" class="css-1hyfx7x"><div id="sponsor-slug" class="css-19vbshk"><p>Supported by</p></div><div class="ad sponsor-wrapper" style="text-align:center;height:100%;display:block"><div id="sponsor" class="" data-position="sponsor"></div></div></div><div class="css-11n4cex euiyums3"></div><div class="css-1vkm6nb ehdk2mb0"><h1 itemProp="headline" class="css-1s4ffep e1h9rw200" id="link-2df79d6c"><span>She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.</span></h1></div><p class="css-1ifw933 e1wiw3jv0">With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.</p><div class="css-79elbk" data-testid="photoviewer-wrapper"><div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div><div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r15"><figure class="sizeMedium layoutVertical css-1ox9jel" aria-label="media" role="group" itemscope="" itemProp="associatedMedia" itemID="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=90&amp;auto=webp" itemType="http://schema.org/ImageObject"><div class="css-bsn42l"><span class="css-1dv1kvn">Image</span><img alt="“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14." class="css-11cwn6f" src="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcSet="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg?quality=90&amp;auto=webp 683w,https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg?quality=90&amp;auto=webp 1366w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 60vw, 100vw" itemProp="url" itemID="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale"/></div><figcaption itemProp="caption description" class="css-17ai7jg emkp2hg0"><span aria-hidden="true" class="css-8i9d0s e13ogyst0">“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14.</span><span itemProp="copyrightHolder" class="emkp2hg2 css-1nwzsjy e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span><span class="css-1dv1kvn">Credit</span><span>Sarah Blesener for The New York Times</span></span></span></figcaption></figure></div></div><div class="css-acwcvw epjyd6m0"><div class="css-pdw9fk epjyd6m1"><div class="css-1txwxcy ey68jwv0"><a href="https://www.nytimes.com/by/joseph-goldstein" class="css-uwwqev"><img alt="Joseph Goldstein" title="Joseph Goldstein" src="https://static01.nyt.com/images/2018/07/16/multimedia/author-joseph-goldstein/author-joseph-goldstein-thumbLarge.png" class="css-1rjmmt7 ey68jwv2"/></a><a href="https://www.nytimes.com/by/ali-watkins" class="css-uwwqev"><img alt="Ali Watkins" title="Ali Watkins" src="https://static01.nyt.com/images/2019/02/20/multimedia/author-ali-watkins/author-ali-watkins-thumbLarge.png" class="css-1rjmmt7 ey68jwv2"/></a></div><div class="css-1baulvz"><p class="css-1nuro5j e1jsehar1" itemProp="author" itemscope="" itemType="http://schema.org/Person">By<!-- --> <a href="https://www.nytimes.com/by/joseph-goldstein" class="css-1riqqik e1jsehar0"><span class="css-1baulvz" itemProp="name">Joseph Goldstein</span></a> and <a href="https://www.nytimes.com/by/ali-watkins" class="css-1riqqik e1jsehar0"><span class="css-1baulvz last-byline" itemProp="name">Ali Watkins</span></a></p></div></div><ul class="css-1w5cs23 epjyd6m2"><li><time class="css-rqb9bm e16638kd0" dateTime="2019-08-01">Aug 1, 2019</time></li><li class="css-6n7j50"><div class=""><div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-d8bdto" data-testid="share-tools"><ul class="css-y8aj3r"><li class="css-60hakz"><a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html&amp;smid=fb-share&amp;name=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-4brsb6" viewBox="0 0 7 15" width="7" height="15"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a></li><li class="css-60hakz"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2GEzuZ8&amp;text=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewBox="0 0 13 10" class="css-4brsb6" width="13" height="10"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a></li><li class="css-60hakz"><a href="mailto:?subject=NYTimes.com%3A%20She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AShe%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.%0A%0AWith%20little%20oversight%2C%20the%20N.Y.P.D.%20has%20been%20using%20powerful%20surveillance%20technology%20on%20photos%20of%20children%20and%20teenagers.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewBox="0 0 15 9" class="css-4brsb6" width="15" height="9"><path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a></li><li class="css-60hakz"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-uhuo44" viewBox="0 0 16 13" width="16" height="13"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button></div></li><li class="css-60hakz"></li><li class="css-l72opv"></li></ul></div></div></li></ul></div></header></div><section name="articleBody" itemProp="articleBody" class="meteredContent css-1i2y565"><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0"><em class="css-2fg4z9 e1gzwzxm0">[What you need to know to start the day: </em><a class="css-1g7m0tk" href="https://www.nytimes.com/newsletters/newyorktoday?module=inline" title=""><em class="css-2fg4z9 e1gzwzxm0">Get New York Today in your inbox</em></a><em class="css-2fg4z9 e1gzwzxm0">.]</em></p><p class="css-exrw3m evys1bk0">The New York Police Department has been loading <!-- -->thousands of arrest photos of children and teenagers<!-- --> into a facial recognition database despite evidence the technology has a higher risk of false matches in younger faces. </p><p class="css-exrw3m evys1bk0">For about four years, internal records show, the department has used the technology to compare crime scene images with its collection of juvenile mug <!-- -->shots<!-- -->, the photos that are taken at an arrest. Most of the photos are of teenagers, largely 13 to 16 years old, but children as young as 11 have been included. </p><p class="css-exrw3m evys1bk0">Elected officials and civil rights groups said the disclosure that the city was deploying a powerful surveillance tool on adolescents — whose privacy seems sacrosanct and whose status is protected in the criminal justice system — was a striking example of the Police Department’s ability to adopt advancing technology with little public scrutiny.</p><p class="css-exrw3m evys1bk0">Several members of the City Council as well as a range of civil liberties groups said they were unaware of the policy until they were contacted by The New York Times. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">Police <!-- -->Department officials defended the decision, <!-- -->saying it was just the latest evolution of a longstanding policing technique: using arrest photos to identify suspects.</p><p class="css-exrw3m evys1bk0">“I don’t think this is any secret decision that’s made behind closed doors,” the city’s chief of detectives, Dermot F. Shea, said in an interview. “This is just process, and making sure we’re doing everything to fight crime.” </p><p class="css-exrw3m evys1bk0">Other cities have begun to debate whether law enforcement should use facial recognition, which relies on an algorithm to quickly pore through images and suggest matches. In May, <a class="css-1g7m0tk" href="https://www.nytimes.com/2019/05/14/us/facial-recognition-ban-san-francisco.html?module=inline" title="">San Francisco blocked city agencies, including the police</a>, from using the tool amid unease about potential government <!-- -->abuse<!-- -->. <a class="css-1g7m0tk" href="https://www.nytimes.com/2019/07/08/us/detroit-facial-recognition-cameras.html?module=inline" title="">Detroit is facing public resistance to a technology </a>that has been shown to have lower accuracy with people with darker skin. </p><p class="css-exrw3m evys1bk0">In New York, the state Education Department recently told the Lockport, N.Y., <!-- -->school district to delay a plan to use facial recognition on students, citing privacy concerns. </p><p class="css-exrw3m evys1bk0">“At the end <!-- -->of the day, it should be banned — no young people,” said <!-- -->Councilman Donovan Richards<!-- -->, a Queens Democrat who heads the Public Safety Committee, which oversees the Police Department. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">The department said its legal bureau had approved using facial recognition on juveniles. <a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/09/opinion/facial-recognition-police-new-york-city.html?module=inline" title="">The algorithm may suggest a lead, but detectives would not make an arrest based solely on </a><a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/09/opinion/facial-recognition-police-new-york-city.html?module=inline" title="">that</a>, Chief Shea said.</p></div><aside class="css-o6xoe7"></aside></div><div class="css-79elbk" data-testid="photoviewer-wrapper"><div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div><div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r15"><figure class="css-jcw7oy e1g7ppur0" aria-label="media" role="group" itemProp="associatedMedia" itemscope="" itemID="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=90&amp;auto=webp" itemType="http://schema.org/ImageObject"><div class="css-1xdhyk6 erfvjey0"><span class="css-1ly73wi e1tej78p0">Image</span><img alt="Dermot Shea, the city&amp;rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match." class="css-1m50asq" src="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcSet="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg?quality=90&amp;auto=webp 1024w,https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg?quality=90&amp;auto=webp 2048w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 60vw, 100vw" itemProp="url" itemID="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale"/></div><figcaption itemProp="caption description" class="css-1l44abu e1xdpqjp0"><span aria-hidden="true" class="css-8i9d0s e13ogyst0">Dermot Shea, the city&rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match.</span><span itemProp="copyrightHolder" class="css-vuqh7u e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span>Chang W. Lee/The New York Times</span></span></figcaption></figure></div></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">Still, facial recognition has not been widely tested on children. Most algorithms are taught to “think” based on adult faces, and there is growing evidence that they do not work as well on children. </p><p class="css-exrw3m evys1bk0">The National Institute of Standards and Technology<!-- -->, which is part of the Commerce Department and <a class="css-1g7m0tk" href="https://nvlpubs.nist.gov/nistpubs/ir/2018/NIST.IR.8238.pdf" title="" rel="noopener noreferrer" target="_blank">evaluates facial recognition </a><a class="css-1g7m0tk" href="https://nvlpubs.nist.gov/nistpubs/ir/2018/NIST.IR.8238.pdf" title="" rel="noopener noreferrer" target="_blank">algorithms</a> for accuracy, recently found the <!-- -->vast majority of more than 100 <!-- -->facial recognition <!-- -->algorithms had a higher rate of mistaken matches among children. The <!-- -->e<!-- -->rror rate was most pronounced in young children but was also seen in those aged 10 to 16.</p><p class="css-exrw3m evys1bk0">Aging poses another problem:<!-- --> The appearance of children and adolescents can change <!-- --> drastically as bones stretch and shift, altering the underlying facial structure. </p><p class="css-exrw3m evys1bk0">“I would use extreme caution in using those algorithms,” said <!-- -->Karl Ricanek Jr.<!-- -->, a computer science professor and <!-- -->co-founder of the Face Aging Group at the University of North Carolina-<!-- -->Wilmington<!-- -->. </p><p class="css-exrw3m evys1bk0">Technology that can match an image of a younger teenager to a recent arrest photo may be less effective at finding the same person even one or two years later, he said. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0"> “The systems do not have the capacity to understand the dynamic changes that occur to a child’s face,” Dr. Ricanek said. </p><p class="css-exrw3m evys1bk0">Idemia<!-- --> and <!-- -->DataWorks Plus<!-- -->, the two companies that provide facial recognition software to the Police Department, did not respond to requests for comment. </p><p class="css-exrw3m evys1bk0">The New York Police Department can take arrest photos of minors as young as <!-- -->11<!-- --> who are charged with a felony, depending on the severity of the charge. </p><p class="css-exrw3m evys1bk0">And in many cases, the department keeps the photos for years, making facial recognition comparisons to what may have effectively become outdated images. There are photos of 5,500 individuals in the juvenile database, 4,100 of whom are no longer 16 or under, the department said. Teenagers 17 and older are considered adults in the criminal justice system. </p><p class="css-exrw3m evys1bk0">Police officials declined to provide statistics on how often their facial recognition systems provide false matches, or to explain how they evaluate the system’s effectiveness.</p><p class="css-exrw3m evys1bk0">“We are comfortable with this technology because it has proved to be a valuable investigative method,” Chief Shea said. Facial recognition has helped lead to thousands of arrests of both adults and juveniles, the department has said. </p><p class="css-exrw3m evys1bk0">Mayor Bill de Blasio had been aware the department was using the technology on minors, said Freddi Goldstein, a spokeswoman for the mayor. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">She said the Police Department followed “strict guidelines” in applying the technology and City Hall monitored the agency’s compliance with the policies. </p><p class="css-exrw3m evys1bk0">The Times learned details of the department’s use of facial recognition by reviewing documents posted online earlier this year by <a class="css-1g7m0tk" href="https://www.flawedfacedata.com/#footnote5" title="" rel="noopener noreferrer" target="_blank">Clare Garvie, a senior associate</a><a class="css-1g7m0tk" href="https://www.flawedfacedata.com/#footnote5" title="" rel="noopener noreferrer" target="_blank"> at the Center on Privacy and Technology at Georgetown Law</a>. Ms. Garvie received the documents as part of an open records lawsuit. </p><p class="css-exrw3m evys1bk0">It could not be determined whether other large police departments used facial recognition with juveniles because very few have written policies governing the use of the technology, Ms. Garvie said. </p><p class="css-exrw3m evys1bk0">New York detectives rely on a vast network<!-- --> of surveillance cameras throughout the city to provide images of people believed to have committed a crime. Since 2011, the department has had a dedicated unit of officers who use facial recognition to compare those images against millions of photos, usually mug shots. The software proposes matches, which have led to thousands of arrests, the department said. </p><p class="css-exrw3m evys1bk0">By 2013, top police officials were meeting to discuss including juveniles in the program, the documents reviewed by The Times showed. </p><p class="css-exrw3m evys1bk0">The documents showed that the juvenile database had been integrated into the system by 2015. </p><p class="css-exrw3m evys1bk0">“We have these photos. It makes sense,” Chief Shea said in the interview. </p><p class="css-exrw3m evys1bk0">State law requires that arrest photos be destroyed if the case is resolved in the juvenile’s favor, or if the child is found to have committed only a misdemeanor, rather than a felony. The photos also must be destroyed if a person reaches age 21 without a criminal record. <!-- --> </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">When children are charged with crimes, the court system usually takes some steps to prevent their acts from defining them in later years. Children who are 16 and under, for instance, are generally sent to Family Court, where records are not public. </p><p class="css-exrw3m evys1bk0">Yet including their photos in a facial recognition database runs the risk that an imperfect algorithm identifies them as possible suspects in later crimes, civil rights advocates said. A mistaken match could lead investigators to focus on the wrong person from the outset, they said. </p><p class="css-exrw3m evys1bk0">“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, a 17-year-old Brooklyn girl who had admitted guilt in Family Court to a group attack that happened when she was 14. She said she was present at the attack but did not participate. </p><p class="css-exrw3m evys1bk0">Bailey, who asked that she be identified only by her <!-- -->last name<!-- --> because she did not want her juvenile arrest to be public, has not been arrested again and is now a student at John Jay College of Criminal Justice. </p><p class="css-exrw3m evys1bk0">R<!-- -->ecent studies indicate that people of color, as well as children and women, have a greater risk of misidentification than their counterparts, sai<!-- -->d <!-- -->Joy Buolamwini<!-- -->, <!-- -->the founder of the Algorithmic Justice League and graduate researcher at the M.I.T. Media Lab<!-- -->, who has examined how human biases are built into artificial intelligence. </p><p class="css-exrw3m evys1bk0">The racial disparities in the juvenile justice system are stark: In New York, black and Latino juveniles were charged with crimes at far higher rates than whites in 2017, the most recent year for which numbers were available. Black juveniles outnumbered white juveniles <a class="css-1g7m0tk" href="https://www.criminaljustice.ny.gov/crimnet/ojsa/jj-reports/newyorkcity.pdf" title="" rel="noopener noreferrer" target="_blank">more than 15 to 1</a>.</p><p class="css-exrw3m evys1bk0">“If the facial recognition algorithm has a negative bias toward a black population, that will get magnified more toward children,” Dr. Ricanek said, adding that in terms of diminished accuracy, “you’re now putting yourself in unknown territory.”</p></div><aside class="css-o6xoe7"></aside></div><div class="css-1soubk3 epkadsg3"><div class="css-15g2oxy epkadsg2"><div class="css-2b3w4o e16ij5yr6"><a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/09/opinion/facial-recognition-police-new-york-city.html?action=click&amp;module=RelatedLinks&amp;pgtype=Article"><div class="css-i9gxme e16ij5yr4"><div class="css-14b9hti e16ij5yr5">Opinion | James O’Neill</div><div class="css-1j8dw05 e16ij5yr2">How Facial Recognition Makes You Safer</div><time class="css-rqb9bm e16638kd0" dateTime="2019-06-09">Jun 9, 2019</time></div><div class="css-1vm5oi9 e16ij5yr0"><img src="https://static01.nyt.com/images/2019/06/07/opinion/sunday/07Oneill/07Oneill-threeByTwoSmallAt2X.jpg" class="css-32rbo2 e16ij5yr1"/></div></a></div><div class="css-2b3w4o e16ij5yr6"><a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/07/opinion/lockport-facial-recognition-schools.html?action=click&amp;module=RelatedLinks&amp;pgtype=Article"><div class="css-i9gxme e16ij5yr4"><div class="css-14b9hti e16ij5yr5">Opinion | Jim Shultz</div><div class="css-1j8dw05 e16ij5yr2">Spying on Children Won’t Keep Them Safe</div><time class="css-rqb9bm e16638kd0" dateTime="2019-06-07">Jun 7, 2019</time></div><div class="css-1vm5oi9 e16ij5yr0"><img src="https://static01.nyt.com/images/2019/06/07/opinion/07shultz-privacy/07shultz-privacy-threeByTwoSmallAt2X.jpg" class="css-32rbo2 e16ij5yr1"/></div></a></div></div></div></section><div class="bottom-of-article"><div class="css-1ubp8k9"></div><div class="css-wg1cha"><div class="css-19hdyf3 e1e7j8ap0"><div><p>Joseph Goldstein writes about policing and the criminal justice system. He has been a reporter at The Times since 2011, and is based in New York. He also worked for a year in the Kabul bureau, reporting on Afghanistan. <span class="css-4w91ra"> <a href="https://twitter.com/JoeKGoldstein" class="css-1rj8to8" rel="noopener noreferrer" target="_blank"><span class="css-0">@</span>JoeKGoldstein</a> </span></p></div></div><div class="css-19hdyf3 e1e7j8ap0"><div><p>Ali Watkins is a reporter on the Metro Desk, covering courts and social services. Previously, she covered national security in Washington for The Times, BuzzFeed and McClatchy Newspapers. <span class="css-4w91ra"> <a href="https://twitter.com/AliWatkins" class="css-1rj8to8" rel="noopener noreferrer" target="_blank"><span class="css-0">@</span>AliWatkins</a> </span></p></div></div></div><div class="css-vdv0al">A version of this article appears in print on <!-- -->, Section <!-- -->A<!-- -->, Page <!-- -->1<!-- --> of the New York edition<!-- --> with the headline: <!-- -->In New York, Police Computers Scan Faces, Some as Young as 11<span>. <a href="http://www.nytreprints.com/">Order Reprints</a> | <a href="http://www.nytimes.com/pages/todayspaper/index.html">Today’s Paper</a> | <a href="https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY">Subscribe</a></span></div><div class="css-i29ckm"><div class="css-10raysz"></div><div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-d8bdto" data-testid="share-tools"><ul class="css-y8aj3r"><li class="css-ar1l6a"><a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html&amp;smid=fb-share&amp;name=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-4brsb6" viewBox="0 0 7 15" width="7" height="15"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a></li><li class="css-ar1l6a"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2GEzuZ8&amp;text=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewBox="0 0 13 10" class="css-4brsb6" width="13" height="10"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a></li><li class="css-ar1l6a"><a href="mailto:?subject=NYTimes.com%3A%20She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AShe%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.%0A%0AWith%20little%20oversight%2C%20the%20N.Y.P.D.%20has%20been%20using%20powerful%20surveillance%20technology%20on%20photos%20of%20children%20and%20teenagers.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewBox="0 0 15 9" class="css-4brsb6" width="15" height="9"><path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a></li><li class="css-ar1l6a"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-uhuo44" viewBox="0 0 16 13" width="16" height="13"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button></div></li></ul></div></div></div><div></div><div><div id="bottom-wrapper" class="css-1ede5it"><div id="bottom-slug" class="css-l9onyx"><p>Advertisement</p></div><div class="ad bottom-wrapper" style="text-align:center;height:100%;display:block;min-height:90px"><div id="bottom" class="" data-position="bottom"></div></div></div></div></article></div></main><nav class="css-1ropbjl" id="site-index" aria-labelledby="site-index-label" data-testid="site-index"><div class="css-uw59u"><header class="css-jxzr5i" data-testid="site-index-header"><h2 class="css-vz7hjd" id="site-index-label">Site Index</h2><a href="/"><svg xmlns="http://www.w3.org/2000/svg" class="css-oylsik" viewBox="0 0 184 25" fill="#000"><path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a><div class="css-1otr2jl" data-testid="go-to-homepage"><a class="css-1c8n994" href="/">Go to Home Page »</a></div></header><div class="css-qtw155" data-testid="site-index-accordion"><div class=" " role="tablist" aria-multiselectable="true" data-testid="accordion"><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-0" id="item-siteindex-0" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">news</header><div class="css-1hyfx7x" id="body-siteindex-0" aria-labelledby="item-siteindex-0" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com" data-testid="accordion-item-list-link">home page</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/world" data-testid="accordion-item-list-link">world</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/us" data-testid="accordion-item-list-link">U.S.</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/politics" data-testid="accordion-item-list-link">politics</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/news-event/2020-election" data-testid="accordion-item-list-link">Election 2020</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/nyregion" data-testid="accordion-item-list-link">New York</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/business" data-testid="accordion-item-list-link">business</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/technology" data-testid="accordion-item-list-link">tech</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/science" data-testid="accordion-item-list-link">science</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://www.nytimes.com/section/climate" data-testid="accordion-item-list-link">climate</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/sports" data-testid="accordion-item-list-link">sports</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/obituaries" data-testid="accordion-item-list-link">obituaries</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://www.nytimes.com/section/upshot" data-testid="accordion-item-list-link">the upshot</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/todayspaper" data-testid="accordion-item-list-link">today&#x27;s paper</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/corrections" data-testid="accordion-item-list-link">corrections</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-1" id="item-siteindex-1" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">opinion</header><div class="css-1hyfx7x" id="body-siteindex-1" aria-labelledby="item-siteindex-1" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion" data-testid="accordion-item-list-link">today&#x27;s opinion</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/columnists" data-testid="accordion-item-list-link">op-ed columnists</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/editorials" data-testid="accordion-item-list-link">editorials</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/contributors" data-testid="accordion-item-list-link">op-ed Contributors</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/letters" data-testid="accordion-item-list-link">letters</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/sunday" data-testid="accordion-item-list-link">sunday review</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/video/opinion" data-testid="accordion-item-list-link">video: opinion</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-2" id="item-siteindex-2" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">arts</header><div class="css-1hyfx7x" id="body-siteindex-2" aria-labelledby="item-siteindex-2" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts" data-testid="accordion-item-list-link">today&#x27;s arts</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/design" data-testid="accordion-item-list-link">art &amp; design</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/books" data-testid="accordion-item-list-link">books</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/dance" data-testid="accordion-item-list-link">dance</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/movies" data-testid="accordion-item-list-link">movies</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/music" data-testid="accordion-item-list-link">music</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/spotlight/pop-culture" data-testid="accordion-item-list-link">Pop Culture</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/television" data-testid="accordion-item-list-link">television</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/theater" data-testid="accordion-item-list-link">theater</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://www.nytimes.com/watching" data-testid="accordion-item-list-link">watching</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/video/arts" data-testid="accordion-item-list-link">video: arts</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-3" id="item-siteindex-3" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">living</header><div class="css-1hyfx7x" id="body-siteindex-3" aria-labelledby="item-siteindex-3" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/automobiles" data-testid="accordion-item-list-link">automobiles</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://cooking.nytimes.com/" data-testid="accordion-item-list-link">Cooking</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/crosswords" data-testid="accordion-item-list-link">crossword</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/education" data-testid="accordion-item-list-link">education</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/food" data-testid="accordion-item-list-link">food</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/health" data-testid="accordion-item-list-link">health</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/jobs" data-testid="accordion-item-list-link">jobs</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/magazine" data-testid="accordion-item-list-link">magazine</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://parenting.nytimes.com/" data-testid="accordion-item-list-link">parenting</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/realestate" data-testid="accordion-item-list-link">real estate</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/style" data-testid="accordion-item-list-link">style</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/t-magazine" data-testid="accordion-item-list-link">t magazine</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/travel" data-testid="accordion-item-list-link">travel</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/fashion/weddings" data-testid="accordion-item-list-link">love</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-4" id="item-siteindex-4" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">listings &amp; more</header><div class="css-1hyfx7x" id="body-siteindex-4" aria-labelledby="item-siteindex-4" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/reader-center" data-testid="accordion-item-list-link">Reader Center</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://thewirecutter.com" data-testid="accordion-item-list-link">Wirecutter</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="http://nytconferences.com/" data-testid="accordion-item-list-link">Live Events</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/learning" data-testid="accordion-item-list-link">The Learning Network</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="http://www.nytimes.com/marketing/tools-and-services" data-testid="accordion-item-list-link">tools &amp; services</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/events" data-testid="accordion-item-list-link">N.Y.C. events guide</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/multimedia" data-testid="accordion-item-list-link">multimedia</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/lens" data-testid="accordion-item-list-link">photography</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/video" data-testid="accordion-item-list-link">video</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/newsletters" data-testid="accordion-item-list-link">Newsletters</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/store" data-testid="accordion-item-list-link">NYT store</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/times-journeys" data-testid="accordion-item-list-link">times journeys</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://myaccount.nytimes.com/membercenter/myaccount.html" data-testid="accordion-item-list-link">manage my account</a></li></ul></div></div></div></div><div class="css-v0l3hm" data-testid="site-index-sections"><div class="css-g4gku8" data-testid="site-index-section"><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-0"><h3 class="css-rxqrcl" id="site-index-section-label-0">news</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com" data-testid="site-index-section-list-link">home page</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/world" data-testid="site-index-section-list-link">world</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/us" data-testid="site-index-section-list-link">U.S.</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/politics" data-testid="site-index-section-list-link">politics</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/news-event/2020-election" data-testid="site-index-section-list-link">Election 2020</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/nyregion" data-testid="site-index-section-list-link">New York</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/business" data-testid="site-index-section-list-link">business</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/technology" data-testid="site-index-section-list-link">tech</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/science" data-testid="site-index-section-list-link">science</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://www.nytimes.com/section/climate" data-testid="site-index-section-list-link">climate</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/sports" data-testid="site-index-section-list-link">sports</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/obituaries" data-testid="site-index-section-list-link">obituaries</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://www.nytimes.com/section/upshot" data-testid="site-index-section-list-link">the upshot</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/todayspaper" data-testid="site-index-section-list-link">today&#x27;s paper</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/corrections" data-testid="site-index-section-list-link">corrections</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-1"><h3 class="css-rxqrcl" id="site-index-section-label-1">opinion</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion" data-testid="site-index-section-list-link">today&#x27;s opinion</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/columnists" data-testid="site-index-section-list-link">op-ed columnists</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/editorials" data-testid="site-index-section-list-link">editorials</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/contributors" data-testid="site-index-section-list-link">op-ed Contributors</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/letters" data-testid="site-index-section-list-link">letters</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/sunday" data-testid="site-index-section-list-link">sunday review</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/video/opinion" data-testid="site-index-section-list-link">video: opinion</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-2"><h3 class="css-rxqrcl" id="site-index-section-label-2">arts</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts" data-testid="site-index-section-list-link">today&#x27;s arts</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/design" data-testid="site-index-section-list-link">art &amp; design</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/books" data-testid="site-index-section-list-link">books</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/dance" data-testid="site-index-section-list-link">dance</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/movies" data-testid="site-index-section-list-link">movies</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/music" data-testid="site-index-section-list-link">music</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/spotlight/pop-culture" data-testid="site-index-section-list-link">Pop Culture</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/television" data-testid="site-index-section-list-link">television</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/theater" data-testid="site-index-section-list-link">theater</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://www.nytimes.com/watching" data-testid="site-index-section-list-link">watching</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/video/arts" data-testid="site-index-section-list-link">video: arts</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-3"><h3 class="css-rxqrcl" id="site-index-section-label-3">living</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/automobiles" data-testid="site-index-section-list-link">automobiles</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://cooking.nytimes.com/" data-testid="site-index-section-list-link">Cooking</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/crosswords" data-testid="site-index-section-list-link">crossword</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/education" data-testid="site-index-section-list-link">education</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/food" data-testid="site-index-section-list-link">food</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/health" data-testid="site-index-section-list-link">health</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/jobs" data-testid="site-index-section-list-link">jobs</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/magazine" data-testid="site-index-section-list-link">magazine</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://parenting.nytimes.com/" data-testid="site-index-section-list-link">parenting</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/realestate" data-testid="site-index-section-list-link">real estate</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/style" data-testid="site-index-section-list-link">style</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/t-magazine" data-testid="site-index-section-list-link">t magazine</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/travel" data-testid="site-index-section-list-link">travel</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/fashion/weddings" data-testid="site-index-section-list-link">love</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-4"><h3 class="css-rxqrcl" id="site-index-section-label-4">more</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/reader-center" data-testid="site-index-section-list-link">Reader Center</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://thewirecutter.com" data-testid="site-index-section-list-link">Wirecutter</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="http://nytconferences.com/" data-testid="site-index-section-list-link">Live Events</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/learning" data-testid="site-index-section-list-link">The Learning Network</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="http://www.nytimes.com/marketing/tools-and-services" data-testid="site-index-section-list-link">tools &amp; services</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/events" data-testid="site-index-section-list-link">N.Y.C. events guide</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/multimedia" data-testid="site-index-section-list-link">multimedia</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/lens" data-testid="site-index-section-list-link">photography</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/video" data-testid="site-index-section-list-link">video</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/newsletters" data-testid="site-index-section-list-link">Newsletters</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/store" data-testid="site-index-section-list-link">NYT store</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/times-journeys" data-testid="site-index-section-list-link">times journeys</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://myaccount.nytimes.com/membercenter/myaccount.html" data-testid="site-index-section-list-link">manage my account</a></li></ul></section><div class="css-6xhk3s" aria-labelledby="site-index-subscribe-label"><h3 class="css-rxqrcl" id="site-index-subscribe-label">Subscribe</h3><ul class="css-1iruc8t" data-testid="site-index-subscribe-list"><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/hdleftnav" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 14 13" fill="#000"><path d="M13.1,11.7H3.5V1.2h9.6V11.7zM13.1,0.4H3.5C3,0.4,2.6,0.8,2.6,1.2v2.2H0.9C0.4,3.4,0,3.8,0,4.3v5.2v1.5c0,0.8,0.8,1.5,1.8,1.5h1.7h0h7.4h2.2c0.5,0,0.9-0.4,0.9-0.9V1.2C14,0.8,13.6,0.4,13.1,0.4"></path><polygon points="10.9,3 5.2,3 5.2,3.9 11.4,3.9 11.4,3"></polygon><rect x="5.2" y="4.7" width="6.1" height="0.9"></rect><rect x="5.2" y="6.5" width="6.1" height="0.9"></rect></svg>home delivery</a></li><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/digitalleftnav" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 10 13"><path fill="#000" d="M9.9,8c-0.4,1.1-1.2,1.9-2.3,2.4V8l1.3-1.2L7.6,5.7V4c1.2-0.1,2-1,2-2c0-1.4-1.3-1.9-2.1-1.9c-0.2,0-0.3,0-0.6,0.1v0.1c0.1,0,0.2,0,0.3,0c0.5,0,0.9,0.2,0.9,0.7c0,0.4-0.3,0.7-0.8,0.7C6,1.7,4.5,0.6,2.8,0.6c-1.5,0-2.5,1.1-2.5,2.2C0.3,4,1,4.3,1.6,4.6l0-0.1C1.4,4.4,1.3,4.1,1.3,3.8c0-0.5,0.5-0.9,1-0.9C3.7,2.9,6,4,7.4,4h0.1v1.7L6.2,6.8L7.5,8v2.4c-0.5,0.2-1.1,0.3-1.7,0.3c-2.2,0-3.6-1.3-3.6-3.5c0-0.5,0.1-1,0.2-1.5l1.1-0.5V10l2.2-1v-5L2.5,5.5c0.3-1,1-1.7,1.8-2l0,0C2.2,3.9,0.1,5.6,0.1,8c0,2.9,2.4,4.8,5.2,4.8C8.2,12.9,9.9,10.9,9.9,8L9.9,8z"></path></svg>digital subscriptions</a></li><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/subscription/games/lp897H9.html" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 13 13" fill="#000"><polygon points="0,-93.6 0,-86.9 6.6,-93.6"></polygon><polygon points="0.9,-86 7.5,-86 7.5,-92.6"></polygon><polygon points="0,-98 0,-94.8 8.8,-94.8 8.8,-86 12,-86 12,-98"></polygon><path d="M11.9-40c-0.4,1.1-1.2,1.9-2.3,2.4V-40l1.3-1.2l-1.3-1.2V-44c1.2-0.1,2-1,2-2c0-1.4-1.3-1.9-2.1-1.9c-0.2,0-0.3,0-0.6,0.1v0.1c0.1,0,0.2,0,0.3,0c0.5,0,0.9,0.2,0.9,0.7c0,0.4-0.3,0.7-0.8,0.7c-1.3,0-2.8-1.1-4.5-1.1c-1.5,0-2.5,1.1-2.5,2.2c0,1.1,0.6,1.5,1.3,1.7l0-0.1c-0.2-0.1-0.4-0.4-0.4-0.7c0-0.5,0.5-0.9,1-0.9C5.7-45.1,8-44,9.4-44h0.1v1.7l-1.3,1.1L9.5-40v2.4c-0.5,0.2-1.1,0.3-1.7,0.3c-2.2,0-3.6-1.3-3.6-3.5c0-0.5,0.1-1,0.2-1.5l1.1-0.5v4.9l2.2-1v-5l-3.3,1.5c0.3-1,1-1.7,1.8-2l0,0c-2.2,0.5-4.3,2.1-4.3,4.6c0,2.9,2.4,4.8,5.2,4.8C10.2-35.1,11.9-37.1,11.9-40L11.9-40z"></path><path d="M12.2-23.7c-0.2,0-0.4,0.2-0.4,0.4v0.4L0.4-19.1v2.3l3,1l-0.2,0.6c-0.3,0.8,0.1,1.8,0.9,2.1l1.7,0.7c0.2,0.1,0.4,0.1,0.6,0.1c0.6,0,1.3-0.4,1.5-1l0.4-0.9l3.5,1.2v0.4c0,0.2,0.2,0.4,0.4,0.4c0.2,0,0.4-0.2,0.4-0.4v-10.7C12.6-23.5,12.4-23.7,12.2-23.7M7.1-13.6c-0.2,0.4-0.6,0.6-1,0.4l-1.7-0.7c-0.4-0.2-0.6-0.6-0.4-1l0.3-0.7l3.3,1.1L7.1-13.6z"></path><path d="M13.1-60.3H3.5v-10.5h9.6V-60.3zM13.1-71.6H3.5c-0.5,0-0.9,0.4-0.9,0.9v2.2H0.9c-0.5,0-0.9,0.4-0.9,0.9v5.2v1.5c0,0.8,0.8,1.5,1.8,1.5h1.7h0h7.4h2.2c0.5,0,0.9-0.4,0.9-0.9v-10.5C14-71.2,13.6-71.6,13.1-71.6"></path><polygon points="10.9,-69 5.2,-69 5.2,-68.1 11.4,-68.1 11.4,-69"></polygon><rect x="5.2" y="-67.3" width="6.1" height="0.9"></rect><rect x="5.2" y="-65.5" width="6.1" height="0.9"></rect><path d="M12,6.5H6.5V12H1V6.5h5.5V1H12V6.5zM12,0H1C0.4,0,0,0.5,0,1v11c0,0.6,0.4,1,1,1h11c0.5,0,1-0.4,1-1V1C13,0.5,12.5,0,12,0"></path></svg>Crossword</a></li><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/subscriptions/Multiproduct/lp8R3WU.html" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 13 13" fill="#000"><path d="M12,2.9L9.6,5.2c-0.1,0.1-0.3,0.1-0.4,0C9.1,5.2,9.1,5,9.3,4.9l2.4-2.4c-0.2-0.2-0.3-0.3-0.5-0.5L8.7,4.3c-0.1,0.1-0.3,0.1-0.4,0C8.2,4.3,8.2,4.1,8.4,4l2.4-2.4c-0.3-0.3-0.5-0.5-0.5-0.5L7.6,3.4C7.1,4,6.8,5.1,7.1,5.8c-1.4,1-4.6,3.5-5.1,4c-0.8,0.8-0.4,1.8-0.3,1.9c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0.1,1.1,0.5,1.9-0.3c0.4-0.4,2.9-3.6,3.9-5C8.4,6.9,9.6,6.6,10.2,6l2.3-2.6C12.5,3.4,12.3,3.2,12,2.9z"></path><path d="M0.8,1.9l0.3-0.3c0.9-0.9,3.2,1.1,3.8,1.7s0.9,1.8,0.4,2.6c1.4,1.1,4.6,3.5,5,3.9c0.8,0.8,0.4,1.8,0.3,1.9c0,0,0,0,0,0c0,0,0,0,0,0c-0.1,0.1-1.1,0.5-1.9-0.3c-0.4-0.4-2.9-3.7-4-5.1C3.9,6.7,2.9,6.4,2.3,5.8S-0.2,2.9,0.8,1.9z"></path></svg>Cooking</a></li></ul><ul class="css-1iruc8t" data-testid="site-index-corporate-links"><li><a class="css-1vhk1ks" href="https://www.nytimes.com/marketing/newsletters">email newsletters</a></li><li><a class="css-1vhk1ks" href="https://www.nytimes.com/corporateleftnav">corporate subscriptions</a></li><li><a class="css-1vhk1ks" href="https://www.nytimes.com/educationleftnav">education rate</a></li></ul><ul class="css-6td9kr" data-testid="site-index-alternate-links"><li><a class="css-1vhk1ks" href="https://www.nytimes.com/services/mobile/index.html">mobile applications</a></li><li><a class="css-1vhk1ks" href="http://eedition.nytimes.com/cgi-bin/signup.cgi?cc=37FYY">replica edition</a></li></ul></div></div></div></div></nav><footer role="contentinfo" class="css-1qmnftd e5u916q0"><nav data-testid="footer" class="css-15uy5yv"><h2 class="css-vz7hjd">Site Information Navigation</h2><ul class="css-1ho5u4o e5u916q1"><li data-testid="copyright"><a class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/copyright/copyright-notice.html">© <span itemProp="copyrightYear">2019</span><span itemProp="publisher copyrightHolder provider sourceOrganization" itemscope="" itemType="http://schema.org/NewsMediaOrganization" itemID="https://www.nytimes.com"> <meta itemProp="diversityPolicy" content="https://www.nytco.com/diversity-and-inclusion-at-the-new-york-times/"/><meta itemProp="ethicsPolicy" content="https://www.nytco.com/who-we-are/culture/standards-and-ethics/"/><meta itemProp="foundingDate" content="1851-09-18"/><span itemProp="logo" itemscope="" itemType="https://schema.org/ImageObject"><meta itemProp="url" content="https://static01.nyt.com/images/misc/NYT_logo_rss_250x40.png"/></span><meta itemProp="url" content="https://www.nytimes.com/"/><meta itemProp="masthead" content="https://www.nytimes.com/interactive/2018/09/28/admin/the-new-york-times-masthead.html"/><meta itemProp="name" content="The New York Times"/><span>The New York Times Company</span></span></a></li></ul><ul class="css-13o0c9t e5u916q2"><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://myaccount.nytimes.com/membercenter/feedback.html">Contact Us</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://www.nytco.com/careers">Work with us</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://nytmediakit.com/">Advertise</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://www.tbrandstudio.com/">T Brand Studio</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/privacy/policy/privacy-policy.html#pp">Your Ad Choices</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/privacy">Privacy</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/ref/membercenter/help/agree.html">Terms of Service</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/sale/terms-of-sale.html">Terms of Sale</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://spiderbites.nytimes.com">Site Map</a></li><li class="smartphone css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://mobile.nytimes.com/help">Help</a></li><li class="desktop css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/membercenter/sitehelp.html">Help</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/subscription/multiproduct/lp8HYKU?campaignId=37WXW">Subscriptions</a></li></ul></nav></footer></div></div></div></div>
+ <script>window.__preloadedData = {"initialState":{"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==":{"__typename":"Article","id":"QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==","compatibility":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.compatibility","typename":"CompatibilityFeatures"},"archiveProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.archiveProperties","typename":"ArticleArchiveProperties"},"collections@filterEmpty":[{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==","typename":"LegacyCollection"}],"tone":"NEWS","section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==","typename":"Section"},"subsection":null,"sprinkledBody":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody","typename":"DocumentBlock"},"url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F08\u002F01\u002Fnyregion\u002Fnypd-facial-recognition-children-teenagers.html","adTargetingParams({\"clientAdParams\":{\"edn\":\"us\",\"plat\":\"web\",\"prop\":\"nyt\"}})":[{"type":"id","generated":false,"id":"AdTargetingParam:als_test1565027040168","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:propnyt","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:platweb","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ednus","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:brandsensitivefalse","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:per","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:orgpolicedepartmentnyc","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:geonewyorkcity","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:desjuveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:spon","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:authaliwatkins,josephgoldstein","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:col","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:collnewyork,usnews,technology,techandsociety","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:artlenmedium","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ledemedsznone","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:gui","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:templatearticle","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:typart,oak","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:sectionnyregion","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:si_sectionnyregion","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:id100000006583622","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:trend","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ptnt10,nt15,nt16,nt18,nt3,nt4,nt9","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:gscatneg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education","typename":"AdTargetingParam"}],"sourceId":"100000006583622","type":"article","wordCount":1357,"bylines":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0","typename":"Byline"}],"displayProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.displayProperties","typename":"CreativeWorkDisplayProperties"},"typeOfMaterials":{"type":"json","json":["News"]},"collections":[{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==","typename":"LegacyCollection"}],"timesTags@filterEmpty":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.0","typename":"Organization"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.1","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.2","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.3","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.4","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.5","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.6","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.7","typename":"Location"}],"language":null,"desk":"Metro","kicker":"","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.headline","typename":"CreativeWorkHeadline"},"commentStatus":"ACCEPT_AND_DISPLAY_COMMENTS","firstPublished":"2019-08-01T17:15:31.000Z","lastModified":"2019-08-02T17:26:37.071Z","originalDesk":"Metro","source":{"type":"id","generated":false,"id":"Organization:T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=","typename":"Organization"},"printInformation":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.printInformation","typename":"PrintInformation"},"sprinkled":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled","typename":"SprinkledContent"},"followChannels":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.0","typename":"ChannelMetadata"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.1","typename":"ChannelMetadata"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.2","typename":"ChannelMetadata"}],"dfpTaxonomyException":null,"advertisingProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.advertisingProperties","typename":"CreativeWorkAdvertisingProperties"},"translations":[],"summary":"With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.","lastMajorModification":"2019-08-02T09:30:23.000Z","uri":"nyt:\u002F\u002Farticle\u002F9da58246-2495-505f-9abd-b5fda8e67b56","eventId":"pubp:\u002F\u002Fevent\u002F47a657bafa8a476bb36832f90ee5ac6e","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia","typename":"Image"},"newsStatus":"DEFAULT","episodeProperties":null,"column":null,"reviewItems":[],"shortUrl":"https:\u002F\u002Fnyti.ms\u002F2GEzuZ8","promotionalHeadline":"She Was Arrested at 14. Her Photo Went to a Facial Recognition Database.","promotionalSummary":"With little oversight, the police have been using the powerful surveillance technology on photos of children and teenagers.","reviewSummary":"","legacy":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.legacy","typename":"ArticleLegacyData"},"addendums":[],"related@filterEmpty":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.compatibility":{"isOak":true,"__typename":"CompatibilityFeatures","hasVideo":false,"hasOakConversionError":false,"isArtReview":false,"isBookReview":false,"isDiningReview":false,"isMovieReview":false,"isTheaterReview":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.archiveProperties":{"timesMachineUrl":"","lede@stripHtml":"","thumbnails":[],"__typename":"ArticleArchiveProperties"},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","slug":"nyregion","__typename":"LegacyCollection","name":"New York","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F19f66998-f562-5ec6-b3f9-298f1c76dd84","type":"legacycollection","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==","slug":"us","__typename":"LegacyCollection","name":"U.S. News","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F11f72ab4-7cd0-540a-93cc-f35b32cd013d","type":"legacycollection","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==","slug":"technology","__typename":"LegacyCollection","name":"Technology","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F58ece0d0-3c35-5fa9-b535-94997a7c8c0f","type":"legacycollection","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==","slug":"experience-tech-and-society","__typename":"LegacyCollection","name":"Tech and Society","collectionType":"SPOTLIGHT","uri":"nyt:\u002F\u002Flegacycollection\u002F9088cfe6-85e3-52fb-993e-6289702a11ff","type":"legacycollection","header":"","showCollectionStories":false},"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==":{"id":"U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==","name":"nyregion","displayName":"New York","url":"\u002Fsection\u002Fnyregion","uri":"nyt:\u002F\u002Fsection\u002F39480374-66d3-5603-9ce1-58cfa12988e2","__typename":"Section"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0":{"__typename":"HeaderBasicBlock","label":null,"headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline","typename":"Heading1Block"},"summary":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary","typename":"SummaryBlock"},"ledeMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.ledeMedia","typename":"ImageBlock"},"byline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline","typename":"BylineBlock"},"timestampBlock":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.timestampBlock","typename":"TimestampBlock"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.3":{"__typename":"Dropzone","index":0,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.5":{"__typename":"Dropzone","index":1,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.7":{"__typename":"Dropzone","index":2,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.9":{"__typename":"Dropzone","index":3,"bad":false,"adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.11":{"__typename":"Dropzone","index":4,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.13":{"__typename":"Dropzone","index":5,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.6","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.15":{"__typename":"Dropzone","index":6,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.1","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.17":{"__typename":"Dropzone","index":7,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.19":{"__typename":"Dropzone","index":8,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.21":{"__typename":"Dropzone","index":9,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.22":{"__typename":"ImageBlock","size":"MEDIUM","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.23":{"__typename":"Dropzone","index":10,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.25":{"__typename":"Dropzone","index":11,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.5","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.6","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.7","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.8","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.9","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.27":{"__typename":"Dropzone","index":12,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.29":{"__typename":"Dropzone","index":13,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.5","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.31":{"__typename":"Dropzone","index":14,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.33":{"__typename":"Dropzone","index":15,"bad":false,"adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.35":{"__typename":"Dropzone","index":16,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.37":{"__typename":"Dropzone","index":17,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.39":{"__typename":"Dropzone","index":18,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.41":{"__typename":"Dropzone","index":19,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.43":{"__typename":"Dropzone","index":20,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.45":{"__typename":"Dropzone","index":21,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.47":{"__typename":"Dropzone","index":22,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.49":{"__typename":"Dropzone","index":23,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.51":{"__typename":"Dropzone","index":24,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.53":{"__typename":"Dropzone","index":25,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.1","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.55":{"__typename":"Dropzone","index":26,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.57":{"__typename":"Dropzone","index":27,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.60":{"__typename":"Dropzone","index":28,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.1","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.62":{"__typename":"Dropzone","index":29,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.64":{"__typename":"Dropzone","index":30,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.66":{"__typename":"Dropzone","index":31,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.68":{"__typename":"Dropzone","index":32,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.70":{"__typename":"Dropzone","index":33,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.5","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.6","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.72":{"__typename":"Dropzone","index":34,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.74":{"__typename":"Dropzone","index":35,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.76":{"__typename":"Dropzone","index":36,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77":{"__typename":"RelatedLinksBlock","displayStyle":"STANDARD","title":[],"description":[],"related@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0","typename":"Article"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1","typename":"Article"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody":{"content@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.15","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.22","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.23","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.25","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.33","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.45","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.53","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.60","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.76","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77","typename":"RelatedLinksBlock"}],"__typename":"DocumentBlock","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.14","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.15","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.22","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.23","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.24","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.25","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.32","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.33","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.44","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.45","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.52","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.53","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.59","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.60","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.75","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.76","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.77","typename":"RelatedLinksBlock"}],"content@take({\"first\":10000})@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.14","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.15","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.22","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.23","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.24","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.25","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.32","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.33","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.44","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.45","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.52","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.53","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.59","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.60","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.75","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.76","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.77","typename":"RelatedLinksBlock"}]},"AdTargetingParam:als_test1565027040168":{"key":"als_test","value":"1565027040168","__typename":"AdTargetingParam"},"AdTargetingParam:propnyt":{"key":"prop","value":"nyt","__typename":"AdTargetingParam"},"AdTargetingParam:platweb":{"key":"plat","value":"web","__typename":"AdTargetingParam"},"AdTargetingParam:ednus":{"key":"edn","value":"us","__typename":"AdTargetingParam"},"AdTargetingParam:brandsensitivefalse":{"key":"brandsensitive","value":"false","__typename":"AdTargetingParam"},"AdTargetingParam:per":{"key":"per","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:orgpolicedepartmentnyc":{"key":"org","value":"policedepartmentnyc","__typename":"AdTargetingParam"},"AdTargetingParam:geonewyorkcity":{"key":"geo","value":"newyorkcity","__typename":"AdTargetingParam"},"AdTargetingParam:desjuveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties":{"key":"des","value":"juveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties","__typename":"AdTargetingParam"},"AdTargetingParam:spon":{"key":"spon","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:authaliwatkins,josephgoldstein":{"key":"auth","value":"aliwatkins,josephgoldstein","__typename":"AdTargetingParam"},"AdTargetingParam:col":{"key":"col","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:collnewyork,usnews,technology,techandsociety":{"key":"coll","value":"newyork,usnews,technology,techandsociety","__typename":"AdTargetingParam"},"AdTargetingParam:artlenmedium":{"key":"artlen","value":"medium","__typename":"AdTargetingParam"},"AdTargetingParam:ledemedsznone":{"key":"ledemedsz","value":"none","__typename":"AdTargetingParam"},"AdTargetingParam:gui":{"key":"gui","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:templatearticle":{"key":"template","value":"article","__typename":"AdTargetingParam"},"AdTargetingParam:typart,oak":{"key":"typ","value":"art,oak","__typename":"AdTargetingParam"},"AdTargetingParam:sectionnyregion":{"key":"section","value":"nyregion","__typename":"AdTargetingParam"},"AdTargetingParam:si_sectionnyregion":{"key":"si_section","value":"nyregion","__typename":"AdTargetingParam"},"AdTargetingParam:id100000006583622":{"key":"id","value":"100000006583622","__typename":"AdTargetingParam"},"AdTargetingParam:trend":{"key":"trend","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:ptnt10,nt15,nt16,nt18,nt3,nt4,nt9":{"key":"pt","value":"nt10,nt15,nt16,nt18,nt3,nt4,nt9","__typename":"AdTargetingParam"},"AdTargetingParam:gscatneg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education":{"key":"gscat","value":"neg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education","__typename":"AdTargetingParam"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0":{"displayName":"Joseph Goldstein","__typename":"Person","url":"","contactDetails":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails","typename":"ContactDetails"},"legacyData":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.legacyData","typename":"PersonLegacyData"}},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1":{"displayName":"Ali Watkins","__typename":"Person","url":"","contactDetails":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails","typename":"ContactDetails"},"legacyData":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.legacyData","typename":"PersonLegacyData"}},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0":{"creators":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0","typename":"Person"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1","typename":"Person"}],"__typename":"Byline","renderedRepresentation":"By Joseph Goldstein and Ali Watkins"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.displayProperties":{"fullBleedDisplayStyle":"","__typename":"CreativeWorkDisplayProperties","serveAsNyt4":false},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.0":{"__typename":"Organization","vernacular":"NYPD","isAdvertisingBrandSensitive":false,"displayName":"Police Department (NYC)"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.1":{"__typename":"Subject","vernacular":"Juvenile delinquency","isAdvertisingBrandSensitive":false,"displayName":"Juvenile Delinquency"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.2":{"__typename":"Subject","vernacular":"Facial Recognition","isAdvertisingBrandSensitive":false,"displayName":"Facial Recognition Software"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.3":{"__typename":"Subject","vernacular":"Privacy","isAdvertisingBrandSensitive":false,"displayName":"Privacy"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.4":{"__typename":"Subject","vernacular":"Government Surveillance","isAdvertisingBrandSensitive":false,"displayName":"Surveillance of Citizens by Government"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.5":{"__typename":"Subject","vernacular":"Police","isAdvertisingBrandSensitive":false,"displayName":"Police"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.6":{"__typename":"Subject","vernacular":"Civil Rights","isAdvertisingBrandSensitive":false,"displayName":"Civil Rights and Liberties"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.7":{"__typename":"Location","vernacular":"NYC","isAdvertisingBrandSensitive":false,"displayName":"New York City"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.headline":{"default":"She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.","__typename":"CreativeWorkHeadline","default@stripHtml":"She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.","seo@stripHtml":""},"Organization:T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=":{"id":"T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=","displayName":"New York Times","__typename":"Organization"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.printInformation":{"page":"1","section":"A","publicationDate":"2019-08-02T04:00:00.000Z","__typename":"PrintInformation","edition":"NewYork","headline@stripHtml":"In New York, Police Computers Scan Faces, Some as Young as 11"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.0":{"name":"mobile","stride":4,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.1":{"name":"desktop","stride":7,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.2":{"name":"mobileHoldout","stride":6,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.3":{"name":"desktopHoldout","stride":8,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.4":{"name":"hybrid","stride":4,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled":{"configs":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.0","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.1","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.2","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.3","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.4","typename":"SprinkledConfig"}],"__typename":"SprinkledContent"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.0":{"__typename":"HeaderBasicBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.1":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.2":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.3":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.4":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.5":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.6":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.7":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.8":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.9":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.10":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.11":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.12":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.13":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.14":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.15":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.16":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.17":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.18":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.19":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.20":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.21":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.22":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.23":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.24":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.25":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.26":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.27":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.28":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.29":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.30":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.31":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.32":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.33":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.34":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.35":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.36":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.37":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.38":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.39":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.40":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.41":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.42":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.43":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.44":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.45":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.46":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.47":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.48":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.49":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.50":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.51":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.52":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.53":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.54":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.55":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.56":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.57":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.58":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.59":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.60":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.61":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.62":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.63":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.64":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.65":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.66":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.67":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.68":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.69":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.70":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.71":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.72":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.73":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.74":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.75":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.76":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.77":{"__typename":"RelatedLinksBlock"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.0":{"uri":"nyt:\u002F\u002Fchannel\u002Fdd1a5725-c3be-4673-be2c-9055eb12c10f","__typename":"ChannelMetadata"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.1":{"uri":"nyt:\u002F\u002Fchannel\u002F7cf18b43-f1c6-4946-8a9c-4e24bad34c5c","__typename":"ChannelMetadata"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.2":{"uri":"nyt:\u002F\u002Fchannel\u002F679a17bb-20e6-40a7-a589-e7742a2a52ed","__typename":"ChannelMetadata"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.0":{"__typename":"HeaderBasicBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.1":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.2":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.3":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.4":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.5":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.6":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.7":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.8":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.9":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.10":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.11":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.12":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.13":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.14":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.15":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.16":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.17":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.18":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.19":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.20":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.21":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.22":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.23":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.24":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.25":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.26":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.27":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.28":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.29":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.30":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.31":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.32":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.33":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.34":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.35":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.36":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.37":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.38":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.39":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.40":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.41":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.42":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.43":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.44":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.45":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.46":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.47":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.48":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.49":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.50":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.51":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.52":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.53":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.54":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.55":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.56":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.57":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.58":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.59":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.60":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.61":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.62":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.63":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.64":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.65":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.66":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.67":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.68":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.69":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.70":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.71":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.72":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.73":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.74":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.75":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.76":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.77":{"__typename":"RelatedLinksBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.advertisingProperties":{"sensitivity":"SHOW_ADS","__typename":"CreativeWorkAdvertisingProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).0":{"name":"MASTER","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-articleLarge.jpg","height":400,"width":600,"name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-superJumbo.jpg","height":1365,"width":2048,"name":"superJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).1":{"name":"SMALL_SQUARE","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbStandard.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbLarge.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbStandard.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-thumbStandard.jpg","height":75,"width":75,"name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-thumbLarge.jpg","height":150,"width":150,"name":"thumbLarge","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).2":{"name":"SIXTEEN_BY_NINE","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg","height":900,"width":1600,"name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).3":{"name":"FACEBOOK","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-facebookJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-facebookJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-facebookJumbo.jpg","height":550,"width":1050,"name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).4":{"name":"WATCH","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-watch308.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-watch308.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-watch308.jpg","height":348,"width":312,"name":"watch308","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia":{"crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).4","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.caption":{"text":"","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline":{"textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline.content.0","typename":"TextInline"}],"__typename":"Heading1Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline.content.0":{"__typename":"TextInline","text@stripHtml":"She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary":{"textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary.content.0","typename":"TextInline"}],"__typename":"SummaryBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary.content.0":{"__typename":"TextInline","text":"With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.ledeMedia":{"__typename":"ImageBlock","size":"MEDIUM","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz","typename":"Image"}},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F00nypd-juveniles.html","uri":"nyt:\u002F\u002Fimage\u002F2ad4fe36-f59f-5211-a12e-6b1f5bce2fa3","credit":"Sarah Blesener for The New York Times","legacyHtmlCaption":"“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg","name":"articleLarge","width":600,"height":900,"__typename":"ImageRendition"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-popup.jpg","name":"popup","width":334,"height":500,"__typename":"ImageRendition"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg","name":"jumbo","width":683,"height":1024,"__typename":"ImageRendition"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg","name":"superJumbo","width":1366,"height":2048,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleInline.jpg","name":"articleInline","width":190,"height":285,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.caption":{"text":"“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline":{"textAlign":"LEFT","hideHeadshots":false,"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0","typename":"Byline"}],"role@filterEmpty":[],"__typename":"BylineBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0":{"prefix":"By","creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0","typename":"Person"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1","typename":"Person"}],"renderedRepresentation":null,"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0":{"displayName":"Joseph Goldstein","bioUrl":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fjoseph-goldstein","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia","typename":"Image"},"__typename":"Person"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-articleLarge.png","name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-popup.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-popup.png","name":"popup","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog480.png","name":"blog480","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog533.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog533.png","name":"blog533","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog427.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog427.png","name":"blog427","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagSF.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-tmagSF.png","name":"tmagSF","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagArticle.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-tmagArticle.png","name":"tmagArticle","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-slide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-slide.png","name":"slide","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-jumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-jumbo.png","name":"jumbo","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-superJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-superJumbo.png","name":"superJumbo","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog225.png","name":"blog225","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master675.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master675.png","name":"master675","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master495.png","name":"master495","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master180.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master180.png","name":"master180","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master315.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master315.png","name":"master315","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master768.png","name":"master768","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-popup.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog533.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog427.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagSF.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagArticle.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-slide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-jumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-superJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master675.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master180.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master315.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master768.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbStandard.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-thumbStandard.png","name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blogSmallThumb.png","name":"blogSmallThumb","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-thumbLarge.png","name":"thumbLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare168.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-smallSquare168.png","name":"smallSquare168","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-smallSquare252.png","name":"smallSquare252","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbStandard.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare168.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare252.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square320.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-square320.png","name":"square320","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-moth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-moth.png","name":"moth","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-filmstrip.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-filmstrip.png","name":"filmstrip","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square640.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-square640.png","name":"square640","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumSquare149.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumSquare149.png","name":"mediumSquare149","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square320.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-moth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-filmstrip.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square640.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumSquare149.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-sfSpan.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-sfSpan.png","name":"sfSpan","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontal375.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-largeHorizontal375.png","name":"largeHorizontal375","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontalJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-largeHorizontalJumbo.png","name":"largeHorizontalJumbo","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-horizontalMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-horizontalMediumAt2X.png","name":"horizontalMediumAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-sfSpan.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontal375.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontalJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-horizontalMediumAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-hpLarge.png","name":"hpLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeWidescreen573.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-largeWidescreen573.png","name":"largeWidescreen573","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeWidescreen573.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbWide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-thumbWide.png","name":"thumbWide","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoThumb.png","name":"videoThumb","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoLarge.png","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo210.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo210.png","name":"mediumThreeByTwo210","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo225.png","name":"mediumThreeByTwo225","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo440.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo440.png","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo252.png","name":"mediumThreeByTwo252","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo378.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo378.png","name":"mediumThreeByTwo378","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoLargeAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-threeByTwoLargeAt2X.png","name":"threeByTwoLargeAt2X","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-threeByTwoMediumAt2X.png","name":"threeByTwoMediumAt2X","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoSmallAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-threeByTwoSmallAt2X.png","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.5":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbWide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo210.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo440.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo252.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo378.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-articleInline.png","name":"articleInline","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-hpSmall.png","name":"hpSmall","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blogSmallInline.png","name":"blogSmallInline","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumFlexible177.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumFlexible177.png","name":"mediumFlexible177","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.6":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumFlexible177.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSmall.png","name":"videoSmall","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoHpMedium.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoHpMedium.png","name":"videoHpMedium","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine600.png","name":"videoSixteenByNine600","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine540.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine540.png","name":"videoSixteenByNine540","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine495.png","name":"videoSixteenByNine495","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine390.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine390.png","name":"videoSixteenByNine390","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine480.png","name":"videoSixteenByNine480","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine310.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine310.png","name":"videoSixteenByNine310","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine225.png","name":"videoSixteenByNine225","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine96.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine96.png","name":"videoSixteenByNine96","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine768.png","name":"videoSixteenByNine768","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine150.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine150.png","name":"videoSixteenByNine150","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNineJumbo1600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNineJumbo1600.png","name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.7":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoHpMedium.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine600.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine540.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine390.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine310.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine96.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine768.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine150.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNineJumbo1600.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-miniMoth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-miniMoth.png","name":"miniMoth","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-windowsTile336H.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-windowsTile336H.png","name":"windowsTile336H","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.8":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-miniMoth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-windowsTile336H.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.9":{"renditions":[],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-facebookJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-facebookJumbo.png","name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.10":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-facebookJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch308.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-watch308.png","name":"watch308","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch268.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-watch268.png","name":"watch268","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.11":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch308.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch268.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.12":{"renditions":[],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia":{"crops":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.4","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.5","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.6","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.7","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.8","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.9","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.10","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.11","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.12","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1":{"displayName":"Ali Watkins","bioUrl":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fali-watkins","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia","typename":"Image"},"__typename":"Person"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-articleLarge.png","name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-popup.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-popup.png","name":"popup","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog480.png","name":"blog480","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog533.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog533.png","name":"blog533","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog427.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog427.png","name":"blog427","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagSF.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-tmagSF.png","name":"tmagSF","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagArticle.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-tmagArticle.png","name":"tmagArticle","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-slide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-slide.png","name":"slide","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-jumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-jumbo.png","name":"jumbo","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-superJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-superJumbo.png","name":"superJumbo","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog225.png","name":"blog225","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master675.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master675.png","name":"master675","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master495.png","name":"master495","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master180.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master180.png","name":"master180","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master315.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master315.png","name":"master315","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master768.png","name":"master768","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-popup.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog533.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog427.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagSF.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagArticle.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-slide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-jumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-superJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master675.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master180.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master315.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master768.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbStandard.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-thumbStandard.png","name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blogSmallThumb.png","name":"blogSmallThumb","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-thumbLarge.png","name":"thumbLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare168.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-smallSquare168.png","name":"smallSquare168","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-smallSquare252.png","name":"smallSquare252","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbStandard.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare168.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare252.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square320.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-square320.png","name":"square320","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-moth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-moth.png","name":"moth","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-filmstrip.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-filmstrip.png","name":"filmstrip","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square640.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-square640.png","name":"square640","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumSquare149.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumSquare149.png","name":"mediumSquare149","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square320.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-moth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-filmstrip.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square640.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumSquare149.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-sfSpan.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-sfSpan.png","name":"sfSpan","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontal375.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeHorizontal375.png","name":"largeHorizontal375","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontalJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeHorizontalJumbo.png","name":"largeHorizontalJumbo","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-horizontalMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-horizontalMediumAt2X.png","name":"horizontalMediumAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-sfSpan.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontal375.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontalJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-horizontalMediumAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-hpLarge.png","name":"hpLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen573.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeWidescreen573.png","name":"largeWidescreen573","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen1050.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeWidescreen1050.png","name":"largeWidescreen1050","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen573.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen1050.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbWide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-thumbWide.png","name":"thumbWide","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoThumb.png","name":"videoThumb","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoLarge.png","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo210.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo210.png","name":"mediumThreeByTwo210","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo225.png","name":"mediumThreeByTwo225","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo440.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo440.png","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo252.png","name":"mediumThreeByTwo252","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo378.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo378.png","name":"mediumThreeByTwo378","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoLargeAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-threeByTwoLargeAt2X.png","name":"threeByTwoLargeAt2X","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-threeByTwoMediumAt2X.png","name":"threeByTwoMediumAt2X","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoSmallAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-threeByTwoSmallAt2X.png","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.5":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbWide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo210.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo440.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo252.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo378.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-articleInline.png","name":"articleInline","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-hpSmall.png","name":"hpSmall","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blogSmallInline.png","name":"blogSmallInline","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumFlexible177.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumFlexible177.png","name":"mediumFlexible177","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.6":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumFlexible177.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSmall.png","name":"videoSmall","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoHpMedium.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoHpMedium.png","name":"videoHpMedium","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine600.png","name":"videoSixteenByNine600","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine540.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine540.png","name":"videoSixteenByNine540","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine495.png","name":"videoSixteenByNine495","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine390.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine390.png","name":"videoSixteenByNine390","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine1050.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine1050.png","name":"videoSixteenByNine1050","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine480.png","name":"videoSixteenByNine480","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine310.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine310.png","name":"videoSixteenByNine310","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine225.png","name":"videoSixteenByNine225","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine96.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine96.png","name":"videoSixteenByNine96","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine768.png","name":"videoSixteenByNine768","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine150.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine150.png","name":"videoSixteenByNine150","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNineJumbo1600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNineJumbo1600.png","name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.7":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoHpMedium.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine600.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine540.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine390.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine1050.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine310.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine96.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine768.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine150.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNineJumbo1600.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-miniMoth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-miniMoth.png","name":"miniMoth","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-windowsTile336H.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-windowsTile336H.png","name":"windowsTile336H","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoFifteenBySeven1305.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoFifteenBySeven1305.png","name":"videoFifteenBySeven1305","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.8":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-miniMoth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-windowsTile336H.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoFifteenBySeven1305.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.9":{"renditions":[],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-facebookJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-facebookJumbo.png","name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.10":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-facebookJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch308.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-watch308.png","name":"watch308","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch268.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-watch268.png","name":"watch268","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.11":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch308.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch268.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.12":{"renditions":[],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia":{"crops":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.4","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.5","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.6","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.7","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.8","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.9","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.10","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.11","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.12","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.timestampBlock":{"timestamp":"2019-08-01T17:15:31.000Z","align":"LEFT","__typename":"TimestampBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0":{"__typename":"TextInline","text":"[What you need to know to start the day: ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0.formats.0","typename":"ItalicFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1":{"__typename":"TextInline","text":"Get New York Today in your inbox","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.0","typename":"ItalicFormat"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.1","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.1":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002Fnewsletters\u002Fnewyorktoday?module=inline","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2":{"__typename":"TextInline","text":".]","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2.formats.0","typename":"ItalicFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.0":{"__typename":"TextInline","text":"The New York Police Department has been loading ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.1":{"__typename":"TextInline","text":"thousands of arrest photos of children and teenagers","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.2":{"__typename":"TextInline","text":" into a facial recognition database despite evidence the technology has a higher risk of false matches in younger faces. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.0":{"__typename":"TextInline","text":"For about four years, internal records show, the department has used the technology to compare crime scene images with its collection of juvenile mug ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.1":{"__typename":"TextInline","text":"shots","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.2":{"__typename":"TextInline","text":", the photos that are taken at an arrest. Most of the photos are of teenagers, largely 13 to 16 years old, but children as young as 11 have been included. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6.content.0":{"__typename":"TextInline","text":"Elected officials and civil rights groups said the disclosure that the city was deploying a powerful surveillance tool on adolescents — whose privacy seems sacrosanct and whose status is protected in the criminal justice system — was a striking example of the Police Department’s ability to adopt advancing technology with little public scrutiny.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8.content.0":{"__typename":"TextInline","text":"Several members of the City Council as well as a range of civil liberties groups said they were unaware of the policy until they were contacted by The New York Times. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.0":{"__typename":"TextInline","text":"Police ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.1":{"__typename":"TextInline","text":"Department officials defended the decision, ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.2":{"__typename":"TextInline","text":"saying it was just the latest evolution of a longstanding policing technique: using arrest photos to identify suspects.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12.content.0":{"__typename":"TextInline","text":"“I don’t think this is any secret decision that’s made behind closed doors,” the city’s chief of detectives, Dermot F. Shea, said in an interview. “This is just process, and making sure we’re doing everything to fight crime.” ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.0":{"__typename":"TextInline","text":"Other cities have begun to debate whether law enforcement should use facial recognition, which relies on an algorithm to quickly pore through images and suggest matches. In May, ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1":{"__typename":"TextInline","text":"San Francisco blocked city agencies, including the police","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F05\u002F14\u002Fus\u002Ffacial-recognition-ban-san-francisco.html?module=inline","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.2":{"__typename":"TextInline","text":", from using the tool amid unease about potential government ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.3":{"__typename":"TextInline","text":"abuse","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.4":{"__typename":"TextInline","text":". ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5":{"__typename":"TextInline","text":"Detroit is facing public resistance to a technology ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F07\u002F08\u002Fus\u002Fdetroit-facial-recognition-cameras.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.6":{"__typename":"TextInline","text":"that has been shown to have lower accuracy with people with darker skin. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.0":{"__typename":"TextInline","text":"In New York, the state Education Department recently told the Lockport, N.Y., ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.1":{"__typename":"TextInline","text":"school district to delay a plan to use facial recognition on students, citing privacy concerns. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.0":{"__typename":"TextInline","text":"“At the end ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.1":{"__typename":"TextInline","text":"of the day, it should be banned — no young people,” said ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.2":{"__typename":"TextInline","text":"Councilman Donovan Richards","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.3":{"__typename":"TextInline","text":", a Queens Democrat who heads the Public Safety Committee, which oversees the Police Department. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.0":{"__typename":"TextInline","text":"The department said its legal bureau had approved using facial recognition on juveniles. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1":{"__typename":"TextInline","text":"The algorithm may suggest a lead, but detectives would not make an arrest based solely on ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F09\u002Fopinion\u002Ffacial-recognition-police-new-york-city.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2":{"__typename":"TextInline","text":"that","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F09\u002Fopinion\u002Ffacial-recognition-police-new-york-city.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.3":{"__typename":"TextInline","text":", Chief Shea said.","formats":[]},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F00nypd-juveniles2.html","uri":"nyt:\u002F\u002Fimage\u002F5a694c3e-2066-51a1-965d-4be8779badef","credit":"Chang W. Lee\u002FThe New York Times","legacyHtmlCaption":"Dermot Shea, the city&rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg","name":"articleLarge","width":600,"height":400,"__typename":"ImageRendition"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-popup.jpg","name":"popup","width":650,"height":433,"__typename":"ImageRendition"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg","name":"jumbo","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg","name":"superJumbo","width":2048,"height":1365,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleInline.jpg","name":"articleInline","width":190,"height":127,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.caption":{"text":"Dermot Shea, the city&rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24.content.0":{"__typename":"TextInline","text":"Still, facial recognition has not been widely tested on children. Most algorithms are taught to “think” based on adult faces, and there is growing evidence that they do not work as well on children. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.0":{"__typename":"TextInline","text":"The National Institute of Standards and Technology","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.1":{"__typename":"TextInline","text":", which is part of the Commerce Department and ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2":{"__typename":"TextInline","text":"evaluates facial recognition ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fnvlpubs.nist.gov\u002Fnistpubs\u002Fir\u002F2018\u002FNIST.IR.8238.pdf","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3":{"__typename":"TextInline","text":"algorithms","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fnvlpubs.nist.gov\u002Fnistpubs\u002Fir\u002F2018\u002FNIST.IR.8238.pdf","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.4":{"__typename":"TextInline","text":" for accuracy, recently found the ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.5":{"__typename":"TextInline","text":"vast majority of more than 100 ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.6":{"__typename":"TextInline","text":"facial recognition ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.7":{"__typename":"TextInline","text":"algorithms had a higher rate of mistaken matches among children. The ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.8":{"__typename":"TextInline","text":"e","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.9":{"__typename":"TextInline","text":"rror rate was most pronounced in young children but was also seen in those aged 10 to 16.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.0":{"__typename":"TextInline","text":"Aging poses another problem:","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.1":{"__typename":"TextInline","text":" The appearance of children and adolescents can change ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.2":{"__typename":"TextInline","text":" drastically as bones stretch and shift, altering the underlying facial structure. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.0":{"__typename":"TextInline","text":"“I would use extreme caution in using those algorithms,” said ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.1":{"__typename":"TextInline","text":"Karl Ricanek Jr.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.2":{"__typename":"TextInline","text":", a computer science professor and ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.3":{"__typename":"TextInline","text":"co-founder of the Face Aging Group at the University of North Carolina-","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.4":{"__typename":"TextInline","text":"Wilmington","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.5":{"__typename":"TextInline","text":". ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32.content.0":{"__typename":"TextInline","text":"Technology that can match an image of a younger teenager to a recent arrest photo may be less effective at finding the same person even one or two years later, he said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34.content.0":{"__typename":"TextInline","text":" “The systems do not have the capacity to understand the dynamic changes that occur to a child’s face,” Dr. Ricanek said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.0":{"__typename":"TextInline","text":"Idemia","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.1":{"__typename":"TextInline","text":" and ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.2":{"__typename":"TextInline","text":"DataWorks Plus","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.3":{"__typename":"TextInline","text":", the two companies that provide facial recognition software to the Police Department, did not respond to requests for comment. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.0":{"__typename":"TextInline","text":"The New York Police Department can take arrest photos of minors as young as ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.1":{"__typename":"TextInline","text":"11","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.2":{"__typename":"TextInline","text":" who are charged with a felony, depending on the severity of the charge. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40.content.0":{"__typename":"TextInline","text":"And in many cases, the department keeps the photos for years, making facial recognition comparisons to what may have effectively become outdated images. There are photos of 5,500 individuals in the juvenile database, 4,100 of whom are no longer 16 or under, the department said. Teenagers 17 and older are considered adults in the criminal justice system. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42.content.0":{"__typename":"TextInline","text":"Police officials declined to provide statistics on how often their facial recognition systems provide false matches, or to explain how they evaluate the system’s effectiveness.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44.content.0":{"__typename":"TextInline","text":"“We are comfortable with this technology because it has proved to be a valuable investigative method,” Chief Shea said. Facial recognition has helped lead to thousands of arrests of both adults and juveniles, the department has said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46.content.0":{"__typename":"TextInline","text":"Mayor Bill de Blasio had been aware the department was using the technology on minors, said Freddi Goldstein, a spokeswoman for the mayor. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48.content.0":{"__typename":"TextInline","text":"She said the Police Department followed “strict guidelines” in applying the technology and City Hall monitored the agency’s compliance with the policies. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.0":{"__typename":"TextInline","text":"The Times learned details of the department’s use of facial recognition by reviewing documents posted online earlier this year by ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1":{"__typename":"TextInline","text":"Clare Garvie, a senior associate","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.flawedfacedata.com\u002F#footnote5","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2":{"__typename":"TextInline","text":" at the Center on Privacy and Technology at Georgetown Law","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.flawedfacedata.com\u002F#footnote5","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.3":{"__typename":"TextInline","text":". Ms. Garvie received the documents as part of an open records lawsuit. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52.content.0":{"__typename":"TextInline","text":"It could not be determined whether other large police departments used facial recognition with juveniles because very few have written policies governing the use of the technology, Ms. Garvie said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.0":{"__typename":"TextInline","text":"New York detectives rely on a vast network","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.1":{"__typename":"TextInline","text":" of surveillance cameras throughout the city to provide images of people believed to have committed a crime. Since 2011, the department has had a dedicated unit of officers who use facial recognition to compare those images against millions of photos, usually mug shots. The software proposes matches, which have led to thousands of arrests, the department said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56.content.0":{"__typename":"TextInline","text":"By 2013, top police officials were meeting to discuss including juveniles in the program, the documents reviewed by The Times showed. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58.content.0":{"__typename":"TextInline","text":"The documents showed that the juvenile database had been integrated into the system by 2015. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59.content.0":{"__typename":"TextInline","text":"“We have these photos. It makes sense,” Chief Shea said in the interview. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.0":{"__typename":"TextInline","text":"State law requires that arrest photos be destroyed if the case is resolved in the juvenile’s favor, or if the child is found to have committed only a misdemeanor, rather than a felony. The photos also must be destroyed if a person reaches age 21 without a criminal record. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.1":{"__typename":"TextInline","text":" ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63.content.0":{"__typename":"TextInline","text":"When children are charged with crimes, the court system usually takes some steps to prevent their acts from defining them in later years. Children who are 16 and under, for instance, are generally sent to Family Court, where records are not public. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65.content.0":{"__typename":"TextInline","text":"Yet including their photos in a facial recognition database runs the risk that an imperfect algorithm identifies them as possible suspects in later crimes, civil rights advocates said. A mistaken match could lead investigators to focus on the wrong person from the outset, they said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67.content.0":{"__typename":"TextInline","text":"“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, a 17-year-old Brooklyn girl who had admitted guilt in Family Court to a group attack that happened when she was 14. She said she was present at the attack but did not participate. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.0":{"__typename":"TextInline","text":"Bailey, who asked that she be identified only by her ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.1":{"__typename":"TextInline","text":"last name","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.2":{"__typename":"TextInline","text":" because she did not want her juvenile arrest to be public, has not been arrested again and is now a student at John Jay College of Criminal Justice. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.0":{"__typename":"TextInline","text":"R","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.1":{"__typename":"TextInline","text":"ecent studies indicate that people of color, as well as children and women, have a greater risk of misidentification than their counterparts, sai","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.2":{"__typename":"TextInline","text":"d ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.3":{"__typename":"TextInline","text":"Joy Buolamwini","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.4":{"__typename":"TextInline","text":", ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.5":{"__typename":"TextInline","text":"the founder of the Algorithmic Justice League and graduate researcher at the M.I.T. Media Lab","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.6":{"__typename":"TextInline","text":", who has examined how human biases are built into artificial intelligence. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.0":{"__typename":"TextInline","text":"The racial disparities in the juvenile justice system are stark: In New York, black and Latino juveniles were charged with crimes at far higher rates than whites in 2017, the most recent year for which numbers were available. Black juveniles outnumbered white juveniles ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1":{"__typename":"TextInline","text":"more than 15 to 1","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.criminaljustice.ny.gov\u002Fcrimnet\u002Fojsa\u002Fjj-reports\u002Fnewyorkcity.pdf","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.2":{"__typename":"TextInline","text":".","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75.content.0":{"__typename":"TextInline","text":"“If the facial recognition algorithm has a negative bias toward a black population, that will get magnified more toward children,” Dr. Ricanek said, adding that in terms of diminished accuracy, “you’re now putting yourself in unknown territory.”","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0":{"__typename":"Article","promotionalHeadline":"Facial Recognition Makes You Safer","promotionalSummary":"Used properly, the software effectively identifies crime suspects without violating rights.","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.headline","typename":"CreativeWorkHeadline"},"summary":"Used properly, the software effectively identifies crime suspects without violating rights.","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F09\u002Fopinion\u002Ffacial-recognition-police-new-york-city.html","firstPublished":"2019-06-09T23:00:05.000Z","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia","typename":"Image"},"section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==","typename":"Section"},"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0","typename":"Byline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.headline":{"default":"How Facial Recognition Makes You Safer","__typename":"CreativeWorkHeadline"},"ImageRendition:images20190607opinionsunday07Oneill07Oneill-videoLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002Fsunday\u002F07Oneill\u002F07Oneill-videoLarge.jpg","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20190607opinionsunday07Oneill07Oneill-mediumThreeByTwo440.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002Fsunday\u002F07Oneill\u002F07Oneill-mediumThreeByTwo440.jpg","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20190607opinionsunday07Oneill07Oneill-threeByTwoSmallAt2X.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002Fsunday\u002F07Oneill\u002F07Oneill-threeByTwoSmallAt2X.jpg","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190607opinionsunday07Oneill07Oneill-videoLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinionsunday07Oneill07Oneill-mediumThreeByTwo440.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinionsunday07Oneill07Oneill-threeByTwoSmallAt2X.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia":{"crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1":{"__typename":"Article","promotionalHeadline":"Spying on Children Won’t Keep Them Safe","promotionalSummary":"This week my daughter’s school became the first in the nation to pilot facial-recognition software. The technology’s potential is chilling.","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.headline","typename":"CreativeWorkHeadline"},"summary":"This week my daughter’s school became the first in the nation to pilot facial-recognition software. The technology’s potential is chilling.","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F07\u002Fopinion\u002Flockport-facial-recognition-schools.html","firstPublished":"2019-06-07T15:00:05.000Z","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia","typename":"Image"},"section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==","typename":"Section"},"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0","typename":"Byline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.headline":{"default":"Spying on Children Won’t Keep Them Safe","__typename":"CreativeWorkHeadline"},"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-videoLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002F07shultz-privacy\u002F07shultz-privacy-videoLarge.jpg","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-mediumThreeByTwo440.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002F07shultz-privacy\u002F07shultz-privacy-mediumThreeByTwo440.jpg","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-threeByTwoSmallAt2X.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002F07shultz-privacy\u002F07shultz-privacy-threeByTwoSmallAt2X.jpg","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-videoLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-mediumThreeByTwo440.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-threeByTwoSmallAt2X.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia":{"crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0","typename":"ImageCrop"}],"__typename":"Image"},"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==":{"id":"U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==","displayName":"Opinion","__typename":"Section"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0.creators.0":{"displayName":"James O’Neill","__typename":"Person"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0":{"creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0.creators.0","typename":"Person"}],"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0.creators.0":{"displayName":"Jim Shultz","__typename":"Person"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0":{"creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0.creators.0","typename":"Person"}],"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.legacy":{"reviewInformation":"","__typename":"ArticleLegacyData","htmlExtendedAuthorOrArticleInformation":"","htmlInfoBox":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.0":{"type":"twitter","account":"JoeKGoldstein","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.1":{"type":"url","account":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fjoseph-goldstein","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails":{"socialMedia":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.0","typename":"ContactDetailsSocialMedia"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.1","typename":"ContactDetailsSocialMedia"}],"__typename":"ContactDetails"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.legacyData":{"htmlShortBiography":"\u003Cp\u003EJoseph Goldstein writes about policing and the criminal justice system. He has been a reporter at The Times since 2011, and is based in New York. He also worked for a year in the Kabul bureau, reporting on Afghanistan.\u003C\u002Fp\u003E","__typename":"PersonLegacyData"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.0":{"type":"url","account":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fali-watkins","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.1":{"type":"twitter","account":"AliWatkins","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails":{"socialMedia":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.0","typename":"ContactDetailsSocialMedia"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.1","typename":"ContactDetailsSocialMedia"}],"__typename":"ContactDetails"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.legacyData":{"htmlShortBiography":"\u003Cp\u003EAli Watkins is a reporter on the Metro Desk, covering courts and social services. Previously, she covered national security in Washington for The Times, BuzzFeed and McClatchy Newspapers.\u003C\u002Fp\u003E","__typename":"PersonLegacyData"},"ROOT_QUERY":{"workOrLocation({\"id\":\"\u002F2019\u002F08\u002F01\u002Fnyregion\u002Fnypd-facial-recognition-children-teenagers.html\"})":{"type":"id","generated":false,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==","typename":"Article"}}},"config":{"gqlUrl":"https:\u002F\u002Fsamizdat-graphql.nytimes.com\u002Fgraphql\u002Fv2","gqlRequestHeaders":{"nyt-app-type":"project-vi","nyt-app-version":"0.0.5","nyt-token":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs+\u002FoUCTBmD\u002FcLdmcecrnBMHiU\u002FpxQCn2DDyaPKUOXxi4p0uUSZQzsuq1pJ1m5z1i0YGPd1U1OeGHAChWtqoxC7bFMCXcwnE1oyui9G1uobgpm1GdhtwkR7ta7akVTcsF8zxiXx7DNXIPd2nIJFH83rmkZueKrC4JVaNzjvD+Z03piLn5bHWU6+w+rA+kyJtGgZNTXKyPh6EC6o5N+rknNMG5+CdTq35p8f99WjFawSvYgP9V64kgckbTbtdJ6YhVP58TnuYgr12urtwnIqWP9KSJ1e5vmgf3tunMqWNm6+AnsqNj8mCLdCuc5cEB74CwUeQcP2HQQmbCddBy2y0mEwIDAQAB"},"gqlFetchTimeout":4000,"disablePersistedQueries":false,"initialDeviceType":"desktop","fastlyAbraConfig":{},"serviceWorkerFile":"service-worker-test-1565019880489.js"},"ssrQuery":{},"initialLocation":{"pathname":"\u002F2019\u002F08\u002F01\u002Fnyregion\u002Fnypd-facial-recognition-children-teenagers.html"},"externalAssets":[]};</script>
+ <script>!function(e){function r(r){for(var n,i,a=r[0],f=r[1],l=r[2],p=0,s=[];p<a.length;p++)i=a[p],o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(c&&c(r);s.length;)s.shift()();return u.push.apply(u,l||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,a=1;a<t.length;a++){var f=t[a];0!==o[f]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={37:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="/vi-assets/static-assets/";var a=window.webpackJsonp=window.webpackJsonp||[],f=a.push.bind(a);a.push=r,a=a.slice();for(var l=0;l<a.length;l++)r(a[l]);var c=f;t()}([]);
+//# sourceMappingURL=runtime~adslot-a45e9d5711d983de8fda.js.map</script>
+ <script async src="/vi-assets/static-assets/adslot-88dc25fbfb7328ff1466.js"></script>
+ <script>!function(e){function r(r){for(var o,n,c=r[0],i=r[1],s=r[2],f=0,l=[];f<c.length;f++)n=c[f],d[n]&&l.push(d[n][0]),d[n]=0;for(o in i)Object.prototype.hasOwnProperty.call(i,o)&&(e[o]=i[o]);for(b&&b(r);l.length;)l.shift()();return a.push.apply(a,s||[]),t()}function t(){for(var e,r=0;r<a.length;r++){for(var t=a[r],o=!0,c=1;c<t.length;c++){var i=t[c];0!==d[i]&&(o=!1)}o&&(a.splice(r--,1),e=n(n.s=t[0]))}return e}var o={},d={39:0},a=[];function n(r){if(o[r])return o[r].exports;var t=o[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,n),t.l=!0,t.exports}n.e=function(e){var r=[],t=d[e];if(0!==t)if(t)r.push(t[2]);else{var o=new Promise(function(r,o){t=d[e]=[r,o]});r.push(t[2]=o);var a,c=document.createElement("script");c.charset="utf-8",c.timeout=120,n.nc&&c.setAttribute("nonce",n.nc),c.src=function(e){return n.p+""+({1:"answerpage~bestsellers~collections~hubpage~reviews~search~slideshow~timeswire~weddings",2:"vendors~audio~home~paidpost~story~trending~video",3:"bestsellers~byline~collections~reviews~trending",4:"vendors~answerpage~audio~slideshow~story",5:"vendors~audio~home~paidpost~story",6:"byline~timeswire~your-list",7:"answerpage~getstarted",8:"bestsellers~hubpage",9:"newsletter~regilite",10:"vendors~paidpost~video",11:"vendors~video~videoblock",13:"answerpage",14:"audio",15:"audioblock",16:"bestsellers",17:"blank",18:"byline",19:"coderedeem",20:"collections",21:"comments",22:"episodefooter",23:"getstarted",24:"home",25:"hubpage",28:"newsletter",29:"newsletters",30:"paidpost",31:"privacy",32:"programmables",33:"recirculation",34:"refer",35:"regilite",36:"reviews",40:"search",41:"slideshow",42:"stickyfilljs",43:"story",44:"timeswire",45:"trending",46:"vendors~audioblock",47:"vendors~collections",48:"vendors~episodefooter",49:"vendors~home",50:"vendors~slideshow",51:"video",52:"videoblock",53:"weddings",54:"your-list"}[e]||e)+"-"+{1:"3f4fa7221ef1476092a3",2:"99859b76d5b5d9a29339",3:"6f48de596aff21cee9e2",4:"4a8420b672b0eb786710",5:"ebc6aacf5f0b0f00d939",6:"cb31ca27d295accb8d47",7:"80921fe67fb06673afe2",8:"2cb427a40932c00d5467",9:"c17835f4020a81b3ebdf",10:"e6333c5f0c9d44a562b9",11:"340b908d6bbf26111cf8",13:"8c464e3538096d914776",14:"926f804d67e8a45a9f10",15:"287cb8154113b7f25784",16:"f4baccd76f2f8e8d9db8",17:"2102d3a3d664a932bad1",18:"7e235f2b3d6d19b68ded",19:"dd19d8e9f879d86abb75",20:"74e3e7b1d52b7fc14653",21:"bfae7d48bcf7e6c8ab89",22:"d32caaca6c5936978d4a",23:"300b3f609b3056db6c18",24:"e7c1959c1d8ba140707f",25:"c0e7bb29b120c3c2d802",28:"3ae59c9859d057a0249a",29:"e951dbf493cdf3558858",30:"c108afd87ed307bd7c43",31:"493cddaf9cad7abf670c",32:"3c3cfd695943ed02249d",33:"dc560ec354d5e74e6e39",34:"3202500fd0bc711d8680",35:"67182278afc38ad823b1",36:"f189bd767bbe13f59254",40:"33f98b7462fec3740a1d",41:"1d22c2cff98639b0c7b7",42:"8640087ba86873ebebae",43:"5230dd3423d03f5eb0b8",44:"2db55c4529c54890b4bd",45:"4614204aab86dd2d820f",46:"8574ab7f8faa5e4151d8",47:"07007634cf48d865ae1a",48:"1e063f58b4e3da82fc25",49:"6e63337189383a709584",50:"ab09592f64b71ce13dba",51:"35bd41b25aecc8dbc38b",52:"e71ac27943b9c0dc2f1c",53:"65894e06a558684c455b",54:"cf5b2e08b6f7a84842e2"}[e]+".js"}(e),a=function(r){c.onerror=c.onload=null,clearTimeout(i);var t=d[e];if(0!==t){if(t){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src,n=new Error("Loading chunk "+e+" failed.\n("+o+": "+a+")");n.type=o,n.request=a,t[1](n)}d[e]=void 0}};var i=setTimeout(function(){a({type:"timeout",target:c})},12e4);c.onerror=c.onload=a,document.head.appendChild(c)}return Promise.all(r)},n.m=e,n.c=o,n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,r){if(1&r&&(e=n(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(n.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)n.d(t,o,function(r){return e[r]}.bind(null,o));return t},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},n.p="/vi-assets/static-assets/",n.oe=function(e){throw console.error(e),e};var c=window.webpackJsonp=window.webpackJsonp||[],i=c.push.bind(c);c.push=r,c=c.slice();for(var s=0;s<c.length;s++)r(c[s]);var b=i;t()}([]);
+//# sourceMappingURL=runtime~main-262212ad851d651999bf.js.map</script>
+ <script defer src="/vi-assets/static-assets/vendor-3389f9c978bdc7cb443c.js"></script>
+ <script defer src="/vi-assets/static-assets/story-5230dd3423d03f5eb0b8.js"></script>
+ <script defer src="/vi-assets/static-assets/main-72d661c291004bc90d1b.js"></script>
+ <script>
+(function(w, l) {
+ w[l] = w[l] || [];
+ w[l].push({
+ 'gtm.start': new Date().getTime(),
+ event: 'gtm.js'
+ });
+})(window, 'dataLayer');
+(function(){
+ var url = 'https://et.nytimes.com/pixel' +
+ '?url=' + window.location.href +
+ '&referrer=' + document.referrer +
+ '&subject=module-interactions' +
+ '&moduleData=%7B%22module%22%3A%22nyt-vi-page-pixel%22%2C%22pgType%22%3A%22%22%2C%22eventName%22%3A%22Impression%22%2C%22action%22%3A%22Impression%22%7D' +
+ '&sourceApp=nyt-vi&instant=1' +
+ '&_=' + Date.now();
+ var img = document.createElement('img');
+ img.src = url;
+ img.alt = "";
+ img.style.cssText = 'position: absolute; z-index: -999999; left: -1000px; top: -1000px;';
+ document.body.appendChild(img);
+})();
+</script>
+ <script defer src="https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x"></script>
+<noscript>
+<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x" height="0" width="0" style="display:none;visibility:hidden"></iframe>
+</noscript>
+ <div id="RavenInstaller">
+<script>
+if (window.INSTALL_RAVEN) {
+ window.addEventListener('load', function(event) {
+ var includeRaven = document.getElementById("RavenInstaller");
+ var script = document.createElement("script");
+ script.src = "/vi-assets/static-assets/raven.min-830a6d04a55c283934dd1893d6ddc66d.js";
+ script.onload = function() {
+ /* eslint-disable */
+// Install Raven
+window.Raven.config('https://7bc8bccf5c254286a99b11c68f6bf4ce@sentry.io/178860', {
+ release: vi.env.RELEASE,
+ environment: vi.env.ENVIRONMENT,
+ ignoreErrors: [/SecurityError: Blocked a frame with origin.*/]
+}).install(); // Stop using our error handler
+
+window.nyt_errors.ravenInstalled = true;
+var regex = /nyt-a=(.*?)(;|$)/;
+var id = regex.exec(document.cookie);
+
+if (id !== null) {
+ id = id[1];
+} else {
+ id = '';
+} // Setting nyt-a as user context
+
+
+window.Raven.setUserContext({
+ id: id
+}); // Pass collected errors to Raven
+
+window.nyt_errors.list.forEach(function (err) {
+ // weird?
+ if (!err) {
+ return;
+ } // also weird ... ?
+
+
+ if (!err.err) {
+ // maybe err itself is an Error?
+ if (err instanceof Error) {
+ window.Raven.captureException(err, err.data || {});
+ } // else { silently ignore? }
+
+ } // just making sure ...
+
+
+ if (err.err instanceof Error) {
+ window.Raven.captureException(err.err, err.data || {});
+ } // else { silently ignore? }
+
+}); // Pass collected Tags to Raven
+
+window.nyt_errors.tags.forEach(function (tag) {
+ window.Raven.setTagsContext(tag);
+});
+ };
+ includeRaven.appendChild(script);
+ });
+}
+</script>
+</div>
+
+
+ </body>
+</html>
diff --git a/test/fixtures/nypd-facial-recognition-children-teenagers3.html b/test/fixtures/nypd-facial-recognition-children-teenagers3.html
new file mode 100644
index 000000000..53454d23e
--- /dev/null
+++ b/test/fixtures/nypd-facial-recognition-children-teenagers3.html
@@ -0,0 +1,227 @@
+<!DOCTYPE html>
+<html lang="en" itemId="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html" itemType="http://schema.org/NewsArticle" itemScope="" class="story" xmlns:og="http://opengraphprotocol.org/schema/">
+ <head>
+ <title data-rh="true">She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database. - The New York Times</title>
+ <meta data-rh="true" itemprop="inLanguage" content="en-US"/><meta data-rh="true" property="article:published" itemprop="datePublished dateCreated" content="2019-08-01T17:15:31.000Z"/><meta data-rh="true" property="article:modified" itemprop="dateModified" content="2019-08-02T09:30:23.000Z"/><meta data-rh="true" http-equiv="Content-Language" content="en"/><meta data-rh="true" name="robots" content="noarchive"/><meta data-rh="true" name="articleid" itemprop="identifier" content="100000006583622"/><meta data-rh="true" name="nyt_uri" itemprop="identifier" content="nyt://article/9da58246-2495-505f-9abd-b5fda8e67b56"/><meta data-rh="true" name="pubp_event_id" itemprop="identifier" content="pubp://event/47a657bafa8a476bb36832f90ee5ac6e"/><meta data-rh="true" name="description" itemprop="description" content="With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers."/><meta data-rh="true" name="image" itemprop="image" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-facebookJumbo.jpg"/><meta data-rh="true" name="byl" content="By Joseph Goldstein and Ali Watkins"/><meta data-rh="true" name="thumbnail" itemprop="thumbnailUrl" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-thumbStandard.jpg"/><meta data-rh="true" name="news_keywords" content="NYPD,Juvenile delinquency,Facial Recognition,Privacy,Government Surveillance,Police,Civil Rights,NYC"/><meta data-rh="true" name="pdate" content="20190801"/><meta data-rh="true" property="og:url" content="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="og:title" content="She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database."/><meta data-rh="true" property="og:image" content="https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-facebookJumbo.jpg"/><meta data-rh="true" property="og:description" content="With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers."/><meta data-rh="true" property="article:section" itemprop="articleSection" content="New York"/><meta data-rh="true" property="article:tag" content="Police Department (NYC)"/><meta data-rh="true" property="article:tag" content="Juvenile Delinquency"/><meta data-rh="true" property="article:tag" content="Facial Recognition Software"/><meta data-rh="true" property="article:tag" content="Privacy"/><meta data-rh="true" property="article:tag" content="Surveillance of Citizens by Government"/><meta data-rh="true" property="article:tag" content="Police"/><meta data-rh="true" property="article:tag" content="Civil Rights and Liberties"/><meta data-rh="true" property="article:tag" content="New York City"/><meta data-rh="true" name="CG" content="nyregion"/><meta data-rh="true" name="SCG" content=""/><meta data-rh="true" name="CN" content="experience-tech-and-society"/><meta data-rh="true" name="CT" content="spotlight"/><meta data-rh="true" name="PT" content="article"/><meta data-rh="true" name="PST" content="News"/><meta data-rh="true" name="url" itemprop="url" content="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" name="msapplication-starturl" content="https://www.nytimes.com"/><meta data-rh="true" property="al:android:url" content="nytimes://reader/id/100000006583622"/><meta data-rh="true" property="al:android:package" content="com.nytimes.android"/><meta data-rh="true" property="al:android:app_name" content="NYTimes"/><meta data-rh="true" name="twitter:app:name:googleplay" content="NYTimes"/><meta data-rh="true" name="twitter:app:id:googleplay" content="com.nytimes.android"/><meta data-rh="true" name="twitter:app:url:googleplay" content="nytimes://reader/id/100000006583622"/><meta data-rh="true" property="al:iphone:url" content="nytimes://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="al:iphone:app_store_id" content="284862083"/><meta data-rh="true" property="al:iphone:app_name" content="NYTimes"/><meta data-rh="true" property="al:ipad:url" content="nytimes://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><meta data-rh="true" property="al:ipad:app_store_id" content="357066198"/><meta data-rh="true" property="al:ipad:app_name" content="NYTimes"/>
+ <meta charset="utf-8" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
+<meta property="fb:app_id" content="9869919170" />
+<meta name="twitter:site" value="@nytimes" />
+
+
+ <script type="text/javascript">
+ // 20.585kB
+ window.viHeadScriptSize = 20.585;
+ (function () { var _f=function(e){window.vi=window.vi||{},window.vi.env=Object.freeze(e)};;_f.apply(null, [{"JKIDD_PATH":"https://a.nytimes.com/svc/nyt/data-layer","ET2_URL":"https://a.et.nytimes.com","WEDDINGS_PATH":"https://content.api.nytimes.com","GDPR_PATH":"https://us-central1-nyt-wfvi-prd.cloudfunctions.net/gdpr-email-form","RECAPTCHA_SITEKEY":"6LevSGcUAAAAAF-7fVZF05VTRiXvBDAY4vBSPaTF","ABRA_ET_URL":"//et.nytimes.com","NODE_ENV":"production","SENTRY_SAMPLE_RATE":"10","EXPERIMENTAL_ROUTE_PREFIX":"","ENVIRONMENT":"prd","RELEASE":"034494769d779a637c178f47c2096df69b7c07a4","AUTH_HOST":"https://myaccount.nytimes.com","SWG_PUBLICATION_ID":"nytimes.com","GQL_FETCH_TIMEOUT":"4000"}]); })();;
+ !function(){if('PerformanceLongTaskTiming' in window){var g=window.__tti={e:[]};
+ g.o=new PerformanceObserver(function(l){g.e=g.e.concat(l.getEntries())});
+ g.o.observe({entryTypes:['longtask']})}}();
+;
+ !function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);
+;try {
+ var observer = new window.PerformanceObserver(function (list) {
+ var entries = list.getEntries();
+
+ for (var i = 0; i < entries.length; i += 1) {
+ var entry = entries[i];
+ var performance = {};
+
+ performance[entry.name] = Math.round(entry.startTime + entry.duration);
+ (window.dataLayer = window.dataLayer || []).push({
+ event: "performance",
+ pageview: {
+ performance: performance
+ }
+ });
+ }
+ });
+ observer.observe({
+ entryTypes: ["paint"]
+ });
+} catch (e) {};
+!function(i,e){var a,s,c,p,u,g=[],
+l="object"==typeof i.navigator&&"string"==typeof i.navigator.userAgent&&/iP(ad|hone|od)/.test(
+i.navigator.userAgent),f="object"==typeof i.navigator&&i.navigator.sendBeacon,
+y=f?l?"xhr_ios":"beacon":"xhr";function d(){var e,t,n=i.crypto||i.msCrypto;if(n)t=n.getRandomValues(
+new Uint8Array(18));else for(t=[];t.length<18;)t.push(256*Math.random()^255&(e=e||+new Date)),
+e=Math.floor(e/256);return btoa(String.fromCharCode.apply(String,t)).replace(/\+/g,"-").replace(
+/\//g,"_")}if(i.nyt_et)try{console.warn("et2 snippet should only load once per page")}catch(e
+){}else i.nyt_et=function(){var e,t,n,o=arguments;function r(r){g.length&&(function(e,t,n){if(
+"beacon"===y||f&&r)return i.navigator.sendBeacon(e,t)
+;var o="undefined"!=typeof XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP")
+;o.open("POST",e),o.withCredentials=!0,o.setRequestHeader("Accept","*/*"),
+"string"==typeof t?o.setRequestHeader("Content-Type","text/plain;charset=UTF-8"
+):"[object Blob]"==={}.toString.call(t)&&t.type&&o.setRequestHeader("Content-Type",t.type);try{
+o.send(t)}catch(e){}}(a+"/track",JSON.stringify(g)),g.length=0,clearTimeout(u),u=null)}if(
+"string"==typeof o[0]&&/init/.test(o[0])&&(c=d(),"init"==o[0]&&!s)){if(s=d(),
+"string"!=typeof o[1]||!/^http/.test(o[1]))throw new Error("init must include an et host url")
+;a=String(o[1]).replace(/\/$/,""),"string"==typeof o[2]&&(p=o[2])}n="page_exit"==(e=o[o.length-1]
+).subject||"ob_click"==(e.eventData||{}).type,a&&"object"==typeof e&&(t="page"==e.subject?c:d(),
+e.sourceApp&&(p=e.sourceApp),e.sourceApp=p,g.push({context_id:s,pageview_id:c,event_id:t,
+client_lib:"v1.0.5",sourceApp:p,how:n&&l&&f?"beacon_ios":y,client_ts:+new Date,data:JSON.parse(
+JSON.stringify(e))}),"send"==o[0]||t==c||n?r(n):u||(u=setTimeout(r,5500)))},
+i.nyt_et.get_pageview_id=function(){return c}}(window);
+;
+var NYTD=NYTD||{};NYTD.Abra=function(t){"use strict";function e(t){var e=r[t];return e&&e[1]||null}function n(t,e){if(t){var n,r,o=e[0],i=e[1],c=0,u=0;if(1!==i.length||4294967296!==i[0])for(n=a(t+" "+o)>>>0,c=0,u=0;r=i[c++];)if(n<(u+=r[0]))return r}}function a(t){for(var e,n,a,r,o,i,c,u=0,h=0,l=[],s=[e=1732584193,n=4023233417,~e,~n,3285377520],f=[],p=t.length;h<=p;)f[h>>2]|=(h<p?t.charCodeAt(h):128)<<8*(3-h++%4);for(f[c=p+8>>2|15]=p<<3;u<=c;u+=16){for(e=s,h=0;h<80;e=[0|[(i=((t=e[0])<<5|t>>>27)+e[4]+(l[h]=h<16?~~f[u+h]:i<<1|i>>>31)+1518500249)+((n=e[1])&(a=e[2])|~n&(r=e[3])),o=i+(n^a^r)+341275144,i+(n&a|n&r|a&r)+882459459,o+1535694389][0|h++/20],t,n<<30|n>>>2,a,r])i=l[h-3]^l[h-8]^l[h-14]^l[h-16];for(h=5;h;)s[--h]=s[h]+e[h]|0}return s[0]}var r,o={};return t.dataLayer=t.dataLayer||[],e.init=function(e){var a,o,i,c,u,h,l,s,f,p,d=[],v=[],m=(t.document.cookie.match(/(?:^|;) *nyt-a=([^;]*)/)||[])[1],b=(t.document.cookie.match(/(?:^|;) *ab7=([^;]*)/)||[])[1],g=(t.location.search.match(/(?:^\?|&)abra=([^&]*)/)||[])[1];if(r)throw new Error("can't init twice");for(r={},u=(decodeURIComponent(b||"")+"&"+decodeURIComponent(g||"")).split("&"),a=u.length-1;a>=0;a--)h=u[a].split("="),h.length<2||(l=h[0])&&!r[l]&&(s=h[1]||null,r[l]=[,s,1],s&&d.push(l+"="+s),v.push({test:l,variant:s||"0"}));for(a=0;a<e.length;a++)i=e[a],(o=i[0])in r||(c=n(m,i)||[],c[0],f=c[1],p=!!c[2],r[o]=c,f&&d.push(o.replace(/[^\w-]/g)+"="+(""+f).replace(/[^\w-]/g)),p&&v.push({test:o,variant:f||"0"}));d.length&&t.document.documentElement.setAttribute("data-nyt-ab",d.join(" ")),v.length&&t.dataLayer.push({event:"ab-alloc",abtest:{batch:v}})},e.reportExposure=function(e,n){if(!o[e]){o[e]=1;var a=r[e];if(a){var i=a[1];a[2]&&t.dataLayer.push({event:"ab-expose",abtest:{test:e,variant:i||"0"}})}n&&t.setTimeout(function(){n(null)},0)}},e}(this);
+;(function () { var NYTD=window.NYTD||{};function setupTimeZone(){var e='[data-timezone][data-timezone~="'+(new Date).getHours()+'"] { display: block }',t=document.createElement("style");t.innerHTML=e,document.head.appendChild(t)}function addNYTAppClass(){var e=window.navigator.userAgent||window.navigator.vendor||window.opera,t=-1!==e.indexOf("nyt_android"),n=-1!==e.indexOf("nytios");(t||n)&&document.documentElement.classList.add("NYTApp")}function setupPageViewId(){NYTD.PageViewId={},NYTD.PageViewId.update=function(){return"undefined"!=typeof nyt_et&&"function"==typeof window.nyt_et.get_pageview_id?(window.nyt_et("pageinit"),NYTD.PageViewId.current=window.nyt_et.get_pageview_id()):NYTD.PageViewId.current="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}),NYTD.PageViewId.current}}var _f=function(e){try{document.domain="nytimes.com"}catch(e){}window.swgUserInfoXhrObject=new XMLHttpRequest,window.__emotion=e.emotionIds,setupPageViewId(),setupTimeZone(),addNYTAppClass(),window.nyt_et("init",vi.env.ET2_URL,"nyt-vi",{subject:"page",canonicalUrl:(document.querySelector("link[rel=canonical]")||{}).href,articleId:(document.querySelector("meta[name=articleid]")||{}).content,nyt_uri:(document.querySelector("meta[name=nyt_uri]")||{}).content,pubpEventId:(document.querySelector("meta[name=pubp_event_id]")||{}).content,url:location.href,referrer:document.referrer||void 0,client_tz_offset:(new Date).getTimezoneOffset()}),"undefined"!=typeof nyt_et&&"function"==typeof window.nyt_et.get_pageview_id?NYTD.PageViewId.current=window.nyt_et.get_pageview_id():NYTD.PageViewId.update(),NYTD.Abra.init(e.abraConfig,vi.env.ABRA_ET_URL)};;_f.apply(null, [{"emotionIds":["0","1dv1kvn","v89234","nuvmzp","1gz70xg","9e9ivx","2bwtzy","1hyfx7x","6n7j50","1kj7lfb","10m9xeu","vz7hjd","1fe7a5q","1rn5q1r","10488qs","1iruc8t","1ropbjl","uw59u","jxzr5i","oylsik","1otr2jl","1c8n994","qtw155","v0l3hm","g4gku8","1rr4qq7","6xhk3s","rxqrcl","tj0ten","ist4u3","1gprdgz","10t7hia","mzqdl","kwpx34","1k2cjfc","1vhk1ks","6td9kr","r5ic95","15uy5yv","1p8nkc0","5j8bii","1am0aiv","1g7m0tk","d8bdto","y8aj3r","60hakz","i29ckm","acwcvw","1baulvz","f8wsfj","mhvv8m","m6999o","i9gxme","1m9j9gf","1sy8kpn","19vbshk","l9onyx","79elbk","1q1yk17","g7rb99","k008qs","bsn42l","11cwn6f","ghw4n2","1c5cfvc","htgkrt","e64et","9zaqp9","16fq4rz","1kjk1j2","88g286","12yx39b","4hu8jm","1wqz2f4","yl3z84","1q3gjvc","nc39ev","amd09y","ru1vxe","ajnadh","1ri25x2","12fr9lp","1hfdzay","4g4cvq","m6xlts","1ahhg7f","fwqvlz","17xtcya","x15j1o","1705lsu","1iwv8en","b7n1on","1b9egsl","1rj8to8","4w91ra","wg1cha","1ubp8k9","1egl8em","vdv0al","1i2y565","o6xoe7","1fanzo5","53u6y8","1m50asq","z3e15g","uwwqev","1ly73wi","7y3qfv","l72opv","4skfbu","1fcn4th","13zu7ev","f7l8cz","16ogagc","17ai7jg","8i9d0s","1nwzsjy","10698na","nhjhh0","1nuro5j","1w5cs23","4brsb6","uhuo44","exrw3m","1a48zt4","1xdhyk6","vuqh7u","1l44abu","jcw7oy","10raysz","ar1l6a","1ede5it","mn5hq9","1qmnftd","1ho5u4o","13o0c9t","1yo489b","ulr03x","1bymuyk","1waixk9","1f7ibof","l2ztic","19lv58h","mgtjo2","1wr3we4","y3sf94","1bnxwmn","1i8g3m4","3qijnq","uqyvli","1uqjmks","1bvtpon","1vxca1d","1vkm6nb","1ox9jel","1riqqik","2fg4z9","11n4cex","1ifw933","1rjmmt7","rqb9bm","19hdyf3","15g2oxy","2b3w4o","14b9hti","1j8dw05","1vm5oi9","32rbo2","llk6mt","1s4ffep","pdw9fk","1txwxcy","1soubk3"],"abraConfig":[["vi-ads-et",[[257698038,"2_remainder",1],[4037269258,null,0]]],["messaging-optimizely",[[4294967296,"1",0]]],["dfp_adslot4v2",[[4294967296,"1_external",1]]],["DFP_als",[[4294967296,"1_als",1]]],["DFP_als_home",[[214748365,"1_als",1],[214748365,"1_als",1],[429496730,"1_als",1],[429496729,"1_als",1],[858993459,"1_als",1],[1073741824,"1_als",1],[1073741824,null,0]]],["medianet_toggle",[[4294967296,"0_default",0]]],["amazon_toggle",[[4294967296,null,0]]],["index_toggle",[[4294967296,"1_block",0]]],["dfp_home_toggle",[[4294967296,null,0]]],["dfp_story_toggle",[[4294967296,null,0]]],["dfp_interactive_toggle",[[4294967296,null,0]]],["FREEX_Best_In_Show",[[2147483648,"0_Control",1],[2147483648,"1_Best",1]]],["MKT_dfp_ocean_language",[[2147483648,"0_control",1],[2147483648,"1_language",1]]],["MC_magnolia_0519",[[4294967296,"1_magnolia",1]]],["STORY_topical_recirc",[[2147483648,"0_control",1],[2147483648,"1_variant",1]]],["HOME_timesExclusive",[[2147483648,"0_control",1],[2147483648,"1_variant",1]]],["ON_daily_digest_NL_0719",[[644245095,"0_control",1],[644245094,"1_daily_digest",1],[3006477107,null,0]]],["HOME_discovery_automation",[[2147483648,"0_control",1],[2147483648,"1_automation",1]]],["MKT_GateDockMsgTap",[[1431655766,"0_control",1],[1431655765,"2_BAUDockTapGate",1],[1431655765,"4_BAUDockRBGate",1]]],["FREEX_RegiWall_Messaging",[[214748365,"0_Control",1],[214748365,"1_Continue_Reading",1],[214748365,"2_For_Free",1],[214748365,"3_Keep_Reading",1],[214748364,"4_Continue_Reading_NoHeader",1],[214748365,"5_For_Free_NoHeader",1],[214748365,"6_Keep_Reading_NoHeader",1],[858993459,"0_Control",1],[858993459,"6_Keep_Reading_NoHeader",1],[1073741824,null,0]]],["MC_briefing_bar_anon_test_0519",[[1431655766,"0_control",1],[1431655765,"1_subscribe",1],[1431655765,"2_regi",1]]],["MC_briefing_bar_regi_test_0519",[[2147483648,"0_control",1],[2147483648,"1_subscribe",1]]],["SEARCH_FACET_DROPDOWN",[[2147483648,"0_FACET_MULTI_SELECT",1],[2147483648,"1_DYNAMIC_FACET_SELECT",1]]],["VG_gift_upsell_x_only",[[429496730,"0_control",1],[3865470566,"1_upsell",1]]],["ON_allocator_0719",[[356482286,"ON_login_interrupt_0819-0_control",0],[356482286,"ON_login_interrupt_0819-1_app_experience",0],[356482285,"ON_login_interrupt_0819-2_login_value",0],[356482286,"ON_login_interrupt_0819-3_login_return",0],[356482285,"ON_app_dl_getstarted_0819-0_control",0],[356482286,"ON_app_dl_getstarted_0819-1_appExperience",0],[356482285,"ON_app_dl_getstarted_0819-2_bestApp",0],[356482286,"ON_app_dl_getstarted_0819-3_magicLink",0],[236223201,"ON_app_dl_mc4-6_0819-0_control",0],[236223202,"ON_app_dl_mc4-6_0819-1_dockTrunc",0],[236223201,"ON_app_dl_mc4-6_0819-2_newDock",0],[236223201,"ON_app_dl_mc4-6_0819-3_stdNew",0],[236223201,"ON_app_dl_mc4-6_0819-4_stdDockTrunc",0],[236223202,"ON_app_dl_mc4-6_0819-5_truncator",0],[25769803,null,0]]],["MKT_dfp_ocean_bundle_light",[[1431655766,"0_control",1],[1431655765,"1_design",1],[1431655765,"2_design_light",1]]],["MKT_dfp_ocean_bundle_family",[[1431655766,"0_control",1],[1431655765,"1_design",1],[1431655765,"2_family",1]]],["HL_sample",[[2147483648,"0",1],[2147483648,"1",1]]],["HL_100000006614214",[[2147483648,"0",1],[2147483648,"1",1]]],["HL_100000006641840",[[2147483648,"0",1],[2147483648,"1",1]]]]}]); })();;(function () { var _f=function(e){var r=function(){var r=e.url;try{r+=window.location.search.slice(1).split("&").reduce(function(e,r){return"ip-override"===r.split("=")[0]?"?"+r:e},"")}catch(e){console.warn(e)}var n=new XMLHttpRequest;for(var t in n.withCredentials=!0,n.open("POST",r,!0),n.setRequestHeader("Content-Type","application/json"),e.headers)n.setRequestHeader(t,e.headers[t]);return n.send(e.body),n};window.userXhrObject=r(),window.userXhrRefresh=function(){return window.userXhrObject=r(),window.userXhrObject}};;_f.apply(null, [{"url":"https://samizdat-graphql.nytimes.com/graphql/v2","body":"{\"operationName\":\"UserQuery\",\"variables\":{},\"query\":\" query UserQuery { user { __typename profile { displayName } userInfo { regiId entitlements demographics { emailSubscriptions wat bundleSubscriptions { bundle inGrace promotion source } } } subscriptionDetails { graceStartDate graceEndDate isFreeTrial hasQueuedSub startDate endDate status entitlements } } } \"}","headers":{"nyt-app-type":"project-vi","nyt-app-version":"0.0.5","nyt-token":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs+/oUCTBmD/cLdmcecrnBMHiU/pxQCn2DDyaPKUOXxi4p0uUSZQzsuq1pJ1m5z1i0YGPd1U1OeGHAChWtqoxC7bFMCXcwnE1oyui9G1uobgpm1GdhtwkR7ta7akVTcsF8zxiXx7DNXIPd2nIJFH83rmkZueKrC4JVaNzjvD+Z03piLn5bHWU6+w+rA+kyJtGgZNTXKyPh6EC6o5N+rknNMG5+CdTq35p8f99WjFawSvYgP9V64kgckbTbtdJ6YhVP58TnuYgr12urtwnIqWP9KSJ1e5vmgf3tunMqWNm6+AnsqNj8mCLdCuc5cEB74CwUeQcP2HQQmbCddBy2y0mEwIDAQAB"}}]); })();;100*Math.random()<=vi.env.SENTRY_SAMPLE_RATE?(window.INSTALL_RAVEN=!0,window.nyt_errors={ravenInstalled:!1,list:[],tags:[]},window.onerror=function(n,r,o,w,i){if(!window.nyt_errors.ravenInstalled){var t={err:i,data:{}};window.nyt_errors.list.push(t)}}):window.INSTALL_RAVEN=!1;;(function () { var _f=function(t,e,n){var a=window,A=document,o=function(t){var e=A.createElement("style");e.appendChild(A.createTextNode(t)),A.querySelector("head").appendChild(e)},r=function(t,e,n,a,A){var r=new XMLHttpRequest;r.open("GET",t,!0),r.onreadystatechange=function(){if(4===r.readyState&&200===r.status){o(r.responseText);try{localStorage.setItem("nyt-fontFormat",e),localStorage.setItem(a,n)}catch(t){return}localStorage.setItem(A,r.responseText)}return!0},r.send(null)},c=function(e,n){var A;try{A=localStorage.getItem("nyt-fontFormat")}catch(t){}A||(A=function(){if(!("FontFace"in a))return!1;var t=new FontFace("t",'url("data:application/font-woff2;base64,d09GMgABAAAAAADcAAoAAAAAAggAAACWAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABk4ALAoUNAE2AiQDCAsGAAQgBSAHIBtvAcieB3aD8wURQ+TZazbRE9HvF5vde4KCYGhiCgq/NKPF0i6UIsZynbP+Xi9Ng+XLbNlmNz/xIBBqq61FIQRJhC/+QA/08PJQJ3sK5TZFMlWzC/iK5GUN40psgqvxwBjBOg6JUSJ7ewyKE2AAaXZrfUB4v+hze37ugJ9d+DeYqiDwVgCawviwVFGnuttkLqIMGivmDg") format("woff2")',{});return t.load().catch(function(){}),"loading"==t.status||"loaded"==t.status}()?"woff2":"woff");for(var c=0;c<e.length;c++){var i=e[c],l="shared"!==i?"-"+i:"",d="nyt-fontHash"+l,s="nyt-fontFace"+l,f=t[i][A],u=localStorage.getItem(d),g=localStorage.getItem(s);if(u===f.hash&&g)o(g);else{var h=function(t,e,n,a,A){return function(){r(t,e,n,a,A)}}(f.url,A,f.hash,d,s);n?h():document.addEventListener("DOMContentLoaded",h)}}};c(e),window.addEventListener("load",function(){c(n,!0)})};;_f.apply(null, [{"shared":{"woff":{"hash":"f2adc73415c5bbb437e993c14559e70e","url":"/vi-assets/static-assets/shared-woff.fonts-f2adc73415c5bbb437e993c14559e70e.css"},"woff2":{"hash":"22b34a6a6fd840943496b658184afdd3","url":"/vi-assets/static-assets/shared-woff2.fonts-22b34a6a6fd840943496b658184afdd3.css"}},"story":{"woff":{"hash":"3c668927c32fbefb440b4024d5da6351","url":"/vi-assets/static-assets/story-woff.fonts-3c668927c32fbefb440b4024d5da6351.css"},"woff2":{"hash":"acec1a902e1795b20a0204af82726cd2","url":"/vi-assets/static-assets/story-woff2.fonts-acec1a902e1795b20a0204af82726cd2.css"}},"opinion":{"woff":{"hash":"dfc5106c9c0aaa76688687e664474b04","url":"/vi-assets/static-assets/opinion-woff.fonts-dfc5106c9c0aaa76688687e664474b04.css"},"woff2":{"hash":"e2b27ff317927dfd77bdd429409627e0","url":"/vi-assets/static-assets/opinion-woff2.fonts-e2b27ff317927dfd77bdd429409627e0.css"}},"tmag":{"woff":{"hash":"4634f3c7ddebb9113b69d4578d9a0ba0","url":"/vi-assets/static-assets/tmag-woff.fonts-4634f3c7ddebb9113b69d4578d9a0ba0.css"},"woff2":{"hash":"8622c93c260fa93b229b7249df708fb1","url":"/vi-assets/static-assets/tmag-woff2.fonts-8622c93c260fa93b229b7249df708fb1.css"}},"mag":{"woff":{"hash":"109e6d301ed49c8078086b5892696adf","url":"/vi-assets/static-assets/mag-woff.fonts-109e6d301ed49c8078086b5892696adf.css"},"woff2":{"hash":"fb42c728dc70cc4ef6010a60cb10b0bd","url":"/vi-assets/static-assets/mag-woff2.fonts-fb42c728dc70cc4ef6010a60cb10b0bd.css"}},"well":{"woff":{"hash":"f0e613b89006e99b4622d88aa5563a81","url":"/vi-assets/static-assets/well-woff.fonts-f0e613b89006e99b4622d88aa5563a81.css"},"woff2":{"hash":"77806b85de524283fe742b916c9d0ee4","url":"/vi-assets/static-assets/well-woff2.fonts-77806b85de524283fe742b916c9d0ee4.css"}}},["shared","story"],["opinion","tmag","mag","well"]]); })();;(function () { function swgDataLayer(e){return!!window.dataLayer&&((window.dataLayer=window.dataLayer||[]).push({event:"impression",module:e}),!0)}function checkSwgOptOut(){if(!window.localStorage)return!1;var e=window.localStorage.getItem("nyt-swgOptOut");if(!e)return!1;var t=parseInt(e,10);return((new Date).getTime()-t)/864e5<1||(window.localStorage.removeItem("nyt-swgOptOut"),!1)}function swgDeferredAccount(e,t){return e.completeDeferredAccountCreation({entitlements:t,consent:!1}).then(function(e){var t=vi.env.AUTH_HOST+"/svc/account/auth/v1/swg-dal-web",n=e.purchaseData.raw.data?e.purchaseData.raw.data:e.purchaseData.raw,o=JSON.parse(n),a={package_name:o.packageName,product_id:o.productId,purchase_token:o.purchaseToken,google_id_token:e.userData.idToken,google_user_email:e.userData.email,google_user_id:e.userData.id,google_user_name:e.userData.name},r=new XMLHttpRequest;r.withCredentials=!0,r.open("POST",t,!0),r.setRequestHeader("Content-Type","application/json"),r.send(JSON.stringify(a)),r.onload=function(){200===r.status?(swgDataLayer({name:"swg",context:"Deferred",label:"Seamless Signin",region:"swg-modal"}),e.complete().then(function(){window.location.reload(!0)})):(e.complete(),window.location=encodeURI(vi.env.AUTH_HOST+"/get-started/swg-link?redirect="+window.location.href))}}).catch(function(){return!!window.localStorage&&(!window.localStorage.getItem("nyt-swgOptOut")&&(window.localStorage.setItem("nyt-swgOptOut",(new Date).getTime()),!0))}),!0}function loginWithGoogle(){return"undefined"!=typeof window&&(-1===document.cookie.indexOf("NYT-S")&&(!0!==checkSwgOptOut()&&(!!window.SWG&&((window.SWG=window.SWG||[]).push(function(e){return e.init(vi.env.SWG_PUBLICATION_ID),e.getEntitlements().then(function(t){if(void 0===t||!t.raw)return!1;var n={entitlements_token:t.raw};return window.swgUserInfoXhrObject.withCredentials=!0,window.swgUserInfoXhrObject.open("POST",vi.env.AUTH_HOST+"/svc/account/auth/v1/login-swg-web",!0),window.swgUserInfoXhrObject.setRequestHeader("Content-Type","application/json"),window.swgUserInfoXhrObject.send(JSON.stringify(n)),window.swgUserInfoXhrObject.onload=function(){switch(window.swgUserInfoXhrObject.status){case 200:return swgDataLayer({name:"swg",context:"Seamless",label:"Seamless Signin",region:"login"}),window.location.reload(!0),!0;case 412:return swgDeferredAccount(e,t);default:return!1}},t}).catch(function(){return!1}),!0}),!0))))}var _f=function(){if(window.swgUserInfoXhrObject.checkSwgResponse=!1,-1===document.cookie.indexOf("NYT-S")){var e=document.createElement("script");e.src="https://news.google.com/swg/js/v1/swg.js",e.setAttribute("subscriptions-control","manual"),e.setAttribute("async",!0),e.onload=function(){loginWithGoogle()},document.getElementsByTagName("head")[0].appendChild(e)}};;_f.apply(null, []); })();
+ </script>
+
+ <link data-rh="true" rel="shortcut icon" href="/vi-assets/static-assets/favicon-4bf96cb6a1093748bf5b3c429accb9b4.ico"/><link data-rh="true" rel="apple-touch-icon" href="/vi-assets/static-assets/apple-touch-icon-319373aaf4524d94d38aa599c56b8655.png"/><link data-rh="true" rel="apple-touch-icon-precomposed" sizes="144×144" href="/vi-assets/static-assets/ios-ipad-144x144-319373aaf4524d94d38aa599c56b8655.png"/><link data-rh="true" rel="apple-touch-icon-precomposed" sizes="114×114" href="/vi-assets/static-assets/ios-iphone-114x144-61d373c43aa8365d3940c5f1135f4597.png"/><link data-rh="true" rel="apple-touch-icon-precomposed" href="/vi-assets/static-assets/ios-default-homescreen-57x57-7cccbfb151c7db793e92ea58c30b9e72.png"/><link data-rh="true" rel="alternate" itemprop="mainEntityOfPage" hrefLang="en-US" href="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><link data-rh="true" rel="canonical" href="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"/><link data-rh="true" rel="alternate" href="android-app://com.nytimes.android/nytimes/reader/id/100000006583622"/><link data-rh="true" rel="amphtml" href="https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.amp.html"/><link data-rh="true" rel="alternate" type="application/json+oembed" href="https://www.nytimes.com/svc/oembed/json/?url=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" title="She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database."/>
+ <script data-rh="true" >
+ if (typeof testCookie === 'undefined') {
+ var testCookie = function (name) {
+ var match = document.cookie.match(new RegExp(name + '=([^;]+)'));
+ if (match) return match[1];
+ }
+ }
+</script><script data-rh="true" >if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+
+ if (testCookie('nyt-gdpr') !== '1') {
+ var gptScript = document.createElement('script');
+ gptScript.async = 'async';
+ gptScript.src = '//securepubads.g.doubleclick.net/tag/js/gpt.js';
+ document.head.appendChild(gptScript);
+ }
+ }</script><script data-rh="true" >if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+
+ var googletag = googletag || {};
+ googletag.cmd = googletag.cmd || [];
+
+ if (testCookie('nyt-gdpr') == '1') {
+ googletag.cmd.push(function() {
+ googletag.pubads().setRequestNonPersonalizedAds(1);
+ });
+ }
+ }</script><script data-rh="true" >if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+ (function () { var _f=function(){var t,e,o=50,n=50;function i(t){if(!document.getElementById("3pCheckIframeId")){if(t||(t=1),!document.body){if(t>o)return;return t+=1,setTimeout(i.bind(null,t),n)}var e,a,r;e="https://static01.nyt.com/ads/tpc-check.html",a=document.body,(r=document.createElement("iframe")).src=e,r.id="3pCheckIframeId",r.style="display:none;",r.height=0,r.width=0,a.insertBefore(r,a.firstChild)}}function a(t){if("https://static01.nyt.com"===t.origin)try{"3PCookieSupported"===t.data&&googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","true")}),"3PCookieNotSupported"===t.data&&googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","false")})}catch(t){}}function r(){if(function(){if(Object.prototype.toString.call(window.HTMLElement).indexOf("Constructor")>0)return!0;if("[object SafariRemoteNotification]"===(!window.safari||safari.pushNotification).toString())return!0;try{return window.localStorage&&/Safari/.test(window.navigator.userAgent)}catch(t){return!1}}()){try{window.openDatabase(null,null,null,null)}catch(e){return t(),!0}try{localStorage.length?e():(localStorage.x=1,localStorage.removeItem("x"),e())}catch(o){navigator.cookieEnabled?t():e()}return!0}}!function(){try{googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","unknown")})}catch(t){}}(),t=function(){try{googletag.cmd.push(function(){googletag.pubads().setTargeting("cookie","private")})}catch(t){}}||function(){},e=function(){window.addEventListener("message",a,!1),i(0)}||function(){},function(){if(window.webkitRequestFileSystem)return window.webkitRequestFileSystem(window.TEMPORARY,1,e,t),!0}()||r()||function(){if(!window.indexedDB&&(window.PointerEvent||window.MSPointerEvent))return t(),!0}()||e()};;_f.apply(null, []); })();
+ }</script><script data-rh="true" >(function() {
+ var AdSlot4=function(){"use strict";function D(n,i,o){var t=document.getElementsByTagName("head")[0],e=document.createElement("script");i&&(e.onload=i),o&&(e.onerror=o),e.src=n,e.async=!0,t.appendChild(e)}return function(){var A=window.AdSlot4||{};A.cmd=A.cmd||[];var b=!1;if(A.loadScripts)return A;function z(t){"art, oak"!==t&&"art,oak"!==t||(t="art"),A.cmd.push(function(){A.events.subscribe({name:"AdDefined",scope:"all",callback:function(n){var o,i=[-1];n.sizes.forEach(function(n){n[0]<window.innerWidth&&n[0]>i[0]&&(i=[]).push(n)}),i[0][1]&&window.apstag.fetchBids({slots:[{slotID:n.id,slotName:"".concat(n.id,"_").concat(t,"_web"),sizes:(o=i[0][1],Array.isArray(o)?[[300,250],[728,90],[970,90],[970,250]].filter(function(i){return o.some(function(n){return n[0]===i[0]&&n[1]===i[1]})}):(console.warn("filterSizes() did not receive an array"),[]))}]},function(){window.googletag.cmd.push(function(){window.apstag.setDisplayBids()})})}})})}return A.loadScripts=function(n){var i,o,t,e,d,a,c,s,r=n||{},w=r.loadMnet,u=void 0===w||w,l=r.loadAmazon,p=void 0===l||l,f=r.loadBait,m=void 0===f||f,v=r.section,g=void 0===v?"none":v,h=r.pageViewId,y=void 0===h?"":h,B=r.pageType,x=void 0===B?"":B;b||("1"===(c="nyt-gdpr",(s=document.cookie.match(new RegExp("".concat(c,"=([^;]+)"))))?s[1]:"")||(d=document.referrer||"",(a=/([a-zA-Z0-9_\-.]+)(@|%40)([a-zA-Z0-9_\-.]+).([a-zA-Z]{2,5})/).test(d)||a.test(window.location.href))||(!u||window.advBidxc&&window.advBidxc.isLoaded||(t=y,e="8CU2553YN",window.innerWidth<740&&(e="8CULO58R6"),D("https://contextual.media.net/bidexchange.js?cid=".concat(e,"&dn=").concat("www.nytimes.com","&https=1"),function(){window.advBidxc&&window.advBidxc.isLoaded||console.warn("Media.net not loading properly")},function(){A.cmd.push(function(){A.events.publish({name:"BidderError",value:{type:"Mnet"}})})}),window.advBidxc=window.advBidxc||{},window.advBidxc.renderAd=function(){},window.advBidxc.startTime=(new Date).getTime(),window.advBidxc.customerId={mediaNetCID:e},window.advBidxc.misc={isGptDisabled:1},t&&(window.advBidxc.misc.keywords=t)),p&&!window.apstag&&(i=g,o=x,function(o,t){function n(n,i){t[o]._Q.push([n,i])}t[o]||(t[o]={init:function(){n("i",arguments)},fetchBids:function(){n("f",arguments)},setDisplayBids:function(){},targetingKeys:function(){return[]},_Q:[]})}("apstag",window),D("//c.amazon-adsystem.com/aax2/apstag.js",function(){window.apstag||console.warn("A9 not loading properly")},function(){A.cmd.push(function(){A.events.publish({name:"BidderError",value:{type:"A9"}})})}),window.apstag.init({pubID:"3030",adServer:"googletag",params:{si_section:i}}),z(o))),m&&D("https://static01.nyt.com/ads/google/adsbygoogle.js",function(){},function(){A.cmd.push(function(){A.events.publish({name:"AdEmpty",value:{type:"AdBlockOn"}})})}),b=!0)},window.AdSlot4=A}()}();
+ AdSlot4.loadScripts({
+ loadMnet: window.NYTD.Abra('medianet_toggle') !== '1_block',
+ loadAmazon: window.NYTD.Abra('amazon_toggle') !== '1_block',
+ section: 'nyregion',
+ pageType: 'art,oak',
+ pageViewId: window.NYTD.PageViewId.current,
+ });
+ (function () { var _f=function(e){var o=performance.navigation&&1===performance.navigation.type;function t(){return window.matchMedia("(max-width: 739px)").matches}function n(e){var n,r,i,d,a,p,u=function(){var e=window.userXhrObject&&""!==window.userXhrObject.responseText&&JSON.parse(window.userXhrObject.responseText).data||null,o=null;return e&&e.user&&e.user.userInfo&&(o=e.user.userInfo.demographics),o}();return u?(r=e,d=(n=u)&&n.emailSubscriptions,(a=n&&n.bundleSubscriptions)&&r&&(r.sub="reg",d&&d.length&&(r.em=d.toString().toLowerCase()),n.wat&&(r.wat=n.wat.toLowerCase()),a&&a.length&&a[0].bundle&&(i=a[0],r.sub=i.bundle.toLowerCase(),i.source&&(r.subsrc=i.source.toLowerCase()),i.promotion&&(r.subprm=i.promotion),i.in_grace&&(r.grace=i.in_grace.toString()))),e=r):e.sub="anon",t()?(e.prop="mnyt",e.plat="mweb",e.ver="mvi"):(e.prop="nyt",e.plat="web",e.ver="vi"),"hp"===e.typ&&(document.referrer&&(e.topref=document.referrer),o&&(e.refresh="manual")),e.abra_dfp=(p=document.documentElement.getAttribute("data-nyt-ab"))?p.split(" ").reduce(function(e,o){var t=o.split("="),n=t[0].toLowerCase(),r=t[1];return(n.indexOf("dfp")>-1||n.indexOf("redbird")>-1)&&e.push(n+"_"+r),e},[]):"",e.page_view_id=window.NYTD.PageViewId&&window.NYTD.PageViewId.current,e}var r=e||{},i=r.adTargeting||{},d=r.adUnitPath||"/29390238/nyt/homepage",a=r.offset||400,p=r.hideTopAd||t(),u=r.lockdownAds||!1,s=r.sizeMapping||{top:[[970,["fluid",[728,90],[970,90],[970,250],[1605,300]]],[728,["fluid",[728,90],[1605,300]]],[0,["fluid",[300,250],[300,420]]]],fp1:[[0,[195,250]]],fp2:[[0,[195,250]]],fp3:[[0,[195,250]]],interstitial:[[0,[[1,1],[640,480]]]],mktg:[[1020,[300,250]],[0,[]]],pencil:[[728,[[336,46]],[0,[]]]],pp_edpick:[[0,["fluid"]]],pp_morein:[[0,["fluid"],[210,218]]],ribbon:[[0,["fluid"]]],sponsor:[[765,[150,50]],[0,[320,25]]],supplemental:[[1020,[[300,250],[300,600]]],[0,[]]],default:[[970,["fluid",[728,90],[970,90],[970,250],[1605,300]]],[728,["fluid",[728,90],[300,250],[1605,300]]],[0,["fluid",[300,250],[300,420]]]]},l=r.dfpToggleName||"dfp_home_toggle";window.AdSlot4=window.AdSlot4||{},window.AdSlot4.cmd=window.AdSlot4.cmd||[],window.AdSlot4.cmd.push(function(){window.AdSlot4.init({adTargeting:n(i),adUnitPath:d,sizeMapping:s,offset:a,haltDFP:"1_block"===window.NYTD.Abra(l),hideTopAd:p,lockdownAds:u}),window.NYTD.Abra.reportExposure("dfp_adslot4v2")})};;_f.apply(null, [{"adTargeting":{"edn":"us","sov":"3","test":"projectvi","ver":"vi","hasVideo":false,"template":"article","als_test":"1565027040168","prop":"nyt","plat":"web","brandsensitive":"false","org":"policedepartmentnyc","geo":"newyorkcity","des":"juveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties","auth":"aliwatkins,josephgoldstein","coll":"newyork,usnews,technology,techandsociety","artlen":"medium","ledemedsz":"none","typ":"art,oak","section":"nyregion","si_section":"nyregion","id":"100000006583622","pt":"nt10,nt15,nt16,nt18,nt3,nt4,nt9","gscat":"neg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education"},"adUnitPath":"/29390238/nyt/nyregion/","dfpToggleName":"dfp_story_toggle"}]); })();
+ })();</script><script data-rh="true" id="als-svc">var alsVariant = window.NYTD.Abra('DFP_als');
+ if (alsVariant != null && alsVariant.match(/(0_control|1_als)/)) {
+ window.NYTD.Abra.reportExposure('DFP_als');
+ }
+ if (window.NYTD.Abra('DFP_als') === '1_als') {
+ (function () { var _f=function(){window.googletag=window.googletag||{},googletag.cmd=googletag.cmd||[];var e=new XMLHttpRequest,t="prd"===window.vi.env.ENVIRONMENT?"als-svc.nytimes.com":"als-svc.dev.nytimes.com",n=document.querySelector('[name="nyt_uri"]'),o=null==n?"":encodeURIComponent(n.content),l=document.querySelector('[name="template"]'),s=document.querySelector('[name="prop"]'),a=document.querySelector('[name="plat"]'),i=null==l||null==l.content?"":l.content,c=null==s||null==s.content?"nyt":s.content,r=null==a||null==a.content?"web":a.content;window.innerWidth<740&&(c="mnyt",r="mweb"),"/"===location.pathname&&(o=encodeURIComponent("https://www.nytimes.com/pages/index.html"));var d=window.localStorage.getItem("als_test_clientside");void 0!==d&&window.googletag.cmd.push(function(){googletag.pubads().setTargeting("als_test_clientside",d)}),e.open("GET","https://"+t+"/als?uri="+o+"&typ="+i+"&prop="+c+"&plat="+r),e.withCredentials=!0,e.send(),e.onreadystatechange=function(){if(4===e.readyState)if(200===e.status){var t=JSON.parse(e.responseText);window.googletag.cmd.push(function(){void 0!==t.als_test_clientside&&(googletag.pubads().setTargeting("als_test_clientside",t.als_test_clientside),window.localStorage.setItem("als_test_clientside","ls-"+t.als_test_clientside)),Object.keys(t).forEach(function(e){"User"===e&&void 0!==t[e]&&window.localStorage.setItem("UTS_User",JSON.stringify(t[e]))})})}else{console.error("Error "+e.responseText);(window.dataLayer=window.dataLayer||[]).push({event:"impression",module:{name:"timing",context:"script-load",label:"alsService-als-error"}})}}};;_f.apply(null, []); })();
+ }
+ </script>
+ <link rel="stylesheet" href="/vi-assets/static-assets/global-42db6c8821fec0e2b3837b2ea2ece8fe.css" />
+ <style>.css-1dv1kvn{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.css-v89234{overflow:hidden;height:100%;}.css-nuvmzp{font-size:14.25px;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;text-transform:uppercase;-webkit-letter-spacing:0.7px;-moz-letter-spacing:0.7px;-ms-letter-spacing:0.7px;letter-spacing:0.7px;line-height:19px;}.css-nuvmzp:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1gz70xg{border-left:1px solid #ccc;color:#326891;height:12px;margin-left:8px;padding-left:8px;}.css-9e9ivx{display:none;font-size:10px;margin-left:auto;text-transform:uppercase;}.hasLinks .css-9e9ivx{display:block;}@media (min-width:740px){.hasLinks .css-9e9ivx{margin:none;position:absolute;right:20px;}}@media (min-width:1024px){.hasLinks .css-9e9ivx{display:none;}}.css-2bwtzy{display:inline-block;padding:6px 4px 4px;margin-bottom:12px;font-size:12px;border-radius:3px;-webkit-transition:background 0.6s ease;transition:background 0.6s ease;}.css-2bwtzy:hover{background-color:#f7f7f7;}.css-1hyfx7x{display:none;}.css-6n7j50{display:inline;}.css-1kj7lfb{display:none;}@media (min-width:1024px){.css-1kj7lfb{display:inline-block;margin-right:7px;}}.css-10m9xeu{display:block;width:16px;height:16px;}.css-vz7hjd{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.css-1fe7a5q{display:inline-block;height:16px;vertical-align:sub;width:16px;}.css-1rn5q1r{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;background:#fff;display:inline-block;left:44px;text-transform:uppercase;-webkit-transition:none;transition:none;}.css-1rn5q1r:active,.css-1rn5q1r:focus{-webkit-clip:auto;clip:auto;overflow:visible;width:auto;height:auto;}.css-1rn5q1r::-moz-focus-inner{padding:0;border:0;}.css-1rn5q1r:-moz-focusring{outline:1px dotted;}.css-1rn5q1r:disabled,.css-1rn5q1r.disabled{opacity:0.5;cursor:default;}.css-1rn5q1r:active,.css-1rn5q1r.active{background-color:#f7f7f7;}@media (min-width:740px){.css-1rn5q1r:hover{background-color:#f7f7f7;}}.css-1rn5q1r:focus{margin-top:3px;padding:8px 8px 6px;}@media (min-width:1024px){.css-1rn5q1r{left:112px;}}.css-10488qs{display:none;}@media (min-width:1024px){.css-10488qs{display:inline-block;position:relative;}}.css-1iruc8t{list-style:none;margin:0;padding:0;}.css-1ropbjl::before{background-color:$white;border-bottom:1px solid #e2e2e2;border-top:2px solid #e2e2e2;content:'';display:block;height:1px;margin-top:0;}@media (min-width:1150px){.css-1ropbjl{margin:0 auto;max-width:1200px;padding:0 3% 9px;}}.NYTApp .css-1ropbjl{display:none;}@media print{.css-1ropbjl{display:none;}}.css-uw59u{padding:0 20px;}@media (min-width:740px){.css-uw59u{padding:0 3%;}}@media (min-width:1150px){.css-uw59u{padding:0;}}.css-jxzr5i{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;}.css-oylsik{display:block;height:44px;vertical-align:middle;width:184px;}.css-1otr2jl{margin:18px 0 0 auto;}.css-1c8n994{color:#6288a5;font-family:nyt-franklin;font-size:11px;font-style:normal;font-weight:400;line-height:11px;-webkit-text-decoration:none;text-decoration:none;}.css-qtw155{display:block;}@media (min-width:1150px){.css-qtw155{display:none;}}.css-v0l3hm{display:none;}@media (min-width:1150px){.css-v0l3hm{display:block;}}.css-g4gku8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:10px;min-width:600px;}.css-1rr4qq7{-webkit-flex:1;-ms-flex:1;flex:1;}.css-6xhk3s{border-left:1px solid #e2e2e2;-webkit-flex:1;-ms-flex:1;flex:1;padding-left:15px;}.css-rxqrcl{color:#333;font-size:13px;font-weight:700;font-family:nyt-franklin;height:25px;line-height:15px;margin:0;text-transform:uppercase;width:150px;}.css-tj0ten{margin-bottom:5px;white-space:nowrap;}.css-tj0ten:last-child{margin-bottom:10px;}.css-ist4u3.desktop{display:none;}@media (min-width:740px){.css-ist4u3.desktop{display:block;}.css-ist4u3.smartphone{display:none;}}.css-1gprdgz{list-style:none;margin:0;padding:0;-webkit-columns:2;columns:2;padding:0 0 15px;}.css-10t7hia{height:34px;line-height:34px;list-style-type:none;}.css-10t7hia.desktop{display:none;}@media (min-width:740px){.css-10t7hia.desktop{display:block;}.css-10t7hia.smartphone{display:none;}}.css-mzqdl{color:#333;display:block;font-family:nyt-franklin;font-size:15px;font-weight:500;height:34px;line-height:34px;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;}.css-kwpx34{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:14px;font-weight:500;height:23px;line-height:16px;}.css-kwpx34:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-kwpx34{color:#fff;}.css-1k2cjfc{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:16px;font-weight:700;height:25px;line-height:15px;padding-bottom:0;}.css-1k2cjfc:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-1k2cjfc{color:#fff;}.css-1vhk1ks{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:11px;font-weight:500;height:23px;line-height:21px;}.css-1vhk1ks:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-1vhk1ks{color:#fff;}.css-6td9kr{list-style:none;margin:0;padding:0;border-top:1px solid #e2e2e2;margin-top:2px;padding-top:10px;}.css-r5ic95{display:inline-block;height:13px;width:13px;margin-right:7px;vertical-align:middle;}.css-15uy5yv{border-top:1px solid #ebebeb;padding-top:9px;}.css-1p8nkc0{color:#999;font-family:nyt-franklin,helvetica,arial,sans-serif;padding:10px 0;-webkit-text-decoration:none;text-decoration:none;white-space:nowrap;}.css-1p8nkc0:hover{-webkit-text-decoration:underline;text-decoration:underline;}@-webkit-keyframes animation-5j8bii{from{opacity:0;}to{opacity:1;}}@keyframes animation-5j8bii{from{opacity:0;}to{opacity:1;}}@-webkit-keyframes animation-1am0aiv{from{visibility:visible;opacity:1;}to{visibility:visible;opacity:0;}}@keyframes animation-1am0aiv{from{visibility:visible;opacity:1;}to{visibility:visible;opacity:0;}}.css-1g7m0tk{color:#326891;}.css-1g7m0tk:visited{color:#326891;}.css-d8bdto{color:#999;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:17px;margin-bottom:5px;}@media print{.css-d8bdto{display:none;}}.css-y8aj3r{padding:0;}.css-60hakz{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-60hakz a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-60hakz:nth-of-type(3),.css-60hakz:nth-of-type(4){display:none;}}.css-60hakz:last-of-type{margin-right:0;}.css-i29ckm{width:calc(100% - 40px);max-width:600px;margin:1.5rem auto 2rem;}@media (min-width:1440px){.css-i29ckm{width:600px;max-width:600px;}}@media (min-width:600px){.css-i29ckm{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}@media (max-width:600px){.css-i29ckm .facebook,.css-i29ckm .twitter,.css-i29ckm .email{display:inline-block;}}.css-acwcvw{margin-bottom:1rem;}.css-1baulvz{display:inline-block;}@-webkit-keyframes animation-f8wsfj{0%{opacity:1;}50%{opacity:0;}100%{opacity:0;}}@keyframes animation-f8wsfj{0%{opacity:1;}50%{opacity:0;}100%{opacity:0;}}@-webkit-keyframes animation-mhvv8m{0%{opacity:0;}50%{opacity:0;}100%{opacity:1;}}@keyframes animation-mhvv8m{0%{opacity:0;}50%{opacity:0;}100%{opacity:1;}}@-webkit-keyframes animation-m6999o{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}}@keyframes animation-m6999o{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}}.css-i9gxme{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}@-webkit-keyframes animation-1m9j9gf{from{background-color:#f7f7f5;}to{background-color:transparent;}}@keyframes animation-1m9j9gf{from{background-color:#f7f7f5;}to{background-color:transparent;}}.css-1sy8kpn{display:none;}@media (min-width:765px){.css-1sy8kpn{background-color:#f7f7f7;border-bottom:1px solid #f3f3f3;display:block;padding-bottom:15px;padding-top:15px;margin:0;min-height:90px;}}@media print{.css-1sy8kpn{display:none;}}.css-19vbshk{color:#ccc;display:none;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.5625rem;font-weight:300;-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;line-height:0.5625rem;margin-left:auto;text-align:center;text-transform:uppercase;}@media (min-width:600px){.css-19vbshk{display:inline-block;}}.css-19vbshk p{margin-bottom:auto;margin-right:7px;margin-top:auto;text-transform:none;}.css-l9onyx{color:#ccc;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.5625rem;font-weight:300;-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;line-height:0.5625rem;margin-bottom:9px;text-align:center;text-transform:uppercase;}.css-79elbk{position:relative;}@-webkit-keyframes animation-1q1yk17{to{width:11px;}}@keyframes animation-1q1yk17{to{width:11px;}}@-webkit-keyframes animation-g7rb99{0%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0);}100%{-webkit-transform:scale(1.05) rotate(-90deg);-ms-transform:scale(1.05) rotate(-90deg);transform:scale(1.05) rotate(-90deg);}}@keyframes animation-g7rb99{0%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0);}100%{-webkit-transform:scale(1.05) rotate(-90deg);-ms-transform:scale(1.05) rotate(-90deg);transform:scale(1.05) rotate(-90deg);}}.css-k008qs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.sizeSmall .css-bsn42l{width:50%;}@media (min-width:600px){.sizeSmall .css-bsn42l{width:300px;}}@media (min-width:1440px){.sizeSmall .css-bsn42l{width:300px;}}@media (max-width:600px){.sizeSmall .css-bsn42l{width:50%;}}.sizeSmall.sizeSmallNoCaption .css-bsn42l{margin-left:auto;margin-right:auto;}@media (min-width:740px){.sizeSmall.layoutVertical .css-bsn42l{max-width:250px;}}@media (min-width:1024px){.sizeSmall.layoutVertical .css-bsn42l{width:250px;}}@media (max-width:740px){.sizeSmall.layoutVertical .css-bsn42l{max-width:250px;}}@media (min-width:740px){.sizeSmall.layoutHorizontal .css-bsn42l{max-width:300px;}}@media (min-width:1024px){.sizeSmall.layoutHorizontal .css-bsn42l{width:300px;}}@media (max-width:740px){.sizeSmall.layoutHorizontal .css-bsn42l{max-width:300px;}}@media (min-width:600px){.sizeMedium.layoutVertical.verticalVideo .css-bsn42l{width:310px;}}.css-11cwn6f{width:100%;vertical-align:top;}.css-11cwn6f img{width:100%;vertical-align:top;}@-webkit-keyframes animation-ghw4n2{0%{opacity:0;-webkit-transform:translateY(100px);-ms-transform:translateY(100px);transform:translateY(100px);}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}}@keyframes animation-ghw4n2{0%{opacity:0;-webkit-transform:translateY(100px);-ms-transform:translateY(100px);transform:translateY(100px);}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);}}@-webkit-keyframes animation-1c5cfvc{0%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}50%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}75%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}}@keyframes animation-1c5cfvc{0%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}50%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}75%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}}@-webkit-keyframes animation-htgkrt{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}50%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}75%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}}@keyframes animation-htgkrt{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}50%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}75%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}}@-webkit-keyframes animation-e64et{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}25%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}75%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}}@keyframes animation-e64et{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}25%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}75%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}}@-webkit-keyframes animation-9zaqp9{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}25%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}75%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}}@keyframes animation-9zaqp9{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}25%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}75%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}}@-webkit-keyframes animation-16fq4rz{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}25%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}50%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}}@keyframes animation-16fq4rz{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}25%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}50%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}}@-webkit-keyframes animation-1kjk1j2{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}25%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}50%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}}@keyframes animation-1kjk1j2{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}25%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}50%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}}@-webkit-keyframes animation-88g286{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}25%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}50%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}75%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}}@keyframes animation-88g286{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}25%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}50%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}75%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}}@-webkit-keyframes animation-12yx39b{0%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}25%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}50%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}75%{-webkit-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);transform:translate(34px,0px) scale(1,1) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}}@keyframes animation-12yx39b{0%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}25%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}50%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}75%{-webkit-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);transform:translate(34px,0px) scale(1,1) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}}@-webkit-keyframes animation-4hu8jm{0%{-webkit-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);}33.33%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);}}@keyframes animation-4hu8jm{0%{-webkit-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);}33.33%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);}}@-webkit-keyframes animation-1wqz2f4{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);}}@keyframes animation-1wqz2f4{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);}}@-webkit-keyframes animation-yl3z84{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);}}@keyframes animation-yl3z84{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);}}@-webkit-keyframes animation-1q3gjvc{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);}}@keyframes animation-1q3gjvc{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);}}@-webkit-keyframes animation-nc39ev{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);}}@keyframes animation-nc39ev{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);}}@-webkit-keyframes animation-amd09y{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);}}@keyframes animation-amd09y{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);}}@-webkit-keyframes animation-ru1vxe{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);}}@keyframes animation-ru1vxe{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);}}@-webkit-keyframes animation-ajnadh{0%{-webkit-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);}33.33%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);}}@keyframes animation-ajnadh{0%{-webkit-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);}33.33%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);}}.css-1ri25x2{display:none;}@media (min-width:740px){.css-1ri25x2{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:16px;height:31px;}}@media (min-width:1024px){.css-1ri25x2{display:none;}}.css-12fr9lp{height:23px;margin-top:6px;}.css-1hfdzay{display:none;}@media (min-width:1024px){.css-1hfdzay{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:0;}}.css-4g4cvq{display:none;}@media (min-width:740px){.css-4g4cvq{position:fixed;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;opacity:0;z-index:1;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;width:100%;height:32.063px;background:white;padding:5px 0;top:0;text-align:center;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;box-shadow:rgba(0,0,0,0.08) 0 0 5px 1px;border-bottom:1px solid #e2e2e2;}}.css-m6xlts{margin-left:20px;margin-right:20px;max-width:1605px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;width:100%;}@media (min-width:1360px){.css-m6xlts{margin-left:20px;margin-right:20px;}}@media (min-width:1780px){.css-m6xlts{margin-left:auto;margin-right:auto;}}.css-1ahhg7f{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;max-width:1605px;overflow:hidden;position:absolute;width:56%;margin-left:calc((100% - 56%) / 2);}@media (min-width:1024px){.css-1ahhg7f{width:56%;margin-left:calc((100% - 56%) / 2);}}@media (min-width:1024px){.css-1ahhg7f{width:53%;margin-left:calc((100% - 53%) / 2);}}.css-fwqvlz{font-family:nyt-cheltenham-small,georgia,'times new roman';font-weight:400;font-size:13px;-webkit-letter-spacing:0.015em;-moz-letter-spacing:0.015em;-ms-letter-spacing:0.015em;letter-spacing:0.015em;margin-top:10.5px;margin-right:auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.css-17xtcya{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;font-size:12.5px;text-transform:uppercase;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;margin-top:12.5px;margin-bottom:auto;margin-left:auto;white-space:nowrap;}.css-17xtcya:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-x15j1o{display:inline-block;padding-left:7px;padding-right:7px;font-size:13px;margin-top:10px;margin-bottom:auto;color:#ccc;}.css-1705lsu{margin-top:auto;margin-bottom:auto;margin-left:auto;background-color:#fff;z-index:50;box-shadow:-14px 2px 7px -2px rgba(255,255,255,0.7);}@media (min-width:740px){.css-1iwv8en{margin-top:1px;}}@media (min-width:1024px){.css-1iwv8en{margin-top:0;}}@-webkit-keyframes animation-b7n1on{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-b7n1on{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@-webkit-keyframes animation-1b9egsl{0%{-webkit-transform:rotate(20deg);-ms-transform:rotate(20deg);transform:rotate(20deg);}100%{-webkit-transform:rotate(380deg);-ms-transform:rotate(380deg);transform:rotate(380deg);}}@keyframes animation-1b9egsl{0%{-webkit-transform:rotate(20deg);-ms-transform:rotate(20deg);transform:rotate(20deg);}100%{-webkit-transform:rotate(380deg);-ms-transform:rotate(380deg);transform:rotate(380deg);}}.css-1rj8to8{display:inline-block;line-height:1em;}.css-1rj8to8 .css-0{-webkit-text-decoration:none;text-decoration:none;display:inline-block;}.css-4w91ra{display:inline-block;padding-left:3px;}.css-wg1cha{margin-left:20px;margin-right:20px;}@media (min-width:600px){.css-wg1cha{width:calc(100% - 40px);max-width:600px;margin:1.5rem auto 1em;}}@media (min-width:1440px){.css-wg1cha{width:600px;max-width:600px;margin:1.5rem auto 1em;}}.css-1ubp8k9{font-family:nyt-imperial,georgia,'times new roman',times,serif;font-style:italic;font-size:1.0625rem;line-height:1.5rem;width:calc(100% - 40px);max-width:600px;margin:1rem auto 0.75rem;}@media (min-width:740px){.css-1ubp8k9{font-size:1.1875rem;line-height:1.75rem;margin-bottom:1.25rem;}}@media (min-width:1440px){.css-1ubp8k9{width:600px;max-width:600px;}}@media print{.css-1ubp8k9{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@-webkit-keyframes animation-1egl8em{from{opacity:0;-webkit-transform:translate3d(0,13%,0);-ms-transform:translate3d(0,13%,0);transform:translate3d(0,13%,0);}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}@keyframes animation-1egl8em{from{opacity:0;-webkit-transform:translate3d(0,13%,0);-ms-transform:translate3d(0,13%,0);transform:translate3d(0,13%,0);}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.css-vdv0al{font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.75rem;line-height:1rem;width:calc(100% - 40px);max-width:600px;margin:0 auto 1em;color:#999;}.css-vdv0al a{color:#999;-webkit-text-decoration:none;text-decoration:none;}.css-vdv0al a:hover{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:1440px){.css-vdv0al{width:600px;max-width:600px;}}@media print{.css-vdv0al{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-vdv0al span{display:none;}}.css-1i2y565 .e6idgb70 + .e1h9rw200{margin-top:0;}.css-1i2y565 .eoo0vm40 + .e1gnsphs0{margin-top:-0.3em;}.css-1i2y565 .e6idgb70 + .eoo0vm40{margin-top:0;}.css-1i2y565 .eoo0vm40 + figure{margin-top:1.2rem;}.css-1i2y565 .e1gnsphs0 + figure{margin-top:1.2rem;}.css-o6xoe7{display:none;}@media (min-width:1024px){.css-o6xoe7{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:0;margin-left:auto;width:130px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}@media (min-width:1150px){.css-o6xoe7{width:210px;}}@media print{.css-o6xoe7{display:none;}}.css-1fanzo5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-bottom:1rem;}@media (min-width:1024px){.css-1fanzo5{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;height:100%;width:945px;margin-left:auto;margin-right:auto;}}@media (min-width:1150px){.css-1fanzo5{width:1110px;margin-left:auto;margin-right:auto;}}@media (min-width:1280px){.css-1fanzo5{width:1170px;}}@media (min-width:1440px){.css-1fanzo5{width:1200px;}}@media print{.css-1fanzo5{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-1fanzo5{margin-bottom:1em;display:block;}}.css-53u6y8{margin-left:auto;margin-right:auto;width:100%;}@media (min-width:1024px){.css-53u6y8{margin-left:calc((100% - 600px) / 2);margin-right:0;width:600px;}}@media (min-width:1440px){.css-53u6y8{max-width:600px;width:600px;margin-left:calc((100% - 600px) / 2);}}@media print{.css-53u6y8{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1m50asq{width:100%;vertical-align:top;}.css-z3e15g{position:fixed;opacity:0;-webkit-scroll-events:none;-moz-scroll-events:none;-ms-scroll-events:none;scroll-events:none;top:0;left:0;bottom:0;right:0;-webkit-transition:opacity 0.2s;transition:opacity 0.2s;background-color:#fff;pointer-events:none;}.css-uwwqev{width:100%;height:100%;}.css-1ly73wi{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);overflow:hidden;}@-webkit-keyframes animation-7y3qfv{0%{opacity:0;}10%,90%{opacity:1;}100%{opacity:0;}}@keyframes animation-7y3qfv{0%{opacity:0;}10%,90%{opacity:1;}100%{opacity:0;}}.css-l72opv{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;position:relative;right:3px;}.css-l72opv a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-l72opv:nth-of-type(3),.css-l72opv:nth-of-type(4){display:none;}}.css-l72opv:last-of-type{margin-right:0;}.css-4skfbu{color:#999;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:17px;margin-bottom:5px;margin-bottom:0;}@media print{.css-4skfbu{display:none;}}.css-1fcn4th{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-1fcn4th a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-1fcn4th:nth-of-type(3),.css-1fcn4th:nth-of-type(4){display:none;}}.css-1fcn4th:last-of-type{margin-right:0;}@media (max-width:1150px){.css-1fcn4th:nth-of-type(1),.css-1fcn4th:nth-of-type(2),.css-1fcn4th:nth-of-type(3){display:none;}}.css-13zu7ev{display:inline-block;height:15px;vertical-align:middle;width:15px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:14px;height:14px;}.css-13zu7ev.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-13zu7ev.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-13zu7ev.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-13zu7ev.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-13zu7ev.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-13zu7ev.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-13zu7ev.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-13zu7ev:hover{background-color:#fff;border:1px solid #ccc;}.css-f7l8cz{display:inline-block;height:15px;vertical-align:middle;width:15px;bottom:5px;position:relative;width:14px;height:14px;bottom:4px;}.css-f7l8cz.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-f7l8cz.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-f7l8cz.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-f7l8cz.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-f7l8cz.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-f7l8cz.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-f7l8cz.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-16ogagc{background:transparent;display:inline-block;height:20px;width:20px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:27px;height:27px;}.css-16ogagc.hidden{opacity:0;visibility:hidden;}.css-16ogagc.hidden:focus{opacity:1;}.css-16ogagc:hover{background-color:#fff;border:1px solid #ccc;}.css-17ai7jg{color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;margin:10px 20px 0;text-align:left;}.css-17ai7jg a{color:#326891;-webkit-text-decoration:none;text-decoration:none;}.css-17ai7jg a:hover,.css-17ai7jg a:focus{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:600px){.css-17ai7jg{margin-left:0;}}.sizeSmall .css-17ai7jg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:calc(50% - 15px);margin:auto 0 15px 15px;}@media (min-width:600px){.sizeSmall .css-17ai7jg{width:260px;margin-left:15px;}}@media (min-width:740px){.sizeSmall .css-17ai7jg{margin-left:15px;}}@media (min-width:1440px){.sizeSmall .css-17ai7jg{width:330px;margin-left:15px;}}@media (max-width:600px){.sizeSmall .css-17ai7jg{margin:auto 0 0 15px;}}.sizeSmall.sizeSmallNoCaption .css-17ai7jg{margin-left:auto;margin-right:auto;margin-top:10px;}.sizeMedium .css-17ai7jg{max-width:900px;}.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{margin-left:0;margin-right:0;}@media (min-width:600px){.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:255px;margin:auto 0 15px 15px;}}@media (min-width:1440px){.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{width:325px;}}.sizeLarge .css-17ai7jg{max-width:none;}@media (min-width:600px){.sizeLarge .css-17ai7jg{margin-left:20px;}}@media (min-width:740px){.sizeLarge .css-17ai7jg{margin-left:20px;max-width:900px;}}@media (min-width:1024px){.sizeLarge .css-17ai7jg{margin-left:0;max-width:720px;}}@media (min-width:1440px){.sizeLarge .css-17ai7jg{margin-left:0;max-width:900px;}}@media (min-width:740px){.sizeLarge.layoutVertical .css-17ai7jg{margin-left:0;}}.sizeFull .css-17ai7jg{margin-left:20px;}@media (min-width:600px){.sizeFull .css-17ai7jg{max-width:900px;}}@media (min-width:740px){.sizeFull .css-17ai7jg{max-width:900px;}}@media (min-width:1440px){.sizeFull .css-17ai7jg{max-width:900px;}}@media print{.css-17ai7jg{display:none;}}.css-8i9d0s{margin-right:7px;color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:0.875rem;line-height:1.125rem;}@media (min-width:740px){.css-8i9d0s{font-size:0.9375rem;line-height:1.25rem;}}.css-8i9d0s strong{font-weight:700;}.css-8i9d0s em{font-style:italic;}.css-8i9d0s a{color:#326891;}.css-8i9d0s a:visited{color:#326891;}.css-1nwzsjy{display:inline-block;color:#888;font-family:nyt-imperial,georgia,'times new roman',times,serif;line-height:1.125rem;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;font-size:0.75rem;}@media (min-width:740px){.css-1nwzsjy{font-size:0.75rem;}}@media (min-width:1150px){.css-1nwzsjy{font-size:0.8125rem;}}@media (min-width:600px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:5px;}}@media (min-width:1024px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:5px;}}@media (min-width:1440px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:40px;}}@media (max-width:600px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:-8px;}}@media print{.css-1nwzsjy{display:none;}}.css-10698na{text-align:center;}@media (min-width:740px){.css-10698na{padding-top:0;}}@media (min-width:1024px){}@media print{.css-10698na a[href]::after{content:'';}.css-10698na svg{fill:black;}}.css-nhjhh0{display:block;width:189px;height:26px;margin:5px auto 0;}@media (min-width:740px){.css-nhjhh0{width:225px;height:31px;margin:4px auto 0;}}@media (min-width:1024px){.css-nhjhh0{width:195px;height:26px;margin:6px auto 0;}}.css-1nuro5j{display:inline-block;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.875rem;line-height:1.125rem;margin:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;color:#333;}@media (min-width:740px){.css-1nuro5j{font-size:0.9375rem;line-height:1.25rem;}}.css-1w5cs23{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.css-1w5cs23 li{list-style:none;}.css-4brsb6{display:inline-block;height:15px;vertical-align:middle;width:15px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:15px;height:15px;}.css-4brsb6.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-4brsb6.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-4brsb6.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-4brsb6.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-4brsb6.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-4brsb6.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-4brsb6.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-4brsb6:hover{background-color:#fff;border:1px solid #ccc;}.css-uhuo44{display:inline-block;height:15px;vertical-align:middle;width:15px;bottom:5px;position:relative;width:15px;height:15px;bottom:4px;}.css-uhuo44.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-uhuo44.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-uhuo44.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-uhuo44.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-uhuo44.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-uhuo44.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-uhuo44.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-exrw3m{margin-bottom:0.78125rem;margin-top:0;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:1.125rem;line-height:1.5625rem;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:740px){.css-exrw3m{margin-bottom:0.9375rem;margin-top:0;}}.css-exrw3m .css-1g7m0tk{-webkit-text-decoration:underline;text-decoration:underline;}.css-exrw3m .css-1g7m0tk:hover,.css-exrw3m .css-1g7m0tk:focus{-webkit-text-decoration:none;text-decoration:none;}@media (min-width:740px){.css-exrw3m{font-size:1.25rem;line-height:1.875rem;}}.css-exrw3m:first-child{margin-top:0;}.css-exrw3m:last-child{margin-bottom:0;}.css-exrw3m.e1h9rw200:last-child{margin-bottom:0.75rem;}@media (min-width:600px){.css-exrw3m{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-exrw3m{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-exrw3m{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1a48zt4{opacity:1;-webkit-transition:opacity 0.3s 0.2s;transition:opacity 0.3s 0.2s;}.css-vuqh7u{display:inline-block;color:#888;font-family:nyt-imperial,georgia,'times new roman',times,serif;line-height:1.125rem;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;font-size:0.75rem;}@media (min-width:740px){.css-vuqh7u{font-size:0.75rem;}}@media (min-width:1150px){.css-vuqh7u{font-size:0.8125rem;}}.css-1l44abu{font-family:nyt-imperial,georgia,'times new roman',times,serif;color:#666;margin:10px 20px 0 20px;text-align:left;}.css-1l44abu a{color:#326891;-webkit-text-decoration:none;text-decoration:none;}.css-1l44abu a:hover,.css-1l44abu a:focus{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:600px){.css-1l44abu{margin-left:0;margin-right:20px;}}@media (min-width:1440px){.css-1l44abu{max-width:px;}}.css-jcw7oy{width:100%;max-width:600px;margin:2.3125rem auto;}@media (min-width:600px){.css-jcw7oy{width:calc(100% - 40px);}}@media (min-width:740px){.css-jcw7oy{width:auto;max-width:600px;}}@media (min-width:1440px){.css-jcw7oy{max-width:720px;}}.css-jcw7oy strong{font-weight:700;}.css-jcw7oy em{font-style:italic;}@media (min-width:740px){.css-jcw7oy{margin:2.6875rem auto;}}.css-10raysz{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;width:calc(100% - 40px);max-width:600px;padding:0 1rem 0 0;}.css-10raysz a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-10raysz:nth-of-type(3),.css-10raysz:nth-of-type(4){display:none;}}.css-10raysz:last-of-type{margin-right:0;}.css-10raysz:nth-of-type(1),.css-10raysz:nth-of-type(2),.css-10raysz:nth-of-type(3),.css-10raysz:nth-of-type(4){display:inline;}@media (min-width:600px){.css-10raysz{width:330px;}}.css-ar1l6a{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-ar1l6a a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-ar1l6a:nth-of-type(3),.css-ar1l6a:nth-of-type(4){display:none;}}.css-ar1l6a:last-of-type{margin-right:0;}.css-ar1l6a:nth-of-type(1),.css-ar1l6a:nth-of-type(2),.css-ar1l6a:nth-of-type(3),.css-ar1l6a:nth-of-type(4){display:inline;}.css-1ede5it{background-color:#f7f7f7;border-bottom:1px solid #f3f3f3;border-top:1px solid #f3f3f3;margin:37px auto;padding-bottom:30px;padding-top:12px;text-align:center;margin-top:60px;}@media (min-width:740px){.css-1ede5it{margin:43px auto;}}@media print{.css-1ede5it{display:none;}}@media (min-width:740px){.css-1ede5it{margin-bottom:0;margin-top:0;}}.css-mn5hq9{cursor:pointer;margin:0;border-top:1px solid #ebebeb;color:#333;font-family:nyt-franklin;font-size:13px;font-weight:700;height:44px;-webkit-letter-spacing:0.04rem;-moz-letter-spacing:0.04rem;-ms-letter-spacing:0.04rem;letter-spacing:0.04rem;line-height:44px;text-transform:uppercase;}.accordionExpanded .css-mn5hq9{color:#b3b3b3;}.css-1qmnftd{font-size:11px;text-align:center;}@media (max-width:600px){.css-1qmnftd{padding-bottom:25px;}}@media (min-width:600px){.css-1qmnftd{padding-bottom:25px;}}@media (min-width:1024px){.css-1qmnftd{padding:0 3% 9px;}}@media (min-width:1150px){.css-1qmnftd{margin:0 auto;max-width:1200px;}}.NYTApp .css-1qmnftd{display:none;}@media print{.css-1qmnftd{display:none;}}.css-1ho5u4o{list-style:none;margin:0 0 15px;padding:0;}@media (min-width:600px){.css-1ho5u4o{display:inline-block;}}.css-13o0c9t{list-style:none;line-height:8px;margin:0 0 35px;padding:0;}@media (min-width:600px){.css-13o0c9t{display:inline-block;}}.css-1yo489b{display:inline-block;line-height:20px;padding:0 10px;}.css-1yo489b:first-child{border-left:none;}.css-1yo489b.desktop{display:none;}@media (min-width:740px){.css-1yo489b.smartphone{display:none;}.css-1yo489b.desktop{display:inline-block;}}.css-ulr03x{opacity:1;visibility:visible;-webkit-animation-name:animation-5j8bii;animation-name:animation-5j8bii;-webkit-animation-duration:300ms;animation-duration:300ms;-webkit-animation-delay:0ms;animation-delay:0ms;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;}@media print{.css-ulr03x{margin-bottom:15px;}}@media (min-width:1024px){.css-ulr03x{position:fixed;width:100%;top:0;left:0;z-index:200;background-color:#fff;border-bottom:none;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}}@media (min-width:1024px){.css-1bymuyk{position:relative;border-bottom:1px solid #e2e2e2;}}.css-1waixk9{background:#fff;border-bottom:1px solid #e2e2e2;height:36px;padding:8px 15px 3px;position:relative;}@media (min-width:740px){.css-1waixk9{background:#fff;padding:10px 15px 6px;}}@media (min-width:1024px){.css-1waixk9{background:transparent;border-bottom:0;padding:4px 15px 2px;}}@media print{.css-1waixk9{background:transparent;}}@media (min-width:740px){}@media (min-width:1024px){.css-1waixk9{margin:0 auto;max-width:1605px;}}.css-1f7ibof{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;left:10px;position:absolute;}@media (min-width:1024px){}@media print{.css-1f7ibof{display:none;}}.css-l2ztic{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;padding:8px 9px;text-transform:uppercase;}.css-l2ztic.hidden{opacity:0;visibility:hidden;}.css-l2ztic.hidden:focus{opacity:1;}.css-l2ztic::-moz-focus-inner{padding:0;border:0;}.css-l2ztic:-moz-focusring{outline:1px dotted;}.css-l2ztic:disabled,.css-l2ztic.disabled{opacity:0.5;cursor:default;}.css-l2ztic:active,.css-l2ztic.active{background-color:#f7f7f7;}@media (min-width:740px){.css-l2ztic:hover{background-color:#f7f7f7;}}@media (min-width:1024px){.css-l2ztic{display:none;}}.css-19lv58h{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;-webkit-appearance:button;-moz-appearance:button;appearance:button;background-color:#fff;border:1px solid #ebebeb;color:#333;display:inline-block;font-size:11px;font-weight:500;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;line-height:13px;margin:0;padding:8px 9px;text-transform:uppercase;vertical-align:middle;display:none;}.css-19lv58h::-moz-focus-inner{padding:0;border:0;}.css-19lv58h:-moz-focusring{outline:1px dotted;}.css-19lv58h:disabled,.css-19lv58h.disabled{opacity:0.5;cursor:default;}.css-19lv58h:active,.css-19lv58h.active{background-color:#f7f7f7;}@media (min-width:740px){.css-19lv58h:hover{background-color:#f7f7f7;}}@media (min-width:1024px){.css-19lv58h{border:0;display:inline-block;margin-right:8px;}}.css-mgtjo2{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;}.css-mgtjo2::-moz-focus-inner{padding:0;border:0;}.css-mgtjo2:-moz-focusring{outline:1px dotted;}.css-mgtjo2:disabled,.css-mgtjo2.disabled{opacity:0.5;cursor:default;}.css-mgtjo2:active,.css-mgtjo2.active{background-color:#f7f7f7;}@media (min-width:740px){.css-mgtjo2:hover{background-color:#f7f7f7;}}.css-mgtjo2.activeSearchButton{background-color:#f7f7f7;}@media (min-width:1024px){.css-mgtjo2{padding:8px 9px 9px;}}.css-1wr3we4{display:none;}@media (min-width:1024px){.css-1wr3we4{display:block;position:absolute;left:105px;line-height:19px;top:10px;}}.css-y3sf94{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;position:absolute;right:10px;top:9px;}@media (min-width:1024px){.css-y3sf94{top:4px;}}@media print{.css-y3sf94{display:none;}}.css-1bnxwmn{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:#6288a5;border:1px solid #326891;color:#fff;font-size:11px;font-weight:700;-webkit-letter-spacing:0.05em;-moz-letter-spacing:0.05em;-ms-letter-spacing:0.05em;letter-spacing:0.05em;line-height:11px;padding:8px 9px 6px;text-transform:uppercase;}.css-1bnxwmn::-moz-focus-inner{padding:0;border:0;}.css-1bnxwmn:-moz-focusring{outline:1px dotted;}.css-1bnxwmn:disabled,.css-1bnxwmn.disabled{opacity:0.5;cursor:default;}@media (min-width:740px){.css-1bnxwmn:hover{background-color:#326891;}}@media (min-width:1024px){.css-1bnxwmn{padding:11px 12px 8px;}}.css-1bnxwmn:hover{border:1px solid #326891;}.css-1i8g3m4{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;display:block;}.css-1i8g3m4.hidden{opacity:0;visibility:hidden;}.css-1i8g3m4.hidden:focus{opacity:1;}.css-1i8g3m4::-moz-focus-inner{padding:0;border:0;}.css-1i8g3m4:-moz-focusring{outline:1px dotted;}.css-1i8g3m4:disabled,.css-1i8g3m4.disabled{opacity:0.5;cursor:default;}.css-1i8g3m4:active,.css-1i8g3m4.active{background-color:#f7f7f7;}@media (min-width:740px){.css-1i8g3m4:hover{background-color:#f7f7f7;}}@media (min-width:740px){.css-1i8g3m4{border:none;line-height:13px;padding:9px 9px 12px;}}@media (min-width:1024px){.css-1i8g3m4{display:none;}}@media (min-width:1150px){}.css-3qijnq{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:11px;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;padding:13px 20px 12px;}@media (min-width:740px){.css-3qijnq{position:relative;}}@media (min-width:1024px){.css-3qijnq{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;border:none;padding:0;height:0;-webkit-transform:translateY(42px);-ms-transform:translateY(42px);transform:translateY(42px);}}@media print{.css-3qijnq{display:none;}}.css-uqyvli{color:#121212;font-size:13px;font-family:nyt-franklin,helvetica,arial,sans-serif;display:none;width:auto;}@media (min-width:740px){.css-uqyvli{text-align:center;width:100%;}}@media (min-width:1024px){.css-uqyvli{font-size:12px;margin-bottom:10px;width:auto;}}.css-1uqjmks{color:#121212;font-size:12px;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;display:none;}@media (min-width:740px){.css-1uqjmks{margin:0;position:absolute;left:20px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0;}}@media (min-width:1024px){.css-1uqjmks{display:none;}}.css-1bvtpon{display:none;}@media (min-width:1024px){}.css-1vxca1d{position:relative;margin:0 auto;}@media (min-width:600px){.css-1vxca1d{margin:0 auto 20px;}}.css-1vxca1d .relatedcoverage + .recirculation{margin-top:20px;}.css-1vxca1d .wrap + .recirculation{margin-top:20px;}@media (min-width:1024px){.css-1vxca1d{padding-top:40px;}}.css-1ox9jel{margin:37px auto;margin-top:20px;margin-bottom:32px;}.css-1ox9jel strong{font-weight:700;}.css-1ox9jel em{font-style:italic;}.css-1ox9jel.sizeSmall{width:calc(100% - 40px);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}@media (min-width:600px){.css-1ox9jel.sizeSmall{max-width:600px;margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1ox9jel.sizeSmall{width:100%;}}@media (min-width:1440px){.css-1ox9jel.sizeSmall{max-width:600px;}}.css-1ox9jel.sizeSmall.sizeSmallNoCaption{display:block;}@media print{.css-1ox9jel.sizeSmall.sizeSmallNoCaption{display:none;}}.css-1ox9jel.sizeMedium{width:100%;max-width:600px;margin-right:auto;margin-left:auto;}@media (min-width:600px){.css-1ox9jel.sizeMedium{width:calc(100% - 40px);}}@media (min-width:740px){.css-1ox9jel.sizeMedium{max-width:600px;}}@media (min-width:1440px){.css-1ox9jel.sizeMedium{max-width:720px;}}@media (min-width:600px){.css-1ox9jel.sizeMedium.layoutVertical{width:420px;}}@media (min-width:1440px){.css-1ox9jel.sizeMedium.layoutVertical{width:480px;}}.css-1ox9jel.sizeMedium.layoutVertical.verticalVideo{width:calc(100% - 40px);}@media (min-width:600px){.css-1ox9jel.sizeMedium.layoutVertical.verticalVideo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:600px;}}@media (min-width:1440px){.css-1ox9jel.sizeMedium.layoutVertical.verticalVideo{width:600px;}}.css-1ox9jel.sizeLarge{width:100%;max-width:1200px;margin-left:auto;margin-right:auto;}@media (min-width:600px){.css-1ox9jel.sizeLarge{width:auto;}}@media (min-width:740px){.css-1ox9jel.sizeLarge.layoutVertical{width:600px;}.css-1ox9jel.sizeLarge.layoutVertical.verticalVideo{width:600px;}}@media (min-width:1024px){.css-1ox9jel.sizeLarge{width:945px;}}@media (min-width:1440px){.css-1ox9jel.sizeLarge{width:1200px;}.css-1ox9jel.sizeLarge.layoutVertical{width:720px;}.css-1ox9jel.sizeLarge.layoutVertical.verticalVideo{width:600px;}}@media (min-width:600px){.css-1ox9jel{margin:43px auto;}}@media print{.css-1ox9jel{display:none;}}@media (min-width:740px){.css-1ox9jel{margin-top:25px;}}.css-1riqqik{display:inline;color:#333;}.css-1riqqik span{-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration-color:#ccc;text-decoration-color:#ccc;}.css-1riqqik span:hover,.css-1riqqik span:focus{-webkit-text-decoration:none;text-decoration:none;}.css-2fg4z9{font-style:italic;}.css-11n4cex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:15px;margin-top:4px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:600px){.css-11n4cex{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-11n4cex{width:600px;}}.css-11n4cex .e6idgb70{font-size:14px;margin:0;}.css-1ifw933{font-style:normal;font-stretch:normal;margin-bottom:1.6rem;color:#333;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:300;-webkit-letter-spacing:0.005em;-moz-letter-spacing:0.005em;-ms-letter-spacing:0.005em;letter-spacing:0.005em;font-size:1.3125rem;line-height:1.6875rem;}@media (min-width:740px){.css-1ifw933{font-size:1.5rem;line-height:1.9375rem;}}.css-1rjmmt7{width:50px;vertical-align:bottom;margin-right:10px;}.css-rqb9bm{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;color:#333;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.875rem;line-height:1.125rem;margin-bottom:1rem;}.css-19hdyf3{font-family:nyt-franklin,helvetica,arial,sans-serif;color:#333;font-size:0.9375rem;line-height:1.25rem;font-family:nyt-franklin,helvetica,arial,sans-serif;color:#333;font-size:0.9375rem;line-height:1.25rem;}.css-19hdyf3 p{margin-bottom:0.75rem;}.css-19hdyf3 a,.css-19hdyf3 a:visited{color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-19hdyf3 a:hover,.css-19hdyf3 a:focus{color:#326891;-webkit-text-decoration:none;text-decoration:none;}@media print{.css-19hdyf3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:740px){.css-19hdyf3{font-size:1rem;line-height:1.375rem;}}.css-19hdyf3 p{margin-bottom:0.75rem;}.css-19hdyf3 a,.css-19hdyf3 a:visited{color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-19hdyf3 a:hover,.css-19hdyf3 a:focus{color:#326891;-webkit-text-decoration:none;text-decoration:none;}@media print{.css-19hdyf3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-15g2oxy{margin-top:1rem;}.css-2b3w4o{margin-bottom:1rem;}.css-2b3w4o .e16638kd0{margin-top:5px;margin-bottom:0;display:inline-block;color:#999;font-size:0.75rem;line-height:1.0625rem;}.css-2b3w4o:hover .e16ij5yr2,.css-2b3w4o:visited .e16ij5yr2{color:#666;}.css-2b3w4o .css-1g7m0tk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:100px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-14b9hti{font-weight:500;color:#a19d9d;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-size:1.125rem;line-height:1.375rem;}@media (min-width:740px){.css-14b9hti{font-size:1.1875rem;line-height:1.4375rem;}}.css-1j8dw05{margin-right:10px;display:inline;font-weight:500;color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-size:1.125rem;line-height:1.375rem;}@media (min-width:740px){.css-1j8dw05{font-size:1.1875rem;line-height:1.4375rem;}}.css-1vm5oi9{margin-left:10px;width:120px;min-width:120px;}@media (min-width:740px){.css-1vm5oi9{width:165px;min-width:165px;}}.css-32rbo2{width:100%;min-width:120px;}.css-llk6mt{margin-top:5px;}@media (min-width:740px){.css-llk6mt{margin-top:45px;margin-bottom:0;}}.css-llk6mt .e6idgb70{margin-top:1.875rem;color:#121212;font-weight:700;line-height:0.75rem;margin-bottom:0.625rem;}@media print{.css-llk6mt .e6idgb70{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-llk6mt .e1h9rw200{margin-bottom:16px;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;margin-top:0;}@media (min-width:600px){.css-llk6mt .e1h9rw200{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .e1h9rw200{width:600px;}}@media (min-width:740px){.css-llk6mt .e1h9rw200{max-width:none;margin-left:calc((100% - 600px) / 2);margin-right:auto;position:relative;width:660px;}}.css-llk6mt .euiyums3 .e6idgb70{margin:0;}.css-llk6mt .e1wiw3jv0{color:#333;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:600px){.css-llk6mt .e1wiw3jv0{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .e1wiw3jv0{width:600px;}}.css-llk6mt .e16638kd0{width:auto;margin-bottom:0;margin-left:0;display:inline-block;margin-top:0;margin-bottom:0;width:auto;}.css-llk6mt .eatfx1z0{margin-right:15px;font-weight:700;font-size:14px;line-height:1;}.css-llk6mt .section-kicker .opinion-bar{font-size:25px;}.css-llk6mt .epjyd6m0{margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:600px){.css-llk6mt .epjyd6m0{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .epjyd6m0{width:600px;}}.css-llk6mt .e1g7ppur0{margin-bottom:32px;margin-top:20px;}@media (min-width:740px){.css-llk6mt .e1g7ppur0{margin-top:25px;}}@media (min-width:1024px){.css-llk6mt .e1g7ppur0{margin-bottom:43px;}}.css-llk6mt .e1q76eii0{margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;max-width:600px;}@media (min-width:600px){.css-llk6mt .e1q76eii0{margin-left:auto;margin-right:auto;}}@media (min-width:740px){.css-llk6mt .e1q76eii0{width:600px;}}.css-llk6mt .euiyums1{margin-bottom:20px;color:#121212;}@media print{.css-llk6mt .euiyums1{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1s4ffep{color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:700;font-style:italic;font-size:1.9375rem;line-height:2.25rem;text-align:left;}@media (min-width:740px){.css-1s4ffep{font-size:2.5rem;line-height:3rem;}}.css-pdw9fk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;width:100%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}@media (min-width:1024px){.css-pdw9fk{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}.css-pdw9fk > img,.css-pdw9fk a > img,.css-pdw9fk div > img{margin-right:10px;}.css-1txwxcy{min-width:100px;display:block;width:100%;margin-bottom:10px;margin-left:-3px;}@media (min-width:1024px){.css-1txwxcy{display:inline-block;width:auto;margin-bottom:0;}}.css-1soubk3{margin:0.5rem 0 1.5rem;padding-top:1rem;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}.css-1soubk3:before{content:'';display:block;width:100%;margin-bottom:0.5rem;border-bottom:1px solid #e2e2e2;}.css-1soubk3:after{content:'';display:block;width:100%;margin-top:0.5rem;border-bottom:1px solid #e2e2e2;}.css-1soubk3 .e16ij5yr6{border-top:none;}@media (min-width:600px){.css-1soubk3{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1soubk3{width:600px;}}@media (min-width:1440px){.css-1soubk3{width:600px;max-width:600px;}}@media print{.css-1soubk3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}</style>
+
+
+
+ <style>[data-timezone] { display: none }</style>
+
+ </head>
+ <body>
+ <div id="app"><div class="css-v89234" role="main"><div class=""><div><div class="css-ulr03x e1suatyy0"><header class="css-1bymuyk e1suatyy1"><section class="css-1waixk9 e1suatyy2"><div class="css-1f7ibof er09x8g0"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="Sections Navigation &amp; Search" class="er09x8g1 css-l2ztic" data-testid="nav-button"><svg class="css-1fe7a5q" viewBox="0 0 16 16"><rect x="1" y="3" fill="#333333" width="14" height="2"></rect><rect x="1" y="7" fill="#333333" width="14" height="2"></rect><rect x="1" y="11" fill="#333333" width="14" height="2"></rect></svg></button></div><button id="desktop-sections-button" aria-label="Sections Navigation" class="css-19lv58h er09x8g2"><span class="css-vz7hjd">Sections</span><svg class="css-1fe7a5q" viewBox="0 0 16 16"><rect x="1" y="3" fill="#333333" width="14" height="2"></rect><rect x="1" y="7" fill="#333333" width="14" height="2"></rect><rect x="1" y="11" fill="#333333" width="14" height="2"></rect></svg></button><div class="css-10488qs"><button class="css-mgtjo2 ewfai8r0" data-test-id="search-button"><span class="css-vz7hjd">SEARCH</span><svg class="css-1fe7a5q" viewBox="0 0 16 16"><path fill="#333" d="M11.3,9.2C11.7,8.4,12,7.5,12,6.5C12,3.5,9.5,1,6.5,1S1,3.5,1,6.5S3.5,12,6.5,12c1,0,1.9-0.3,2.7-0.7l3.3,3.3c0.3,0.3,0.7,0.4,1.1,0.4s0.8-0.1,1.1-0.4c0.6-0.6,0.6-1.5,0-2.1L11.3,9.2zM6.5,10.3c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8c2.1,0,3.8,1.7,3.8,3.8C10.3,8.6,8.6,10.3,6.5,10.3z"></path></svg></button></div><a class="css-1rn5q1r" href="#site-content">Skip to content</a><a class="css-1rn5q1r" href="#site-index">Skip to site index</a></div><div class="css-1wr3we4 eaxe0e00"><a href="https://www.nytimes.com/section/nyregion" class="css-nuvmzp">New York</a></div><div class="css-10698na e1huz5gh0"><a aria-label="New York Times Logo. Click to visit the homepage" class="css-nhjhh0 e1huz5gh1" href="/"><svg xmlns="http://www.w3.org/2000/svg" class="" viewBox="0 0 184 25" fill="#000"><path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a></div><div class="css-y3sf94 ez4a0qj1"><a href="https://myaccount.nytimes.com/auth/login?response_type=cookie&amp;client_id=vi" class="css-1kj7lfb"><button class="css-1bnxwmn ez4a0qj0" data-testid="login-button">Log In</button></a><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="User Settings" class="ez4a0qj4 css-1i8g3m4" data-testid="user-settings-button"><svg class="css-10m9xeu" viewBox="0 0 16 16" fill="#333"><path d="M8,10c-2.5,0-7,1.1-7,3.5V16h14v-2.5C15,11.1,10.5,10,8,10z"></path><circle cx="8" cy="4" r="4"></circle></svg></button></div></div></section><section class="hasLinks css-3qijnq e1csuq9d3"><div class="css-uqyvli e1csuq9d0"></div><div class="css-1uqjmks e1csuq9d1"></div><div class="css-9e9ivx"><a href="https://myaccount.nytimes.com/auth/login?response_type=cookie&amp;client_id=vi" class="css-1gz70xg">Log In</a></div><div class="css-1bvtpon e1csuq9d2"><a href="https://www.nytimes.com/section/todayspaper" class="css-2bwtzy">Today’s Paper</a></div></section></header></div></div><div aria-hidden="false"><main id="site-content"><div><div class="css-4g4cvq" style="opacity:0.000000001;z-index:-1;visibility:hidden"><div class="css-m6xlts"><div class="css-1ahhg7f"><span class="css-17xtcya"><a href="/section/nyregion">New York</a></span><span class="css-x15j1o">|</span><span class="css-fwqvlz">She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.</span></div><div class="css-k008qs"><div class="css-1iwv8en"><a href="/"><svg class="css-1ri25x2" viewBox="0 0 16 22"><path d="M15.863 13.08c-.687 1.818-1.923 3.147-3.64 3.916v-3.917l2.129-1.958-2.129-1.889V6.505c1.923-.14 3.228-1.609 3.228-3.358C15.45.84 13.32 0 12.086 0c-.275 0-.55 0-.962.14v.14h.481c.824 0 1.51.42 1.51 1.189 0 .63-.48 1.189-1.304 1.189-2.129 0-4.6-1.749-7.279-1.749C2.13.91.481 2.728.481 4.546c0 1.819 1.03 2.448 2.128 2.798v-.14c-.343-.21-.618-.63-.618-1.189 0-.84.756-1.469 1.648-1.469 2.267 0 5.906 1.959 8.172 1.959h.206v2.727l-2.129 1.889 2.13 1.958v3.987c-.894.35-1.786.49-2.748.49-3.502 0-5.768-2.169-5.768-5.806 0-.839.137-1.678.344-2.518l1.785-.769v7.973l3.57-1.608V6.575L3.984 8.953c.55-1.61 1.648-2.728 2.953-3.358v-.07C3.433 6.295 0 9.023 0 13.08c0 4.686 3.914 7.974 8.446 7.974 4.807 0 7.485-3.288 7.554-7.974h-.137z" fill="#000"></path></svg></a><span class="css-1hfdzay"><div><a href="/" aria-label="New York Times Logo. Click to visit the homepage"><svg xmlns="http://www.w3.org/2000/svg" class="css-12fr9lp" viewBox="0 0 184 25" fill="#000"><path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a></div></span></div><div class="css-1705lsu"><div class=""><div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-4skfbu" data-testid="share-tools"><ul class="css-y8aj3r"><li class="css-1fcn4th"><a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html&amp;smid=fb-share&amp;name=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-13zu7ev" viewBox="0 0 7 15" width="7" height="15"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a></li><li class="css-1fcn4th"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2GEzuZ8&amp;text=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewBox="0 0 13 10" class="css-13zu7ev" width="13" height="10"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a></li><li class="css-1fcn4th"><a href="mailto:?subject=NYTimes.com%3A%20She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AShe%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.%0A%0AWith%20little%20oversight%2C%20the%20N.Y.P.D.%20has%20been%20using%20powerful%20surveillance%20technology%20on%20photos%20of%20children%20and%20teenagers.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewBox="0 0 15 9" class="css-13zu7ev" width="15" height="9"><path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a></li><li class="css-1fcn4th"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-f7l8cz" viewBox="0 0 16 13" width="16" height="13"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button></div></li><li class="css-60hakz"></li><li class="css-l72opv"></li></ul></div></div></div></div></div></div><meta itemProp="isAccessibleForFree" content="false"/><span itemProp="isPartOf" itemscope="" itemType="http://schema.org/CreativeWork http://schema.org/Product"><meta itemProp="name" content="The New York Times"/><meta itemProp="productID" content="nytimes.com:basic"/></span><article id="story" class="css-1vxca1d e1qksbhf0"><div id="top-wrapper" class="css-1sy8kpn"><div id="top-slug" class="css-l9onyx"><p>Advertisement</p></div><div class="ad top-wrapper" style="text-align:center;height:100%;display:block;min-height:250px"><div id="top" class="place-ad" data-position="top"></div></div></div><span itemProp="hasPart" itemscope="" itemType="http://schema.org/WebPageElement"><meta itemProp="isAccessibleForFree" content="False"/><meta itemProp="cssSelector" content=".meteredContent"/></span><div><header class="css-llk6mt euiyums4"><div id="sponsor-wrapper" class="css-1hyfx7x"><div id="sponsor-slug" class="css-19vbshk"><p>Supported by</p></div><div class="ad sponsor-wrapper" style="text-align:center;height:100%;display:block"><div id="sponsor" class="" data-position="sponsor"></div></div></div><div class="css-11n4cex euiyums3"></div><div class="css-1vkm6nb ehdk2mb0"><h1 itemProp="headline" class="css-1s4ffep e1h9rw200" id="link-2df79d6c"><span>She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.</span></h1></div><p class="css-1ifw933 e1wiw3jv0">With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.</p><div class="css-79elbk" data-testid="photoviewer-wrapper"><div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div><div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r15"><figure class="sizeMedium layoutVertical css-1ox9jel" aria-label="media" role="group" itemscope="" itemProp="associatedMedia" itemID="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=90&amp;auto=webp" itemType="http://schema.org/ImageObject"><div class="css-bsn42l"><span class="css-1dv1kvn">Image</span><img alt="“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14." class="css-11cwn6f" src="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcSet="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg?quality=90&amp;auto=webp 683w,https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg?quality=90&amp;auto=webp 1366w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 60vw, 100vw" itemProp="url" itemID="https://static01.nyt.com/images/2019/07/30/nyregion/00nypd-juveniles/merlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale"/></div><figcaption itemProp="caption description" class="css-17ai7jg emkp2hg0"><span aria-hidden="true" class="css-8i9d0s e13ogyst0">“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14.</span><span itemProp="copyrightHolder" class="emkp2hg2 css-1nwzsjy e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span><span class="css-1dv1kvn">Credit</span><span>Sarah Blesener for The New York Times</span></span></span></figcaption></figure></div></div><div class="css-acwcvw epjyd6m0"><div class="css-pdw9fk epjyd6m1"><div class="css-1txwxcy ey68jwv0"><a href="https://www.nytimes.com/by/joseph-goldstein" class="css-uwwqev"><img alt="Joseph Goldstein" title="Joseph Goldstein" src="https://static01.nyt.com/images/2018/07/16/multimedia/author-joseph-goldstein/author-joseph-goldstein-thumbLarge.png" class="css-1rjmmt7 ey68jwv2"/></a><a href="https://www.nytimes.com/by/ali-watkins" class="css-uwwqev"><img alt="Ali Watkins" title="Ali Watkins" src="https://static01.nyt.com/images/2019/02/20/multimedia/author-ali-watkins/author-ali-watkins-thumbLarge.png" class="css-1rjmmt7 ey68jwv2"/></a></div><div class="css-1baulvz"><p class="css-1nuro5j e1jsehar1" itemProp="author" itemscope="" itemType="http://schema.org/Person">By<!-- --> <a href="https://www.nytimes.com/by/joseph-goldstein" class="css-1riqqik e1jsehar0"><span class="css-1baulvz" itemProp="name">Joseph Goldstein</span></a> and <a href="https://www.nytimes.com/by/ali-watkins" class="css-1riqqik e1jsehar0"><span class="css-1baulvz last-byline" itemProp="name">Ali Watkins</span></a></p></div></div><ul class="css-1w5cs23 epjyd6m2"><li><time class="css-rqb9bm e16638kd0" dateTime="2019-08-01">Aug 1, 2019</time></li><li class="css-6n7j50"><div class=""><div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-d8bdto" data-testid="share-tools"><ul class="css-y8aj3r"><li class="css-60hakz"><a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html&amp;smid=fb-share&amp;name=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-4brsb6" viewBox="0 0 7 15" width="7" height="15"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a></li><li class="css-60hakz"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2GEzuZ8&amp;text=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewBox="0 0 13 10" class="css-4brsb6" width="13" height="10"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a></li><li class="css-60hakz"><a href="mailto:?subject=NYTimes.com%3A%20She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AShe%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.%0A%0AWith%20little%20oversight%2C%20the%20N.Y.P.D.%20has%20been%20using%20powerful%20surveillance%20technology%20on%20photos%20of%20children%20and%20teenagers.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewBox="0 0 15 9" class="css-4brsb6" width="15" height="9"><path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a></li><li class="css-60hakz"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-uhuo44" viewBox="0 0 16 13" width="16" height="13"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button></div></li><li class="css-60hakz"></li><li class="css-l72opv"></li></ul></div></div></li></ul></div></header></div><section name="articleBody" itemProp="articleBody" class="meteredContent css-1i2y565"><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0"><em class="css-2fg4z9 e1gzwzxm0">[What you need to know to start the day: </em><a class="css-1g7m0tk" href="https://www.nytimes.com/newsletters/newyorktoday?module=inline" title=""><em class="css-2fg4z9 e1gzwzxm0">Get New York Today in your inbox</em></a><em class="css-2fg4z9 e1gzwzxm0">.]</em></p><p class="css-exrw3m evys1bk0">The New York Police Department has been loading <!-- -->thousands of arrest photos of children and teenagers<!-- --> into a facial recognition database despite evidence the technology has a higher risk of false matches in younger faces. </p><p class="css-exrw3m evys1bk0">For about four years, internal records show, the department has used the technology to compare crime scene images with its collection of juvenile mug <!-- -->shots<!-- -->, the photos that are taken at an arrest. Most of the photos are of teenagers, largely 13 to 16 years old, but children as young as 11 have been included. </p><p class="css-exrw3m evys1bk0">Elected officials and civil rights groups said the disclosure that the city was deploying a powerful surveillance tool on adolescents — whose privacy seems sacrosanct and whose status is protected in the criminal justice system — was a striking example of the Police Department’s ability to adopt advancing technology with little public scrutiny.</p><p class="css-exrw3m evys1bk0">Several members of the City Council as well as a range of civil liberties groups said they were unaware of the policy until they were contacted by The New York Times. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">Police <!-- -->Department officials defended the decision, <!-- -->saying it was just the latest evolution of a longstanding policing technique: using arrest photos to identify suspects.</p><p class="css-exrw3m evys1bk0">“I don’t think this is any secret decision that’s made behind closed doors,” the city’s chief of detectives, Dermot F. Shea, said in an interview. “This is just process, and making sure we’re doing everything to fight crime.” </p><p class="css-exrw3m evys1bk0">Other cities have begun to debate whether law enforcement should use facial recognition, which relies on an algorithm to quickly pore through images and suggest matches. In May, <a class="css-1g7m0tk" href="https://www.nytimes.com/2019/05/14/us/facial-recognition-ban-san-francisco.html?module=inline" title="">San Francisco blocked city agencies, including the police</a>, from using the tool amid unease about potential government <!-- -->abuse<!-- -->. <a class="css-1g7m0tk" href="https://www.nytimes.com/2019/07/08/us/detroit-facial-recognition-cameras.html?module=inline" title="">Detroit is facing public resistance to a technology </a>that has been shown to have lower accuracy with people with darker skin. </p><p class="css-exrw3m evys1bk0">In New York, the state Education Department recently told the Lockport, N.Y., <!-- -->school district to delay a plan to use facial recognition on students, citing privacy concerns. </p><p class="css-exrw3m evys1bk0">“At the end <!-- -->of the day, it should be banned — no young people,” said <!-- -->Councilman Donovan Richards<!-- -->, a Queens Democrat who heads the Public Safety Committee, which oversees the Police Department. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">The department said its legal bureau had approved using facial recognition on juveniles. <a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/09/opinion/facial-recognition-police-new-york-city.html?module=inline" title="">The algorithm may suggest a lead, but detectives would not make an arrest based solely on </a><a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/09/opinion/facial-recognition-police-new-york-city.html?module=inline" title="">that</a>, Chief Shea said.</p></div><aside class="css-o6xoe7"></aside></div><div class="css-79elbk" data-testid="photoviewer-wrapper"><div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div><div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r15"><figure class="css-jcw7oy e1g7ppur0" aria-label="media" role="group" itemProp="associatedMedia" itemscope="" itemID="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=90&amp;auto=webp" itemType="http://schema.org/ImageObject"><div class="css-1xdhyk6 erfvjey0"><span class="css-1ly73wi e1tej78p0">Image</span><img alt="Dermot Shea, the city&amp;rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match." class="css-1m50asq" src="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcSet="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg?quality=90&amp;auto=webp 1024w,https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg?quality=90&amp;auto=webp 2048w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 60vw, 100vw" itemProp="url" itemID="https://static01.nyt.com/images/2019/08/02/nyregion/02nypdjuveniles1-print/merlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale"/></div><figcaption itemProp="caption description" class="css-1l44abu e1xdpqjp0"><span aria-hidden="true" class="css-8i9d0s e13ogyst0">Dermot Shea, the city&rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match.</span><span itemProp="copyrightHolder" class="css-vuqh7u e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span>Chang W. Lee/The New York Times</span></span></figcaption></figure></div></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">Still, facial recognition has not been widely tested on children. Most algorithms are taught to “think” based on adult faces, and there is growing evidence that they do not work as well on children. </p><p class="css-exrw3m evys1bk0">The National Institute of Standards and Technology<!-- -->, which is part of the Commerce Department and <a class="css-1g7m0tk" href="https://nvlpubs.nist.gov/nistpubs/ir/2018/NIST.IR.8238.pdf" title="" rel="noopener noreferrer" target="_blank">evaluates facial recognition </a><a class="css-1g7m0tk" href="https://nvlpubs.nist.gov/nistpubs/ir/2018/NIST.IR.8238.pdf" title="" rel="noopener noreferrer" target="_blank">algorithms</a> for accuracy, recently found the <!-- -->vast majority of more than 100 <!-- -->facial recognition <!-- -->algorithms had a higher rate of mistaken matches among children. The <!-- -->e<!-- -->rror rate was most pronounced in young children but was also seen in those aged 10 to 16.</p><p class="css-exrw3m evys1bk0">Aging poses another problem:<!-- --> The appearance of children and adolescents can change <!-- --> drastically as bones stretch and shift, altering the underlying facial structure. </p><p class="css-exrw3m evys1bk0">“I would use extreme caution in using those algorithms,” said <!-- -->Karl Ricanek Jr.<!-- -->, a computer science professor and <!-- -->co-founder of the Face Aging Group at the University of North Carolina-<!-- -->Wilmington<!-- -->. </p><p class="css-exrw3m evys1bk0">Technology that can match an image of a younger teenager to a recent arrest photo may be less effective at finding the same person even one or two years later, he said. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0"> “The systems do not have the capacity to understand the dynamic changes that occur to a child’s face,” Dr. Ricanek said. </p><p class="css-exrw3m evys1bk0">Idemia<!-- --> and <!-- -->DataWorks Plus<!-- -->, the two companies that provide facial recognition software to the Police Department, did not respond to requests for comment. </p><p class="css-exrw3m evys1bk0">The New York Police Department can take arrest photos of minors as young as <!-- -->11<!-- --> who are charged with a felony, depending on the severity of the charge. </p><p class="css-exrw3m evys1bk0">And in many cases, the department keeps the photos for years, making facial recognition comparisons to what may have effectively become outdated images. There are photos of 5,500 individuals in the juvenile database, 4,100 of whom are no longer 16 or under, the department said. Teenagers 17 and older are considered adults in the criminal justice system. </p><p class="css-exrw3m evys1bk0">Police officials declined to provide statistics on how often their facial recognition systems provide false matches, or to explain how they evaluate the system’s effectiveness.</p><p class="css-exrw3m evys1bk0">“We are comfortable with this technology because it has proved to be a valuable investigative method,” Chief Shea said. Facial recognition has helped lead to thousands of arrests of both adults and juveniles, the department has said. </p><p class="css-exrw3m evys1bk0">Mayor Bill de Blasio had been aware the department was using the technology on minors, said Freddi Goldstein, a spokeswoman for the mayor. </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">She said the Police Department followed “strict guidelines” in applying the technology and City Hall monitored the agency’s compliance with the policies. </p><p class="css-exrw3m evys1bk0">The Times learned details of the department’s use of facial recognition by reviewing documents posted online earlier this year by <a class="css-1g7m0tk" href="https://www.flawedfacedata.com/#footnote5" title="" rel="noopener noreferrer" target="_blank">Clare Garvie, a senior associate</a><a class="css-1g7m0tk" href="https://www.flawedfacedata.com/#footnote5" title="" rel="noopener noreferrer" target="_blank"> at the Center on Privacy and Technology at Georgetown Law</a>. Ms. Garvie received the documents as part of an open records lawsuit. </p><p class="css-exrw3m evys1bk0">It could not be determined whether other large police departments used facial recognition with juveniles because very few have written policies governing the use of the technology, Ms. Garvie said. </p><p class="css-exrw3m evys1bk0">New York detectives rely on a vast network<!-- --> of surveillance cameras throughout the city to provide images of people believed to have committed a crime. Since 2011, the department has had a dedicated unit of officers who use facial recognition to compare those images against millions of photos, usually mug shots. The software proposes matches, which have led to thousands of arrests, the department said. </p><p class="css-exrw3m evys1bk0">By 2013, top police officials were meeting to discuss including juveniles in the program, the documents reviewed by The Times showed. </p><p class="css-exrw3m evys1bk0">The documents showed that the juvenile database had been integrated into the system by 2015. </p><p class="css-exrw3m evys1bk0">“We have these photos. It makes sense,” Chief Shea said in the interview. </p><p class="css-exrw3m evys1bk0">State law requires that arrest photos be destroyed if the case is resolved in the juvenile’s favor, or if the child is found to have committed only a misdemeanor, rather than a felony. The photos also must be destroyed if a person reaches age 21 without a criminal record. <!-- --> </p></div><aside class="css-o6xoe7"></aside></div><div class="css-1fanzo5 StoryBodyCompanionColumn"><div class="css-53u6y8"><p class="css-exrw3m evys1bk0">When children are charged with crimes, the court system usually takes some steps to prevent their acts from defining them in later years. Children who are 16 and under, for instance, are generally sent to Family Court, where records are not public. </p><p class="css-exrw3m evys1bk0">Yet including their photos in a facial recognition database runs the risk that an imperfect algorithm identifies them as possible suspects in later crimes, civil rights advocates said. A mistaken match could lead investigators to focus on the wrong person from the outset, they said. </p><p class="css-exrw3m evys1bk0">“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, a 17-year-old Brooklyn girl who had admitted guilt in Family Court to a group attack that happened when she was 14. She said she was present at the attack but did not participate. </p><p class="css-exrw3m evys1bk0">Bailey, who asked that she be identified only by her <!-- -->last name<!-- --> because she did not want her juvenile arrest to be public, has not been arrested again and is now a student at John Jay College of Criminal Justice. </p><p class="css-exrw3m evys1bk0">R<!-- -->ecent studies indicate that people of color, as well as children and women, have a greater risk of misidentification than their counterparts, sai<!-- -->d <!-- -->Joy Buolamwini<!-- -->, <!-- -->the founder of the Algorithmic Justice League and graduate researcher at the M.I.T. Media Lab<!-- -->, who has examined how human biases are built into artificial intelligence. </p><p class="css-exrw3m evys1bk0">The racial disparities in the juvenile justice system are stark: In New York, black and Latino juveniles were charged with crimes at far higher rates than whites in 2017, the most recent year for which numbers were available. Black juveniles outnumbered white juveniles <a class="css-1g7m0tk" href="https://www.criminaljustice.ny.gov/crimnet/ojsa/jj-reports/newyorkcity.pdf" title="" rel="noopener noreferrer" target="_blank">more than 15 to 1</a>.</p><p class="css-exrw3m evys1bk0">“If the facial recognition algorithm has a negative bias toward a black population, that will get magnified more toward children,” Dr. Ricanek said, adding that in terms of diminished accuracy, “you’re now putting yourself in unknown territory.”</p></div><aside class="css-o6xoe7"></aside></div><div class="css-1soubk3 epkadsg3"><div class="css-15g2oxy epkadsg2"><div class="css-2b3w4o e16ij5yr6"><a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/09/opinion/facial-recognition-police-new-york-city.html?action=click&amp;module=RelatedLinks&amp;pgtype=Article"><div class="css-i9gxme e16ij5yr4"><div class="css-14b9hti e16ij5yr5">Opinion | James O’Neill</div><div class="css-1j8dw05 e16ij5yr2">How Facial Recognition Makes You Safer</div><time class="css-rqb9bm e16638kd0" dateTime="2019-06-09">Jun 9, 2019</time></div><div class="css-1vm5oi9 e16ij5yr0"><img src="https://static01.nyt.com/images/2019/06/07/opinion/sunday/07Oneill/07Oneill-threeByTwoSmallAt2X.jpg" class="css-32rbo2 e16ij5yr1"/></div></a></div><div class="css-2b3w4o e16ij5yr6"><a class="css-1g7m0tk" href="https://www.nytimes.com/2019/06/07/opinion/lockport-facial-recognition-schools.html?action=click&amp;module=RelatedLinks&amp;pgtype=Article"><div class="css-i9gxme e16ij5yr4"><div class="css-14b9hti e16ij5yr5">Opinion | Jim Shultz</div><div class="css-1j8dw05 e16ij5yr2">Spying on Children Won’t Keep Them Safe</div><time class="css-rqb9bm e16638kd0" dateTime="2019-06-07">Jun 7, 2019</time></div><div class="css-1vm5oi9 e16ij5yr0"><img src="https://static01.nyt.com/images/2019/06/07/opinion/07shultz-privacy/07shultz-privacy-threeByTwoSmallAt2X.jpg" class="css-32rbo2 e16ij5yr1"/></div></a></div></div></div></section><div class="bottom-of-article"><div class="css-1ubp8k9"></div><div class="css-wg1cha"><div class="css-19hdyf3 e1e7j8ap0"><div><p>Joseph Goldstein writes about policing and the criminal justice system. He has been a reporter at The Times since 2011, and is based in New York. He also worked for a year in the Kabul bureau, reporting on Afghanistan. <span class="css-4w91ra"> <a href="https://twitter.com/JoeKGoldstein" class="css-1rj8to8" rel="noopener noreferrer" target="_blank"><span class="css-0">@</span>JoeKGoldstein</a> </span></p></div></div><div class="css-19hdyf3 e1e7j8ap0"><div><p>Ali Watkins is a reporter on the Metro Desk, covering courts and social services. Previously, she covered national security in Washington for The Times, BuzzFeed and McClatchy Newspapers. <span class="css-4w91ra"> <a href="https://twitter.com/AliWatkins" class="css-1rj8to8" rel="noopener noreferrer" target="_blank"><span class="css-0">@</span>AliWatkins</a> </span></p></div></div></div><div class="css-vdv0al">A version of this article appears in print on <!-- -->, Section <!-- -->A<!-- -->, Page <!-- -->1<!-- --> of the New York edition<!-- --> with the headline: <!-- -->In New York, Police Computers Scan Faces, Some as Young as 11<span>. <a href="http://www.nytreprints.com/">Order Reprints</a> | <a href="http://www.nytimes.com/pages/todayspaper/index.html">Today’s Paper</a> | <a href="https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY">Subscribe</a></span></div><div class="css-i29ckm"><div class="css-10raysz"></div><div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-d8bdto" data-testid="share-tools"><ul class="css-y8aj3r"><li class="css-ar1l6a"><a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html&amp;smid=fb-share&amp;name=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-4brsb6" viewBox="0 0 7 15" width="7" height="15"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a></li><li class="css-ar1l6a"><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2GEzuZ8&amp;text=She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewBox="0 0 13 10" class="css-4brsb6" width="13" height="10"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a></li><li class="css-ar1l6a"><a href="mailto:?subject=NYTimes.com%3A%20She%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AShe%20Was%20Arrested%20at%2014.%20Then%20Her%20Photo%20Went%20to%20a%20Facial%20Recognition%20Database.%0A%0AWith%20little%20oversight%2C%20the%20N.Y.P.D.%20has%20been%20using%20powerful%20surveillance%20technology%20on%20photos%20of%20children%20and%20teenagers.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F08%2F01%2Fnyregion%2Fnypd-facial-recognition-children-teenagers.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewBox="0 0 15 9" class="css-4brsb6" width="15" height="9"><path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a></li><li class="css-ar1l6a"><div class="css-6n7j50"><button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-uhuo44" viewBox="0 0 16 13" width="16" height="13"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button></div></li></ul></div></div></div><div></div><div><div id="bottom-wrapper" class="css-1ede5it"><div id="bottom-slug" class="css-l9onyx"><p>Advertisement</p></div><div class="ad bottom-wrapper" style="text-align:center;height:100%;display:block;min-height:90px"><div id="bottom" class="" data-position="bottom"></div></div></div></div></article></div></main><nav class="css-1ropbjl" id="site-index" aria-labelledby="site-index-label" data-testid="site-index"><div class="css-uw59u"><header class="css-jxzr5i" data-testid="site-index-header"><h2 class="css-vz7hjd" id="site-index-label">Site Index</h2><a href="/"><svg xmlns="http://www.w3.org/2000/svg" class="css-oylsik" viewBox="0 0 184 25" fill="#000"><path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a><div class="css-1otr2jl" data-testid="go-to-homepage"><a class="css-1c8n994" href="/">Go to Home Page »</a></div></header><div class="css-qtw155" data-testid="site-index-accordion"><div class=" " role="tablist" aria-multiselectable="true" data-testid="accordion"><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-0" id="item-siteindex-0" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">news</header><div class="css-1hyfx7x" id="body-siteindex-0" aria-labelledby="item-siteindex-0" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com" data-testid="accordion-item-list-link">home page</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/world" data-testid="accordion-item-list-link">world</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/us" data-testid="accordion-item-list-link">U.S.</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/politics" data-testid="accordion-item-list-link">politics</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/news-event/2020-election" data-testid="accordion-item-list-link">Election 2020</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/nyregion" data-testid="accordion-item-list-link">New York</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/business" data-testid="accordion-item-list-link">business</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/technology" data-testid="accordion-item-list-link">tech</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/science" data-testid="accordion-item-list-link">science</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://www.nytimes.com/section/climate" data-testid="accordion-item-list-link">climate</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/sports" data-testid="accordion-item-list-link">sports</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/obituaries" data-testid="accordion-item-list-link">obituaries</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://www.nytimes.com/section/upshot" data-testid="accordion-item-list-link">the upshot</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/todayspaper" data-testid="accordion-item-list-link">today&#x27;s paper</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/corrections" data-testid="accordion-item-list-link">corrections</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-1" id="item-siteindex-1" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">opinion</header><div class="css-1hyfx7x" id="body-siteindex-1" aria-labelledby="item-siteindex-1" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion" data-testid="accordion-item-list-link">today&#x27;s opinion</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/columnists" data-testid="accordion-item-list-link">op-ed columnists</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/editorials" data-testid="accordion-item-list-link">editorials</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/contributors" data-testid="accordion-item-list-link">op-ed Contributors</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/letters" data-testid="accordion-item-list-link">letters</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/sunday" data-testid="accordion-item-list-link">sunday review</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/video/opinion" data-testid="accordion-item-list-link">video: opinion</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-2" id="item-siteindex-2" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">arts</header><div class="css-1hyfx7x" id="body-siteindex-2" aria-labelledby="item-siteindex-2" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts" data-testid="accordion-item-list-link">today&#x27;s arts</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/design" data-testid="accordion-item-list-link">art &amp; design</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/books" data-testid="accordion-item-list-link">books</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/dance" data-testid="accordion-item-list-link">dance</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/movies" data-testid="accordion-item-list-link">movies</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/music" data-testid="accordion-item-list-link">music</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/spotlight/pop-culture" data-testid="accordion-item-list-link">Pop Culture</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/arts/television" data-testid="accordion-item-list-link">television</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/theater" data-testid="accordion-item-list-link">theater</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://www.nytimes.com/watching" data-testid="accordion-item-list-link">watching</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/video/arts" data-testid="accordion-item-list-link">video: arts</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-3" id="item-siteindex-3" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">living</header><div class="css-1hyfx7x" id="body-siteindex-3" aria-labelledby="item-siteindex-3" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/automobiles" data-testid="accordion-item-list-link">automobiles</a></li><li class="css-10t7hia smartphone"><a class="css-mzqdl" href="https://cooking.nytimes.com/" data-testid="accordion-item-list-link">Cooking</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/crosswords" data-testid="accordion-item-list-link">crossword</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/education" data-testid="accordion-item-list-link">education</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/food" data-testid="accordion-item-list-link">food</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/health" data-testid="accordion-item-list-link">health</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/jobs" data-testid="accordion-item-list-link">jobs</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/magazine" data-testid="accordion-item-list-link">magazine</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://parenting.nytimes.com/" data-testid="accordion-item-list-link">parenting</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/realestate" data-testid="accordion-item-list-link">real estate</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/style" data-testid="accordion-item-list-link">style</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/t-magazine" data-testid="accordion-item-list-link">t magazine</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/travel" data-testid="accordion-item-list-link">travel</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/fashion/weddings" data-testid="accordion-item-list-link">love</a></li></ul></div></div><div class="" data-testid="accordion-item"><header aria-controls="body-siteindex-4" id="item-siteindex-4" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">listings &amp; more</header><div class="css-1hyfx7x" id="body-siteindex-4" aria-labelledby="item-siteindex-4" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body"><ul class="css-1gprdgz" data-testid="site-index-accordion-list"><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/reader-center" data-testid="accordion-item-list-link">Reader Center</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://thewirecutter.com" data-testid="accordion-item-list-link">Wirecutter</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="http://nytconferences.com/" data-testid="accordion-item-list-link">Live Events</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/learning" data-testid="accordion-item-list-link">The Learning Network</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="http://www.nytimes.com/marketing/tools-and-services" data-testid="accordion-item-list-link">tools &amp; services</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/events" data-testid="accordion-item-list-link">N.Y.C. events guide</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/multimedia" data-testid="accordion-item-list-link">multimedia</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/section/lens" data-testid="accordion-item-list-link">photography</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/video" data-testid="accordion-item-list-link">video</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/newsletters" data-testid="accordion-item-list-link">Newsletters</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/store" data-testid="accordion-item-list-link">NYT store</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://www.nytimes.com/times-journeys" data-testid="accordion-item-list-link">times journeys</a></li><li class="css-10t7hia"><a class="css-mzqdl" href="https://myaccount.nytimes.com/membercenter/myaccount.html" data-testid="accordion-item-list-link">manage my account</a></li></ul></div></div></div></div><div class="css-v0l3hm" data-testid="site-index-sections"><div class="css-g4gku8" data-testid="site-index-section"><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-0"><h3 class="css-rxqrcl" id="site-index-section-label-0">news</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com" data-testid="site-index-section-list-link">home page</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/world" data-testid="site-index-section-list-link">world</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/us" data-testid="site-index-section-list-link">U.S.</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/politics" data-testid="site-index-section-list-link">politics</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/news-event/2020-election" data-testid="site-index-section-list-link">Election 2020</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/nyregion" data-testid="site-index-section-list-link">New York</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/business" data-testid="site-index-section-list-link">business</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/technology" data-testid="site-index-section-list-link">tech</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/science" data-testid="site-index-section-list-link">science</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://www.nytimes.com/section/climate" data-testid="site-index-section-list-link">climate</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/sports" data-testid="site-index-section-list-link">sports</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/obituaries" data-testid="site-index-section-list-link">obituaries</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://www.nytimes.com/section/upshot" data-testid="site-index-section-list-link">the upshot</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/todayspaper" data-testid="site-index-section-list-link">today&#x27;s paper</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/corrections" data-testid="site-index-section-list-link">corrections</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-1"><h3 class="css-rxqrcl" id="site-index-section-label-1">opinion</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion" data-testid="site-index-section-list-link">today&#x27;s opinion</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/columnists" data-testid="site-index-section-list-link">op-ed columnists</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/editorials" data-testid="site-index-section-list-link">editorials</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/contributors" data-testid="site-index-section-list-link">op-ed Contributors</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/letters" data-testid="site-index-section-list-link">letters</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/sunday" data-testid="site-index-section-list-link">sunday review</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/video/opinion" data-testid="site-index-section-list-link">video: opinion</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-2"><h3 class="css-rxqrcl" id="site-index-section-label-2">arts</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts" data-testid="site-index-section-list-link">today&#x27;s arts</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/design" data-testid="site-index-section-list-link">art &amp; design</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/books" data-testid="site-index-section-list-link">books</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/dance" data-testid="site-index-section-list-link">dance</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/movies" data-testid="site-index-section-list-link">movies</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/music" data-testid="site-index-section-list-link">music</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/spotlight/pop-culture" data-testid="site-index-section-list-link">Pop Culture</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/arts/television" data-testid="site-index-section-list-link">television</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/theater" data-testid="site-index-section-list-link">theater</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://www.nytimes.com/watching" data-testid="site-index-section-list-link">watching</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/video/arts" data-testid="site-index-section-list-link">video: arts</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-3"><h3 class="css-rxqrcl" id="site-index-section-label-3">living</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/automobiles" data-testid="site-index-section-list-link">automobiles</a></li><li class="css-ist4u3 smartphone"><a class="css-kwpx34" href="https://cooking.nytimes.com/" data-testid="site-index-section-list-link">Cooking</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/crosswords" data-testid="site-index-section-list-link">crossword</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/education" data-testid="site-index-section-list-link">education</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/food" data-testid="site-index-section-list-link">food</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/health" data-testid="site-index-section-list-link">health</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/jobs" data-testid="site-index-section-list-link">jobs</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/magazine" data-testid="site-index-section-list-link">magazine</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://parenting.nytimes.com/" data-testid="site-index-section-list-link">parenting</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/realestate" data-testid="site-index-section-list-link">real estate</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/style" data-testid="site-index-section-list-link">style</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/t-magazine" data-testid="site-index-section-list-link">t magazine</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/travel" data-testid="site-index-section-list-link">travel</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/fashion/weddings" data-testid="site-index-section-list-link">love</a></li></ul></section><section class="css-1rr4qq7" aria-labelledby="site-index-section-label-4"><h3 class="css-rxqrcl" id="site-index-section-label-4">more</h3><ul class="css-1iruc8t" data-testid="site-index-section-list"><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/reader-center" data-testid="site-index-section-list-link">Reader Center</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://thewirecutter.com" data-testid="site-index-section-list-link">Wirecutter</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="http://nytconferences.com/" data-testid="site-index-section-list-link">Live Events</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/learning" data-testid="site-index-section-list-link">The Learning Network</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="http://www.nytimes.com/marketing/tools-and-services" data-testid="site-index-section-list-link">tools &amp; services</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/events" data-testid="site-index-section-list-link">N.Y.C. events guide</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/multimedia" data-testid="site-index-section-list-link">multimedia</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/section/lens" data-testid="site-index-section-list-link">photography</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/video" data-testid="site-index-section-list-link">video</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/newsletters" data-testid="site-index-section-list-link">Newsletters</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/store" data-testid="site-index-section-list-link">NYT store</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://www.nytimes.com/times-journeys" data-testid="site-index-section-list-link">times journeys</a></li><li class="css-ist4u3"><a class="css-kwpx34" href="https://myaccount.nytimes.com/membercenter/myaccount.html" data-testid="site-index-section-list-link">manage my account</a></li></ul></section><div class="css-6xhk3s" aria-labelledby="site-index-subscribe-label"><h3 class="css-rxqrcl" id="site-index-subscribe-label">Subscribe</h3><ul class="css-1iruc8t" data-testid="site-index-subscribe-list"><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/hdleftnav" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 14 13" fill="#000"><path d="M13.1,11.7H3.5V1.2h9.6V11.7zM13.1,0.4H3.5C3,0.4,2.6,0.8,2.6,1.2v2.2H0.9C0.4,3.4,0,3.8,0,4.3v5.2v1.5c0,0.8,0.8,1.5,1.8,1.5h1.7h0h7.4h2.2c0.5,0,0.9-0.4,0.9-0.9V1.2C14,0.8,13.6,0.4,13.1,0.4"></path><polygon points="10.9,3 5.2,3 5.2,3.9 11.4,3.9 11.4,3"></polygon><rect x="5.2" y="4.7" width="6.1" height="0.9"></rect><rect x="5.2" y="6.5" width="6.1" height="0.9"></rect></svg>home delivery</a></li><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/digitalleftnav" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 10 13"><path fill="#000" d="M9.9,8c-0.4,1.1-1.2,1.9-2.3,2.4V8l1.3-1.2L7.6,5.7V4c1.2-0.1,2-1,2-2c0-1.4-1.3-1.9-2.1-1.9c-0.2,0-0.3,0-0.6,0.1v0.1c0.1,0,0.2,0,0.3,0c0.5,0,0.9,0.2,0.9,0.7c0,0.4-0.3,0.7-0.8,0.7C6,1.7,4.5,0.6,2.8,0.6c-1.5,0-2.5,1.1-2.5,2.2C0.3,4,1,4.3,1.6,4.6l0-0.1C1.4,4.4,1.3,4.1,1.3,3.8c0-0.5,0.5-0.9,1-0.9C3.7,2.9,6,4,7.4,4h0.1v1.7L6.2,6.8L7.5,8v2.4c-0.5,0.2-1.1,0.3-1.7,0.3c-2.2,0-3.6-1.3-3.6-3.5c0-0.5,0.1-1,0.2-1.5l1.1-0.5V10l2.2-1v-5L2.5,5.5c0.3-1,1-1.7,1.8-2l0,0C2.2,3.9,0.1,5.6,0.1,8c0,2.9,2.4,4.8,5.2,4.8C8.2,12.9,9.9,10.9,9.9,8L9.9,8z"></path></svg>digital subscriptions</a></li><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/subscription/games/lp897H9.html" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 13 13" fill="#000"><polygon points="0,-93.6 0,-86.9 6.6,-93.6"></polygon><polygon points="0.9,-86 7.5,-86 7.5,-92.6"></polygon><polygon points="0,-98 0,-94.8 8.8,-94.8 8.8,-86 12,-86 12,-98"></polygon><path d="M11.9-40c-0.4,1.1-1.2,1.9-2.3,2.4V-40l1.3-1.2l-1.3-1.2V-44c1.2-0.1,2-1,2-2c0-1.4-1.3-1.9-2.1-1.9c-0.2,0-0.3,0-0.6,0.1v0.1c0.1,0,0.2,0,0.3,0c0.5,0,0.9,0.2,0.9,0.7c0,0.4-0.3,0.7-0.8,0.7c-1.3,0-2.8-1.1-4.5-1.1c-1.5,0-2.5,1.1-2.5,2.2c0,1.1,0.6,1.5,1.3,1.7l0-0.1c-0.2-0.1-0.4-0.4-0.4-0.7c0-0.5,0.5-0.9,1-0.9C5.7-45.1,8-44,9.4-44h0.1v1.7l-1.3,1.1L9.5-40v2.4c-0.5,0.2-1.1,0.3-1.7,0.3c-2.2,0-3.6-1.3-3.6-3.5c0-0.5,0.1-1,0.2-1.5l1.1-0.5v4.9l2.2-1v-5l-3.3,1.5c0.3-1,1-1.7,1.8-2l0,0c-2.2,0.5-4.3,2.1-4.3,4.6c0,2.9,2.4,4.8,5.2,4.8C10.2-35.1,11.9-37.1,11.9-40L11.9-40z"></path><path d="M12.2-23.7c-0.2,0-0.4,0.2-0.4,0.4v0.4L0.4-19.1v2.3l3,1l-0.2,0.6c-0.3,0.8,0.1,1.8,0.9,2.1l1.7,0.7c0.2,0.1,0.4,0.1,0.6,0.1c0.6,0,1.3-0.4,1.5-1l0.4-0.9l3.5,1.2v0.4c0,0.2,0.2,0.4,0.4,0.4c0.2,0,0.4-0.2,0.4-0.4v-10.7C12.6-23.5,12.4-23.7,12.2-23.7M7.1-13.6c-0.2,0.4-0.6,0.6-1,0.4l-1.7-0.7c-0.4-0.2-0.6-0.6-0.4-1l0.3-0.7l3.3,1.1L7.1-13.6z"></path><path d="M13.1-60.3H3.5v-10.5h9.6V-60.3zM13.1-71.6H3.5c-0.5,0-0.9,0.4-0.9,0.9v2.2H0.9c-0.5,0-0.9,0.4-0.9,0.9v5.2v1.5c0,0.8,0.8,1.5,1.8,1.5h1.7h0h7.4h2.2c0.5,0,0.9-0.4,0.9-0.9v-10.5C14-71.2,13.6-71.6,13.1-71.6"></path><polygon points="10.9,-69 5.2,-69 5.2,-68.1 11.4,-68.1 11.4,-69"></polygon><rect x="5.2" y="-67.3" width="6.1" height="0.9"></rect><rect x="5.2" y="-65.5" width="6.1" height="0.9"></rect><path d="M12,6.5H6.5V12H1V6.5h5.5V1H12V6.5zM12,0H1C0.4,0,0,0.5,0,1v11c0,0.6,0.4,1,1,1h11c0.5,0,1-0.4,1-1V1C13,0.5,12.5,0,12,0"></path></svg>Crossword</a></li><li class="css-tj0ten"><a class="css-1k2cjfc" href="https://www.nytimes.com/subscriptions/Multiproduct/lp8R3WU.html" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewBox="0 0 13 13" fill="#000"><path d="M12,2.9L9.6,5.2c-0.1,0.1-0.3,0.1-0.4,0C9.1,5.2,9.1,5,9.3,4.9l2.4-2.4c-0.2-0.2-0.3-0.3-0.5-0.5L8.7,4.3c-0.1,0.1-0.3,0.1-0.4,0C8.2,4.3,8.2,4.1,8.4,4l2.4-2.4c-0.3-0.3-0.5-0.5-0.5-0.5L7.6,3.4C7.1,4,6.8,5.1,7.1,5.8c-1.4,1-4.6,3.5-5.1,4c-0.8,0.8-0.4,1.8-0.3,1.9c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0.1,1.1,0.5,1.9-0.3c0.4-0.4,2.9-3.6,3.9-5C8.4,6.9,9.6,6.6,10.2,6l2.3-2.6C12.5,3.4,12.3,3.2,12,2.9z"></path><path d="M0.8,1.9l0.3-0.3c0.9-0.9,3.2,1.1,3.8,1.7s0.9,1.8,0.4,2.6c1.4,1.1,4.6,3.5,5,3.9c0.8,0.8,0.4,1.8,0.3,1.9c0,0,0,0,0,0c0,0,0,0,0,0c-0.1,0.1-1.1,0.5-1.9-0.3c-0.4-0.4-2.9-3.7-4-5.1C3.9,6.7,2.9,6.4,2.3,5.8S-0.2,2.9,0.8,1.9z"></path></svg>Cooking</a></li></ul><ul class="css-1iruc8t" data-testid="site-index-corporate-links"><li><a class="css-1vhk1ks" href="https://www.nytimes.com/marketing/newsletters">email newsletters</a></li><li><a class="css-1vhk1ks" href="https://www.nytimes.com/corporateleftnav">corporate subscriptions</a></li><li><a class="css-1vhk1ks" href="https://www.nytimes.com/educationleftnav">education rate</a></li></ul><ul class="css-6td9kr" data-testid="site-index-alternate-links"><li><a class="css-1vhk1ks" href="https://www.nytimes.com/services/mobile/index.html">mobile applications</a></li><li><a class="css-1vhk1ks" href="http://eedition.nytimes.com/cgi-bin/signup.cgi?cc=37FYY">replica edition</a></li></ul></div></div></div></div></nav><footer role="contentinfo" class="css-1qmnftd e5u916q0"><nav data-testid="footer" class="css-15uy5yv"><h2 class="css-vz7hjd">Site Information Navigation</h2><ul class="css-1ho5u4o e5u916q1"><li data-testid="copyright"><a class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/copyright/copyright-notice.html">© <span itemProp="copyrightYear">2019</span><span itemProp="publisher copyrightHolder provider sourceOrganization" itemscope="" itemType="http://schema.org/NewsMediaOrganization" itemID="https://www.nytimes.com"> <meta itemProp="diversityPolicy" content="https://www.nytco.com/diversity-and-inclusion-at-the-new-york-times/"/><meta itemProp="ethicsPolicy" content="https://www.nytco.com/who-we-are/culture/standards-and-ethics/"/><meta itemProp="foundingDate" content="1851-09-18"/><span itemProp="logo" itemscope="" itemType="https://schema.org/ImageObject"><meta itemProp="url" content="https://static01.nyt.com/images/misc/NYT_logo_rss_250x40.png"/></span><meta itemProp="url" content="https://www.nytimes.com/"/><meta itemProp="masthead" content="https://www.nytimes.com/interactive/2018/09/28/admin/the-new-york-times-masthead.html"/><meta itemProp="name" content="The New York Times"/><span>The New York Times Company</span></span></a></li></ul><ul class="css-13o0c9t e5u916q2"><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://myaccount.nytimes.com/membercenter/feedback.html">Contact Us</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://www.nytco.com/careers">Work with us</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://nytmediakit.com/">Advertise</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://www.tbrandstudio.com/">T Brand Studio</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/privacy/policy/privacy-policy.html#pp">Your Ad Choices</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/privacy">Privacy</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/ref/membercenter/help/agree.html">Terms of Service</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/sale/terms-of-sale.html">Terms of Sale</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="http://spiderbites.nytimes.com">Site Map</a></li><li class="smartphone css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://mobile.nytimes.com/help">Help</a></li><li class="desktop css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/membercenter/sitehelp.html">Help</a></li><li class="css-1yo489b e5u916q3"><a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/subscription/multiproduct/lp8HYKU?campaignId=37WXW">Subscriptions</a></li></ul></nav></footer></div></div></div></div>
+ <script>window.__preloadedData = {"initialState":{"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==":{"__typename":"Article","id":"QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==","compatibility":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.compatibility","typename":"CompatibilityFeatures"},"archiveProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.archiveProperties","typename":"ArticleArchiveProperties"},"collections@filterEmpty":[{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==","typename":"LegacyCollection"}],"tone":"NEWS","section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==","typename":"Section"},"subsection":null,"sprinkledBody":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody","typename":"DocumentBlock"},"url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F08\u002F01\u002Fnyregion\u002Fnypd-facial-recognition-children-teenagers.html","adTargetingParams({\"clientAdParams\":{\"edn\":\"us\",\"plat\":\"web\",\"prop\":\"nyt\"}})":[{"type":"id","generated":false,"id":"AdTargetingParam:als_test1565027040168","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:propnyt","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:platweb","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ednus","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:brandsensitivefalse","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:per","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:orgpolicedepartmentnyc","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:geonewyorkcity","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:desjuveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:spon","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:authaliwatkins,josephgoldstein","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:col","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:collnewyork,usnews,technology,techandsociety","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:artlenmedium","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ledemedsznone","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:gui","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:templatearticle","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:typart,oak","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:sectionnyregion","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:si_sectionnyregion","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:id100000006583622","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:trend","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ptnt10,nt15,nt16,nt18,nt3,nt4,nt9","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:gscatneg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education","typename":"AdTargetingParam"}],"sourceId":"100000006583622","type":"article","wordCount":1357,"bylines":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0","typename":"Byline"}],"displayProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.displayProperties","typename":"CreativeWorkDisplayProperties"},"typeOfMaterials":{"type":"json","json":["News"]},"collections":[{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==","typename":"LegacyCollection"}],"timesTags@filterEmpty":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.0","typename":"Organization"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.1","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.2","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.3","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.4","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.5","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.6","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.7","typename":"Location"}],"language":null,"desk":"Metro","kicker":"","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.headline","typename":"CreativeWorkHeadline"},"commentStatus":"ACCEPT_AND_DISPLAY_COMMENTS","firstPublished":"2019-08-01T17:15:31.000Z","lastModified":"2019-08-02T17:26:37.071Z","originalDesk":"Metro","source":{"type":"id","generated":false,"id":"Organization:T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=","typename":"Organization"},"printInformation":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.printInformation","typename":"PrintInformation"},"sprinkled":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled","typename":"SprinkledContent"},"followChannels":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.0","typename":"ChannelMetadata"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.1","typename":"ChannelMetadata"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.2","typename":"ChannelMetadata"}],"dfpTaxonomyException":null,"advertisingProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.advertisingProperties","typename":"CreativeWorkAdvertisingProperties"},"translations":[],"summary":"With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.","lastMajorModification":"2019-08-02T09:30:23.000Z","uri":"nyt:\u002F\u002Farticle\u002F9da58246-2495-505f-9abd-b5fda8e67b56","eventId":"pubp:\u002F\u002Fevent\u002F47a657bafa8a476bb36832f90ee5ac6e","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia","typename":"Image"},"newsStatus":"DEFAULT","episodeProperties":null,"column":null,"reviewItems":[],"shortUrl":"https:\u002F\u002Fnyti.ms\u002F2GEzuZ8","promotionalHeadline":"She Was Arrested at 14. Her Photo Went to a Facial Recognition Database.","promotionalSummary":"With little oversight, the police have been using the powerful surveillance technology on photos of children and teenagers.","reviewSummary":"","legacy":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.legacy","typename":"ArticleLegacyData"},"addendums":[],"related@filterEmpty":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.compatibility":{"isOak":true,"__typename":"CompatibilityFeatures","hasVideo":false,"hasOakConversionError":false,"isArtReview":false,"isBookReview":false,"isDiningReview":false,"isMovieReview":false,"isTheaterReview":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.archiveProperties":{"timesMachineUrl":"","lede@stripHtml":"","thumbnails":[],"__typename":"ArticleArchiveProperties"},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","slug":"nyregion","__typename":"LegacyCollection","name":"New York","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F19f66998-f562-5ec6-b3f9-298f1c76dd84","type":"legacycollection","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzExZjcyYWI0LTdjZDAtNTQwYS05M2NjLWYzNWIzMmNkMDEzZA==","slug":"us","__typename":"LegacyCollection","name":"U.S. News","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F11f72ab4-7cd0-540a-93cc-f35b32cd013d","type":"legacycollection","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4ZWNlMGQwLTNjMzUtNWZhOS1iNTM1LTk0OTk3YTdjOGMwZg==","slug":"technology","__typename":"LegacyCollection","name":"Technology","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F58ece0d0-3c35-5fa9-b535-94997a7c8c0f","type":"legacycollection","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzkwODhjZmU2LTg1ZTMtNTJmYi05OTNlLTYyODk3MDJhMTFmZg==","slug":"experience-tech-and-society","__typename":"LegacyCollection","name":"Tech and Society","collectionType":"SPOTLIGHT","uri":"nyt:\u002F\u002Flegacycollection\u002F9088cfe6-85e3-52fb-993e-6289702a11ff","type":"legacycollection","header":"","showCollectionStories":false},"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==":{"id":"U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==","name":"nyregion","displayName":"New York","url":"\u002Fsection\u002Fnyregion","uri":"nyt:\u002F\u002Fsection\u002F39480374-66d3-5603-9ce1-58cfa12988e2","__typename":"Section"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0":{"__typename":"HeaderBasicBlock","label":null,"headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline","typename":"Heading1Block"},"summary":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary","typename":"SummaryBlock"},"ledeMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.ledeMedia","typename":"ImageBlock"},"byline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline","typename":"BylineBlock"},"timestampBlock":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.timestampBlock","typename":"TimestampBlock"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.3":{"__typename":"Dropzone","index":0,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.5":{"__typename":"Dropzone","index":1,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.7":{"__typename":"Dropzone","index":2,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.9":{"__typename":"Dropzone","index":3,"bad":false,"adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.11":{"__typename":"Dropzone","index":4,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.13":{"__typename":"Dropzone","index":5,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.6","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.15":{"__typename":"Dropzone","index":6,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.1","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.17":{"__typename":"Dropzone","index":7,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.19":{"__typename":"Dropzone","index":8,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.21":{"__typename":"Dropzone","index":9,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.22":{"__typename":"ImageBlock","size":"MEDIUM","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.23":{"__typename":"Dropzone","index":10,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.25":{"__typename":"Dropzone","index":11,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.5","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.6","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.7","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.8","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.9","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.27":{"__typename":"Dropzone","index":12,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.29":{"__typename":"Dropzone","index":13,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.5","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.31":{"__typename":"Dropzone","index":14,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.33":{"__typename":"Dropzone","index":15,"bad":false,"adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.35":{"__typename":"Dropzone","index":16,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.37":{"__typename":"Dropzone","index":17,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.39":{"__typename":"Dropzone","index":18,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.41":{"__typename":"Dropzone","index":19,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.43":{"__typename":"Dropzone","index":20,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.45":{"__typename":"Dropzone","index":21,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.47":{"__typename":"Dropzone","index":22,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.49":{"__typename":"Dropzone","index":23,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.51":{"__typename":"Dropzone","index":24,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.53":{"__typename":"Dropzone","index":25,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.1","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.55":{"__typename":"Dropzone","index":26,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.57":{"__typename":"Dropzone","index":27,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.60":{"__typename":"Dropzone","index":28,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.1","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.62":{"__typename":"Dropzone","index":29,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.64":{"__typename":"Dropzone","index":30,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.66":{"__typename":"Dropzone","index":31,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.68":{"__typename":"Dropzone","index":32,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.70":{"__typename":"Dropzone","index":33,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.4","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.5","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.6","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.72":{"__typename":"Dropzone","index":34,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.74":{"__typename":"Dropzone","index":35,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.76":{"__typename":"Dropzone","index":36,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77":{"__typename":"RelatedLinksBlock","displayStyle":"STANDARD","title":[],"description":[],"related@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0","typename":"Article"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1","typename":"Article"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody":{"content@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.15","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.22","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.23","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.25","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.33","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.45","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.53","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.60","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.76","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77","typename":"RelatedLinksBlock"}],"__typename":"DocumentBlock","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.14","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.15","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.22","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.23","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.24","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.25","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.32","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.33","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.44","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.45","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.52","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.53","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.59","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.60","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.75","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.76","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.77","typename":"RelatedLinksBlock"}],"content@take({\"first\":10000})@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.14","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.15","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.22","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.23","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.24","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.25","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.32","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.33","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.44","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.45","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.52","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.53","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.59","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.60","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.75","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.76","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.77","typename":"RelatedLinksBlock"}]},"AdTargetingParam:als_test1565027040168":{"key":"als_test","value":"1565027040168","__typename":"AdTargetingParam"},"AdTargetingParam:propnyt":{"key":"prop","value":"nyt","__typename":"AdTargetingParam"},"AdTargetingParam:platweb":{"key":"plat","value":"web","__typename":"AdTargetingParam"},"AdTargetingParam:ednus":{"key":"edn","value":"us","__typename":"AdTargetingParam"},"AdTargetingParam:brandsensitivefalse":{"key":"brandsensitive","value":"false","__typename":"AdTargetingParam"},"AdTargetingParam:per":{"key":"per","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:orgpolicedepartmentnyc":{"key":"org","value":"policedepartmentnyc","__typename":"AdTargetingParam"},"AdTargetingParam:geonewyorkcity":{"key":"geo","value":"newyorkcity","__typename":"AdTargetingParam"},"AdTargetingParam:desjuveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties":{"key":"des","value":"juveniledelinquency,facialrecognitionsoftware,privacy,surveillanceofcitizensbygovern,police,civilrightsandliberties","__typename":"AdTargetingParam"},"AdTargetingParam:spon":{"key":"spon","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:authaliwatkins,josephgoldstein":{"key":"auth","value":"aliwatkins,josephgoldstein","__typename":"AdTargetingParam"},"AdTargetingParam:col":{"key":"col","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:collnewyork,usnews,technology,techandsociety":{"key":"coll","value":"newyork,usnews,technology,techandsociety","__typename":"AdTargetingParam"},"AdTargetingParam:artlenmedium":{"key":"artlen","value":"medium","__typename":"AdTargetingParam"},"AdTargetingParam:ledemedsznone":{"key":"ledemedsz","value":"none","__typename":"AdTargetingParam"},"AdTargetingParam:gui":{"key":"gui","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:templatearticle":{"key":"template","value":"article","__typename":"AdTargetingParam"},"AdTargetingParam:typart,oak":{"key":"typ","value":"art,oak","__typename":"AdTargetingParam"},"AdTargetingParam:sectionnyregion":{"key":"section","value":"nyregion","__typename":"AdTargetingParam"},"AdTargetingParam:si_sectionnyregion":{"key":"si_section","value":"nyregion","__typename":"AdTargetingParam"},"AdTargetingParam:id100000006583622":{"key":"id","value":"100000006583622","__typename":"AdTargetingParam"},"AdTargetingParam:trend":{"key":"trend","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:ptnt10,nt15,nt16,nt18,nt3,nt4,nt9":{"key":"pt","value":"nt10,nt15,nt16,nt18,nt3,nt4,nt9","__typename":"AdTargetingParam"},"AdTargetingParam:gscatneg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education":{"key":"gscat","value":"neg_mastercard,gs_law_misc,neg_chanel,gv_crime,neg_hearts,gs_tech,gs_law,gs_tech_computing,neg_ibmtest,gs_tech_phones,neg_samsung,gs_education","__typename":"AdTargetingParam"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0":{"displayName":"Joseph Goldstein","__typename":"Person","url":"","contactDetails":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails","typename":"ContactDetails"},"legacyData":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.legacyData","typename":"PersonLegacyData"}},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1":{"displayName":"Ali Watkins","__typename":"Person","url":"","contactDetails":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails","typename":"ContactDetails"},"legacyData":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.legacyData","typename":"PersonLegacyData"}},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0":{"creators":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0","typename":"Person"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1","typename":"Person"}],"__typename":"Byline","renderedRepresentation":"By Joseph Goldstein and Ali Watkins"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.displayProperties":{"fullBleedDisplayStyle":"","__typename":"CreativeWorkDisplayProperties","serveAsNyt4":false},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.0":{"__typename":"Organization","vernacular":"NYPD","isAdvertisingBrandSensitive":false,"displayName":"Police Department (NYC)"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.1":{"__typename":"Subject","vernacular":"Juvenile delinquency","isAdvertisingBrandSensitive":false,"displayName":"Juvenile Delinquency"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.2":{"__typename":"Subject","vernacular":"Facial Recognition","isAdvertisingBrandSensitive":false,"displayName":"Facial Recognition Software"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.3":{"__typename":"Subject","vernacular":"Privacy","isAdvertisingBrandSensitive":false,"displayName":"Privacy"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.4":{"__typename":"Subject","vernacular":"Government Surveillance","isAdvertisingBrandSensitive":false,"displayName":"Surveillance of Citizens by Government"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.5":{"__typename":"Subject","vernacular":"Police","isAdvertisingBrandSensitive":false,"displayName":"Police"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.6":{"__typename":"Subject","vernacular":"Civil Rights","isAdvertisingBrandSensitive":false,"displayName":"Civil Rights and Liberties"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.timesTags@filterEmpty.7":{"__typename":"Location","vernacular":"NYC","isAdvertisingBrandSensitive":false,"displayName":"New York City"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.headline":{"default":"She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.","__typename":"CreativeWorkHeadline","default@stripHtml":"She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.","seo@stripHtml":""},"Organization:T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=":{"id":"T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=","displayName":"New York Times","__typename":"Organization"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.printInformation":{"page":"1","section":"A","publicationDate":"2019-08-02T04:00:00.000Z","__typename":"PrintInformation","edition":"NewYork","headline@stripHtml":"In New York, Police Computers Scan Faces, Some as Young as 11"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.0":{"name":"mobile","stride":4,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.1":{"name":"desktop","stride":7,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.2":{"name":"mobileHoldout","stride":6,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.3":{"name":"desktopHoldout","stride":8,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.4":{"name":"hybrid","stride":4,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled":{"configs":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.0","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.1","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.2","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.3","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkled.configs.4","typename":"SprinkledConfig"}],"__typename":"SprinkledContent"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.0":{"__typename":"HeaderBasicBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.1":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.2":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.3":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.4":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.5":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.6":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.7":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.8":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.9":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.10":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.11":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.12":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.13":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.14":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.15":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.16":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.17":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.18":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.19":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.20":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.21":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.22":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.23":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.24":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.25":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.26":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.27":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.28":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.29":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.30":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.31":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.32":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.33":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.34":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.35":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.36":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.37":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.38":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.39":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.40":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.41":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.42":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.43":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.44":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.45":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.46":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.47":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.48":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.49":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.50":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.51":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.52":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.53":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.54":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.55":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.56":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.57":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.58":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.59":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.60":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.61":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.62":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.63":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.64":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.65":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.66":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.67":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.68":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.69":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.70":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.71":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.72":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.73":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.74":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.75":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.76":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content.77":{"__typename":"RelatedLinksBlock"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.0":{"uri":"nyt:\u002F\u002Fchannel\u002Fdd1a5725-c3be-4673-be2c-9055eb12c10f","__typename":"ChannelMetadata"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.1":{"uri":"nyt:\u002F\u002Fchannel\u002F7cf18b43-f1c6-4946-8a9c-4e24bad34c5c","__typename":"ChannelMetadata"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.followChannels.2":{"uri":"nyt:\u002F\u002Fchannel\u002F679a17bb-20e6-40a7-a589-e7742a2a52ed","__typename":"ChannelMetadata"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.0":{"__typename":"HeaderBasicBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.1":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.2":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.3":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.4":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.5":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.6":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.7":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.8":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.9":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.10":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.11":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.12":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.13":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.14":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.15":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.16":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.17":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.18":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.19":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.20":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.21":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.22":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.23":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.24":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.25":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.26":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.27":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.28":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.29":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.30":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.31":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.32":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.33":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.34":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.35":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.36":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.37":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.38":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.39":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.40":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.41":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.42":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.43":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.44":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.45":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.46":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.47":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.48":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.49":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.50":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.51":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.52":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.53":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.54":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.55":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.56":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.57":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.58":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.59":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.60":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.61":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.62":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.63":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.64":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.65":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.66":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.67":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.68":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.69":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.70":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.71":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.72":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.73":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.74":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.75":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.76":{"__typename":"Dropzone"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@take({\"first\":10000})@filterEmpty.77":{"__typename":"RelatedLinksBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.advertisingProperties":{"sensitivity":"SHOW_ADS","__typename":"CreativeWorkAdvertisingProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).0":{"name":"MASTER","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-articleLarge.jpg","height":400,"width":600,"name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-superJumbo.jpg","height":1365,"width":2048,"name":"superJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).1":{"name":"SMALL_SQUARE","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbStandard.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbLarge.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbStandard.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-thumbStandard.jpg","height":75,"width":75,"name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-thumbLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-thumbLarge.jpg","height":150,"width":150,"name":"thumbLarge","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).2":{"name":"SIXTEEN_BY_NINE","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg","height":900,"width":1600,"name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).3":{"name":"FACEBOOK","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-facebookJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-facebookJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-facebookJumbo.jpg","height":550,"width":1050,"name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).4":{"name":"WATCH","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-watch308.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190801nyregion01nypd-juveniles-promo01nypd-juveniles-promo-watch308.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F01nypd-juveniles-promo\u002F01nypd-juveniles-promo-watch308.jpg","height":348,"width":312,"name":"watch308","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia":{"crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).4","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.promotionalMedia.caption":{"text":"","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline":{"textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline.content.0","typename":"TextInline"}],"__typename":"Heading1Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.headline.content.0":{"__typename":"TextInline","text@stripHtml":"She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary":{"textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary.content.0","typename":"TextInline"}],"__typename":"SummaryBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.summary.content.0":{"__typename":"TextInline","text":"With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.ledeMedia":{"__typename":"ImageBlock","size":"MEDIUM","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz","typename":"Image"}},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F00nypd-juveniles.html","uri":"nyt:\u002F\u002Fimage\u002F2ad4fe36-f59f-5211-a12e-6b1f5bce2fa3","credit":"Sarah Blesener for The New York Times","legacyHtmlCaption":"“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg","name":"articleLarge","width":600,"height":900,"__typename":"ImageRendition"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-popup.jpg","name":"popup","width":334,"height":500,"__typename":"ImageRendition"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg","name":"jumbo","width":683,"height":1024,"__typename":"ImageRendition"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg","name":"superJumbo","width":1366,"height":2048,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F07\u002F30\u002Fnyregion\u002F00nypd-juveniles\u002Fmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleInline.jpg","name":"articleInline","width":190,"height":285,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190730nyregion00nypd-juvenilesmerlin_157762122_e2d17c00-b58b-4baf-b9cb-4326ac7cbcef-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMmFkNGZlMzYtZjU5Zi01MjExLWExMmUtNmIxZjViY2UyZmEz.caption":{"text":"“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, who pleaded guilty to an assault that occurred when she was 14.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline":{"textAlign":"LEFT","hideHeadshots":false,"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0","typename":"Byline"}],"role@filterEmpty":[],"__typename":"BylineBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0":{"prefix":"By","creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0","typename":"Person"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1","typename":"Person"}],"renderedRepresentation":null,"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0":{"displayName":"Joseph Goldstein","bioUrl":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fjoseph-goldstein","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia","typename":"Image"},"__typename":"Person"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-articleLarge.png","name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-popup.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-popup.png","name":"popup","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog480.png","name":"blog480","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog533.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog533.png","name":"blog533","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog427.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog427.png","name":"blog427","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagSF.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-tmagSF.png","name":"tmagSF","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagArticle.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-tmagArticle.png","name":"tmagArticle","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-slide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-slide.png","name":"slide","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-jumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-jumbo.png","name":"jumbo","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-superJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-superJumbo.png","name":"superJumbo","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blog225.png","name":"blog225","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master675.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master675.png","name":"master675","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master495.png","name":"master495","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master180.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master180.png","name":"master180","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master315.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master315.png","name":"master315","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-master768.png","name":"master768","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-popup.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog533.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog427.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagSF.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-tmagArticle.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-slide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-jumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-superJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blog225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master675.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master180.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master315.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-master768.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbStandard.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-thumbStandard.png","name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blogSmallThumb.png","name":"blogSmallThumb","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-thumbLarge.png","name":"thumbLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare168.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-smallSquare168.png","name":"smallSquare168","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-smallSquare252.png","name":"smallSquare252","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbStandard.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare168.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-smallSquare252.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square320.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-square320.png","name":"square320","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-moth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-moth.png","name":"moth","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-filmstrip.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-filmstrip.png","name":"filmstrip","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square640.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-square640.png","name":"square640","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumSquare149.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumSquare149.png","name":"mediumSquare149","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square320.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-moth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-filmstrip.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-square640.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumSquare149.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-sfSpan.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-sfSpan.png","name":"sfSpan","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontal375.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-largeHorizontal375.png","name":"largeHorizontal375","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontalJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-largeHorizontalJumbo.png","name":"largeHorizontalJumbo","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-horizontalMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-horizontalMediumAt2X.png","name":"horizontalMediumAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-sfSpan.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontal375.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeHorizontalJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-horizontalMediumAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-hpLarge.png","name":"hpLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeWidescreen573.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-largeWidescreen573.png","name":"largeWidescreen573","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-largeWidescreen573.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbWide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-thumbWide.png","name":"thumbWide","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoThumb.png","name":"videoThumb","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoLarge.png","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo210.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo210.png","name":"mediumThreeByTwo210","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo225.png","name":"mediumThreeByTwo225","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo440.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo440.png","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo252.png","name":"mediumThreeByTwo252","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo378.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumThreeByTwo378.png","name":"mediumThreeByTwo378","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoLargeAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-threeByTwoLargeAt2X.png","name":"threeByTwoLargeAt2X","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-threeByTwoMediumAt2X.png","name":"threeByTwoMediumAt2X","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoSmallAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-threeByTwoSmallAt2X.png","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.5":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-thumbWide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo210.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo440.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo252.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumThreeByTwo378.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-articleInline.png","name":"articleInline","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-hpSmall.png","name":"hpSmall","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-blogSmallInline.png","name":"blogSmallInline","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumFlexible177.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-mediumFlexible177.png","name":"mediumFlexible177","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.6":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-articleInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-hpSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-blogSmallInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-mediumFlexible177.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSmall.png","name":"videoSmall","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoHpMedium.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoHpMedium.png","name":"videoHpMedium","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine600.png","name":"videoSixteenByNine600","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine540.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine540.png","name":"videoSixteenByNine540","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine495.png","name":"videoSixteenByNine495","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine390.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine390.png","name":"videoSixteenByNine390","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine480.png","name":"videoSixteenByNine480","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine310.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine310.png","name":"videoSixteenByNine310","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine225.png","name":"videoSixteenByNine225","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine96.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine96.png","name":"videoSixteenByNine96","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine768.png","name":"videoSixteenByNine768","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine150.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNine150.png","name":"videoSixteenByNine150","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNineJumbo1600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-videoSixteenByNineJumbo1600.png","name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.7":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoHpMedium.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine600.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine540.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine390.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine310.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine96.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine768.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNine150.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-videoSixteenByNineJumbo1600.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-miniMoth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-miniMoth.png","name":"miniMoth","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-windowsTile336H.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-windowsTile336H.png","name":"windowsTile336H","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.8":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-miniMoth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-windowsTile336H.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.9":{"renditions":[],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-facebookJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-facebookJumbo.png","name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.10":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-facebookJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch308.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-watch308.png","name":"watch308","__typename":"ImageRendition"},"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch268.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F16\u002Fmultimedia\u002Fauthor-joseph-goldstein\u002Fauthor-joseph-goldstein-watch268.png","name":"watch268","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.11":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch308.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180716multimediaauthor-joseph-goldsteinauthor-joseph-goldstein-watch268.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.12":{"renditions":[],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia":{"crops":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.4","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.5","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.6","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.7","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.8","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.9","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.10","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.11","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.12","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1":{"displayName":"Ali Watkins","bioUrl":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fali-watkins","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia","typename":"Image"},"__typename":"Person"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-articleLarge.png","name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-popup.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-popup.png","name":"popup","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog480.png","name":"blog480","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog533.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog533.png","name":"blog533","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog427.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog427.png","name":"blog427","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagSF.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-tmagSF.png","name":"tmagSF","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagArticle.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-tmagArticle.png","name":"tmagArticle","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-slide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-slide.png","name":"slide","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-jumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-jumbo.png","name":"jumbo","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-superJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-superJumbo.png","name":"superJumbo","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blog225.png","name":"blog225","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master675.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master675.png","name":"master675","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master495.png","name":"master495","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master180.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master180.png","name":"master180","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master315.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master315.png","name":"master315","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-master768.png","name":"master768","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-popup.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog533.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog427.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagSF.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-tmagArticle.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-slide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-jumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-superJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blog225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master675.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master180.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master315.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-master768.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbStandard.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-thumbStandard.png","name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blogSmallThumb.png","name":"blogSmallThumb","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-thumbLarge.png","name":"thumbLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare168.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-smallSquare168.png","name":"smallSquare168","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-smallSquare252.png","name":"smallSquare252","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbStandard.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare168.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-smallSquare252.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square320.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-square320.png","name":"square320","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-moth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-moth.png","name":"moth","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-filmstrip.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-filmstrip.png","name":"filmstrip","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square640.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-square640.png","name":"square640","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumSquare149.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumSquare149.png","name":"mediumSquare149","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square320.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-moth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-filmstrip.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-square640.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumSquare149.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-sfSpan.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-sfSpan.png","name":"sfSpan","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontal375.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeHorizontal375.png","name":"largeHorizontal375","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontalJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeHorizontalJumbo.png","name":"largeHorizontalJumbo","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-horizontalMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-horizontalMediumAt2X.png","name":"horizontalMediumAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-sfSpan.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontal375.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeHorizontalJumbo.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-horizontalMediumAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-hpLarge.png","name":"hpLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen573.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeWidescreen573.png","name":"largeWidescreen573","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen1050.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-largeWidescreen1050.png","name":"largeWidescreen1050","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen573.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-largeWidescreen1050.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbWide.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-thumbWide.png","name":"thumbWide","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoThumb.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoThumb.png","name":"videoThumb","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoLarge.png","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo210.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo210.png","name":"mediumThreeByTwo210","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo225.png","name":"mediumThreeByTwo225","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo440.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo440.png","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo252.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo252.png","name":"mediumThreeByTwo252","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo378.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumThreeByTwo378.png","name":"mediumThreeByTwo378","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoLargeAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-threeByTwoLargeAt2X.png","name":"threeByTwoLargeAt2X","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoMediumAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-threeByTwoMediumAt2X.png","name":"threeByTwoMediumAt2X","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoSmallAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-threeByTwoSmallAt2X.png","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.5":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-thumbWide.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoThumb.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo210.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo440.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo252.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumThreeByTwo378.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-articleInline.png","name":"articleInline","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-hpSmall.png","name":"hpSmall","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallInline.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-blogSmallInline.png","name":"blogSmallInline","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumFlexible177.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-mediumFlexible177.png","name":"mediumFlexible177","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.6":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-articleInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-hpSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-blogSmallInline.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-mediumFlexible177.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSmall.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSmall.png","name":"videoSmall","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoHpMedium.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoHpMedium.png","name":"videoHpMedium","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine600.png","name":"videoSixteenByNine600","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine540.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine540.png","name":"videoSixteenByNine540","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine495.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine495.png","name":"videoSixteenByNine495","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine390.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine390.png","name":"videoSixteenByNine390","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine1050.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine1050.png","name":"videoSixteenByNine1050","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine480.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine480.png","name":"videoSixteenByNine480","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine310.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine310.png","name":"videoSixteenByNine310","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine225.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine225.png","name":"videoSixteenByNine225","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine96.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine96.png","name":"videoSixteenByNine96","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine768.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine768.png","name":"videoSixteenByNine768","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine150.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNine150.png","name":"videoSixteenByNine150","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNineJumbo1600.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoSixteenByNineJumbo1600.png","name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.7":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSmall.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoHpMedium.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine600.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine540.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine495.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine390.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine1050.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine480.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine310.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine225.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine96.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine768.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNine150.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoSixteenByNineJumbo1600.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-miniMoth.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-miniMoth.png","name":"miniMoth","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-windowsTile336H.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-windowsTile336H.png","name":"windowsTile336H","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoFifteenBySeven1305.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-videoFifteenBySeven1305.png","name":"videoFifteenBySeven1305","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.8":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-miniMoth.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-windowsTile336H.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-videoFifteenBySeven1305.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.9":{"renditions":[],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-facebookJumbo.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-facebookJumbo.png","name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.10":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-facebookJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch308.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-watch308.png","name":"watch308","__typename":"ImageRendition"},"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch268.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F20\u002Fmultimedia\u002Fauthor-ali-watkins\u002Fauthor-ali-watkins-watch268.png","name":"watch268","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.11":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch308.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190220multimediaauthor-ali-watkinsauthor-ali-watkins-watch268.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.12":{"renditions":[],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia":{"crops":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.4","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.5","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.6","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.7","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.8","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.9","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.10","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.11","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.1.promotionalMedia.crops.12","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.0.timestampBlock":{"timestamp":"2019-08-01T17:15:31.000Z","align":"LEFT","__typename":"TimestampBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0":{"__typename":"TextInline","text":"[What you need to know to start the day: ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0.formats.0","typename":"ItalicFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.0.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1":{"__typename":"TextInline","text":"Get New York Today in your inbox","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.0","typename":"ItalicFormat"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.1","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.1.formats.1":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002Fnewsletters\u002Fnewyorktoday?module=inline","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2":{"__typename":"TextInline","text":".]","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2.formats.0","typename":"ItalicFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.1.content.2.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.0":{"__typename":"TextInline","text":"The New York Police Department has been loading ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.1":{"__typename":"TextInline","text":"thousands of arrest photos of children and teenagers","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.2.content.2":{"__typename":"TextInline","text":" into a facial recognition database despite evidence the technology has a higher risk of false matches in younger faces. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.0":{"__typename":"TextInline","text":"For about four years, internal records show, the department has used the technology to compare crime scene images with its collection of juvenile mug ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.1":{"__typename":"TextInline","text":"shots","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.4.content.2":{"__typename":"TextInline","text":", the photos that are taken at an arrest. Most of the photos are of teenagers, largely 13 to 16 years old, but children as young as 11 have been included. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.6.content.0":{"__typename":"TextInline","text":"Elected officials and civil rights groups said the disclosure that the city was deploying a powerful surveillance tool on adolescents — whose privacy seems sacrosanct and whose status is protected in the criminal justice system — was a striking example of the Police Department’s ability to adopt advancing technology with little public scrutiny.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.8.content.0":{"__typename":"TextInline","text":"Several members of the City Council as well as a range of civil liberties groups said they were unaware of the policy until they were contacted by The New York Times. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.0":{"__typename":"TextInline","text":"Police ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.1":{"__typename":"TextInline","text":"Department officials defended the decision, ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.10.content.2":{"__typename":"TextInline","text":"saying it was just the latest evolution of a longstanding policing technique: using arrest photos to identify suspects.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.12.content.0":{"__typename":"TextInline","text":"“I don’t think this is any secret decision that’s made behind closed doors,” the city’s chief of detectives, Dermot F. Shea, said in an interview. “This is just process, and making sure we’re doing everything to fight crime.” ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.0":{"__typename":"TextInline","text":"Other cities have begun to debate whether law enforcement should use facial recognition, which relies on an algorithm to quickly pore through images and suggest matches. In May, ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1":{"__typename":"TextInline","text":"San Francisco blocked city agencies, including the police","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F05\u002F14\u002Fus\u002Ffacial-recognition-ban-san-francisco.html?module=inline","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.2":{"__typename":"TextInline","text":", from using the tool amid unease about potential government ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.3":{"__typename":"TextInline","text":"abuse","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.4":{"__typename":"TextInline","text":". ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5":{"__typename":"TextInline","text":"Detroit is facing public resistance to a technology ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.5.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F07\u002F08\u002Fus\u002Fdetroit-facial-recognition-cameras.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.14.content.6":{"__typename":"TextInline","text":"that has been shown to have lower accuracy with people with darker skin. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.0":{"__typename":"TextInline","text":"In New York, the state Education Department recently told the Lockport, N.Y., ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.16.content.1":{"__typename":"TextInline","text":"school district to delay a plan to use facial recognition on students, citing privacy concerns. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.0":{"__typename":"TextInline","text":"“At the end ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.1":{"__typename":"TextInline","text":"of the day, it should be banned — no young people,” said ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.2":{"__typename":"TextInline","text":"Councilman Donovan Richards","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.18.content.3":{"__typename":"TextInline","text":", a Queens Democrat who heads the Public Safety Committee, which oversees the Police Department. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.0":{"__typename":"TextInline","text":"The department said its legal bureau had approved using facial recognition on juveniles. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1":{"__typename":"TextInline","text":"The algorithm may suggest a lead, but detectives would not make an arrest based solely on ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F09\u002Fopinion\u002Ffacial-recognition-police-new-york-city.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2":{"__typename":"TextInline","text":"that","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.2.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F09\u002Fopinion\u002Ffacial-recognition-police-new-york-city.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.20.content.3":{"__typename":"TextInline","text":", Chief Shea said.","formats":[]},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F08\u002F01\u002Fnyregion\u002F00nypd-juveniles2.html","uri":"nyt:\u002F\u002Fimage\u002F5a694c3e-2066-51a1-965d-4be8779badef","credit":"Chang W. Lee\u002FThe New York Times","legacyHtmlCaption":"Dermot Shea, the city&rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg","name":"articleLarge","width":600,"height":400,"__typename":"ImageRendition"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-popup.jpg","name":"popup","width":650,"height":433,"__typename":"ImageRendition"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg","name":"jumbo","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg","name":"superJumbo","width":2048,"height":1365,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F08\u002F02\u002Fnyregion\u002F02nypdjuveniles1-print\u002Fmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleInline.jpg","name":"articleInline","width":190,"height":127,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190802nyregion02nypdjuveniles1-printmerlin_152191512_83c5140a-fad8-400e-b645-a28f31fd7d26-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE2OTRjM2UtMjA2Ni01MWExLTk2NWQtNGJlODc3OWJhZGVm.caption":{"text":"Dermot Shea, the city&rsquo;s chief of detectives, said investigators would not arrest anyone based solely on a facial recognition match.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.24.content.0":{"__typename":"TextInline","text":"Still, facial recognition has not been widely tested on children. Most algorithms are taught to “think” based on adult faces, and there is growing evidence that they do not work as well on children. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.0":{"__typename":"TextInline","text":"The National Institute of Standards and Technology","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.1":{"__typename":"TextInline","text":", which is part of the Commerce Department and ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2":{"__typename":"TextInline","text":"evaluates facial recognition ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.2.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fnvlpubs.nist.gov\u002Fnistpubs\u002Fir\u002F2018\u002FNIST.IR.8238.pdf","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3":{"__typename":"TextInline","text":"algorithms","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.3.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fnvlpubs.nist.gov\u002Fnistpubs\u002Fir\u002F2018\u002FNIST.IR.8238.pdf","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.4":{"__typename":"TextInline","text":" for accuracy, recently found the ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.5":{"__typename":"TextInline","text":"vast majority of more than 100 ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.6":{"__typename":"TextInline","text":"facial recognition ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.7":{"__typename":"TextInline","text":"algorithms had a higher rate of mistaken matches among children. The ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.8":{"__typename":"TextInline","text":"e","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.26.content.9":{"__typename":"TextInline","text":"rror rate was most pronounced in young children but was also seen in those aged 10 to 16.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.0":{"__typename":"TextInline","text":"Aging poses another problem:","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.1":{"__typename":"TextInline","text":" The appearance of children and adolescents can change ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.28.content.2":{"__typename":"TextInline","text":" drastically as bones stretch and shift, altering the underlying facial structure. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.0":{"__typename":"TextInline","text":"“I would use extreme caution in using those algorithms,” said ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.1":{"__typename":"TextInline","text":"Karl Ricanek Jr.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.2":{"__typename":"TextInline","text":", a computer science professor and ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.3":{"__typename":"TextInline","text":"co-founder of the Face Aging Group at the University of North Carolina-","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.4":{"__typename":"TextInline","text":"Wilmington","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.30.content.5":{"__typename":"TextInline","text":". ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.32.content.0":{"__typename":"TextInline","text":"Technology that can match an image of a younger teenager to a recent arrest photo may be less effective at finding the same person even one or two years later, he said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.34.content.0":{"__typename":"TextInline","text":" “The systems do not have the capacity to understand the dynamic changes that occur to a child’s face,” Dr. Ricanek said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.0":{"__typename":"TextInline","text":"Idemia","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.1":{"__typename":"TextInline","text":" and ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.2":{"__typename":"TextInline","text":"DataWorks Plus","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.36.content.3":{"__typename":"TextInline","text":", the two companies that provide facial recognition software to the Police Department, did not respond to requests for comment. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.0":{"__typename":"TextInline","text":"The New York Police Department can take arrest photos of minors as young as ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.1":{"__typename":"TextInline","text":"11","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.38.content.2":{"__typename":"TextInline","text":" who are charged with a felony, depending on the severity of the charge. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.40.content.0":{"__typename":"TextInline","text":"And in many cases, the department keeps the photos for years, making facial recognition comparisons to what may have effectively become outdated images. There are photos of 5,500 individuals in the juvenile database, 4,100 of whom are no longer 16 or under, the department said. Teenagers 17 and older are considered adults in the criminal justice system. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.42.content.0":{"__typename":"TextInline","text":"Police officials declined to provide statistics on how often their facial recognition systems provide false matches, or to explain how they evaluate the system’s effectiveness.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.44.content.0":{"__typename":"TextInline","text":"“We are comfortable with this technology because it has proved to be a valuable investigative method,” Chief Shea said. Facial recognition has helped lead to thousands of arrests of both adults and juveniles, the department has said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.46.content.0":{"__typename":"TextInline","text":"Mayor Bill de Blasio had been aware the department was using the technology on minors, said Freddi Goldstein, a spokeswoman for the mayor. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.48.content.0":{"__typename":"TextInline","text":"She said the Police Department followed “strict guidelines” in applying the technology and City Hall monitored the agency’s compliance with the policies. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.0":{"__typename":"TextInline","text":"The Times learned details of the department’s use of facial recognition by reviewing documents posted online earlier this year by ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1":{"__typename":"TextInline","text":"Clare Garvie, a senior associate","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.flawedfacedata.com\u002F#footnote5","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2":{"__typename":"TextInline","text":" at the Center on Privacy and Technology at Georgetown Law","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.2.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.flawedfacedata.com\u002F#footnote5","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.50.content.3":{"__typename":"TextInline","text":". Ms. Garvie received the documents as part of an open records lawsuit. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.52.content.0":{"__typename":"TextInline","text":"It could not be determined whether other large police departments used facial recognition with juveniles because very few have written policies governing the use of the technology, Ms. Garvie said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.0":{"__typename":"TextInline","text":"New York detectives rely on a vast network","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.54.content.1":{"__typename":"TextInline","text":" of surveillance cameras throughout the city to provide images of people believed to have committed a crime. Since 2011, the department has had a dedicated unit of officers who use facial recognition to compare those images against millions of photos, usually mug shots. The software proposes matches, which have led to thousands of arrests, the department said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.56.content.0":{"__typename":"TextInline","text":"By 2013, top police officials were meeting to discuss including juveniles in the program, the documents reviewed by The Times showed. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.58.content.0":{"__typename":"TextInline","text":"The documents showed that the juvenile database had been integrated into the system by 2015. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.59.content.0":{"__typename":"TextInline","text":"“We have these photos. It makes sense,” Chief Shea said in the interview. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.0":{"__typename":"TextInline","text":"State law requires that arrest photos be destroyed if the case is resolved in the juvenile’s favor, or if the child is found to have committed only a misdemeanor, rather than a felony. The photos also must be destroyed if a person reaches age 21 without a criminal record. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.61.content.1":{"__typename":"TextInline","text":" ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.63.content.0":{"__typename":"TextInline","text":"When children are charged with crimes, the court system usually takes some steps to prevent their acts from defining them in later years. Children who are 16 and under, for instance, are generally sent to Family Court, where records are not public. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.65.content.0":{"__typename":"TextInline","text":"Yet including their photos in a facial recognition database runs the risk that an imperfect algorithm identifies them as possible suspects in later crimes, civil rights advocates said. A mistaken match could lead investigators to focus on the wrong person from the outset, they said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.67.content.0":{"__typename":"TextInline","text":"“It’s very disturbing to know that no matter what I’m doing at that moment, someone might be scanning my picture to try to find someone who committed a crime,” said Bailey, a 17-year-old Brooklyn girl who had admitted guilt in Family Court to a group attack that happened when she was 14. She said she was present at the attack but did not participate. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.0":{"__typename":"TextInline","text":"Bailey, who asked that she be identified only by her ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.1":{"__typename":"TextInline","text":"last name","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.69.content.2":{"__typename":"TextInline","text":" because she did not want her juvenile arrest to be public, has not been arrested again and is now a student at John Jay College of Criminal Justice. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.0":{"__typename":"TextInline","text":"R","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.1":{"__typename":"TextInline","text":"ecent studies indicate that people of color, as well as children and women, have a greater risk of misidentification than their counterparts, sai","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.2":{"__typename":"TextInline","text":"d ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.3":{"__typename":"TextInline","text":"Joy Buolamwini","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.4":{"__typename":"TextInline","text":", ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.5":{"__typename":"TextInline","text":"the founder of the Algorithmic Justice League and graduate researcher at the M.I.T. Media Lab","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.71.content.6":{"__typename":"TextInline","text":", who has examined how human biases are built into artificial intelligence. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.0":{"__typename":"TextInline","text":"The racial disparities in the juvenile justice system are stark: In New York, black and Latino juveniles were charged with crimes at far higher rates than whites in 2017, the most recent year for which numbers were available. Black juveniles outnumbered white juveniles ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1":{"__typename":"TextInline","text":"more than 15 to 1","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.criminaljustice.ny.gov\u002Fcrimnet\u002Fojsa\u002Fjj-reports\u002Fnewyorkcity.pdf","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.73.content.2":{"__typename":"TextInline","text":".","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.75.content.0":{"__typename":"TextInline","text":"“If the facial recognition algorithm has a negative bias toward a black population, that will get magnified more toward children,” Dr. Ricanek said, adding that in terms of diminished accuracy, “you’re now putting yourself in unknown territory.”","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0":{"__typename":"Article","promotionalHeadline":"Facial Recognition Makes You Safer","promotionalSummary":"Used properly, the software effectively identifies crime suspects without violating rights.","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.headline","typename":"CreativeWorkHeadline"},"summary":"Used properly, the software effectively identifies crime suspects without violating rights.","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F09\u002Fopinion\u002Ffacial-recognition-police-new-york-city.html","firstPublished":"2019-06-09T23:00:05.000Z","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia","typename":"Image"},"section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==","typename":"Section"},"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0","typename":"Byline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.headline":{"default":"How Facial Recognition Makes You Safer","__typename":"CreativeWorkHeadline"},"ImageRendition:images20190607opinionsunday07Oneill07Oneill-videoLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002Fsunday\u002F07Oneill\u002F07Oneill-videoLarge.jpg","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20190607opinionsunday07Oneill07Oneill-mediumThreeByTwo440.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002Fsunday\u002F07Oneill\u002F07Oneill-mediumThreeByTwo440.jpg","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20190607opinionsunday07Oneill07Oneill-threeByTwoSmallAt2X.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002Fsunday\u002F07Oneill\u002F07Oneill-threeByTwoSmallAt2X.jpg","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190607opinionsunday07Oneill07Oneill-videoLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinionsunday07Oneill07Oneill-mediumThreeByTwo440.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinionsunday07Oneill07Oneill-threeByTwoSmallAt2X.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia":{"crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1":{"__typename":"Article","promotionalHeadline":"Spying on Children Won’t Keep Them Safe","promotionalSummary":"This week my daughter’s school became the first in the nation to pilot facial-recognition software. The technology’s potential is chilling.","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.headline","typename":"CreativeWorkHeadline"},"summary":"This week my daughter’s school became the first in the nation to pilot facial-recognition software. The technology’s potential is chilling.","url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F06\u002F07\u002Fopinion\u002Flockport-facial-recognition-schools.html","firstPublished":"2019-06-07T15:00:05.000Z","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia","typename":"Image"},"section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==","typename":"Section"},"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0","typename":"Byline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.headline":{"default":"Spying on Children Won’t Keep Them Safe","__typename":"CreativeWorkHeadline"},"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-videoLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002F07shultz-privacy\u002F07shultz-privacy-videoLarge.jpg","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-mediumThreeByTwo440.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002F07shultz-privacy\u002F07shultz-privacy-mediumThreeByTwo440.jpg","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-threeByTwoSmallAt2X.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F06\u002F07\u002Fopinion\u002F07shultz-privacy\u002F07shultz-privacy-threeByTwoSmallAt2X.jpg","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-videoLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-mediumThreeByTwo440.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190607opinion07shultz-privacy07shultz-privacy-threeByTwoSmallAt2X.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia":{"crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0","typename":"ImageCrop"}],"__typename":"Image"},"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==":{"id":"U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2Q3YTcxMTg1LWFhNjAtNTYzNS1iY2UwLTVmYWI3NmM3YzI5Nw==","displayName":"Opinion","__typename":"Section"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0.creators.0":{"displayName":"James O’Neill","__typename":"Person"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0":{"creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.0.bylines.0.creators.0","typename":"Person"}],"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0.creators.0":{"displayName":"Jim Shultz","__typename":"Person"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0":{"creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.sprinkledBody.content@filterEmpty.77.related@filterEmpty.1.bylines.0.creators.0","typename":"Person"}],"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.legacy":{"reviewInformation":"","__typename":"ArticleLegacyData","htmlExtendedAuthorOrArticleInformation":"","htmlInfoBox":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.0":{"type":"twitter","account":"JoeKGoldstein","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.1":{"type":"url","account":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fjoseph-goldstein","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails":{"socialMedia":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.0","typename":"ContactDetailsSocialMedia"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.contactDetails.socialMedia.1","typename":"ContactDetailsSocialMedia"}],"__typename":"ContactDetails"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.0.legacyData":{"htmlShortBiography":"\u003Cp\u003EJoseph Goldstein writes about policing and the criminal justice system. He has been a reporter at The Times since 2011, and is based in New York. He also worked for a year in the Kabul bureau, reporting on Afghanistan.\u003C\u002Fp\u003E","__typename":"PersonLegacyData"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.0":{"type":"url","account":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fali-watkins","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.1":{"type":"twitter","account":"AliWatkins","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails":{"socialMedia":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.0","typename":"ContactDetailsSocialMedia"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.contactDetails.socialMedia.1","typename":"ContactDetailsSocialMedia"}],"__typename":"ContactDetails"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==.bylines.0.creators.1.legacyData":{"htmlShortBiography":"\u003Cp\u003EAli Watkins is a reporter on the Metro Desk, covering courts and social services. Previously, she covered national security in Washington for The Times, BuzzFeed and McClatchy Newspapers.\u003C\u002Fp\u003E","__typename":"PersonLegacyData"},"ROOT_QUERY":{"workOrLocation({\"id\":\"\u002F2019\u002F08\u002F01\u002Fnyregion\u002Fnypd-facial-recognition-children-teenagers.html\"})":{"type":"id","generated":false,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzlkYTU4MjQ2LTI0OTUtNTA1Zi05YWJkLWI1ZmRhOGU2N2I1Ng==","typename":"Article"}}},"config":{"gqlUrl":"https:\u002F\u002Fsamizdat-graphql.nytimes.com\u002Fgraphql\u002Fv2","gqlRequestHeaders":{"nyt-app-type":"project-vi","nyt-app-version":"0.0.5","nyt-token":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs+\u002FoUCTBmD\u002FcLdmcecrnBMHiU\u002FpxQCn2DDyaPKUOXxi4p0uUSZQzsuq1pJ1m5z1i0YGPd1U1OeGHAChWtqoxC7bFMCXcwnE1oyui9G1uobgpm1GdhtwkR7ta7akVTcsF8zxiXx7DNXIPd2nIJFH83rmkZueKrC4JVaNzjvD+Z03piLn5bHWU6+w+rA+kyJtGgZNTXKyPh6EC6o5N+rknNMG5+CdTq35p8f99WjFawSvYgP9V64kgckbTbtdJ6YhVP58TnuYgr12urtwnIqWP9KSJ1e5vmgf3tunMqWNm6+AnsqNj8mCLdCuc5cEB74CwUeQcP2HQQmbCddBy2y0mEwIDAQAB"},"gqlFetchTimeout":4000,"disablePersistedQueries":false,"initialDeviceType":"desktop","fastlyAbraConfig":{},"serviceWorkerFile":"service-worker-test-1565019880489.js"},"ssrQuery":{},"initialLocation":{"pathname":"\u002F2019\u002F08\u002F01\u002Fnyregion\u002Fnypd-facial-recognition-children-teenagers.html"},"externalAssets":[]};</script>
+ <script>!function(e){function r(r){for(var n,i,a=r[0],f=r[1],l=r[2],p=0,s=[];p<a.length;p++)i=a[p],o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(c&&c(r);s.length;)s.shift()();return u.push.apply(u,l||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,a=1;a<t.length;a++){var f=t[a];0!==o[f]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={37:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="/vi-assets/static-assets/";var a=window.webpackJsonp=window.webpackJsonp||[],f=a.push.bind(a);a.push=r,a=a.slice();for(var l=0;l<a.length;l++)r(a[l]);var c=f;t()}([]);
+//# sourceMappingURL=runtime~adslot-a45e9d5711d983de8fda.js.map</script>
+ <script async src="/vi-assets/static-assets/adslot-88dc25fbfb7328ff1466.js"></script>
+ <script>!function(e){function r(r){for(var o,n,c=r[0],i=r[1],s=r[2],f=0,l=[];f<c.length;f++)n=c[f],d[n]&&l.push(d[n][0]),d[n]=0;for(o in i)Object.prototype.hasOwnProperty.call(i,o)&&(e[o]=i[o]);for(b&&b(r);l.length;)l.shift()();return a.push.apply(a,s||[]),t()}function t(){for(var e,r=0;r<a.length;r++){for(var t=a[r],o=!0,c=1;c<t.length;c++){var i=t[c];0!==d[i]&&(o=!1)}o&&(a.splice(r--,1),e=n(n.s=t[0]))}return e}var o={},d={39:0},a=[];function n(r){if(o[r])return o[r].exports;var t=o[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,n),t.l=!0,t.exports}n.e=function(e){var r=[],t=d[e];if(0!==t)if(t)r.push(t[2]);else{var o=new Promise(function(r,o){t=d[e]=[r,o]});r.push(t[2]=o);var a,c=document.createElement("script");c.charset="utf-8",c.timeout=120,n.nc&&c.setAttribute("nonce",n.nc),c.src=function(e){return n.p+""+({1:"answerpage~bestsellers~collections~hubpage~reviews~search~slideshow~timeswire~weddings",2:"vendors~audio~home~paidpost~story~trending~video",3:"bestsellers~byline~collections~reviews~trending",4:"vendors~answerpage~audio~slideshow~story",5:"vendors~audio~home~paidpost~story",6:"byline~timeswire~your-list",7:"answerpage~getstarted",8:"bestsellers~hubpage",9:"newsletter~regilite",10:"vendors~paidpost~video",11:"vendors~video~videoblock",13:"answerpage",14:"audio",15:"audioblock",16:"bestsellers",17:"blank",18:"byline",19:"coderedeem",20:"collections",21:"comments",22:"episodefooter",23:"getstarted",24:"home",25:"hubpage",28:"newsletter",29:"newsletters",30:"paidpost",31:"privacy",32:"programmables",33:"recirculation",34:"refer",35:"regilite",36:"reviews",40:"search",41:"slideshow",42:"stickyfilljs",43:"story",44:"timeswire",45:"trending",46:"vendors~audioblock",47:"vendors~collections",48:"vendors~episodefooter",49:"vendors~home",50:"vendors~slideshow",51:"video",52:"videoblock",53:"weddings",54:"your-list"}[e]||e)+"-"+{1:"3f4fa7221ef1476092a3",2:"99859b76d5b5d9a29339",3:"6f48de596aff21cee9e2",4:"4a8420b672b0eb786710",5:"ebc6aacf5f0b0f00d939",6:"cb31ca27d295accb8d47",7:"80921fe67fb06673afe2",8:"2cb427a40932c00d5467",9:"c17835f4020a81b3ebdf",10:"e6333c5f0c9d44a562b9",11:"340b908d6bbf26111cf8",13:"8c464e3538096d914776",14:"926f804d67e8a45a9f10",15:"287cb8154113b7f25784",16:"f4baccd76f2f8e8d9db8",17:"2102d3a3d664a932bad1",18:"7e235f2b3d6d19b68ded",19:"dd19d8e9f879d86abb75",20:"74e3e7b1d52b7fc14653",21:"bfae7d48bcf7e6c8ab89",22:"d32caaca6c5936978d4a",23:"300b3f609b3056db6c18",24:"e7c1959c1d8ba140707f",25:"c0e7bb29b120c3c2d802",28:"3ae59c9859d057a0249a",29:"e951dbf493cdf3558858",30:"c108afd87ed307bd7c43",31:"493cddaf9cad7abf670c",32:"3c3cfd695943ed02249d",33:"dc560ec354d5e74e6e39",34:"3202500fd0bc711d8680",35:"67182278afc38ad823b1",36:"f189bd767bbe13f59254",40:"33f98b7462fec3740a1d",41:"1d22c2cff98639b0c7b7",42:"8640087ba86873ebebae",43:"5230dd3423d03f5eb0b8",44:"2db55c4529c54890b4bd",45:"4614204aab86dd2d820f",46:"8574ab7f8faa5e4151d8",47:"07007634cf48d865ae1a",48:"1e063f58b4e3da82fc25",49:"6e63337189383a709584",50:"ab09592f64b71ce13dba",51:"35bd41b25aecc8dbc38b",52:"e71ac27943b9c0dc2f1c",53:"65894e06a558684c455b",54:"cf5b2e08b6f7a84842e2"}[e]+".js"}(e),a=function(r){c.onerror=c.onload=null,clearTimeout(i);var t=d[e];if(0!==t){if(t){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src,n=new Error("Loading chunk "+e+" failed.\n("+o+": "+a+")");n.type=o,n.request=a,t[1](n)}d[e]=void 0}};var i=setTimeout(function(){a({type:"timeout",target:c})},12e4);c.onerror=c.onload=a,document.head.appendChild(c)}return Promise.all(r)},n.m=e,n.c=o,n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,r){if(1&r&&(e=n(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(n.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)n.d(t,o,function(r){return e[r]}.bind(null,o));return t},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},n.p="/vi-assets/static-assets/",n.oe=function(e){throw console.error(e),e};var c=window.webpackJsonp=window.webpackJsonp||[],i=c.push.bind(c);c.push=r,c=c.slice();for(var s=0;s<c.length;s++)r(c[s]);var b=i;t()}([]);
+//# sourceMappingURL=runtime~main-262212ad851d651999bf.js.map</script>
+ <script defer src="/vi-assets/static-assets/vendor-3389f9c978bdc7cb443c.js"></script>
+ <script defer src="/vi-assets/static-assets/story-5230dd3423d03f5eb0b8.js"></script>
+ <script defer src="/vi-assets/static-assets/main-72d661c291004bc90d1b.js"></script>
+ <script>
+(function(w, l) {
+ w[l] = w[l] || [];
+ w[l].push({
+ 'gtm.start': new Date().getTime(),
+ event: 'gtm.js'
+ });
+})(window, 'dataLayer');
+(function(){
+ var url = 'https://et.nytimes.com/pixel' +
+ '?url=' + window.location.href +
+ '&referrer=' + document.referrer +
+ '&subject=module-interactions' +
+ '&moduleData=%7B%22module%22%3A%22nyt-vi-page-pixel%22%2C%22pgType%22%3A%22%22%2C%22eventName%22%3A%22Impression%22%2C%22action%22%3A%22Impression%22%7D' +
+ '&sourceApp=nyt-vi&instant=1' +
+ '&_=' + Date.now();
+ var img = document.createElement('img');
+ img.src = url;
+ img.alt = "";
+ img.style.cssText = 'position: absolute; z-index: -999999; left: -1000px; top: -1000px;';
+ document.body.appendChild(img);
+})();
+</script>
+ <script defer src="https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x"></script>
+<noscript>
+<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-P528B3&gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&gtm_preview=env-130&gtm_cookies_win=x" height="0" width="0" style="display:none;visibility:hidden"></iframe>
+</noscript>
+ <div id="RavenInstaller">
+<script>
+if (window.INSTALL_RAVEN) {
+ window.addEventListener('load', function(event) {
+ var includeRaven = document.getElementById("RavenInstaller");
+ var script = document.createElement("script");
+ script.src = "/vi-assets/static-assets/raven.min-830a6d04a55c283934dd1893d6ddc66d.js";
+ script.onload = function() {
+ /* eslint-disable */
+// Install Raven
+window.Raven.config('https://7bc8bccf5c254286a99b11c68f6bf4ce@sentry.io/178860', {
+ release: vi.env.RELEASE,
+ environment: vi.env.ENVIRONMENT,
+ ignoreErrors: [/SecurityError: Blocked a frame with origin.*/]
+}).install(); // Stop using our error handler
+
+window.nyt_errors.ravenInstalled = true;
+var regex = /nyt-a=(.*?)(;|$)/;
+var id = regex.exec(document.cookie);
+
+if (id !== null) {
+ id = id[1];
+} else {
+ id = '';
+} // Setting nyt-a as user context
+
+
+window.Raven.setUserContext({
+ id: id
+}); // Pass collected errors to Raven
+
+window.nyt_errors.list.forEach(function (err) {
+ // weird?
+ if (!err) {
+ return;
+ } // also weird ... ?
+
+
+ if (!err.err) {
+ // maybe err itself is an Error?
+ if (err instanceof Error) {
+ window.Raven.captureException(err, err.data || {});
+ } // else { silently ignore? }
+
+ } // just making sure ...
+
+
+ if (err.err instanceof Error) {
+ window.Raven.captureException(err.err, err.data || {});
+ } // else { silently ignore? }
+
+}); // Pass collected Tags to Raven
+
+window.nyt_errors.tags.forEach(function (tag) {
+ window.Raven.setTagsContext(tag);
+});
+ };
+ includeRaven.appendChild(script);
+ });
+}
+</script>
+</div>
+
+
+ </body>
+</html>
diff --git a/test/fixtures/rich_media/amz.html b/test/fixtures/rich_media/amz.html
new file mode 100644
index 000000000..d4f8bd1a3
--- /dev/null
+++ b/test/fixtures/rich_media/amz.html
@@ -0,0 +1,5 @@
+<meta name="twitter:card" content="summary" />
+<meta name="twitter:site" content="@flickr" />
+<meta name="twitter:title" content="Small Island Developing States Photo Submission" />
+<meta name="twitter:description" content="View the album on Flickr." />
+<meta name="twitter:image" content="https://pleroma.s3.ap-southeast-1.amazonaws.com/sachin%20%281%29%20_a%20-%25%2Aasdasd%20BNN%20bnnn%20.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIBLWWK6RGDQXDLJQ%2F20190716%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=20190716T175105Z&X-Amz-Expires=300000&X-Amz-Signature=04ffd6b98634f4b1bbabc62e0fac4879093cd54a6eed24fe8eb38e8369526bbf&X-Amz-SignedHeaders=host" />
diff --git a/test/fixtures/rich_media/non_ogp_embed.html b/test/fixtures/rich_media/non_ogp_embed.html
new file mode 100644
index 000000000..62a1d677a
--- /dev/null
+++ b/test/fixtures/rich_media/non_ogp_embed.html
@@ -0,0 +1,1479 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
+ <meta charset="UTF-8">
+ <link rel="apple-touch-icon-precomposed" sizes="57x57" href="https://img.mfcimg.com/images/favicons/apple-touch-icon-57x57.png?nc=1" />
+<link rel="apple-touch-icon-precomposed" sizes="114x114" href="https://img.mfcimg.com/images/favicons/apple-touch-icon-114x114.png?nc=1" />
+<link rel="apple-touch-icon-precomposed" sizes="72x72" href="https://img.mfcimg.com/images/favicons/apple-touch-icon-72x72.png?nc=1" />
+<link rel="apple-touch-icon-precomposed" sizes="144x144" href="https://img.mfcimg.com/images/favicons/apple-touch-icon-144x144.png?nc=1" />
+<link rel="apple-touch-icon-precomposed" sizes="60x60" href="https://img.mfcimg.com/images/favicons/apple-touch-icon-60x60.png?nc=1" />
+<link rel="apple-touch-icon-precomposed" sizes="120x120" href="https://img.mfcimg.com/images/favicons/apple-touch-icon-120x120.png?nc=1" />
+<link rel="apple-touch-icon-precomposed" sizes="76x76" href="https://img.mfcimg.com/images/favicons/apple-touch-icon-76x76.png?nc=1" />
+<link rel="apple-touch-icon-precomposed" sizes="152x152" href="https://img.mfcimg.com/images/favicons/apple-touch-icon-152x152.png?nc=1" />
+<link rel="icon" type="image/png" href="https://img.mfcimg.com/images/favicons/favicon-196x196.png?nc=1" sizes="196x196" />
+<link rel="icon" type="image/png" href="https://img.mfcimg.com/images/favicons/favicon-96x96.png?nc=1" sizes="96x96" />
+<link rel="icon" type="image/png" href="https://img.mfcimg.com/images/favicons/favicon-32x32.png?nc=1" sizes="32x32" />
+<link rel="icon" type="image/png" href="https://img.mfcimg.com/images/favicons/favicon-16x16.png?nc=1" sizes="16x16" />
+<link rel="icon" type="image/png" href="https://img.mfcimg.com/images/favicons/favicon-128.png?nc=1" sizes="128x128" />
+<meta name="application-name" content="MyFreeCams.com Profiles" />
+<meta name="msapplication-TileColor" content="#008000" />
+<meta name="msapplication-TileImage" content="https://img.mfcimg.com/images/favicons/mstile-144x144.png?nc=1" />
+<meta name="msapplication-square70x70logo" content="https://img.mfcimg.com/images/favicons/mstile-70x70.png?nc=1" />
+<meta name="msapplication-square150x150logo" content="https://img.mfcimg.com/images/favicons/mstile-150x150.png?nc=1" />
+<meta name="msapplication-wide310x150logo" content="https://img.mfcimg.com/images/favicons/mstile-310x150.png?nc=1" />
+<meta name="msapplication-square310x310logo" content="https://img.mfcimg.com/images/favicons/mstile-310x310.png?nc=1" />
+
+ <script src="https://img.mfcimg.com/profiles/jquery/jquery-1.9.1.min.js"></script>
+<script src="https://img.mfcimg.com/profiles/jquery/jquery-ui-1.9.2.min.js"></script>
+<script src="https://img.mfcimg.com/profiles/jquery/jquery.ui.touch-punch.min.js"></script> <script>
+ var g_hPlatform = { "id": 1, "domain": "myfreecams.com", "name": "MyFreeCams", "code": "mfc", "image_url": "https://img.mfcimg.com/" };
+
+ try { document.domain = 'myfreecams.com'; } catch (e) {}
+
+ var MfcAssets = {
+ images: "/bundles/mfcprofile/vendor/img/",
+ urls: {
+ www: "https://www.myfreecams.com/",
+ new_comments: "/BlueAngelLove/comments/since/0"
+ }
+ };
+
+ var MfcPageVars = {
+ userId: 0,
+ accessLevel: 0,
+ token: "xIqyjzUBSrt6Rbl_su7UOrDxNZJlZNc4nsWh6eXxDkg",
+ profileState: {"number":127,"string":"Offline"},
+ serverTime: {"unixTime":1561209909,"time":"6:25am PDT","dst":1},
+ profileUsername: "BlueAngelLove",
+ admirers: 4719,
+ username: "",
+ userPhotoUrl: "",
+ vToken: "4c4ea23b221f89b73c964b7f99a50f78",
+ avatarRev: 0,
+ avgRating: {"rating_count":7060,"rating_average":"4.8681"},
+ rating: 0
+};
+
+
+ function MfcProfilePage( jQuery )
+ {
+ var _self = this;
+
+ _self.$ = jQuery;
+
+ _self.token = ( typeof(MfcPageVars) !== 'undefined' && MfcPageVars.token ) ? MfcPageVars.token : _self.$('meta[name=token]').attr('content');
+
+ _self.beforeDomReady();
+
+
+ _self.$(function(){ _self.afterDomReady(); });
+ };
+
+ MfcProfilePage.prototype.beforeDomReady = function()
+ {
+ var _self = this;
+ var $ = _self.$;
+
+ if ( _self.token )
+ {
+ $.ajaxSetup({
+ beforeSend: function(xhr, settings) {
+ if ( settings.type === 'GET' || settings.crossDomain )
+ return;
+
+ if ( $.type(settings.data) === 'object' && $.type(settings.data.append) === 'function' )
+ {
+ settings.data.append('_token', _self.token);
+ }
+ else if ( $.type(settings.data) === 'string' && settings.data.indexOf('_token=') === -1 )
+ {
+ if ( settings.data.length === 0 )
+ {
+ xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
+ } else {
+ settings.data += '&';
+ }
+
+ settings.data += encodeURIComponent('_token') + '=' + encodeURIComponent(_self.token);
+ }
+ }
+ });
+
+ $(document).on('submit', 'form', function(e)
+ {
+ if ( ! $(this).find('#_token').length && ! $(this).data('mfc-no-token') )
+ $(this).append($('<input type="hidden" name="_token" id="_token" value="' + _self.token + '">'));
+ });
+ }
+ };
+
+ MfcProfilePage.prototype.afterDomReady = function()
+ {
+ var _self = this;
+ var $ = this.$;
+
+ var page = $('body').data('mfc-page');
+
+ if ( $.isFunction(_self[page]) )
+ _self[page]();
+ };
+
+ new MfcProfilePage(jQuery);
+</script>
+
+ <link href="https://img.mfcimg.com/profiles/prod/22793316144741120/css/profiles.css?nc=22793316144741120" type="text/css" rel="stylesheet">
+
+ <title>BlueAngelLove's Homepage on MyFreeCams.com</title>
+ <meta name="description" content="BlueAngelLove's webcam homepage on MyFreeCams.com - your #1 adult webcam community">
+ <meta name="keywords" content="webcams,models,adult,community,nude,chat,video">
+
+ <style type="text/css">
+ body.mfc_display_inline_mode #header_bar, body.mfc_display_inline_mode #footer_bar {
+ visibility: hidden;
+ }
+ body.mfc_profile_standard.mfc_display_inline_mode {
+ margin-left: 0;
+ margin-right: 0;
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+ body.mfc_profile_standard.mfc_display_inline_mode #profile_about_me {
+ display: flex;
+ flex-flow: wrap;
+ }
+ body.mfc_profile_standard.mfc_display_inline_mode #profile_about_me .heading {
+ flex: 0 0 100%;
+ }
+ body.mfc_profile_standard.mfc_display_inline_mode #profile_about_me .container {
+ flex: 0 1 50%;
+ margin: 0;
+ padding: 0;
+ }
+ body.mfc_profile_standard.mfc_display_inline_mode #profile_about_me #about_me_container, body.mfc_profile_standard.mfc_display_inline_mode #profile_about_me #tags_container {
+ flex: 0 0 100%;
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+ @media (max-width: 850px) {
+ body.mfc_profile_standard.mfc_display_inline_mode #profile_about_me .container {
+ flex: 0 0 100%;
+ }
+ }
+ @media (min-width: 1500px) {
+ body.mfc_profile_standard.mfc_display_inline_mode #profile_about_me .container {
+ flex: 0 0 33%;
+ }
+ }
+ </style>
+
+ <link href="/BlueAngelLove/css?nc=204272526" rel="stylesheet" type="text/css">
+
+
+ <script type="text/javascript">
+ g_bInIframe = (function(w) {
+ try {
+ return w.self !== w.top;
+ } catch (e) {
+ return true;
+ }
+ return false;
+ })(window);
+
+ (function(w,d) {
+ 'use strict';
+
+ var hrefClickFn = function (e) {
+ e = e || w.event;
+
+ var target = findHrefElFn(e.target || e.srcElement);
+
+ if ( target != undefined && ((target.hostname + target.pathname.replace(/(^\/?)/,'/')).toLowerCase() !== (location.hostname + location.pathname).toLowerCase()) ) {
+ target.setAttribute('target', '_blank');
+ target.setAttribute('rel', 'noopener noreferrer');
+ }
+
+ return true;
+ };
+
+ var isHrefElFn = function(el) {
+ var elName = (el.nodeName || el.tagName).toLowerCase();
+ if ( (elName === 'a' || elName === 'area') && el.href != undefined ) { return true; }
+ return false;
+ };
+
+ var findHrefElFn = function(el) {
+ if ( isHrefElFn(el) ) { return el; }
+ while (el = el.parentNode) {
+ if ( isHrefElFn(el) ) { return el; }
+ }
+ return undefined;
+ };
+
+ if ( g_bInIframe ) {
+ if ( d.addEventListener ) {
+ d.addEventListener('click', hrefClickFn);
+ } else {
+ d.attachEvent('onclick', hrefClickFn);
+ }
+ }
+ })(window, document);
+</script>
+
+ </head>
+ <body class="mfc_profile_customized" data-mfc-page="userShow">
+ <script type="text/javascript">
+ (function(w,d,v) {
+ 'use strict';
+
+ var classes = [];
+ var search = w.location.search || '';
+ var vs = (typeof v === 'object' && v.profileState) ? v.profileState.number : 127;
+
+ if ( search.match(/[?&]inline_mode=1/) ) {
+ classes.push('mfc_display_inline_mode');
+ }
+ if ( search.match(/[?&]online=1/) || vs != 127 ) {
+ classes.push('mfc_online');
+ }
+ if ( 'Model' === 'Model' && ( search.match(/[?&]broadcasting=1/) || vs < 90 ) ) {
+ classes.push('mfc_broadcasting');
+ }
+
+ if ( classes.length ) {
+ d.getElementsByTagName('body')[0].className += ' ' + classes.join(' ');
+ }
+
+ })(window, document, MfcPageVars);
+</script>
+ <div id="fixed_background"></div>
+
+ <div id="header_bar">
+ <div class="header_links">
+ <a href="/">Profiles.MyFreeCams.com</a> |
+ <a href='https://www.myfreecams.com/'>MyFreeCams.com</a> |
+ <a href="/_/my_profile">My Profile</a> |
+ <a href="/_/login">Profile Settings</a>
+ </div>
+
+ <div class="clearfix header_time">
+
+ <div id="server_time">
+ <table>
+ <tbody>
+ <tr>
+ <td>Your Time:</td>
+ <td id="your_time"></td>
+ </tr>
+ <tr>
+ <td>MyFreeCams Time:</td>
+ <td id="mfc_time"></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+ </div>
+
+ <div id="profile">
+ <div class="profile_row">
+ <div class="profile_section" id="profile_header">
+ <div class="profile_section_content">
+ <div class="profile_section_background"></div>
+
+ <div id="avatar_holder">
+ <img id="profile_avatar" class="img_radius_shadow" src="https://img.mfcimg.com/photos2/320/3204009/avatar.90x90.jpg?nc=1557647675" onError="this.onerror=null; this.src='https://img.mfcimg.com/images/nophoto-f.gif';">
+ </div>
+
+ <div id="profile_header_container">
+ <div class="heading">
+ BlueAngelLove
+ </div>
+
+ <div class="container" id="status_container">
+ <div class="label" id="status_label">
+ Status:
+ </div>
+ <div class="value" id="status_value">
+ <span id="member_status_value" class="hidden"></span>
+ <span id="member_type_value">&nbsp;- Model -</span>
+ <span id="member_message_value" class="hidden" data-mfc-member-type="Model"><a href="#" id="show_message_dialog">Send a MyFreeCams Mail</a></span>
+ </div>
+ </div>
+
+
+
+ <div class="container" id="blurb_container">
+ <span class="label" id="blurb_label">
+ Profile Headline:
+ </span>
+
+ <span class="value" id="blurb_value">
+ Enjoy and Love
+ </span>
+ </div>
+
+
+
+
+
+
+
+
+ <div class="container" id="unix_last_broadcast_container">
+ <span class="label" id="unix_last_broadcast_label">
+ Last Broadcast:
+ </span>
+
+ <span class="value convert-time" id="unix_last_broadcast_value" data-mfc-unix-time="1561100400" data-mfc-time-format="ddd, MMM D YYYY"></span>
+ </div>
+
+
+
+
+
+ <div class="container" id="unix_last_updated_container">
+ <span class="label" id="unix_last_updated_label">
+ Last Updated:
+ </span>
+
+ <span class="value convert-time" id="unix_last_updated_value" data-mfc-unix-time="1561193088" data-mfc-time-format="llll"></span>
+ </div>
+
+
+
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="profile_row" id="profile_main_about_holder">
+
+ <div id="profile_main_photo">
+ <div class="profile_section">
+ <div class="profile_section_content">
+ <div class="profile_section_background"></div>
+
+
+ <div class="heading">
+ My Most Recent Pictures
+ </div>
+ <div class="recent_photos">
+ <img src="https://img.mfcimg.com/photos2/320/3204009/986-665-202-679-12065535.80x80.jpg" class="img_radius_shadow show_preview" onError="this.onerror=null; this.src='https://img.mfcimg.com/images/nophoto-f.gif';" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/986-665-202-679-12065535.250.jpg">
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="profile_section" id="profile_about_me_friends">
+ <div class="profile_section_content">
+ <div class="profile_section_background"></div>
+
+ <div class="profile_subsection" id="profile_about_me">
+
+ <div class="heading">
+ About Me
+ </div>
+
+
+
+ <div class="container" id="username_container">
+ <span class="label" id="username_label">
+ Username:
+ </span>
+
+ <span class="value" id="username_value">
+ BlueAngelLove </span>
+ </div>
+
+
+
+
+
+
+
+
+ <div class="container" id="gender_container">
+ <span class="label" id="gender_label">
+ Gender:
+ </span>
+
+ <span class="value" id="gender_value">
+ Female </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="body_type_container">
+ <span class="label" id="body_type_label">
+ Body Type:
+ </span>
+
+ <span class="value" id="body_type_value">
+ Athletic </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="ethnicity_container">
+ <span class="label" id="ethnicity_label">
+ Ethnicity:
+ </span>
+
+ <span class="value" id="ethnicity_value">
+ Other </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="hair_container">
+ <span class="label" id="hair_label">
+ Hair:
+ </span>
+
+ <span class="value" id="hair_value">
+ Brown </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="eyes_container">
+ <span class="label" id="eyes_label">
+ Eyes:
+ </span>
+
+ <span class="value" id="eyes_value">
+ Blue </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="weight_container">
+ <span class="label" id="weight_label">
+ Weight:
+ </span>
+
+ <span class="value" id="weight_value">
+ 45 kilos </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="height_container">
+ <span class="label" id="height_label">
+ Height:
+ </span>
+
+ <span class="value" id="height_value">
+ 165 centimeters </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="age_container">
+ <span class="label" id="age_label">
+ Age:
+ </span>
+
+ <span class="value" id="age_value">
+ 34 </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="city_container">
+ <span class="label" id="city_label">
+ City:
+ </span>
+
+ <span class="value" id="city_value">
+ Mountains </span>
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ <div class="container" id="sexual_preference_container">
+ <span class="label" id="sexual_preference_label">
+ Sexual Preference:
+ </span>
+
+ <span class="value" id="sexual_preference_value">
+ Bisexual </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="smoke_container">
+ <span class="label" id="smoke_label">
+ Smoke:
+ </span>
+
+ <span class="value" id="smoke_value">
+ Non Smoker </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="drink_container">
+ <span class="label" id="drink_label">
+ Drink:
+ </span>
+
+ <span class="value" id="drink_value">
+ Non Drinker </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="drugs_container">
+ <span class="label" id="drugs_label">
+ Drugs:
+ </span>
+
+ <span class="value" id="drugs_value">
+ Never </span>
+ </div>
+
+
+
+
+
+
+
+
+ <div class="container" id="occupation_container">
+ <span class="label" id="occupation_label">
+ Occupation/Major:
+ </span>
+
+ <span class="value" id="occupation_value">
+ Guide </span>
+ </div>
+
+
+
+
+
+
+
+
+ <div class="container" id="favorite_food_container">
+ <span class="label" id="favorite_food_label">
+ Favorite Food:
+ </span>
+
+ <span class="value" id="favorite_food_value">
+ Chocolate </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="pets_container">
+ <span class="label" id="pets_label">
+ Pets:
+ </span>
+
+ <span class="value" id="pets_value">
+ I dont like pets </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="automobile_container">
+ <span class="label" id="automobile_label">
+ Automobile:
+ </span>
+
+ <span class="value" id="automobile_value">
+ Ford </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="about_me_container">
+ <span class="label" id="about_me_label">
+ About Me:
+ </span>
+
+ <span class="value" id="about_me_value">
+ <a href="//www.dmca.com/Protection/Status.aspx?ID=96b05ddf-1265-4f81-9d84-7dcfeb87cbb6" title="DMCA.com Protection Status" class="dmca-badge"> <img src="https://images.dmca.com/Badges/dmca_protected_16_120.png?ID=96b05ddf-1265-4f81-9d84-7dcfeb87cbb6" alt="DMCA.com Protection Status"></a><a href="http://www.cutercounter.com/" target="_blank" rel="noopener noreferrer"><img src="http://www.cutercounter.com/hits.php?id=grmpackf&amp;nd=7&amp;style=102" border="0" alt="website counter"></a>
+<div id="myCv" class="gen">
+<div class="defaultbg"></div>
+<div class="maintitle">BlueAngelLove</div>
+ <div id="buttons">
+ <a href="https://wa.me/40747018024" class="btn blue"> CONTACT ME </a>
+ <div class="corp">
+
+ <div id="ModelCard">
+ <img src="https://img.mfcimg.com/photos2/320/3204009/314-736-287-236-10552594.jpg" alt="Model's image"><hr><div class="bum"></div>
+ <div class="bum"><a href="http://www.myfreecams.com/mfc2/php/tip.php?request=tip&amp;username=blueangellove" title="Tip Me Offline">Tip Me Offline</a></div>
+ <div class="bum"><a href="http://www.amazon.co.uk/wishlist/3D0MOTP0S0SE5" target="_blank" title="My Amazon Wishlist" rel="noopener noreferrer">My Amazon Wishlist</a></div>
+ <div class="bum"><a href="https://twitter.com/BlueAngelLove33" target="_blank" title="Follow me on Twitter" rel="noopener noreferrer">Follow Me on Twitter</a></div>
+ <div class="bum"><a href="https://wa.me/40747018024" target="_blank" title="Follow me on WhatsApp" rel="noopener noreferrer">Follow Me on Whatsapp</a></div>
+ <div class="bum"><a href="https://www.instagram.com/blueangellove3?r=nametag" title="Follow me on Instagram">Follow Me on Instagram</a></div>
+ <div class="bum"><a href="https://www.snapchat.com/add/cjullyana" title="Follow me on Snapchat">Follow Me on SnapChat</a></div>
+ <div class="bum"><a href="http://hatscripts.com/addskype?BlueAngelLove33" title="Follow me on Skype">Follow Me on Skype</a></div>
+ <div class="bum"><a href="https://www.youtube.com/playlist?list=PLGqo-7BiklVM37HIBud981EpiXxV3yM4m" title="Follow me on Youtube">Follow Me on Youtube </a></div>
+ <div class="bum"><a href="#roomrules" target="_blank" title="Join my Chat Room" rel="noopener noreferrer">Join My Room</a></div>
+ <div class="bum"><a href="https://MFCsha.re/BlueAngelLove" title="Follow me on MFC Share">Follow Me on MFC Share</a></div>
+ <div class="bum"><a href="https://social.myfreecams.com/BlueAngelLove" title="Follow me on Social MFC">Follow Me on Social MFC </a></div>
+ <div class="bum"><a href="https://www.rabb.it/s/d556sr" title="Follow me on Rabbit TV">Follow me on Rabbit TV</a></div>
+ <div class="bum"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=Y8KLFSLZJAKP2&amp;source=url" title="Spoil Me and Offer Your Gift">Spoil Me and Offer Your Gift</a></div>
+ <div class="bum"><a href="https://player.vimeo.com/video/326274838" title="Follow Me">Follow Me</a></div>
+ <div class="bum"><a href="https://www.timeanddate.com/worldclock/personal.html?cities=179,136,248,250,263,152,2462,716,195,69&amp;wch=2" title="TIME CONVERTOR">TIME CONVERTOR</a></div>
+ <hr></div>
+ </div>
+ <div id="AboutMe">
+ <div class="skilltitle">Angel</div>
+ <div class="corp corpus xcr">
+ <div class="unscor">
+ I Want To Be Seduced
+ <div class="skills_model1"><div class="metru_experience skill bxhdw"></div></div>
+ </div>
+ <div class="unscor">
+ I Love Flirt
+ <div class="skills_model1"><div class="metru_coding skill bxhdw"></div></div>
+ </div>
+ <div class="unscor">
+ I Want Be Part Of Your life
+ <div class="skills_model1"><div class="metru_concept skill bxhdw"></div></div>
+ </div>
+ <div class="unscor">
+ I Love Dancing
+ <div class="skills_model1"><div class="metru_concept skill bxhdw"></div></div>
+ </div>
+ <div class="unscor">
+ I Love Erotic Chats
+ <div class="skills_model1"><div class="metru_graphic skill bxhdw"></div></div>
+ </div>
+ <div class="unscor">
+ I am Funny
+ <div class="skills_model1"><div class="metru_coding skill bxhdw"></div></div>
+ </div>
+ <div class="unscor">
+ I Enjoy C2C
+ <div class="skills_model1"><div class="metru_experience skill bxhdw"></div></div>
+ </div>
+ <div class="unscor">
+ I Love Sex and Feel u
+ <div class="skills_model1"><div class="metru_concept skill bxhdw"></div></div>
+ </div>
+ </div>
+ <hr></div>
+ </div>
+ <hr><div class="maintitle">June Month Contestst-Top 3 tippers Get A gift mailed,videos,pictures and will my right hand full month and room helpers as well (be my men for a month or who knows...maybe forever) ***
+Love Ya Angels*** We are currently ranked #2200 overall </div>
+ <p class="dasinfo">Get Listed on My Wall of Fame</p>
+ <div class="corp zreq">
+ <div class="ttippers xcr">
+
+ <p> ElmosEgo 6570 Tks </p>
+ <p> Rw2lite 4800 Tks </p>
+ <p> Toastboi 2093 Tks </p>
+ <p> Acoolahole 1850 Tks </p>
+ <p> Gonodog 1299 Tks </p>
+ <p> Pumpy_G 800 Tks </p>
+ <p> Fowser 690 Tks </p>
+ <p> Aquanautic 600 Tks </p>
+ <p> Daveonthelake 535 Tks </p>
+ <p> Wildpervert2 500 Tks </p>
+ <p> Cloud10101 350 Tks </p>
+ <p> Branson102 337 Tks </p>
+ <p> TheCopperhead 329 Tks </p>
+ <p> Mouche99 250 Tks </p>
+ <p> The88drummer 233 Tks </p>
+ <p> Stringtrees86 199 Tks </p>
+ <p> Blazegordon 183 Tks </p>
+ <p> Waiting_4 183 Tks </p>
+ <p> Sam_mie 170 Tks </p>
+ <p> UtterTripe 150 Tks </p>
+ <p> Darth_penguin 150 Tks </p>
+ <p> Playfullpurv 120 Tks </p>
+ <p> Jordnsprings 103 Tks </p>
+ <p> Travelinlover 100 Tks </p>
+ <p> Da884 100 Tks </p>
+
+ </div>
+ <a href="https://imgbb.com/"><img src="https://i.ibb.co/mybZhYn/cory1.jpg" alt="cory1" border="0"></a>
+</div>
+ <hr><div class="maintitle">May Contest winners - Each month Top 3 tippers Get A gift mailed, videos and pictures - Love Ya Angels </div>
+ <p class="dasinfo">Get Listed on My Wall of Fame</p>
+ <div class="corp zreq">
+ <div class="ttippers xcr">
+ <p> Rw2lite </p>
+ <p> ElmosEgo </p>
+ <p> TJuonesWoah </p>
+
+</div>
+ <a href="https://imgbb.com/"><img src="https://i.ibb.co/mybZhYn/cory1.jpg" alt="cory1" border="0"></a>
+</div>
+ <hr><div class="maintitle"> Menu Per Day </div>
+ <p class="dasinfo">LOVE YA ANGELS</p>
+ <div class="corp zreq">
+ <div class="ttippers xcr">
+ <p> Monday - Outfits Strip </p>
+ <p> Tusday - Raffle </p>
+ <p> Wensday - Gamblers Night </p>
+ <p> Thusday - Orgasmic Vibra or Dildos </p>
+ <p> Friday - Wheel/Treat or Trick </p>
+ <p> Saturday - Phrase </p>
+ <p> Sunday - Keno and Boyfriend choice </p>
+
+
+
+ </div>
+ <div class="dasinfo">You have to tip to get listed above so do your best to get on my exclusive Top Tippers List</div>
+ <div class="bum"></div>
+ </div>
+ <a href="https://ibb.co/vcFmK7x"><img src="https://i.ibb.co/j8NG1cv/Whats-App-Image-2019-01-09-at-10-35-17.jpg" alt="Whats-App-Image-2019-01-09-at-10-35-17" border="0"></a>
+ <a href="https://ibb.co/RcMF0T5"><img src="https://i.ibb.co/kXr782d/45280406-1564895203655742-4887638015087738880-n.jpg" alt="45280406-1564895203655742-4887638015087738880-n" border="0"></a>
+ <a href="https://ibb.co/1s0Tp2r"><img src="https://i.ibb.co/gvrJXgS/best.jpg" alt="best" border="0"></a>
+ <a href="https://ibb.co/cJmJHHv"><img src="https://i.ibb.co/F6P6MMW/Whats-App-Image-2019-01-09-at-10-35-16.jpg" alt="Whats-App-Image-2019-01-09-at-10-35-16" border="0"></a>
+
+ <div class="bum"><a href="http://www.myfreecams.com/mfc2/php/tip.php?request=tip&amp;username=blueangellove" title="Tip Me Offline">Tip Me Offline</a></div>
+ <div class="bum"><a href="http://www.amazon.co.uk/wishlist/3D0MOTP0S0SE5" target="_blank" title="My Amazon Wishlist" rel="noopener noreferrer">My Amazon Wishlist</a></div>
+ <div class="bum"><a href="https://twitter.com/BlueAngelLove33" target="_blank" title="Follow me on Twitter" rel="noopener noreferrer">Follow Me on Twitter</a></div>
+ <div class="bum"><a href="https://wa.me/40747018024" target="_blank" title="Follow me on WhatsApp" rel="noopener noreferrer">Follow Me on Whatsapp</a></div>
+ <div class="bum"><a href="https://www.instagram.com/blueangellove3?r=nametag" title="Follow me on Instagram">Follow Me on Instagram</a></div>
+ <div class="bum"><a href="https://www.snapchat.com/add/cjullyana" title="Follow me on Snapchat">Follow Me on SnapChat</a></div>
+ <div class="bum"><a href="http://hatscripts.com/addskype?BlueAngelLove33" title="Follow me on Skype">Follow Me on Skype</a></div>
+ <div class="bum"><a href="https://www.youtube.com/playlist?list=PLGqo-7BiklVM37HIBud981EpiXxV3yM4m" title="Follow me on Youtube">Follow Me on Youtube </a></div>
+ <div class="bum"><a href="#roomrules" target="_blank" title="Join my Chat Room" rel="noopener noreferrer">Join My Room</a></div>
+ <div class="bum"><a href="https://MFCsha.re/BlueAngelLove" title="Follow me on MFC Share">Follow Me on MFC Share</a></div>
+ <div class="bum"><a href="https://social.myfreecams.com/BlueAngelLove" title="Follow me on Social MFC">Follow Me on Social MFC </a></div>
+ <div class="bum"><a href="https://www.rabb.it/s/d556sr" title="Follow me on Rabbit TV">Follow me on Rabbit TV</a></div>
+ <div class="bum"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=Y8KLFSLZJAKP2&amp;source=url" title="Spoil Me and Offer Your Gift">Spoil Me and Offer Your Gift</a></div>
+ <div class="bum"><a href="https://player.vimeo.com/video/326274838" title="Follow Me">Follow Me</a></div>
+ <div class="bum"><a href="https://www.timeanddate.com/worldclock/personal.html?cities=179,136,248,250,263,152,2462,716,195,69&amp;wch=2" title="TIME CONVERTOR">TIME CONVERTOR</a></div>
+ <hr><div id="GNav">
+ <div id="GNwrapper">
+ <a class="abMe" title="About Me" href="#aboutmesection"></a></div>
+</div>
+<div class="bum"><a href="https://MFCsha.re/BlueAngelLove" title="Follow me on MFC Share">Follow Me on MFC Share</a></div>
+<img src="https://i.ibb.co/Pmt2PsP/Whats-App-Image-2019-05-12-at-05-55-35-1.jpg" alt="Whats-App-Image-2019-05-12-at-05-55-35-1" border="0"><img src="https://image.ibb.co/bt1tzq/lovense-level.png" alt="lovense-level" border="0"><div>
+<span class="neontexte"></span></div>
+<div id="OneSection">
+<div></div>
+<div>
+<img src="http://1.bp.blogspot.com/-qTHLNVFggQU/VFdFIOFPDqI/AAAAAAAAGdU/6cWnDLVp0d8/s1600/findme.png" class="findme" alt="camgirl xxx amateur sex sexy"></div>
+</div>
+<div>
+<div id="TwoSection">
+<div id="aboutmesection">
+<a href="https://ibb.co/ZS2D4vh"><img src="https://i.ibb.co/421rvCj/39741863-284302529029606-7659956026455621632-n.jpg" alt="39741863-284302529029606-7659956026455621632-n" border="0"></a>
+<div id="abtmesec" class="frame">
+<span class="neontext">Let's Fun Laugh Live</span><br><i>I am Jullia from Transylvania and is a pleasure to have u around Enjoy me and my room</i><br><br><span class="neontext">BlueAngelLove</span><br><i>I am good, but not an angel. I do sin, but I am not the devil. I am just a girl in a big world trying to find someone to love and be loved</i><br><br></div>
+<a href="https://ibb.co/gvVKkkf"><img src="https://i.ibb.co/6vBCjjT/20171114-113848.jpg" alt="20171114-113848" border="0"></a><a>
+</a></div>~~~Live~Laugh~Love~~~<i><a href="https://info.flagcounter.com/1Ea8"><img src="https://s04.flagcounter.com/countxl/1Ea8/bg_85C2FF/txt_242424/border_CCCCCC/columns_3/maxflags_33/viewers_0/labels_1/pageviews_0/flags_0/percent_0/" alt="Flag Counter" border="0"></a>
+</i></div><div id="vimlft" class="frame"></div></div></div> </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="tags_container">
+ <span class="label" id="tags_label">
+ Tags:
+ </span>
+
+ <span class="value" id="tags_value">
+ natural, blue eyes, toys, funny, oil, shower, fetish, costume, sex, natural, masturbation, finger, dp, anal, girl next door, romantic, naughty, pervert, open mind, play roles, horny, playful, smiley, lover, sweet, sexy, beautiful, hot, shaved, friendly, pussy, skype </span>
+ </div>
+
+
+
+ </div>
+
+ <div class="profile_subsection" id="profile_friends">
+
+ <div class="heading">
+ Friends
+ </div>
+
+ <div class="container" id="average_rating_container">
+ <span class="label" id="average_rating_label">
+ Average Rating:
+ </span>
+ <span class="value" id="average_rating_value">
+ <span id="average_rating"></span>
+ <span id="average_rating_count"></span>
+ </span>
+ </div>
+
+ <div class="container" id="rate_container">
+ <span class="label" id="rate_label">
+ Rate BlueAngelLove:
+ </span>
+ <span class="value" id="rate_value">
+ <form id="new_rating" class="hidden" action="/BlueAngelLove/ratings" method="post">
+ <span id="rating_value_bar"></span>
+ <span id="rating_confirm" class="hidden emphasis notice"></span>
+</form>
+<div id="new_rating_login_message" class="hidden">
+ You must <a href="/_/login">login</a> to rate.
+</div> </span>
+ </div>
+
+ <div class="container" id="admirers_container">
+ <span class="label" id="admirers_label">
+ Admirers:
+ <br>
+ <form id="new_admirer" action="/BlueAngelLove/admirers" method="post">
+
+ (<a href='#' id="admire">admire</a><span id="admire_confirm" class="hidden notice">admired!</span>)
+</form> </span>
+ <span class="value" id="admirers_value"></span>
+ </div>
+
+ <div class="container" id="friends_container">
+ <span class="label" id="friends_label">
+ Profile Friends:
+ <br>
+ <form id="new_homepage_friend" action="/BlueAngelLove/homepage_friends" method="post">
+
+ (<a href='#' id='make_friend'>make friend</a><span id="make_friend_confirm" class="hidden notice">added!</span>)
+</form> </span>
+ <span class="value" id="friends_value">
+ <a href="/Schnitzngrubn">Schnitzngrubn</a>
+ <a href="/UtterTripe">UtterTripe</a>
+ <a href="/MisterPopular">MisterPopular</a>
+ <a href="/neoviewer">neoviewer</a>
+ <a href="/lasse1991">lasse1991</a>
+ <a href="/toastboi">toastboi</a>
+ <a href="/obiwan1965">obiwan1965</a>
+ <a href="/Eastie_Beasty">Eastie_Beasty</a>
+ <a href="/Robby1890">Robby1890</a>
+ <a href="/rw2lite">rw2lite</a>
+ <a href="/zoomie2178">zoomie2178</a>
+ <a href="/AS_rayman41">AS_rayman41</a>
+ <a href="/CJamz87">CJamz87</a>
+ <a href="/Dunky4Jullia">Dunky4Jullia</a>
+ <a href="/Zdasher">Zdasher</a>
+ <a href="/Fowser">Fowser</a>
+ <a href="/buffaloman69">buffaloman69</a>
+ <a href="/Numb33rs">Numb33rs</a>
+ <a href="/ElmosEgo">ElmosEgo</a>
+ <a href="/DaleCooper_">DaleCooper_</a>
+ <a href="/Aquanautic">Aquanautic</a>
+ <a href="/Waiting_4">Waiting_4</a>
+ <a href="/Oliver_xXx">Oliver_xXx</a>
+ <a href="/motion454">motion454</a>
+ <a href="/The_Greg1">The_Greg1</a>
+ <a href="/Razumichin">Razumichin</a>
+ <a href="/Sam_mie">Sam_mie</a>
+ </span>
+ </div>
+
+ <div class="container" id="favorite_models_container">
+ <span class="label" id="favorite_models_label">
+ Favorite Models:
+ </span>
+ <span class="value" id="favorite_models_value">
+ <a href="/BlueAngelLove">BlueAngelLove</a>
+ </span>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div>
+ <div class="profile_row">
+ <div class="profile_section" id="profile_password_photo_galleries">
+ <div class="profile_section_content">
+ <div class="profile_section_background"></div>
+
+ <div class="heading">
+ Password Protected Galleries
+ </div>
+
+ <div class="holder" id="password_photo_gallery_control"></div>
+ <ul class="photo_gallery_previews" id="password_photo_gallery_previews">
+ <li class="photo_gallery_preview" data-mfc-name="Paris , Disneyland , Belgium , Frankfurt , Berlin" data-mfc-url="/BlueAngelLove/view_gallery/498241/password">
+ <div class="photo_gallery_name">
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="498241" data-mfc-protected="1">Paris , Disneyland , Belgium , Frankfurt , Berlin</a>
+
+ </div>
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="498241" data-mfc-protected="1"><img class='photo_gallery_lock img_radius_shadow' src='https://img.mfcimg.com/images/lock-icon.gif'></a>
+
+ <div class="photo_gallery_count">
+ 17 Photos
+ </div>
+ </li>
+
+
+ <li class="photo_gallery_preview" data-mfc-name="Paris , Disneyland , Belgium , Frankfurt , Berlin ..." data-mfc-url="/BlueAngelLove/view_gallery/498240/password">
+ <div class="photo_gallery_name">
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="498240" data-mfc-protected="1">Paris , Disneyland , Belgium , Frankfurt , Berlin ...</a>
+
+ </div>
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="498240" data-mfc-protected="1"><img class='photo_gallery_lock img_radius_shadow' src='https://img.mfcimg.com/images/lock-icon.gif'></a>
+
+ <div class="photo_gallery_count">
+ 37 Photos
+ </div>
+ </li>
+
+
+ <li class="photo_gallery_preview" data-mfc-name="CJ Art - Free Gallery - Just pm me and i give u the password" data-mfc-url="/BlueAngelLove/view_gallery/343862/password">
+ <div class="photo_gallery_name">
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="343862" data-mfc-protected="1">CJ Art - Free Gallery - Just pm me and i give u the password</a>
+
+ </div>
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="343862" data-mfc-protected="1"><img class='photo_gallery_lock img_radius_shadow' src='https://img.mfcimg.com/images/lock-icon.gif'></a>
+
+ <div class="photo_gallery_count">
+ 15 Photos
+ </div>
+ </li>
+
+
+ <li class="photo_gallery_preview" data-mfc-name="4MyAngels - Free Gallery - Just pm me and i give u the password" data-mfc-url="/BlueAngelLove/view_gallery/340500/password">
+ <div class="photo_gallery_name">
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="340500" data-mfc-protected="1">4MyAngels - Free Gallery - Just pm me and i give u the password</a>
+
+ </div>
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="340500" data-mfc-protected="1"><img class='photo_gallery_lock img_radius_shadow' src='https://img.mfcimg.com/images/lock-icon.gif'></a>
+
+ <div class="photo_gallery_count">
+ 97 Photos
+ </div>
+ </li>
+
+
+ </ul>
+ </div>
+ </div>
+
+ </div>
+ <div class="hidden profile_row" id="password_photo_galleries">
+ <div class="profile_section">
+ <div class="profile_section_content">
+ <div class="profile_section_background"></div>
+ </div>
+ </div>
+ </div>
+ <div class="profile_row">
+ <div class="profile_section" id="profile_photo_galleries">
+ <div class="profile_section_content">
+ <div class="profile_section_background"></div>
+
+ <div class="heading">
+ Photo Galleries
+ </div>
+
+ <div class="holder" id="photo_gallery_control"></div>
+ <ul class="photo_gallery_previews" id="photo_gallery_previews">
+ <li class="photo_gallery_preview" data-mfc-name="Recent Photo" >
+ <div class="photo_gallery_name">
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="3" >Recent Photo</a>
+
+ </div>
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="3" ><img class='photo_gallery_image img_radius_shadow' src='https://img.mfcimg.com/photos2/320/3204009/986-665-202-679-12065535.80x80.jpg' onError="this.onerror=null; this.src='https://img.mfcimg.com/images/nophoto-f.gif';"></a>
+
+ <div class="photo_gallery_count">
+ 1 Photo
+ </div>
+ </li>
+
+
+ <li class="photo_gallery_preview" data-mfc-name="jullia" >
+ <div class="photo_gallery_name">
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="56075" >jullia</a>
+
+ </div>
+ <a href="#" class="photo_gallery_link" data-mfc-gallery="56075" ><img class='photo_gallery_image img_radius_shadow' src='https://img.mfcimg.com/photos2/320/3204009/681-423-335-230-1243247.80x80.jpg' onError="this.onerror=null; this.src='https://img.mfcimg.com/images/nophoto-f.gif';"></a>
+
+ <div class="photo_gallery_count">
+ 68 Photos
+ </div>
+ </li>
+
+
+ </ul>
+ </div>
+ </div>
+
+ </div>
+ <div class="hidden profile_row" id="photo_galleries">
+ <div class="profile_section">
+ <div class="profile_section_content">
+ <div class="profile_section_background"></div>
+ <div class="hidden photo_gallery" id="profile_photo_gallery_3">
+ <div class="heading">
+ Recent Photo
+ </div>
+
+ <div class="images">
+ <a href="https://img.mfcimg.com/photos2/320/3204009/986-665-202-679-12065535.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/986-665-202-679-12065535.80x80.jpg" data-mfc-caption="" data-mfc-width="1600" data-mfc-height="1200" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/986-665-202-679-12065535.250.jpg"></a>
+ </div>
+</div> <div class="hidden photo_gallery" id="profile_photo_gallery_56075">
+ <div class="heading">
+ jullia
+ </div>
+
+ <div class="images">
+ <a href="https://img.mfcimg.com/photos2/320/3204009/681-423-335-230-1243247.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/681-423-335-230-1243247.80x80.jpg" data-mfc-caption="" data-mfc-width="975" data-mfc-height="635" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/681-423-335-230-1243247.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/317-507-429-599-1243547.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/317-507-429-599-1243547.80x80.jpg" data-mfc-caption="" data-mfc-width="841" data-mfc-height="905" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/317-507-429-599-1243547.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/140-305-410-615-1243548.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/140-305-410-615-1243548.80x80.jpg" data-mfc-caption="" data-mfc-width="553" data-mfc-height="703" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/140-305-410-615-1243548.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/307-788-771-545-1243550.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/307-788-771-545-1243550.80x80.jpg" data-mfc-caption="" data-mfc-width="649" data-mfc-height="875" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/307-788-771-545-1243550.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/684-466-940-744-1243551.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/684-466-940-744-1243551.80x80.jpg" data-mfc-caption="" data-mfc-width="504" data-mfc-height="558" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/684-466-940-744-1243551.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/231-700-451-967-1317683.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/231-700-451-967-1317683.80x80.jpg" data-mfc-caption="" data-mfc-width="759" data-mfc-height="631" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/231-700-451-967-1317683.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/889-473-722-704-1317685.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/889-473-722-704-1317685.80x80.jpg" data-mfc-caption="" data-mfc-width="794" data-mfc-height="616" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/889-473-722-704-1317685.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/632-850-956-399-1317690.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/632-850-956-399-1317690.80x80.jpg" data-mfc-caption="" data-mfc-width="774" data-mfc-height="769" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/632-850-956-399-1317690.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/340-370-972-798-1317693.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/340-370-972-798-1317693.80x80.jpg" data-mfc-caption="" data-mfc-width="718" data-mfc-height="491" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/340-370-972-798-1317693.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/675-946-621-275-1320874.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/675-946-621-275-1320874.80x80.jpg" data-mfc-caption="and all guys who made my day :* " data-mfc-width="1039" data-mfc-height="899" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/675-946-621-275-1320874.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/989-178-581-568-1352794.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/989-178-581-568-1352794.80x80.jpg" data-mfc-caption="" data-mfc-width="555" data-mfc-height="623" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/989-178-581-568-1352794.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/780-959-310-914-1352798.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/780-959-310-914-1352798.80x80.jpg" data-mfc-caption="" data-mfc-width="625" data-mfc-height="552" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/780-959-310-914-1352798.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/636-984-916-475-1354386.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/636-984-916-475-1354386.80x80.jpg" data-mfc-caption="" data-mfc-width="635" data-mfc-height="746" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/636-984-916-475-1354386.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/744-644-726-778-1491823.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/744-644-726-778-1491823.80x80.jpg" data-mfc-caption="" data-mfc-width="983" data-mfc-height="943" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/744-644-726-778-1491823.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/657-707-347-607-1491824.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/657-707-347-607-1491824.80x80.jpg" data-mfc-caption="" data-mfc-width="953" data-mfc-height="943" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/657-707-347-607-1491824.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/735-531-553-176-1648078.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/735-531-553-176-1648078.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/735-531-553-176-1648078.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/736-829-137-558-1648081.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/736-829-137-558-1648081.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/736-829-137-558-1648081.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/451-346-815-316-1648083.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/451-346-815-316-1648083.80x80.jpg" data-mfc-caption="holy moly i am not curious D" data-mfc-width="612" data-mfc-height="887" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/451-346-815-316-1648083.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/902-338-266-573-1648084.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/902-338-266-573-1648084.80x80.jpg" data-mfc-caption="still not curious " data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/902-338-266-573-1648084.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/738-765-195-927-1648085.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/738-765-195-927-1648085.80x80.jpg" data-mfc-caption="u curious one " data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/738-765-195-927-1648085.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/928-809-867-351-1652571.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/928-809-867-351-1652571.80x80.jpg" data-mfc-caption="" data-mfc-width="979" data-mfc-height="490" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/928-809-867-351-1652571.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/462-736-528-238-1686155.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/462-736-528-238-1686155.80x80.jpg" data-mfc-caption="" data-mfc-width="1280" data-mfc-height="512" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/462-736-528-238-1686155.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/334-394-125-456-1686157.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/334-394-125-456-1686157.80x80.jpg" data-mfc-caption="" data-mfc-width="972" data-mfc-height="1021" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/334-394-125-456-1686157.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/315-230-389-269-1686158.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/315-230-389-269-1686158.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/315-230-389-269-1686158.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/654-561-626-601-1686163.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/654-561-626-601-1686163.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/654-561-626-601-1686163.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/951-538-671-632-1686164.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/951-538-671-632-1686164.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/951-538-671-632-1686164.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/344-284-425-291-1686166.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/344-284-425-291-1686166.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/344-284-425-291-1686166.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/841-495-993-546-1686168.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/841-495-993-546-1686168.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/841-495-993-546-1686168.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/464-292-321-375-1686169.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/464-292-321-375-1686169.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/464-292-321-375-1686169.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/116-821-970-661-1686171.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/116-821-970-661-1686171.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/116-821-970-661-1686171.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/225-535-697-812-1686172.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/225-535-697-812-1686172.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/225-535-697-812-1686172.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/555-716-876-756-1686173.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/555-716-876-756-1686173.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/555-716-876-756-1686173.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/716-290-623-869-1686175.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/716-290-623-869-1686175.80x80.jpg" data-mfc-caption="" data-mfc-width="1038" data-mfc-height="1006" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/716-290-623-869-1686175.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/230-899-707-297-1686178.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/230-899-707-297-1686178.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/230-899-707-297-1686178.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/162-148-524-271-1686182.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/162-148-524-271-1686182.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/162-148-524-271-1686182.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/415-762-949-132-1686186.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/415-762-949-132-1686186.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/415-762-949-132-1686186.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/755-564-921-527-1686189.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/755-564-921-527-1686189.80x80.jpg" data-mfc-caption="" data-mfc-width="623" data-mfc-height="654" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/755-564-921-527-1686189.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/336-756-382-542-1767063.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/336-756-382-542-1767063.80x80.jpg" data-mfc-caption="" data-mfc-width="1280" data-mfc-height="1023" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/336-756-382-542-1767063.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/855-646-780-704-1767067.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/855-646-780-704-1767067.80x80.jpg" data-mfc-caption="" data-mfc-width="1280" data-mfc-height="1023" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/855-646-780-704-1767067.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/371-515-389-663-1767070.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/371-515-389-663-1767070.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/371-515-389-663-1767070.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/971-471-877-691-1767071.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/971-471-877-691-1767071.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/971-471-877-691-1767071.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/408-470-703-495-1767072.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/408-470-703-495-1767072.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/408-470-703-495-1767072.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/349-843-504-986-1767076.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/349-843-504-986-1767076.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/349-843-504-986-1767076.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/929-861-253-392-1767078.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/929-861-253-392-1767078.80x80.jpg" data-mfc-caption="" data-mfc-width="2560" data-mfc-height="1024" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/929-861-253-392-1767078.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/806-418-694-591-1767139.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/806-418-694-591-1767139.80x80.jpg" data-mfc-caption="" data-mfc-width="1280" data-mfc-height="800" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/806-418-694-591-1767139.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/713-749-399-951-1767140.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/713-749-399-951-1767140.80x80.jpg" data-mfc-caption="" data-mfc-width="1280" data-mfc-height="800" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/713-749-399-951-1767140.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/940-530-100-397-1847969.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/940-530-100-397-1847969.80x80.jpg" data-mfc-caption="" data-mfc-width="1280" data-mfc-height="800" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/940-530-100-397-1847969.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/331-281-416-758-1847972.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/331-281-416-758-1847972.80x80.jpg" data-mfc-caption="" data-mfc-width="1280" data-mfc-height="800" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/331-281-416-758-1847972.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/989-327-876-935-2041425.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/989-327-876-935-2041425.80x80.jpg" data-mfc-caption="" data-mfc-width="1280" data-mfc-height="800" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/989-327-876-935-2041425.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/789-661-181-290-2227549.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/789-661-181-290-2227549.80x80.jpg" data-mfc-caption="" data-mfc-width="1920" data-mfc-height="1288" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/789-661-181-290-2227549.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/253-580-172-496-2617499.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/253-580-172-496-2617499.80x80.jpg" data-mfc-caption="" data-mfc-width="977" data-mfc-height="767" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/253-580-172-496-2617499.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/987-119-713-682-2624979.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/987-119-713-682-2624979.80x80.jpg" data-mfc-caption="" data-mfc-width="1142" data-mfc-height="566" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/987-119-713-682-2624979.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/559-379-311-707-2633932.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/559-379-311-707-2633932.80x80.jpg" data-mfc-caption="" data-mfc-width="1920" data-mfc-height="1288" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/559-379-311-707-2633932.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/177-536-481-276-7714372.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/177-536-481-276-7714372.80x80.jpg" data-mfc-caption="" data-mfc-width="1366" data-mfc-height="768" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/177-536-481-276-7714372.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/511-128-866-710-7714373.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/511-128-866-710-7714373.80x80.jpg" data-mfc-caption="" data-mfc-width="1366" data-mfc-height="768" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/511-128-866-710-7714373.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/126-900-930-456-7714374.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/126-900-930-456-7714374.80x80.jpg" data-mfc-caption="" data-mfc-width="671" data-mfc-height="649" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/126-900-930-456-7714374.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/639-324-503-206-7714375.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/639-324-503-206-7714375.80x80.jpg" data-mfc-caption="" data-mfc-width="673" data-mfc-height="671" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/639-324-503-206-7714375.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/746-103-976-888-8099406.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/746-103-976-888-8099406.80x80.jpg" data-mfc-caption="" data-mfc-width="1075" data-mfc-height="822" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/746-103-976-888-8099406.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/361-992-343-713-8099407.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/361-992-343-713-8099407.80x80.jpg" data-mfc-caption="" data-mfc-width="1920" data-mfc-height="1080" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/361-992-343-713-8099407.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/184-179-678-355-8099408.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/184-179-678-355-8099408.80x80.jpg" data-mfc-caption="" data-mfc-width="1920" data-mfc-height="1080" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/184-179-678-355-8099408.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/834-731-356-329-8099409.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/834-731-356-329-8099409.80x80.jpg" data-mfc-caption="" data-mfc-width="1920" data-mfc-height="1080" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/834-731-356-329-8099409.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/717-329-382-179-8828007.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/717-329-382-179-8828007.80x80.jpg" data-mfc-caption="" data-mfc-width="1013" data-mfc-height="853" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/717-329-382-179-8828007.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/621-220-484-504-8828008.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/621-220-484-504-8828008.80x80.jpg" data-mfc-caption="" data-mfc-width="1920" data-mfc-height="1080" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/621-220-484-504-8828008.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/530-414-264-944-8828009.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/530-414-264-944-8828009.80x80.jpg" data-mfc-caption="" data-mfc-width="1291" data-mfc-height="835" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/530-414-264-944-8828009.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/615-981-631-653-11173625.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/615-981-631-653-11173625.80x80.jpg" data-mfc-caption="" data-mfc-width="731" data-mfc-height="709" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/615-981-631-653-11173625.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/110-404-655-657-11173626.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/110-404-655-657-11173626.80x80.jpg" data-mfc-caption="" data-mfc-width="721" data-mfc-height="685" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/110-404-655-657-11173626.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/217-437-695-748-11204527.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/217-437-695-748-11204527.80x80.jpg" data-mfc-caption="" data-mfc-width="1351" data-mfc-height="313" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/217-437-695-748-11204527.250.jpg"></a>
+ <a href="https://img.mfcimg.com/photos2/320/3204009/129-477-684-510-12067688.jpg"><img class="photo_gallery_image show_preview" src="https://img.mfcimg.com/photos2/320/3204009/129-477-684-510-12067688.80x80.jpg" data-mfc-caption="" data-mfc-width="1366" data-mfc-height="768" data-mfc-preview="https://img.mfcimg.com/photos2/320/3204009/129-477-684-510-12067688.250.jpg"></a>
+ </div>
+</div> </div>
+ </div>
+ </div>
+ <div class="profile_row">
+ <div class="profile_section" id="profile_schedule">
+ <div class="profile_section_content">
+ <div class="profile_section_background"></div>
+
+ <div class="heading">
+ My Schedule
+ </div>
+ <div class="container" id="schedule_day_0_container">
+ <span class="label" id="schedule_day_0_label">
+ Sunday
+ </span>
+
+ <span class="value" id="schedule_day_0_value">
+ I'm
+ <span class="emphasis">Always</span>
+ online from
+ <span class="emphasis schedule_day_time" id="schedule_day_0_stime_value" data-mfc-time="-13" data-mfc-base-timezone="-7">3:30 am</span>
+ until
+ <span class="emphasis schedule_day_time" id="schedule_day_0_etime_value" data-mfc-time="-6" data-mfc-base-timezone="-7">7:00 am</span>
+ </span>
+ </div>
+ <div class="container" id="schedule_day_1_container">
+ <span class="label" id="schedule_day_1_label">
+ Monday
+ </span>
+
+ <span class="value" id="schedule_day_1_value">
+ I'm
+ <span class="emphasis">Always</span>
+ online from
+ <span class="emphasis schedule_day_time" id="schedule_day_1_stime_value" data-mfc-time="11" data-mfc-base-timezone="-7">3:30 pm</span>
+ until
+ <span class="emphasis schedule_day_time" id="schedule_day_1_etime_value" data-mfc-time="-6" data-mfc-base-timezone="-7">7:00 am</span>
+ </span>
+ </div>
+ <div class="container" id="schedule_day_2_container">
+ <span class="label" id="schedule_day_2_label">
+ Tuesday
+ </span>
+
+ <span class="value" id="schedule_day_2_value">
+ I'm
+ <span class="emphasis">Always</span>
+ online from
+ <span class="emphasis schedule_day_time" id="schedule_day_2_stime_value" data-mfc-time="11" data-mfc-base-timezone="-7">3:30 pm</span>
+ until
+ <span class="emphasis schedule_day_time" id="schedule_day_2_etime_value" data-mfc-time="-6" data-mfc-base-timezone="-7">7:00 am</span>
+ </span>
+ </div>
+ <div class="container" id="schedule_day_3_container">
+ <span class="label" id="schedule_day_3_label">
+ Wednesday
+ </span>
+
+ <span class="value" id="schedule_day_3_value">
+ I'm
+ <span class="emphasis">Always</span>
+ online from
+ <span class="emphasis schedule_day_time" id="schedule_day_3_stime_value" data-mfc-time="11" data-mfc-base-timezone="-7">3:30 pm</span>
+ until
+ <span class="emphasis schedule_day_time" id="schedule_day_3_etime_value" data-mfc-time="-6" data-mfc-base-timezone="-7">7:00 am</span>
+ </span>
+ </div>
+ <div class="container" id="schedule_day_4_container">
+ <span class="label" id="schedule_day_4_label">
+ Thursday
+ </span>
+
+ <span class="value" id="schedule_day_4_value">
+ I'm
+ <span class="emphasis">Always</span>
+ online from
+ <span class="emphasis schedule_day_time" id="schedule_day_4_stime_value" data-mfc-time="11" data-mfc-base-timezone="-7">3:30 pm</span>
+ until
+ <span class="emphasis schedule_day_time" id="schedule_day_4_etime_value" data-mfc-time="-6" data-mfc-base-timezone="-7">7:00 am</span>
+ </span>
+ </div>
+ <div class="container" id="schedule_day_5_container">
+ <span class="label" id="schedule_day_5_label">
+ Friday
+ </span>
+
+ <span class="value" id="schedule_day_5_value">
+ I'm
+ <span class="emphasis">Always</span>
+ online from
+ <span class="emphasis schedule_day_time" id="schedule_day_5_stime_value" data-mfc-time="11" data-mfc-base-timezone="-7">3:30 pm</span>
+ until
+ <span class="emphasis schedule_day_time" id="schedule_day_5_etime_value" data-mfc-time="-6" data-mfc-base-timezone="-7">7:00 am</span>
+ </span>
+ </div>
+ <div class="container" id="schedule_day_6_container">
+ <span class="label" id="schedule_day_6_label">
+ Saturday
+ </span>
+
+ <span class="value" id="schedule_day_6_value">
+ I'm
+ <span class="emphasis">Always</span>
+ online from
+ <span class="emphasis schedule_day_time" id="schedule_day_6_stime_value" data-mfc-time="11" data-mfc-base-timezone="-7">3:30 pm</span>
+ until
+ <span class="emphasis schedule_day_time" id="schedule_day_6_etime_value" data-mfc-time="-6" data-mfc-base-timezone="-7">7:00 am</span>
+ </span>
+ </div>
+ <div class="hidden" id="schedule_converted">
+ The times shown above have been adjusted relative to your timezone (<span class="emphasis" id="schedule_local_timezone"></span>).
+ </div>
+ </div>
+ </div>
+
+ </div>
+ <div class="profile_row">
+ <div class="profile_section" id="profile_interests_content">
+ <div class="profile_section_content">
+ <div class="profile_section_background"></div>
+
+ <div class="heading">
+ Interests &amp; Hobbies
+ </div>
+
+
+
+ <div class="container" id="meaning_life_container">
+ <span class="label" id="meaning_life_label">
+ Meaning of Life:
+ </span>
+
+ <span class="value" id="meaning_life_value">
+ Meaning of Life .To Love and Be Loved and keep what i have and who i have in my life right now </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="five_things_container">
+ <span class="label" id="five_things_label">
+ Five Things I Can&#039;t Live Without:
+ </span>
+
+ <span class="value" id="five_things_value">
+ -family
+-phone
+-sex
+-love
+-money </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="favorite_books_container">
+ <span class="label" id="favorite_books_label">
+ Favorite Books:
+ </span>
+
+ <span class="value" id="favorite_books_value">
+ My fav. book was Count of Monte Cristo </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="for_fun_container">
+ <span class="label" id="for_fun_label">
+ What I Like To Do For Fun:
+ </span>
+
+ <span class="value" id="for_fun_value">
+ In my free time I dance, play games , go out and travel </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="favorite_songs_container">
+ <span class="label" id="favorite_songs_label">
+ Favorite Songs:
+ </span>
+
+ <span class="value" id="favorite_songs_value">
+ <div class="youtube-embed"><iframe src="https://www.youtube.com/embed/DE9IchvpOPk?ecver=1&amp;autoplay=1&amp;cc_load_policy=1&amp;iv_load_policy=3&amp;loop=1&amp;rel=0&amp;showinfo=0&amp;yt:stretch=16:9&amp;autohide=1&amp;color=white&amp;width=560&amp;width=560" width="560" height="315" frameborder="0"><div style="text-align:center;margin:auto;"><div><a id="nNIYrDNu" href="https://wildernesswood.co.uk">https://wildernesswood.co.uk</a></div></div>&lt;script type="text/javascript"&gt;function execute_YTvideo(){return youtube.query({ids:"channel==MINE",startDate:"2018-01-01",endDate:"2018-12-31",metrics:"views,estimatedMinutesWatched,averageViewDuration,averageViewPercentage,subscribersGained",dimensions:"day",sort:"day"}).then(function(e){},function(e){console.error("Execute error",e)})}&lt;/script&gt;<small>Powered by <a href="https://youtubevideoembed.com/">Embed YouTube Video</a></small></iframe></div> </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="favorite_movies_container">
+ <span class="label" id="favorite_movies_label">
+ Favorite Movies:
+ </span>
+
+ <span class="value" id="favorite_movies_value">
+ <iframe width="560" height="315" src="//www.youtube.com/embed/EsO3PfQiXy8" frameborder="0"></iframe> </span>
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ <div class="container" id="hobbies_container">
+ <span class="label" id="hobbies_label">
+ Hobbies:
+ </span>
+
+ <span class="value" id="hobbies_value">
+ <a href="http://www.amazon.co.uk/wishlist/3D0MOTP0S0SE5">My Amazon Wishlistuk</a> </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="talents_container">
+ <span class="label" id="talents_label">
+ Talents:
+ </span>
+
+ <span class="value" id="talents_value">
+ i love to Dance , Travel and Cook </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="perfect_mate_container">
+ <span class="label" id="perfect_mate_label">
+ Perfect Mate:
+ </span>
+
+ <span class="value" id="perfect_mate_value">
+ Perfect mate is Magic Mike </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="perfect_date_container">
+ <span class="label" id="perfect_date_label">
+ Perfect Date:
+ </span>
+
+ <span class="value" id="perfect_date_value">
+ Perfect Date .You and Me , romatic dinner and wild sex </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="turn_ons_container">
+ <span class="label" id="turn_ons_label">
+ Turn Ons/Offs:
+ </span>
+
+ <span class="value" id="turn_ons_value">
+ I hate Liers and Rude Peoples </span>
+ </div>
+
+
+
+
+
+ <div class="container" id="know_me_container">
+ <span class="label" id="know_me_label">
+ Best Reason to Get to Know Me:
+ </span>
+
+ <span class="value" id="know_me_value">
+ My dear men, please dont put a label on medont make me a category before you get to know me! </span>
+ </div>
+
+
+
+ </div>
+ </div>
+
+ </div>
+
+ </div>
+
+ <div id="footer_bar">
+ <div class="footer_links">
+ <a href="/">Profiles.MyFreeCams.com</a> |
+ <a href='https://www.myfreecams.com/'>MyFreeCams.com</a> |
+ <a href="/_/my_profile">My Profile</a> |
+ <a href="/_/login">Profile Settings</a>
+ </div>
+ </div>
+
+ <div id="gallery_password_container" style="display: none !important;">
+ <div id="gallery_password_form_modal">
+ <div id="protected_gallery_name"></div>
+ <div id="protected_gallery_instructions">
+ You must specify the password to view this gallery
+ </div>
+ <form id="gallery_password_form" method=post data-mfc-no-token="1password_protected_gallery">
+ <label for="gallery_password">Password:</label>
+ <input type="password" name="gallery_password" id="gallery_password">
+ <input type="submit" name="submit" value="submit" data-mfc-submitted="verifying...">
+ </form>
+ <div id="gallery_password_form_error"></div>
+ </div>
+ </div>
+ <div id="send_message_container" style="display: none !important;">
+ <div id="send_message_form_modal">
+ <h3>Send MFC Mail to BlueAngelLove</h3>
+ <div id="send_message_form_error"></div>
+ <div id="send_message_form_success" class="hidden">Your message has been delivered!</div>
+ </div>
+ </div>
+ <script src="https://assets.mfcimg.com/js/MfcBrokenImageDetector.js"></script>
+ <script src="https://assets.mfcimg.com/js/MfcUtilities.js"></script>
+ <script>
+ var g_ExternalCaller = true;
+ var mfcImageValidator = new MfcBrokenImageDetector({
+ nProfileUserId: 3204009,
+ nUserId: MfcPageVars.userId,
+ sImgSelector: '.wall_post_body img',
+ sImgParentSelector: '.wall_post_body',
+ sToken: MfcPageVars.vToken
+ });
+
+ mfcImageValidator.checkImages();
+ </script>
+ <script src="https://img.mfcimg.com/profiles/prod/22793316144741120/js/profiles.js?nc=22793316144741120"></script>
+ <script type="text/javascript">
+
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-295864-5']);
+ _gaq.push(['_setDomainName', 'myfreecams.com']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+
+</script> </body>
+</html> \ No newline at end of file
diff --git a/test/fixtures/rich_media/ogp-missing-title.html b/test/fixtures/rich_media/ogp-missing-title.html
new file mode 100644
index 000000000..fcdbedfc6
--- /dev/null
+++ b/test/fixtures/rich_media/ogp-missing-title.html
@@ -0,0 +1,12 @@
+<html prefix="og: http://ogp.me/ns#">
+
+<head>
+ <title>The Rock (1996)</title>
+ <meta property="og:type" content="video.movie" />
+ <meta property="og:url" content="http://www.imdb.com/title/tt0117500/" />
+ <meta property="og:image" content="http://ia.media-imdb.com/images/rock.jpg" />
+ <meta property="og:description"
+ content="Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.">
+</head>
+
+</html>
diff --git a/test/fixtures/httpoison_mock/7369654.atom b/test/fixtures/tesla_mock/7369654.atom
index 74fd9ce6b..74fd9ce6b 100644
--- a/test/fixtures/httpoison_mock/7369654.atom
+++ b/test/fixtures/tesla_mock/7369654.atom
diff --git a/test/fixtures/httpoison_mock/7369654.html b/test/fixtures/tesla_mock/7369654.html
index a75a90b90..a75a90b90 100644
--- a/test/fixtures/httpoison_mock/7369654.html
+++ b/test/fixtures/tesla_mock/7369654.html
diff --git a/test/fixtures/httpoison_mock/7even.json b/test/fixtures/tesla_mock/7even.json
index eb3bab14e..eb3bab14e 100644
--- a/test/fixtures/httpoison_mock/7even.json
+++ b/test/fixtures/tesla_mock/7even.json
diff --git a/test/fixtures/tesla_mock/admin@mastdon.example.org.json b/test/fixtures/tesla_mock/admin@mastdon.example.org.json
new file mode 100644
index 000000000..8159dc20a
--- /dev/null
+++ b/test/fixtures/tesla_mock/admin@mastdon.example.org.json
@@ -0,0 +1,54 @@
+{
+ "@context": ["https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1", {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "movedTo": "as:movedTo",
+ "Hashtag": "as:Hashtag",
+ "ostatus": "http://ostatus.org#",
+ "atomUri": "ostatus:atomUri",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji"
+ }],
+ "id": "http://mastodon.example.org/users/admin",
+ "type": "Person",
+ "following": "http://mastodon.example.org/users/admin/following",
+ "followers": "http://mastodon.example.org/users/admin/followers",
+ "inbox": "http://mastodon.example.org/users/admin/inbox",
+ "outbox": "http://mastodon.example.org/users/admin/outbox",
+ "preferredUsername": "admin",
+ "name": null,
+ "summary": "\u003cp\u003e\u003c/p\u003e",
+ "url": "http://mastodon.example.org/@admin",
+ "manuallyApprovesFollowers": false,
+ "publicKey": {
+ "id": "http://mastodon.example.org/users/admin#main-key",
+ "owner": "http://mastodon.example.org/users/admin",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtc4Tir+3ADhSNF6VKrtW\nOU32T01w7V0yshmQei38YyiVwVvFu8XOP6ACchkdxbJ+C9mZud8qWaRJKVbFTMUG\nNX4+6Q+FobyuKrwN7CEwhDALZtaN2IPbaPd6uG1B7QhWorrY+yFa8f2TBM3BxnUy\nI4T+bMIZIEYG7KtljCBoQXuTQmGtuffO0UwJksidg2ffCF5Q+K//JfQagJ3UzrR+\nZXbKMJdAw4bCVJYs4Z5EhHYBwQWiXCyMGTd7BGlmMkY6Av7ZqHKC/owp3/0EWDNz\nNqF09Wcpr3y3e8nA10X40MJqp/wR+1xtxp+YGbq/Cj5hZGBG7etFOmIpVBrDOhry\nBwIDAQAB\n-----END PUBLIC KEY-----\n"
+ },
+ "attachment": [{
+ "type": "PropertyValue",
+ "name": "foo",
+ "value": "bar"
+ },
+ {
+ "type": "PropertyValue",
+ "name": "foo1",
+ "value": "bar1"
+ }
+ ],
+ "endpoints": {
+ "sharedInbox": "http://mastodon.example.org/inbox"
+ },
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "url": "https://cdn.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg"
+ },
+ "image": {
+ "type": "Image",
+ "mediaType": "image/png",
+ "url": "https://cdn.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png"
+ }
+}
diff --git a/test/fixtures/httpoison_mock/atarifrosch_feed.xml b/test/fixtures/tesla_mock/atarifrosch_feed.xml
index e00df782e..e00df782e 100644
--- a/test/fixtures/httpoison_mock/atarifrosch_feed.xml
+++ b/test/fixtures/tesla_mock/atarifrosch_feed.xml
diff --git a/test/fixtures/httpoison_mock/atarifrosch_webfinger.xml b/test/fixtures/tesla_mock/atarifrosch_webfinger.xml
index 24188362c..24188362c 100644
--- a/test/fixtures/httpoison_mock/atarifrosch_webfinger.xml
+++ b/test/fixtures/tesla_mock/atarifrosch_webfinger.xml
diff --git a/test/fixtures/httpoison_mock/baptiste.gelex.xyz-article.json b/test/fixtures/tesla_mock/baptiste.gelex.xyz-article.json
index 3f3f0f4fb..3f3f0f4fb 100644
--- a/test/fixtures/httpoison_mock/baptiste.gelex.xyz-article.json
+++ b/test/fixtures/tesla_mock/baptiste.gelex.xyz-article.json
diff --git a/test/fixtures/httpoison_mock/baptiste.gelex.xyz-user.json b/test/fixtures/tesla_mock/baptiste.gelex.xyz-user.json
index b226204ba..b226204ba 100644
--- a/test/fixtures/httpoison_mock/baptiste.gelex.xyz-user.json
+++ b/test/fixtures/tesla_mock/baptiste.gelex.xyz-user.json
diff --git a/test/fixtures/httpoison_mock/eal_sakamoto.xml b/test/fixtures/tesla_mock/eal_sakamoto.xml
index 934d539c9..934d539c9 100644
--- a/test/fixtures/httpoison_mock/eal_sakamoto.xml
+++ b/test/fixtures/tesla_mock/eal_sakamoto.xml
diff --git a/test/fixtures/httpoison_mock/emelie.atom b/test/fixtures/tesla_mock/emelie.atom
index ddaa1c6ca..ddaa1c6ca 100644
--- a/test/fixtures/httpoison_mock/emelie.atom
+++ b/test/fixtures/tesla_mock/emelie.atom
diff --git a/test/fixtures/tesla_mock/emelie.json b/test/fixtures/tesla_mock/emelie.json
new file mode 100644
index 000000000..592fc0e4e
--- /dev/null
+++ b/test/fixtures/tesla_mock/emelie.json
@@ -0,0 +1 @@
+{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","toot":"http://joinmastodon.org/ns#","featured":{"@id":"toot:featured","@type":"@id"},"alsoKnownAs":{"@id":"as:alsoKnownAs","@type":"@id"},"movedTo":{"@id":"as:movedTo","@type":"@id"},"schema":"http://schema.org#","PropertyValue":"schema:PropertyValue","value":"schema:value","Hashtag":"as:Hashtag","Emoji":"toot:Emoji","IdentityProof":"toot:IdentityProof","focalPoint":{"@container":"@list","@id":"toot:focalPoint"}}],"id":"https://mastodon.social/users/emelie","type":"Person","following":"https://mastodon.social/users/emelie/following","followers":"https://mastodon.social/users/emelie/followers","inbox":"https://mastodon.social/users/emelie/inbox","outbox":"https://mastodon.social/users/emelie/outbox","featured":"https://mastodon.social/users/emelie/collections/featured","preferredUsername":"emelie","name":"emelie 🎨","summary":"\u003cp\u003e23 / \u003ca href=\"https://mastodon.social/tags/sweden\" class=\"mention hashtag\" rel=\"tag\"\u003e#\u003cspan\u003eSweden\u003c/span\u003e\u003c/a\u003e / \u003ca href=\"https://mastodon.social/tags/artist\" class=\"mention hashtag\" rel=\"tag\"\u003e#\u003cspan\u003eArtist\u003c/span\u003e\u003c/a\u003e / \u003ca href=\"https://mastodon.social/tags/equestrian\" class=\"mention hashtag\" rel=\"tag\"\u003e#\u003cspan\u003eEquestrian\u003c/span\u003e\u003c/a\u003e / \u003ca href=\"https://mastodon.social/tags/gamedev\" class=\"mention hashtag\" rel=\"tag\"\u003e#\u003cspan\u003eGameDev\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp\u003eIf I ain\u0026apos;t spending time with my pets, I\u0026apos;m probably drawing. 🐴 🐱 🐰\u003c/p\u003e","url":"https://mastodon.social/@emelie","manuallyApprovesFollowers":false,"publicKey":{"id":"https://mastodon.social/users/emelie#main-key","owner":"https://mastodon.social/users/emelie","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu3CWs1oAJPE3ZJ9sj6Ut\n/Mu+mTE7MOijsQc8/6c73XVVuhIEomiozJIH7l8a7S1n5SYL4UuiwcubSOi7u1bb\nGpYnp5TYhN+Cxvq/P80V4/ncNIPSQzS49it7nSLeG5pA21lGPDA44huquES1un6p\n9gSmbTwngVX9oe4MYuUeh0Z7vijjU13Llz1cRq/ZgPQPgfz+2NJf+VeXnvyDZDYx\nZPVBBlrMl3VoGbu0M5L8SjY35559KCZ3woIvqRolcoHXfgvJMdPcJgSZVYxlCw3d\nA95q9jQcn6s87CPSUs7bmYEQCrDVn5m5NER5TzwBmP4cgJl9AaDVWQtRd4jFZNTx\nlQIDAQAB\n-----END PUBLIC KEY-----\n"},"tag":[{"type":"Hashtag","href":"https://mastodon.social/explore/sweden","name":"#sweden"},{"type":"Hashtag","href":"https://mastodon.social/explore/gamedev","name":"#gamedev"},{"type":"Hashtag","href":"https://mastodon.social/explore/artist","name":"#artist"},{"type":"Hashtag","href":"https://mastodon.social/explore/equestrian","name":"#equestrian"}],"attachment":[{"type":"PropertyValue","name":"Ko-fi","value":"\u003ca href=\"https://ko-fi.com/emeliepng\" rel=\"me nofollow noopener\" target=\"_blank\"\u003e\u003cspan class=\"invisible\"\u003ehttps://\u003c/span\u003e\u003cspan class=\"\"\u003eko-fi.com/emeliepng\u003c/span\u003e\u003cspan class=\"invisible\"\u003e\u003c/span\u003e\u003c/a\u003e"},{"type":"PropertyValue","name":"Instagram","value":"\u003ca href=\"https://www.instagram.com/emelie_png/\" rel=\"me nofollow noopener\" target=\"_blank\"\u003e\u003cspan class=\"invisible\"\u003ehttps://www.\u003c/span\u003e\u003cspan class=\"\"\u003einstagram.com/emelie_png/\u003c/span\u003e\u003cspan class=\"invisible\"\u003e\u003c/span\u003e\u003c/a\u003e"},{"type":"PropertyValue","name":"Carrd","value":"\u003ca href=\"https://emelie.carrd.co/\" rel=\"me nofollow noopener\" target=\"_blank\"\u003e\u003cspan class=\"invisible\"\u003ehttps://\u003c/span\u003e\u003cspan class=\"\"\u003eemelie.carrd.co/\u003c/span\u003e\u003cspan class=\"invisible\"\u003e\u003c/span\u003e\u003c/a\u003e"},{"type":"PropertyValue","name":"Artstation","value":"\u003ca href=\"https://emiri.artstation.com\" rel=\"me nofollow noopener\" target=\"_blank\"\u003e\u003cspan class=\"invisible\"\u003ehttps://\u003c/span\u003e\u003cspan class=\"\"\u003eemiri.artstation.com\u003c/span\u003e\u003cspan class=\"invisible\"\u003e\u003c/span\u003e\u003c/a\u003e"}],"endpoints":{"sharedInbox":"https://mastodon.social/inbox"},"icon":{"type":"Image","mediaType":"image/png","url":"https://files.mastodon.social/accounts/avatars/000/015/657/original/e7163f98280da1a4.png"},"image":{"type":"Image","mediaType":"image/png","url":"https://files.mastodon.social/accounts/headers/000/015/657/original/847f331f3dd9e38b.png"}} \ No newline at end of file
diff --git a/test/fixtures/httpoison_mock/framasoft@framatube.org.json b/test/fixtures/tesla_mock/framasoft@framatube.org.json
index dcd5e88f5..dcd5e88f5 100644
--- a/test/fixtures/httpoison_mock/framasoft@framatube.org.json
+++ b/test/fixtures/tesla_mock/framasoft@framatube.org.json
diff --git a/test/fixtures/httpoison_mock/framatube.org_host_meta b/test/fixtures/tesla_mock/framatube.org_host_meta
index 91516ff6d..91516ff6d 100644
--- a/test/fixtures/httpoison_mock/framatube.org_host_meta
+++ b/test/fixtures/tesla_mock/framatube.org_host_meta
diff --git a/test/fixtures/httpoison_mock/gerzilla.de_host_meta b/test/fixtures/tesla_mock/gerzilla.de_host_meta
index fae8f37eb..fae8f37eb 100644
--- a/test/fixtures/httpoison_mock/gerzilla.de_host_meta
+++ b/test/fixtures/tesla_mock/gerzilla.de_host_meta
diff --git a/test/fixtures/httpoison_mock/gnusocial.de_host_meta b/test/fixtures/tesla_mock/gnusocial.de_host_meta
index a4affb102..a4affb102 100644
--- a/test/fixtures/httpoison_mock/gnusocial.de_host_meta
+++ b/test/fixtures/tesla_mock/gnusocial.de_host_meta
diff --git a/test/fixtures/httpoison_mock/gs.example.org_host_meta b/test/fixtures/tesla_mock/gs.example.org_host_meta
index c2fcd7305..c2fcd7305 100644
--- a/test/fixtures/httpoison_mock/gs.example.org_host_meta
+++ b/test/fixtures/tesla_mock/gs.example.org_host_meta
diff --git a/test/fixtures/httpoison_mock/hellpie.json b/test/fixtures/tesla_mock/hellpie.json
index e228ba394..e228ba394 100644
--- a/test/fixtures/httpoison_mock/hellpie.json
+++ b/test/fixtures/tesla_mock/hellpie.json
diff --git a/test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml b/test/fixtures/tesla_mock/http___gs.example.org_4040_index.php_user_1.xml
index 058f629ab..058f629ab 100644
--- a/test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml
+++ b/test/fixtures/tesla_mock/http___gs.example.org_4040_index.php_user_1.xml
diff --git a/test/fixtures/httpoison_mock/http___mastodon.example.org_users_admin_status_1234.json b/test/fixtures/tesla_mock/http___mastodon.example.org_users_admin_status_1234.json
index 5c7c9c6d3..5c7c9c6d3 100644
--- a/test/fixtures/httpoison_mock/http___mastodon.example.org_users_admin_status_1234.json
+++ b/test/fixtures/tesla_mock/http___mastodon.example.org_users_admin_status_1234.json
diff --git a/test/fixtures/httpoison_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml b/test/fixtures/tesla_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml
index 490467708..490467708 100644
--- a/test/fixtures/httpoison_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml
+++ b/test/fixtures/tesla_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml
diff --git a/test/fixtures/httpoison_mock/https___info.pleroma.site_actor.json b/test/fixtures/tesla_mock/https___info.pleroma.site_actor.json
index 9dabf0e52..9dabf0e52 100644
--- a/test/fixtures/httpoison_mock/https___info.pleroma.site_actor.json
+++ b/test/fixtures/tesla_mock/https___info.pleroma.site_actor.json
diff --git a/test/fixtures/httpoison_mock/https___mamot.fr_users_Skruyb.atom b/test/fixtures/tesla_mock/https___mamot.fr_users_Skruyb.atom
index b5f3d923b..b5f3d923b 100644
--- a/test/fixtures/httpoison_mock/https___mamot.fr_users_Skruyb.atom
+++ b/test/fixtures/tesla_mock/https___mamot.fr_users_Skruyb.atom
diff --git a/test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.atom b/test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.atom
index 4d732b109..4d732b109 100644
--- a/test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.atom
+++ b/test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.atom
diff --git a/test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml b/test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.xml
index 6a6a978a2..6a6a978a2 100644
--- a/test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml
+++ b/test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.xml
diff --git a/test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json b/test/fixtures/tesla_mock/https___osada.macgirvin.com_channel_mike.json
index c42f3a53c..c42f3a53c 100644
--- a/test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json
+++ b/test/fixtures/tesla_mock/https___osada.macgirvin.com_channel_mike.json
diff --git a/test/fixtures/httpoison_mock/https___pawoo.net_users_aqidaqidaqid.xml b/test/fixtures/tesla_mock/https___pawoo.net_users_aqidaqidaqid.xml
index 2de8a44b9..2de8a44b9 100644
--- a/test/fixtures/httpoison_mock/https___pawoo.net_users_aqidaqidaqid.xml
+++ b/test/fixtures/tesla_mock/https___pawoo.net_users_aqidaqidaqid.xml
diff --git a/test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.atom b/test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.atom
index 17d1956e8..17d1956e8 100644
--- a/test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.atom
+++ b/test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.atom
diff --git a/test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.xml b/test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.xml
index 1f1478a5e..1f1478a5e 100644
--- a/test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.xml
+++ b/test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.xml
diff --git a/test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml b/test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain.xml
index 284a30df0..284a30df0 100644
--- a/test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml
+++ b/test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain.xml
diff --git a/test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml b/test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml
index a2a2629a6..a2a2629a6 100644
--- a/test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml
+++ b/test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml
diff --git a/test/fixtures/httpoison_mock/https___prismo.news__mxb.json b/test/fixtures/tesla_mock/https___prismo.news__mxb.json
index a2fe53117..a2fe53117 100644
--- a/test/fixtures/httpoison_mock/https___prismo.news__mxb.json
+++ b/test/fixtures/tesla_mock/https___prismo.news__mxb.json
diff --git a/test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml b/test/fixtures/tesla_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml
index 26fdebb49..26fdebb49 100644
--- a/test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml
+++ b/test/fixtures/tesla_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml
diff --git a/test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml b/test/fixtures/tesla_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml
index 31df7c2a6..31df7c2a6 100644
--- a/test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml
+++ b/test/fixtures/tesla_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml
diff --git a/test/fixtures/httpoison_mock/https___shitposter.club_notice_2827873.html b/test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.html
index 54745ef3d..54745ef3d 100644
--- a/test/fixtures/httpoison_mock/https___shitposter.club_notice_2827873.html
+++ b/test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.html
diff --git a/test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml b/test/fixtures/tesla_mock/https___shitposter.club_user_1.xml
index bf54c80c8..bf54c80c8 100644
--- a/test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml
+++ b/test/fixtures/tesla_mock/https___shitposter.club_user_1.xml
diff --git a/test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml b/test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml
index 6cba5c28f..6cba5c28f 100644
--- a/test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml
+++ b/test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml
diff --git a/test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml b/test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml
index f70fbc695..f70fbc695 100644
--- a/test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml
+++ b/test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml
diff --git a/test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml b/test/fixtures/tesla_mock/https___social.heldscal.la_user_23211.xml
index 426a52939..426a52939 100644
--- a/test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml
+++ b/test/fixtures/tesla_mock/https___social.heldscal.la_user_23211.xml
diff --git a/test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml b/test/fixtures/tesla_mock/https___social.heldscal.la_user_29191.xml
index 641103377..641103377 100644
--- a/test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml
+++ b/test/fixtures/tesla_mock/https___social.heldscal.la_user_29191.xml
diff --git a/test/fixtures/httpoison_mock/https__info.pleroma.site_activity.json b/test/fixtures/tesla_mock/https__info.pleroma.site_activity.json
index a0dc4c830..a0dc4c830 100644
--- a/test/fixtures/httpoison_mock/https__info.pleroma.site_activity.json
+++ b/test/fixtures/tesla_mock/https__info.pleroma.site_activity.json
diff --git a/test/fixtures/httpoison_mock/https__info.pleroma.site_activity2.json b/test/fixtures/tesla_mock/https__info.pleroma.site_activity2.json
index b16a9279b..b16a9279b 100644
--- a/test/fixtures/httpoison_mock/https__info.pleroma.site_activity2.json
+++ b/test/fixtures/tesla_mock/https__info.pleroma.site_activity2.json
diff --git a/test/fixtures/httpoison_mock/https__info.pleroma.site_activity3.json b/test/fixtures/tesla_mock/https__info.pleroma.site_activity3.json
index 1df73f2c5..1df73f2c5 100644
--- a/test/fixtures/httpoison_mock/https__info.pleroma.site_activity3.json
+++ b/test/fixtures/tesla_mock/https__info.pleroma.site_activity3.json
diff --git a/test/fixtures/httpoison_mock/https__info.pleroma.site_activity4.json b/test/fixtures/tesla_mock/https__info.pleroma.site_activity4.json
index 57a73b12a..57a73b12a 100644
--- a/test/fixtures/httpoison_mock/https__info.pleroma.site_activity4.json
+++ b/test/fixtures/tesla_mock/https__info.pleroma.site_activity4.json
diff --git a/test/fixtures/httpoison_mock/kaniini@gerzilla.de.json b/test/fixtures/tesla_mock/kaniini@gerzilla.de.json
index be2f69b18..be2f69b18 100644
--- a/test/fixtures/httpoison_mock/kaniini@gerzilla.de.json
+++ b/test/fixtures/tesla_mock/kaniini@gerzilla.de.json
diff --git a/test/fixtures/httpoison_mock/kaniini@hubzilla.example.org.json b/test/fixtures/tesla_mock/kaniini@hubzilla.example.org.json
index 11c79e11e..11c79e11e 100644
--- a/test/fixtures/httpoison_mock/kaniini@hubzilla.example.org.json
+++ b/test/fixtures/tesla_mock/kaniini@hubzilla.example.org.json
diff --git a/test/fixtures/tesla_mock/kpherox@mstdn.jp.xml b/test/fixtures/tesla_mock/kpherox@mstdn.jp.xml
new file mode 100644
index 000000000..2ec134eaa
--- /dev/null
+++ b/test/fixtures/tesla_mock/kpherox@mstdn.jp.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+ <Subject>acct:kPherox@mstdn.jp</Subject>
+ <Alias>https://mstdn.jp/@kPherox</Alias>
+ <Alias>https://mstdn.jp/users/kPherox</Alias>
+ <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="https://mstdn.jp/@kPherox"/>
+ <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="https://mstdn.jp/users/kPherox.atom"/>
+ <Link rel="self" type="application/activity+json" href="https://mstdn.jp/users/kPherox"/>
+ <Link rel="http://ostatus.org/schema/1.0/subscribe" template="https://mstdn.jp/authorize_interaction?acct={uri}"/>
+</XRD>
diff --git a/test/fixtures/httpoison_mock/lain_squeet.me_webfinger.xml b/test/fixtures/tesla_mock/lain_squeet.me_webfinger.xml
index 948e4758e..948e4758e 100644
--- a/test/fixtures/httpoison_mock/lain_squeet.me_webfinger.xml
+++ b/test/fixtures/tesla_mock/lain_squeet.me_webfinger.xml
diff --git a/test/fixtures/httpoison_mock/lucifermysticus.json b/test/fixtures/tesla_mock/lucifermysticus.json
index 0409046e2..0409046e2 100644
--- a/test/fixtures/httpoison_mock/lucifermysticus.json
+++ b/test/fixtures/tesla_mock/lucifermysticus.json
diff --git a/test/fixtures/httpoison_mock/macgirvin.com_host_meta b/test/fixtures/tesla_mock/macgirvin.com_host_meta
index cd30b602f..cd30b602f 100644
--- a/test/fixtures/httpoison_mock/macgirvin.com_host_meta
+++ b/test/fixtures/tesla_mock/macgirvin.com_host_meta
diff --git a/test/fixtures/httpoison_mock/mamot.fr_host_meta b/test/fixtures/tesla_mock/mamot.fr_host_meta
index ed7a95094..ed7a95094 100644
--- a/test/fixtures/httpoison_mock/mamot.fr_host_meta
+++ b/test/fixtures/tesla_mock/mamot.fr_host_meta
diff --git a/test/fixtures/httpoison_mock/mastodon.social_host_meta b/test/fixtures/tesla_mock/mastodon.social_host_meta
index 78e46e260..78e46e260 100644
--- a/test/fixtures/httpoison_mock/mastodon.social_host_meta
+++ b/test/fixtures/tesla_mock/mastodon.social_host_meta
diff --git a/test/fixtures/httpoison_mock/mastodon.xyz_host_meta b/test/fixtures/tesla_mock/mastodon.xyz_host_meta
index 8604316fb..8604316fb 100644
--- a/test/fixtures/httpoison_mock/mastodon.xyz_host_meta
+++ b/test/fixtures/tesla_mock/mastodon.xyz_host_meta
diff --git a/test/fixtures/httpoison_mock/mayumayu.json b/test/fixtures/tesla_mock/mayumayu.json
index 2d5cdae1e..2d5cdae1e 100644
--- a/test/fixtures/httpoison_mock/mayumayu.json
+++ b/test/fixtures/tesla_mock/mayumayu.json
diff --git a/test/fixtures/httpoison_mock/mayumayupost.json b/test/fixtures/tesla_mock/mayumayupost.json
index fbee043e6..fbee043e6 100644
--- a/test/fixtures/httpoison_mock/mayumayupost.json
+++ b/test/fixtures/tesla_mock/mayumayupost.json
diff --git a/test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json b/test/fixtures/tesla_mock/mike@osada.macgirvin.com.json
index fe6b83ca6..fe6b83ca6 100644
--- a/test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json
+++ b/test/fixtures/tesla_mock/mike@osada.macgirvin.com.json
diff --git a/test/fixtures/httpoison_mock/nonexistant@social.heldscal.la.xml b/test/fixtures/tesla_mock/nonexistant@social.heldscal.la.xml
index 2a61de8dd..2a61de8dd 100644
--- a/test/fixtures/httpoison_mock/nonexistant@social.heldscal.la.xml
+++ b/test/fixtures/tesla_mock/nonexistant@social.heldscal.la.xml
diff --git a/test/fixtures/httpoison_mock/pawoo.net_host_meta b/test/fixtures/tesla_mock/pawoo.net_host_meta
index dbbe7be5f..dbbe7be5f 100644
--- a/test/fixtures/httpoison_mock/pawoo.net_host_meta
+++ b/test/fixtures/tesla_mock/pawoo.net_host_meta
diff --git a/test/fixtures/httpoison_mock/peertube.moe-vid.json b/test/fixtures/tesla_mock/peertube.moe-vid.json
index 76296eb7d..76296eb7d 100644
--- a/test/fixtures/httpoison_mock/peertube.moe-vid.json
+++ b/test/fixtures/tesla_mock/peertube.moe-vid.json
diff --git a/test/fixtures/httpoison_mock/pleroma.soykaf.com_host_meta b/test/fixtures/tesla_mock/pleroma.soykaf.com_host_meta
index fb5c15a4f..fb5c15a4f 100644
--- a/test/fixtures/httpoison_mock/pleroma.soykaf.com_host_meta
+++ b/test/fixtures/tesla_mock/pleroma.soykaf.com_host_meta
diff --git a/test/fixtures/httpoison_mock/puckipedia.com.json b/test/fixtures/tesla_mock/puckipedia.com.json
index d18dfbae7..d18dfbae7 100644
--- a/test/fixtures/httpoison_mock/puckipedia.com.json
+++ b/test/fixtures/tesla_mock/puckipedia.com.json
diff --git a/test/fixtures/tesla_mock/rinpatch.json b/test/fixtures/tesla_mock/rinpatch.json
new file mode 100644
index 000000000..59311ecb6
--- /dev/null
+++ b/test/fixtures/tesla_mock/rinpatch.json
@@ -0,0 +1,64 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "toot": "http://joinmastodon.org/ns#",
+ "featured": {
+ "@id": "toot:featured",
+ "@type": "@id"
+ },
+ "alsoKnownAs": {
+ "@id": "as:alsoKnownAs",
+ "@type": "@id"
+ },
+ "movedTo": {
+ "@id": "as:movedTo",
+ "@type": "@id"
+ },
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "Hashtag": "as:Hashtag",
+ "Emoji": "toot:Emoji",
+ "IdentityProof": "toot:IdentityProof",
+ "focalPoint": {
+ "@container": "@list",
+ "@id": "toot:focalPoint"
+ }
+ }
+ ],
+ "id": "https://mastodon.sdf.org/users/rinpatch",
+ "type": "Person",
+ "following": "https://mastodon.sdf.org/users/rinpatch/following",
+ "followers": "https://mastodon.sdf.org/users/rinpatch/followers",
+ "inbox": "https://mastodon.sdf.org/users/rinpatch/inbox",
+ "outbox": "https://mastodon.sdf.org/users/rinpatch/outbox",
+ "featured": "https://mastodon.sdf.org/users/rinpatch/collections/featured",
+ "preferredUsername": "rinpatch",
+ "name": "rinpatch",
+ "summary": "<p>umu</p>",
+ "url": "https://mastodon.sdf.org/@rinpatch",
+ "manuallyApprovesFollowers": false,
+ "publicKey": {
+ "id": "https://mastodon.sdf.org/users/rinpatch#main-key",
+ "owner": "https://mastodon.sdf.org/users/rinpatch",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1vbhYKDopb5xzfJB2TZY\n0ZvgxqdAhbSKKkQC5Q2b0ofhvueDy2AuZTnVk1/BbHNlqKlwhJUSpA6LiTZVvtcc\nMn6cmSaJJEg30gRF5GARP8FMcuq8e2jmceiW99NnUX17MQXsddSf2JFUwD0rUE8H\nBsgD7UzE9+zlA/PJOTBO7fvBEz9PTQ3r4sRMTJVFvKz2MU/U+aRNTuexRKMMPnUw\nfp6VWh1F44VWJEQOs4tOEjGiQiMQh5OfBk1w2haT3vrDbQvq23tNpUP1cRomLUtx\nEBcGKi5DMMBzE1RTVT1YUykR/zLWlA+JSmw7P6cWtsHYZovs8dgn8Po3X//6N+ng\nTQIDAQAB\n-----END PUBLIC KEY-----\n"
+ },
+ "tag": [],
+ "attachment": [],
+ "endpoints": {
+ "sharedInbox": "https://mastodon.sdf.org/inbox"
+ },
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "url": "https://mastodon.sdf.org/system/accounts/avatars/000/067/580/original/bf05521bf711b7a0.jpg?1533238802"
+ },
+ "image": {
+ "type": "Image",
+ "mediaType": "image/gif",
+ "url": "https://mastodon.sdf.org/system/accounts/headers/000/067/580/original/a99b987e798f7063.gif?1533278217"
+ }
+}
diff --git a/test/fixtures/httpoison_mock/rye.json b/test/fixtures/tesla_mock/rye.json
index f31d1ddd8..f31d1ddd8 100644
--- a/test/fixtures/httpoison_mock/rye.json
+++ b/test/fixtures/tesla_mock/rye.json
diff --git a/test/fixtures/httpoison_mock/sakamoto.atom b/test/fixtures/tesla_mock/sakamoto.atom
index 648946795..648946795 100644
--- a/test/fixtures/httpoison_mock/sakamoto.atom
+++ b/test/fixtures/tesla_mock/sakamoto.atom
diff --git a/test/fixtures/httpoison_mock/sakamoto_eal_feed.atom b/test/fixtures/tesla_mock/sakamoto_eal_feed.atom
index 9340d9038..9340d9038 100644
--- a/test/fixtures/httpoison_mock/sakamoto_eal_feed.atom
+++ b/test/fixtures/tesla_mock/sakamoto_eal_feed.atom
diff --git a/test/fixtures/httpoison_mock/shitposter.club_host_meta b/test/fixtures/tesla_mock/shitposter.club_host_meta
index 9d012e1df..9d012e1df 100644
--- a/test/fixtures/httpoison_mock/shitposter.club_host_meta
+++ b/test/fixtures/tesla_mock/shitposter.club_host_meta
diff --git a/test/fixtures/httpoison_mock/shp@pleroma.soykaf.com.feed b/test/fixtures/tesla_mock/shp@pleroma.soykaf.com.feed
index b24ef7ab6..b24ef7ab6 100644
--- a/test/fixtures/httpoison_mock/shp@pleroma.soykaf.com.feed
+++ b/test/fixtures/tesla_mock/shp@pleroma.soykaf.com.feed
diff --git a/test/fixtures/httpoison_mock/shp@pleroma.soykaf.com.webfigner b/test/fixtures/tesla_mock/shp@pleroma.soykaf.com.webfigner
index 23e84306c..23e84306c 100644
--- a/test/fixtures/httpoison_mock/shp@pleroma.soykaf.com.webfigner
+++ b/test/fixtures/tesla_mock/shp@pleroma.soykaf.com.webfigner
diff --git a/test/fixtures/httpoison_mock/shp@social.heldscal.la.xml b/test/fixtures/tesla_mock/shp@social.heldscal.la.xml
index 4cde42e3f..4cde42e3f 100644
--- a/test/fixtures/httpoison_mock/shp@social.heldscal.la.xml
+++ b/test/fixtures/tesla_mock/shp@social.heldscal.la.xml
diff --git a/test/fixtures/httpoison_mock/skruyb@mamot.fr.atom b/test/fixtures/tesla_mock/skruyb@mamot.fr.atom
index 1bbbc29f5..1bbbc29f5 100644
--- a/test/fixtures/httpoison_mock/skruyb@mamot.fr.atom
+++ b/test/fixtures/tesla_mock/skruyb@mamot.fr.atom
diff --git a/test/fixtures/httpoison_mock/social.heldscal.la_host_meta b/test/fixtures/tesla_mock/social.heldscal.la_host_meta
index 540e6257e..540e6257e 100644
--- a/test/fixtures/httpoison_mock/social.heldscal.la_host_meta
+++ b/test/fixtures/tesla_mock/social.heldscal.la_host_meta
diff --git a/test/fixtures/httpoison_mock/social.sakamoto.gq_host_meta b/test/fixtures/tesla_mock/social.sakamoto.gq_host_meta
index f193dce2b..f193dce2b 100644
--- a/test/fixtures/httpoison_mock/social.sakamoto.gq_host_meta
+++ b/test/fixtures/tesla_mock/social.sakamoto.gq_host_meta
diff --git a/test/fixtures/httpoison_mock/social.stopwatchingus-heidelberg.de_host_meta b/test/fixtures/tesla_mock/social.stopwatchingus-heidelberg.de_host_meta
index aafc9f60d..aafc9f60d 100644
--- a/test/fixtures/httpoison_mock/social.stopwatchingus-heidelberg.de_host_meta
+++ b/test/fixtures/tesla_mock/social.stopwatchingus-heidelberg.de_host_meta
diff --git a/test/fixtures/httpoison_mock/social.wxcafe.net_host_meta b/test/fixtures/tesla_mock/social.wxcafe.net_host_meta
index 5ffc40a90..5ffc40a90 100644
--- a/test/fixtures/httpoison_mock/social.wxcafe.net_host_meta
+++ b/test/fixtures/tesla_mock/social.wxcafe.net_host_meta
diff --git a/test/fixtures/httpoison_mock/spc_5381.atom b/test/fixtures/tesla_mock/spc_5381.atom
index c3288e97b..c3288e97b 100644
--- a/test/fixtures/httpoison_mock/spc_5381.atom
+++ b/test/fixtures/tesla_mock/spc_5381.atom
diff --git a/test/fixtures/httpoison_mock/spc_5381_xrd.xml b/test/fixtures/tesla_mock/spc_5381_xrd.xml
index b15fb276d..b15fb276d 100644
--- a/test/fixtures/httpoison_mock/spc_5381_xrd.xml
+++ b/test/fixtures/tesla_mock/spc_5381_xrd.xml
diff --git a/test/fixtures/httpoison_mock/squeet.me_host_meta b/test/fixtures/tesla_mock/squeet.me_host_meta
index 4a94ae574..4a94ae574 100644
--- a/test/fixtures/httpoison_mock/squeet.me_host_meta
+++ b/test/fixtures/tesla_mock/squeet.me_host_meta
diff --git a/test/fixtures/httpoison_mock/status.alpicola.com_host_meta b/test/fixtures/tesla_mock/status.alpicola.com_host_meta
index 6948c30ea..6948c30ea 100644
--- a/test/fixtures/httpoison_mock/status.alpicola.com_host_meta
+++ b/test/fixtures/tesla_mock/status.alpicola.com_host_meta
diff --git a/test/fixtures/httpoison_mock/status.emelie.json b/test/fixtures/tesla_mock/status.emelie.json
index 4aada0377..4aada0377 100644
--- a/test/fixtures/httpoison_mock/status.emelie.json
+++ b/test/fixtures/tesla_mock/status.emelie.json
diff --git a/test/fixtures/httpoison_mock/webfinger_emelie.json b/test/fixtures/tesla_mock/webfinger_emelie.json
index 0b61cb618..0b61cb618 100644
--- a/test/fixtures/httpoison_mock/webfinger_emelie.json
+++ b/test/fixtures/tesla_mock/webfinger_emelie.json
diff --git a/test/fixtures/tesla_mock/wedistribute-article.json b/test/fixtures/tesla_mock/wedistribute-article.json
new file mode 100644
index 000000000..39dc1b982
--- /dev/null
+++ b/test/fixtures/tesla_mock/wedistribute-article.json
@@ -0,0 +1,18 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams"
+ ],
+ "type": "Article",
+ "name": "The end is near: Mastodon plans to drop OStatus support",
+ "content": "<!-- wp:paragraph {\"dropCap\":true} -->\n<p class=\"has-drop-cap\">The days of OStatus are numbered. The venerable protocol has served as a glue between many different types of servers since the early days of the Fediverse, connecting StatusNet (now GNU Social) to Friendica, Hubzilla, Mastodon, and Pleroma.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Now that many fediverse platforms support ActivityPub as a successor protocol, Mastodon appears to be drawing a line in the sand. In <a href=\"https://www.patreon.com/posts/mastodon-2-9-and-28121681\">a Patreon update</a>, Eugen Rochko writes:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><p>...OStatus...has overstayed its welcome in the code...and now that most of the network uses ActivityPub, it's time for it to go. </p><cite>Eugen Rochko, Mastodon creator</cite></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:paragraph -->\n<p>The <a href=\"https://github.com/tootsuite/mastodon/pull/11205\">pull request</a> to remove Pubsubhubbub and Salmon, two of the main components of OStatus, has already been merged into Mastodon's master branch.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Some projects will be left in the dark as a side effect of this. GNU Social and PostActiv, for example, both only communicate using OStatus. While <a href=\"https://mastodon.social/@dansup/102076573310057902\">some discussion</a> exists regarding adopting ActivityPub for GNU Social, and <a href=\"https://notabug.org/diogo/gnu-social/src/activitypub/plugins/ActivityPub\">a plugin is in development</a>, it hasn't been formally adopted yet. We just hope that the <a href=\"https://status.fsf.org/main/public\">Free Software Foundation's instance</a> gets updated in time!</p>\n<!-- /wp:paragraph -->",
+ "summary": "One of the largest platforms in the federated social web is dropping the protocol that it started with.",
+ "attributedTo": "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog",
+ "url": "https://wedistribute.org/2019/07/mastodon-drops-ostatus/",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public",
+ "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog/followers"
+ ],
+ "id": "https://wedistribute.org/wp-json/pterotype/v1/object/85810",
+ "likes": "https://wedistribute.org/wp-json/pterotype/v1/object/85810/likes",
+ "shares": "https://wedistribute.org/wp-json/pterotype/v1/object/85810/shares"
+}
diff --git a/test/fixtures/tesla_mock/wedistribute-user.json b/test/fixtures/tesla_mock/wedistribute-user.json
new file mode 100644
index 000000000..fe2a15703
--- /dev/null
+++ b/test/fixtures/tesla_mock/wedistribute-user.json
@@ -0,0 +1,31 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers"
+ }
+ ],
+ "type": "Organization",
+ "id": "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog",
+ "following": "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog/following",
+ "followers": "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog/followers",
+ "liked": "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog/liked",
+ "inbox": "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog/inbox",
+ "outbox": "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog/outbox",
+ "name": "We Distribute",
+ "preferredUsername": "blog",
+ "summary": "<p>Connecting many threads in the federated web. We Distribute is an independent publication dedicated to the fediverse, decentralization, P2P technologies, and Free Software!</p>",
+ "url": "https://wedistribute.org/",
+ "publicKey": {
+ "id": "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog#publicKey",
+ "owner": "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1bmUJ+y8PS8JFVi0KugN\r\nFl4pLvLog3V2lsV9ftmCXpveB/WJx66Tr1fQLsU3qYvQFc8UPGWD52zV4RENR1SN\r\nx0O6T2f97KUbRM+Ckow7Jyjtssgl+Mqq8UBZQ/+H8I/1Vpvt5E5hUykhFgwzx9qg\r\nzoIA3OK7alOpQbSoKXo0QcOh6yTRUnMSRMJAgUoZJzzXI/FmH/DtKr7ziQ1T2KWs\r\nVs8mWnTb/OlCxiheLuMlmJNMF+lPyVthvMIxF6Z5gV9d5QAmASSCI628e6uH2EUF\r\nDEEF5jo+Z5ffeNv28953lrnM+VB/wTjl3tYA+zCQeAmUPksX3E+YkXGxj+4rxBAY\r\n8wIDAQAB\r\n-----END PUBLIC KEY-----"
+ },
+ "manuallyApprovesFollowers": false,
+ "icon": {
+ "url": "https://wedistribute.org/wp-content/uploads/2019/02/b067de423757a538.png",
+ "type": "Image",
+ "mediaType": "image/png"
+ }
+}
diff --git a/test/fixtures/httpoison_mock/winterdienst_webfinger.json b/test/fixtures/tesla_mock/winterdienst_webfinger.json
index e7bfba9ed..e7bfba9ed 100644
--- a/test/fixtures/httpoison_mock/winterdienst_webfinger.json
+++ b/test/fixtures/tesla_mock/winterdienst_webfinger.json
diff --git a/test/fixtures/users_mock/masto_closed_followers.json b/test/fixtures/users_mock/masto_closed_followers.json
new file mode 100644
index 000000000..da296892d
--- /dev/null
+++ b/test/fixtures/users_mock/masto_closed_followers.json
@@ -0,0 +1,7 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "http://localhost:4001/users/masto_closed/followers",
+ "type": "OrderedCollection",
+ "totalItems": 437,
+ "first": "http://localhost:4001/users/masto_closed/followers?page=1"
+}
diff --git a/test/fixtures/users_mock/masto_closed_followers_page.json b/test/fixtures/users_mock/masto_closed_followers_page.json
new file mode 100644
index 000000000..04ab0c4d3
--- /dev/null
+++ b/test/fixtures/users_mock/masto_closed_followers_page.json
@@ -0,0 +1 @@
+{"@context":"https://www.w3.org/ns/activitystreams","id":"http://localhost:4001/users/masto_closed/followers?page=1","type":"OrderedCollectionPage","totalItems":437,"next":"http://localhost:4001/users/masto_closed/followers?page=2","partOf":"http://localhost:4001/users/masto_closed/followers","orderedItems":["https://testing.uguu.ltd/users/rin","https://patch.cx/users/rin","https://letsalllovela.in/users/xoxo","https://pleroma.site/users/crushv","https://aria.company/users/boris","https://kawen.space/users/crushv","https://freespeech.host/users/cvcvcv","https://pleroma.site/users/picpub","https://pixelfed.social/users/nosleep","https://boopsnoot.gq/users/5c1896d162f7d337f90492a3","https://pikachu.rocks/users/waifu","https://royal.crablettesare.life/users/crablettes"]}
diff --git a/test/fixtures/users_mock/masto_closed_following.json b/test/fixtures/users_mock/masto_closed_following.json
new file mode 100644
index 000000000..146d49f9c
--- /dev/null
+++ b/test/fixtures/users_mock/masto_closed_following.json
@@ -0,0 +1,7 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "id": "http://localhost:4001/users/masto_closed/following",
+ "type": "OrderedCollection",
+ "totalItems": 152,
+ "first": "http://localhost:4001/users/masto_closed/following?page=1"
+}
diff --git a/test/fixtures/users_mock/masto_closed_following_page.json b/test/fixtures/users_mock/masto_closed_following_page.json
new file mode 100644
index 000000000..8d8324699
--- /dev/null
+++ b/test/fixtures/users_mock/masto_closed_following_page.json
@@ -0,0 +1 @@
+{"@context":"https://www.w3.org/ns/activitystreams","id":"http://localhost:4001/users/masto_closed/following?page=1","type":"OrderedCollectionPage","totalItems":152,"next":"http://localhost:4001/users/masto_closed/following?page=2","partOf":"http://localhost:4001/users/masto_closed/following","orderedItems":["https://testing.uguu.ltd/users/rin","https://patch.cx/users/rin","https://letsalllovela.in/users/xoxo","https://pleroma.site/users/crushv","https://aria.company/users/boris","https://kawen.space/users/crushv","https://freespeech.host/users/cvcvcv","https://pleroma.site/users/picpub","https://pixelfed.social/users/nosleep","https://boopsnoot.gq/users/5c1896d162f7d337f90492a3","https://pikachu.rocks/users/waifu","https://royal.crablettesare.life/users/crablettes"]}
diff --git a/test/fixtures/users_mock/pleroma_followers.json b/test/fixtures/users_mock/pleroma_followers.json
new file mode 100644
index 000000000..db71d084b
--- /dev/null
+++ b/test/fixtures/users_mock/pleroma_followers.json
@@ -0,0 +1,20 @@
+{
+ "type": "OrderedCollection",
+ "totalItems": 527,
+ "id": "http://localhost:4001/users/fuser2/followers",
+ "first": {
+ "type": "OrderedCollectionPage",
+ "totalItems": 527,
+ "partOf": "http://localhost:4001/users/fuser2/followers",
+ "orderedItems": [],
+ "next": "http://localhost:4001/users/fuser2/followers?page=2",
+ "id": "http://localhost:4001/users/fuser2/followers?page=1"
+ },
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "http://localhost:4001/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ]
+}
diff --git a/test/fixtures/users_mock/pleroma_following.json b/test/fixtures/users_mock/pleroma_following.json
new file mode 100644
index 000000000..33d087703
--- /dev/null
+++ b/test/fixtures/users_mock/pleroma_following.json
@@ -0,0 +1,20 @@
+{
+ "type": "OrderedCollection",
+ "totalItems": 267,
+ "id": "http://localhost:4001/users/fuser2/following",
+ "first": {
+ "type": "OrderedCollectionPage",
+ "totalItems": 267,
+ "partOf": "http://localhost:4001/users/fuser2/following",
+ "orderedItems": [],
+ "next": "http://localhost:4001/users/fuser2/following?page=2",
+ "id": "http://localhost:4001/users/fuser2/following?page=1"
+ },
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "http://localhost:4001/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ]
+}
diff --git a/test/flake_id_test.exs b/test/flake_id_test.exs
index ca2338041..85ed5bbdf 100644
--- a/test/flake_id_test.exs
+++ b/test/flake_id_test.exs
@@ -39,4 +39,9 @@ defmodule Pleroma.FlakeIdTest do
assert dump(flake_s) == {:ok, flake}
assert dump(flake) == {:ok, flake}
end
+
+ test "is_flake_id?/1" do
+ assert is_flake_id?("9eoozpwTul5mjSEDRI")
+ refute is_flake_id?("http://example.com/activities/3ebbadd1-eb14-4e20-8118-b6f79c0c7b0b")
+ end
end
diff --git a/test/healthcheck_test.exs b/test/healthcheck_test.exs
index e05061220..6bb8d5b7f 100644
--- a/test/healthcheck_test.exs
+++ b/test/healthcheck_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.HealthcheckTest do
use Pleroma.DataCase
alias Pleroma.Healthcheck
diff --git a/test/html_test.exs b/test/html_test.exs
index 08738276e..b8906c46a 100644
--- a/test/html_test.exs
+++ b/test/html_test.exs
@@ -4,8 +4,12 @@
defmodule Pleroma.HTMLTest do
alias Pleroma.HTML
+ alias Pleroma.Object
+ alias Pleroma.Web.CommonAPI
use Pleroma.DataCase
+ import Pleroma.Factory
+
@html_sample """
<b>this is in bold</b>
<p>this is a paragraph</p>
@@ -160,4 +164,69 @@ defmodule Pleroma.HTMLTest do
)
end
end
+
+ describe "extract_first_external_url" do
+ test "extracts the url" do
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" =>
+ "I think I just found the best github repo https://github.com/komeiji-satori/Dress"
+ })
+
+ object = Object.normalize(activity)
+ {:ok, url} = HTML.extract_first_external_url(object, object.data["content"])
+ assert url == "https://github.com/komeiji-satori/Dress"
+ end
+
+ test "skips mentions" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" =>
+ "@#{other_user.nickname} install misskey! https://github.com/syuilo/misskey/blob/develop/docs/setup.en.md"
+ })
+
+ object = Object.normalize(activity)
+ {:ok, url} = HTML.extract_first_external_url(object, object.data["content"])
+
+ assert url == "https://github.com/syuilo/misskey/blob/develop/docs/setup.en.md"
+
+ refute url == other_user.ap_id
+ end
+
+ test "skips hashtags" do
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" =>
+ "#cofe https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72255140"
+ })
+
+ object = Object.normalize(activity)
+ {:ok, url} = HTML.extract_first_external_url(object, object.data["content"])
+
+ assert url == "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72255140"
+ end
+
+ test "skips microformats hashtags" do
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" =>
+ "<a href=\"https://pleroma.gov/tags/cofe\" rel=\"tag\">#cofe</a> https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72255140",
+ "content_type" => "text/html"
+ })
+
+ object = Object.normalize(activity)
+ {:ok, url} = HTML.extract_first_external_url(object, object.data["content"])
+
+ assert url == "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72255140"
+ end
+ end
end
diff --git a/test/http/request_builder_test.exs b/test/http/request_builder_test.exs
new file mode 100644
index 000000000..170ca916f
--- /dev/null
+++ b/test/http/request_builder_test.exs
@@ -0,0 +1,93 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.HTTP.RequestBuilderTest do
+ use ExUnit.Case, async: true
+ use Pleroma.Tests.Helpers
+ alias Pleroma.HTTP.RequestBuilder
+
+ describe "headers/2" do
+ clear_config([:http, :send_user_agent])
+
+ test "don't send pleroma user agent" do
+ assert RequestBuilder.headers(%{}, []) == %{headers: []}
+ end
+
+ test "send pleroma user agent" do
+ Pleroma.Config.put([:http, :send_user_agent], true)
+
+ assert RequestBuilder.headers(%{}, []) == %{
+ headers: [{"User-Agent", Pleroma.Application.user_agent()}]
+ }
+ end
+ end
+
+ describe "add_optional_params/3" do
+ test "don't add if keyword is empty" do
+ assert RequestBuilder.add_optional_params(%{}, %{}, []) == %{}
+ end
+
+ test "add query parameter" do
+ assert RequestBuilder.add_optional_params(
+ %{},
+ %{query: :query, body: :body, another: :val},
+ [
+ {:query, "param1=val1&param2=val2"},
+ {:body, "some body"}
+ ]
+ ) == %{query: "param1=val1&param2=val2", body: "some body"}
+ end
+ end
+
+ describe "add_param/4" do
+ test "add file parameter" do
+ %{
+ body: %Tesla.Multipart{
+ boundary: _,
+ content_type_params: [],
+ parts: [
+ %Tesla.Multipart.Part{
+ body: %File.Stream{
+ line_or_bytes: 2048,
+ modes: [:raw, :read_ahead, :read, :binary],
+ path: "some-path/filename.png",
+ raw: true
+ },
+ dispositions: [name: "filename.png", filename: "filename.png"],
+ headers: []
+ }
+ ]
+ }
+ } = RequestBuilder.add_param(%{}, :file, "filename.png", "some-path/filename.png")
+ end
+
+ test "add key to body" do
+ %{
+ body: %Tesla.Multipart{
+ boundary: _,
+ content_type_params: [],
+ parts: [
+ %Tesla.Multipart.Part{
+ body: "\"someval\"",
+ dispositions: [name: "somekey"],
+ headers: ["Content-Type": "application/json"]
+ }
+ ]
+ }
+ } = RequestBuilder.add_param(%{}, :body, "somekey", "someval")
+ end
+
+ test "add form parameter" do
+ assert RequestBuilder.add_param(%{}, :form, "somename", "someval") == %{
+ body: %{"somename" => "someval"}
+ }
+ end
+
+ test "add for location" do
+ assert RequestBuilder.add_param(%{}, :some_location, "somekey", "someval") == %{
+ some_location: [{"somekey", "someval"}]
+ }
+ end
+ end
+end
diff --git a/test/integration/mastodon_websocket_test.exs b/test/integration/mastodon_websocket_test.exs
index b42c9ef07..3975cdcd6 100644
--- a/test/integration/mastodon_websocket_test.exs
+++ b/test/integration/mastodon_websocket_test.exs
@@ -97,5 +97,22 @@ defmodule Pleroma.Integration.MastodonWebsocketTest do
test "accepts valid tokens", state do
assert {:ok, _} = start_socket("?stream=user&access_token=#{state.token.token}")
end
+
+ test "accepts the 'user' stream", %{token: token} = _state do
+ assert {:ok, _} = start_socket("?stream=user&access_token=#{token.token}")
+ assert {:error, {403, "Forbidden"}} = start_socket("?stream=user")
+ end
+
+ test "accepts the 'user:notification' stream", %{token: token} = _state do
+ assert {:ok, _} = start_socket("?stream=user:notification&access_token=#{token.token}")
+ assert {:error, {403, "Forbidden"}} = start_socket("?stream=user:notification")
+ end
+
+ test "accepts valid token on Sec-WebSocket-Protocol header", %{token: token} do
+ assert {:ok, _} = start_socket("?stream=user", [{"Sec-WebSocket-Protocol", token.token}])
+
+ assert {:error, {403, "Forbidden"}} =
+ start_socket("?stream=user", [{"Sec-WebSocket-Protocol", "I am a friend"}])
+ end
end
end
diff --git a/test/keys_test.exs b/test/keys_test.exs
index 776fdea6f..059f70b74 100644
--- a/test/keys_test.exs
+++ b/test/keys_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.KeysTest do
use Pleroma.DataCase
diff --git a/test/list_test.exs b/test/list_test.exs
index 1909c0cd9..f39033d02 100644
--- a/test/list_test.exs
+++ b/test/list_test.exs
@@ -113,4 +113,30 @@ defmodule Pleroma.ListTest do
assert owned_list in lists_2
refute not_owned_list in lists_2
end
+
+ test "get by ap_id" do
+ user = insert(:user)
+ {:ok, list} = Pleroma.List.create("foo", user)
+ assert Pleroma.List.get_by_ap_id(list.ap_id) == list
+ end
+
+ test "memberships" do
+ user = insert(:user)
+ member = insert(:user)
+ {:ok, list} = Pleroma.List.create("foo", user)
+ {:ok, list} = Pleroma.List.follow(list, member)
+
+ assert Pleroma.List.memberships(member) == [list.ap_id]
+ end
+
+ test "member?" do
+ user = insert(:user)
+ member = insert(:user)
+
+ {:ok, list} = Pleroma.List.create("foo", user)
+ {:ok, list} = Pleroma.List.follow(list, member)
+
+ assert Pleroma.List.member?(list, member)
+ refute Pleroma.List.member?(list, user)
+ end
end
diff --git a/test/notification_test.exs b/test/notification_test.exs
index 581db58a8..80ea2a085 100644
--- a/test/notification_test.exs
+++ b/test/notification_test.exs
@@ -4,12 +4,15 @@
defmodule Pleroma.NotificationTest do
use Pleroma.DataCase
+
+ import Pleroma.Factory
+
alias Pleroma.Notification
alias Pleroma.User
alias Pleroma.Web.ActivityPub.Transmogrifier
alias Pleroma.Web.CommonAPI
+ alias Pleroma.Web.Streamer
alias Pleroma.Web.TwitterAPI.TwitterAPI
- import Pleroma.Factory
describe "create_notifications" do
test "notifies someone when they are directly addressed" do
@@ -41,29 +44,91 @@ defmodule Pleroma.NotificationTest do
assert notification.user_id == subscriber.id
end
+
+ test "does not create a notification for subscribed users if status is a reply" do
+ user = insert(:user)
+ other_user = insert(:user)
+ subscriber = insert(:user)
+
+ User.subscribe(subscriber, other_user)
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "test post"})
+
+ {:ok, _reply_activity} =
+ CommonAPI.post(other_user, %{
+ "status" => "test reply",
+ "in_reply_to_status_id" => activity.id
+ })
+
+ user_notifications = Notification.for_user(user)
+ assert length(user_notifications) == 1
+
+ subscriber_notifications = Notification.for_user(subscriber)
+ assert Enum.empty?(subscriber_notifications)
+ end
end
describe "create_notification" do
- test "it doesn't create a notification for user if the user blocks the activity author" do
+ setup do
+ GenServer.start(Streamer, %{}, name: Streamer)
+
+ on_exit(fn ->
+ if pid = Process.whereis(Streamer) do
+ Process.exit(pid, :kill)
+ end
+ end)
+ end
+
+ test "it creates a notification for user and send to the 'user' and the 'user:notification' stream" do
+ user = insert(:user)
+ task = Task.async(fn -> assert_receive {:text, _}, 4_000 end)
+ task_user_notification = Task.async(fn -> assert_receive {:text, _}, 4_000 end)
+ Streamer.add_socket("user", %{transport_pid: task.pid, assigns: %{user: user}})
+
+ Streamer.add_socket(
+ "user:notification",
+ %{transport_pid: task_user_notification.pid, assigns: %{user: user}}
+ )
+
+ activity = insert(:note_activity)
+
+ notify = Notification.create_notification(activity, user)
+ assert notify.user_id == user.id
+ Task.await(task)
+ Task.await(task_user_notification)
+ end
+
+ test "it creates a notification for user if the user blocks the activity author" do
activity = insert(:note_activity)
author = User.get_cached_by_ap_id(activity.data["actor"])
user = insert(:user)
{:ok, user} = User.block(user, author)
- assert nil == Notification.create_notification(activity, user)
+ assert Notification.create_notification(activity, user)
end
- test "it doesn't create a notificatin for the user if the user mutes the activity author" do
+ test "it creates a notificatin for the user if the user mutes the activity author" do
muter = insert(:user)
muted = insert(:user)
{:ok, _} = User.mute(muter, muted)
muter = Repo.get(User, muter.id)
{:ok, activity} = CommonAPI.post(muted, %{"status" => "Hi @#{muter.nickname}"})
- assert nil == Notification.create_notification(activity, muter)
+ assert Notification.create_notification(activity, muter)
+ end
+
+ test "notification created if user is muted without notifications" do
+ muter = insert(:user)
+ muted = insert(:user)
+
+ {:ok, muter} = User.mute(muter, muted, false)
+
+ {:ok, activity} = CommonAPI.post(muted, %{"status" => "Hi @#{muter.nickname}"})
+
+ assert Notification.create_notification(activity, muter)
end
- test "it doesn't create a notification for an activity from a muted thread" do
+ test "it creates a notification for an activity from a muted thread" do
muter = insert(:user)
other_user = insert(:user)
{:ok, activity} = CommonAPI.post(muter, %{"status" => "hey"})
@@ -75,34 +140,7 @@ defmodule Pleroma.NotificationTest do
"in_reply_to_status_id" => activity.id
})
- assert nil == Notification.create_notification(activity, muter)
- end
-
- test "it disables notifications from people on remote instances" do
- user = insert(:user, info: %{notification_settings: %{"remote" => false}})
- other_user = insert(:user)
-
- create_activity = %{
- "@context" => "https://www.w3.org/ns/activitystreams",
- "type" => "Create",
- "to" => ["https://www.w3.org/ns/activitystreams#Public"],
- "actor" => other_user.ap_id,
- "object" => %{
- "type" => "Note",
- "content" => "Hi @#{user.nickname}",
- "attributedTo" => other_user.ap_id
- }
- }
-
- {:ok, %{local: false} = activity} = Transmogrifier.handle_incoming(create_activity)
- assert nil == Notification.create_notification(activity, user)
- end
-
- test "it disables notifications from people on the local instance" do
- user = insert(:user, info: %{notification_settings: %{"local" => false}})
- other_user = insert(:user)
- {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hey @#{user.nickname}"})
- assert nil == Notification.create_notification(activity, user)
+ assert Notification.create_notification(activity, muter)
end
test "it disables notifications from followers" do
@@ -110,7 +148,14 @@ defmodule Pleroma.NotificationTest do
followed = insert(:user, info: %{notification_settings: %{"followers" => false}})
User.follow(follower, followed)
{:ok, activity} = CommonAPI.post(follower, %{"status" => "hey @#{followed.nickname}"})
- assert nil == Notification.create_notification(activity, followed)
+ refute Notification.create_notification(activity, followed)
+ end
+
+ test "it disables notifications from non-followers" do
+ follower = insert(:user)
+ followed = insert(:user, info: %{notification_settings: %{"non_followers" => false}})
+ {:ok, activity} = CommonAPI.post(follower, %{"status" => "hey @#{followed.nickname}"})
+ refute Notification.create_notification(activity, followed)
end
test "it disables notifications from people the user follows" do
@@ -119,14 +164,21 @@ defmodule Pleroma.NotificationTest do
User.follow(follower, followed)
follower = Repo.get(User, follower.id)
{:ok, activity} = CommonAPI.post(followed, %{"status" => "hey @#{follower.nickname}"})
- assert nil == Notification.create_notification(activity, follower)
+ refute Notification.create_notification(activity, follower)
+ end
+
+ test "it disables notifications from people the user does not follow" do
+ follower = insert(:user, info: %{notification_settings: %{"non_follows" => false}})
+ followed = insert(:user)
+ {:ok, activity} = CommonAPI.post(followed, %{"status" => "hey @#{follower.nickname}"})
+ refute Notification.create_notification(activity, follower)
end
test "it doesn't create a notification for user if he is the activity author" do
activity = insert(:note_activity)
author = User.get_cached_by_ap_id(activity.data["actor"])
- assert nil == Notification.create_notification(activity, author)
+ refute Notification.create_notification(activity, author)
end
test "it doesn't create a notification for follow-unfollow-follow chains" do
@@ -136,7 +188,7 @@ defmodule Pleroma.NotificationTest do
Notification.create_notification(activity, followed_user)
TwitterAPI.unfollow(user, %{"user_id" => followed_user.id})
{:ok, _, _, activity_dupe} = TwitterAPI.follow(user, %{"user_id" => followed_user.id})
- assert nil == Notification.create_notification(activity_dupe, followed_user)
+ refute Notification.create_notification(activity_dupe, followed_user)
end
test "it doesn't create a notification for like-unlike-like chains" do
@@ -147,7 +199,7 @@ defmodule Pleroma.NotificationTest do
Notification.create_notification(fav_status, liked_user)
TwitterAPI.unfav(user, status.id)
{:ok, dupe} = TwitterAPI.fav(user, status.id)
- assert nil == Notification.create_notification(dupe, liked_user)
+ refute Notification.create_notification(dupe, liked_user)
end
test "it doesn't create a notification for repeat-unrepeat-repeat chains" do
@@ -163,7 +215,7 @@ defmodule Pleroma.NotificationTest do
Notification.create_notification(retweeted_activity, retweeted_user)
TwitterAPI.unrepeat(user, status.id)
{:ok, dupe} = TwitterAPI.repeat(user, status.id)
- assert nil == Notification.create_notification(dupe, retweeted_user)
+ refute Notification.create_notification(dupe, retweeted_user)
end
test "it doesn't create duplicate notifications for follow+subscribed users" do
@@ -302,6 +354,51 @@ defmodule Pleroma.NotificationTest do
end
end
+ describe "for_user_since/2" do
+ defp days_ago(days) do
+ NaiveDateTime.add(
+ NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second),
+ -days * 60 * 60 * 24,
+ :second
+ )
+ end
+
+ test "Returns recent notifications" do
+ user1 = insert(:user)
+ user2 = insert(:user)
+
+ Enum.each(0..10, fn i ->
+ {:ok, _activity} =
+ CommonAPI.post(user1, %{
+ "status" => "hey ##{i} @#{user2.nickname}!"
+ })
+ end)
+
+ {old, new} = Enum.split(Notification.for_user(user2), 5)
+
+ Enum.each(old, fn notification ->
+ notification
+ |> cast(%{updated_at: days_ago(10)}, [:updated_at])
+ |> Pleroma.Repo.update!()
+ end)
+
+ recent_notifications_ids =
+ user2
+ |> Notification.for_user_since(
+ NaiveDateTime.add(NaiveDateTime.utc_now(), -5 * 86_400, :second)
+ )
+ |> Enum.map(& &1.id)
+
+ Enum.each(old, fn %{id: id} ->
+ refute id in recent_notifications_ids
+ end)
+
+ Enum.each(new, fn %{id: id} ->
+ assert id in recent_notifications_ids
+ end)
+ end
+ end
+
describe "notification target determination" do
test "it sends notifications to addressed users in new messages" do
user = insert(:user)
@@ -514,5 +611,157 @@ defmodule Pleroma.NotificationTest do
assert Enum.empty?(Notification.for_user(user))
end
+
+ test "notifications are deleted if a local user is deleted" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, _activity} =
+ CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}", "visibility" => "direct"})
+
+ refute Enum.empty?(Notification.for_user(other_user))
+
+ User.delete(user)
+
+ assert Enum.empty?(Notification.for_user(other_user))
+ end
+
+ test "notifications are deleted if a remote user is deleted" do
+ remote_user = insert(:user)
+ local_user = insert(:user)
+
+ dm_message = %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "type" => "Create",
+ "actor" => remote_user.ap_id,
+ "id" => remote_user.ap_id <> "/activities/test",
+ "to" => [local_user.ap_id],
+ "cc" => [],
+ "object" => %{
+ "type" => "Note",
+ "content" => "Hello!",
+ "tag" => [
+ %{
+ "type" => "Mention",
+ "href" => local_user.ap_id,
+ "name" => "@#{local_user.nickname}"
+ }
+ ],
+ "to" => [local_user.ap_id],
+ "cc" => [],
+ "attributedTo" => remote_user.ap_id
+ }
+ }
+
+ {:ok, _dm_activity} = Transmogrifier.handle_incoming(dm_message)
+
+ refute Enum.empty?(Notification.for_user(local_user))
+
+ delete_user_message = %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "id" => remote_user.ap_id <> "/activities/delete",
+ "actor" => remote_user.ap_id,
+ "type" => "Delete",
+ "object" => remote_user.ap_id
+ }
+
+ {:ok, _delete_activity} = Transmogrifier.handle_incoming(delete_user_message)
+
+ assert Enum.empty?(Notification.for_user(local_user))
+ end
+ end
+
+ describe "for_user" do
+ test "it returns notifications for muted user without notifications" do
+ user = insert(:user)
+ muted = insert(:user)
+ {:ok, user} = User.mute(user, muted, false)
+
+ {:ok, _activity} = TwitterAPI.create_status(muted, %{"status" => "hey @#{user.nickname}"})
+
+ assert length(Notification.for_user(user)) == 1
+ end
+
+ test "it doesn't return notifications for muted user with notifications" do
+ user = insert(:user)
+ muted = insert(:user)
+ {:ok, user} = User.mute(user, muted)
+
+ {:ok, _activity} = TwitterAPI.create_status(muted, %{"status" => "hey @#{user.nickname}"})
+
+ assert Notification.for_user(user) == []
+ end
+
+ test "it doesn't return notifications for blocked user" do
+ user = insert(:user)
+ blocked = insert(:user)
+ {:ok, user} = User.block(user, blocked)
+
+ {:ok, _activity} = TwitterAPI.create_status(blocked, %{"status" => "hey @#{user.nickname}"})
+
+ assert Notification.for_user(user) == []
+ end
+
+ test "it doesn't return notificatitons for blocked domain" do
+ user = insert(:user)
+ blocked = insert(:user, ap_id: "http://some-domain.com")
+ {:ok, user} = User.block_domain(user, "some-domain.com")
+
+ {:ok, _activity} = TwitterAPI.create_status(blocked, %{"status" => "hey @#{user.nickname}"})
+
+ assert Notification.for_user(user) == []
+ end
+
+ test "it doesn't return notifications for muted thread" do
+ user = insert(:user)
+ another_user = insert(:user)
+
+ {:ok, activity} =
+ TwitterAPI.create_status(another_user, %{"status" => "hey @#{user.nickname}"})
+
+ {:ok, _} = Pleroma.ThreadMute.add_mute(user.id, activity.data["context"])
+ assert Notification.for_user(user) == []
+ end
+
+ test "it returns notifications for muted user with notifications and with_muted parameter" do
+ user = insert(:user)
+ muted = insert(:user)
+ {:ok, user} = User.mute(user, muted)
+
+ {:ok, _activity} = TwitterAPI.create_status(muted, %{"status" => "hey @#{user.nickname}"})
+
+ assert length(Notification.for_user(user, %{with_muted: true})) == 1
+ end
+
+ test "it returns notifications for blocked user and with_muted parameter" do
+ user = insert(:user)
+ blocked = insert(:user)
+ {:ok, user} = User.block(user, blocked)
+
+ {:ok, _activity} = TwitterAPI.create_status(blocked, %{"status" => "hey @#{user.nickname}"})
+
+ assert length(Notification.for_user(user, %{with_muted: true})) == 1
+ end
+
+ test "it returns notificatitons for blocked domain and with_muted parameter" do
+ user = insert(:user)
+ blocked = insert(:user, ap_id: "http://some-domain.com")
+ {:ok, user} = User.block_domain(user, "some-domain.com")
+
+ {:ok, _activity} = TwitterAPI.create_status(blocked, %{"status" => "hey @#{user.nickname}"})
+
+ assert length(Notification.for_user(user, %{with_muted: true})) == 1
+ end
+
+ test "it returns notifications for muted thread with_muted parameter" do
+ user = insert(:user)
+ another_user = insert(:user)
+
+ {:ok, activity} =
+ TwitterAPI.create_status(another_user, %{"status" => "hey @#{user.nickname}"})
+
+ {:ok, _} = Pleroma.ThreadMute.add_mute(user.id, activity.data["context"])
+ assert length(Notification.for_user(user, %{with_muted: true})) == 1
+ end
end
end
diff --git a/test/object/containment_test.exs b/test/object/containment_test.exs
index 452064093..61cd1b412 100644
--- a/test/object/containment_test.exs
+++ b/test/object/containment_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Object.ContainmentTest do
use Pleroma.DataCase
@@ -5,6 +9,12 @@ defmodule Pleroma.Object.ContainmentTest do
alias Pleroma.User
import Pleroma.Factory
+ import ExUnit.CaptureLog
+
+ setup_all do
+ Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+ :ok
+ end
describe "general origin containment" do
test "contain_origin_from_id() catches obvious spoofing attempts" do
@@ -52,7 +62,40 @@ defmodule Pleroma.Object.ContainmentTest do
follower_address: User.ap_followers(%User{nickname: "rye@niu.moe"})
})
- {:error, _} = User.get_or_fetch_by_ap_id("https://n1u.moe/users/rye")
+ assert capture_log(fn ->
+ {:error, _} = User.get_or_fetch_by_ap_id("https://n1u.moe/users/rye")
+ end) =~
+ "[error] Could not decode user at fetch https://n1u.moe/users/rye, {:error, :error}"
+ end
+ end
+
+ describe "containment of children" do
+ test "contain_child() catches spoofing attempts" do
+ data = %{
+ "id" => "http://example.com/whatever",
+ "type" => "Create",
+ "object" => %{
+ "id" => "http://example.net/~alyssa/activities/1234",
+ "attributedTo" => "http://example.org/~alyssa"
+ },
+ "actor" => "http://example.com/~bob"
+ }
+
+ :error = Containment.contain_child(data)
+ end
+
+ test "contain_child() allows correct origins" do
+ data = %{
+ "id" => "http://example.org/~alyssa/activities/5678",
+ "type" => "Create",
+ "object" => %{
+ "id" => "http://example.org/~alyssa/activities/1234",
+ "attributedTo" => "http://example.org/~alyssa"
+ },
+ "actor" => "http://example.org/~alyssa"
+ }
+
+ :ok = Containment.contain_child(data)
end
end
end
diff --git a/test/object/fetcher_test.exs b/test/object/fetcher_test.exs
index d604fd5f5..895a73d2c 100644
--- a/test/object/fetcher_test.exs
+++ b/test/object/fetcher_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Object.FetcherTest do
use Pleroma.DataCase
@@ -5,23 +9,49 @@ defmodule Pleroma.Object.FetcherTest do
alias Pleroma.Object
alias Pleroma.Object.Fetcher
import Tesla.Mock
+ import Mock
setup do
- mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+ mock(fn
+ %{method: :get, url: "https://mastodon.example.org/users/userisgone"} ->
+ %Tesla.Env{status: 410}
+
+ %{method: :get, url: "https://mastodon.example.org/users/userisgone404"} ->
+ %Tesla.Env{status: 404}
+
+ env ->
+ apply(HttpRequestMock, :request, [env])
+ end)
+
:ok
end
describe "actor origin containment" do
- test "it rejects objects with a bogus origin" do
+ test_with_mock "it rejects objects with a bogus origin",
+ Pleroma.Web.OStatus,
+ [:passthrough],
+ [] do
{:error, _} = Fetcher.fetch_object_from_id("https://info.pleroma.site/activity.json")
+
+ refute called(Pleroma.Web.OStatus.fetch_activity_from_url(:_))
end
- test "it rejects objects when attributedTo is wrong (variant 1)" do
+ test_with_mock "it rejects objects when attributedTo is wrong (variant 1)",
+ Pleroma.Web.OStatus,
+ [:passthrough],
+ [] do
{:error, _} = Fetcher.fetch_object_from_id("https://info.pleroma.site/activity2.json")
+
+ refute called(Pleroma.Web.OStatus.fetch_activity_from_url(:_))
end
- test "it rejects objects when attributedTo is wrong (variant 2)" do
+ test_with_mock "it rejects objects when attributedTo is wrong (variant 2)",
+ Pleroma.Web.OStatus,
+ [:passthrough],
+ [] do
{:error, _} = Fetcher.fetch_object_from_id("https://info.pleroma.site/activity3.json")
+
+ refute called(Pleroma.Web.OStatus.fetch_activity_from_url(:_))
end
end
@@ -80,11 +110,32 @@ defmodule Pleroma.Object.FetcherTest do
assert object
end
+ test "it can fetch wedistribute articles" do
+ {:ok, object} =
+ Fetcher.fetch_object_from_id("https://wedistribute.org/wp-json/pterotype/v1/object/85810")
+
+ assert object
+ end
+
test "all objects with fake directions are rejected by the object fetcher" do
- {:error, _} =
- Fetcher.fetch_and_contain_remote_object_from_id(
- "https://info.pleroma.site/activity4.json"
- )
+ assert {:error, _} =
+ Fetcher.fetch_and_contain_remote_object_from_id(
+ "https://info.pleroma.site/activity4.json"
+ )
+ end
+
+ test "handle HTTP 410 Gone response" do
+ assert {:error, "Object has been deleted"} ==
+ Fetcher.fetch_and_contain_remote_object_from_id(
+ "https://mastodon.example.org/users/userisgone"
+ )
+ end
+
+ test "handle HTTP 404 response" do
+ assert {:error, "Object has been deleted"} ==
+ Fetcher.fetch_and_contain_remote_object_from_id(
+ "https://mastodon.example.org/users/userisgone404"
+ )
end
end
@@ -106,4 +157,30 @@ defmodule Pleroma.Object.FetcherTest do
assert object.id != object_two.id
end
end
+
+ describe "signed fetches" do
+ clear_config([:activitypub, :sign_object_fetches])
+
+ test_with_mock "it signs fetches when configured to do so",
+ Pleroma.Signature,
+ [:passthrough],
+ [] do
+ Pleroma.Config.put([:activitypub, :sign_object_fetches], true)
+
+ Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367")
+
+ assert called(Pleroma.Signature.sign(:_, :_))
+ end
+
+ test_with_mock "it doesn't sign fetches when not configured to do so",
+ Pleroma.Signature,
+ [:passthrough],
+ [] do
+ Pleroma.Config.put([:activitypub, :sign_object_fetches], false)
+
+ Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367")
+
+ refute called(Pleroma.Signature.sign(:_, :_))
+ end
+ end
end
diff --git a/test/plugs/authentication_plug_test.exs b/test/plugs/authentication_plug_test.exs
index 6158086ea..f7f8fd9f3 100644
--- a/test/plugs/authentication_plug_test.exs
+++ b/test/plugs/authentication_plug_test.exs
@@ -8,6 +8,8 @@ defmodule Pleroma.Plugs.AuthenticationPlugTest do
alias Pleroma.Plugs.AuthenticationPlug
alias Pleroma.User
+ import ExUnit.CaptureLog
+
setup %{conn: conn} do
user = %User{
id: 1,
@@ -54,4 +56,31 @@ defmodule Pleroma.Plugs.AuthenticationPlugTest do
assert conn == ret_conn
end
+
+ describe "checkpw/2" do
+ test "check pbkdf2 hash" do
+ hash =
+ "$pbkdf2-sha512$160000$loXqbp8GYls43F0i6lEfIw$AY.Ep.2pGe57j2hAPY635sI/6w7l9Q9u9Bp02PkPmF3OrClDtJAI8bCiivPr53OKMF7ph6iHhN68Rom5nEfC2A"
+
+ assert AuthenticationPlug.checkpw("test-password", hash)
+ refute AuthenticationPlug.checkpw("test-password1", hash)
+ end
+
+ @tag :skip_on_mac
+ test "check sha512-crypt hash" do
+ hash =
+ "$6$9psBWV8gxkGOZWBz$PmfCycChoxeJ3GgGzwvhlgacb9mUoZ.KUXNCssekER4SJ7bOK53uXrHNb2e4i8yPFgSKyzaW9CcmrDXWIEMtD1"
+
+ assert AuthenticationPlug.checkpw("password", hash)
+ end
+
+ test "it returns false when hash invalid" do
+ hash =
+ "psBWV8gxkGOZWBz$PmfCycChoxeJ3GgGzwvhlgacb9mUoZ.KUXNCssekER4SJ7bOK53uXrHNb2e4i8yPFgSKyzaW9CcmrDXWIEMtD1"
+
+ assert capture_log(fn ->
+ refute Pleroma.Plugs.AuthenticationPlug.checkpw("password", hash)
+ end) =~ "[error] Password hash not recognized"
+ end
+ end
end
diff --git a/test/plugs/ensure_public_or_authenticated_plug_test.exs b/test/plugs/ensure_public_or_authenticated_plug_test.exs
index ce5d77ff7..d45662a2a 100644
--- a/test/plugs/ensure_public_or_authenticated_plug_test.exs
+++ b/test/plugs/ensure_public_or_authenticated_plug_test.exs
@@ -9,8 +9,10 @@ defmodule Pleroma.Plugs.EnsurePublicOrAuthenticatedPlugTest do
alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug
alias Pleroma.User
+ clear_config([:instance, :public])
+
test "it halts if not public and no user is assigned", %{conn: conn} do
- set_public_to(false)
+ Config.put([:instance, :public], false)
conn =
conn
@@ -21,7 +23,7 @@ defmodule Pleroma.Plugs.EnsurePublicOrAuthenticatedPlugTest do
end
test "it continues if public", %{conn: conn} do
- set_public_to(true)
+ Config.put([:instance, :public], true)
ret_conn =
conn
@@ -31,7 +33,7 @@ defmodule Pleroma.Plugs.EnsurePublicOrAuthenticatedPlugTest do
end
test "it continues if a user is assigned, even if not public", %{conn: conn} do
- set_public_to(false)
+ Config.put([:instance, :public], false)
conn =
conn
@@ -43,13 +45,4 @@ defmodule Pleroma.Plugs.EnsurePublicOrAuthenticatedPlugTest do
assert ret_conn == conn
end
-
- defp set_public_to(value) do
- orig = Config.get!([:instance, :public])
- Config.put([:instance, :public], value)
-
- on_exit(fn ->
- Config.put([:instance, :public], orig)
- end)
- end
end
diff --git a/test/plugs/http_security_plug_test.exs b/test/plugs/http_security_plug_test.exs
index 7dfd50c1f..7a2835e3d 100644
--- a/test/plugs/http_security_plug_test.exs
+++ b/test/plugs/http_security_plug_test.exs
@@ -7,17 +7,12 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do
alias Pleroma.Config
alias Plug.Conn
+ clear_config([:http_securiy, :enabled])
+ clear_config([:http_security, :sts])
+
describe "http security enabled" do
setup do
- enabled = Config.get([:http_securiy, :enabled])
-
Config.put([:http_security, :enabled], true)
-
- on_exit(fn ->
- Config.put([:http_security, :enabled], enabled)
- end)
-
- :ok
end
test "it sends CSP headers when enabled", %{conn: conn} do
@@ -81,14 +76,8 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do
end
test "it does not send CSP headers when disabled", %{conn: conn} do
- enabled = Config.get([:http_securiy, :enabled])
-
Config.put([:http_security, :enabled], false)
- on_exit(fn ->
- Config.put([:http_security, :enabled], enabled)
- end)
-
conn = get(conn, "/api/v1/instance")
assert Conn.get_resp_header(conn, "x-xss-protection") == []
diff --git a/test/plugs/http_signature_plug_test.exs b/test/plugs/http_signature_plug_test.exs
index efd811df7..d6fd9ea81 100644
--- a/test/plugs/http_signature_plug_test.exs
+++ b/test/plugs/http_signature_plug_test.exs
@@ -26,22 +26,4 @@ defmodule Pleroma.Web.Plugs.HTTPSignaturePlugTest do
assert called(HTTPSignatures.validate_conn(:_))
end
end
-
- test "bails out early if the signature isn't by the activity actor" do
- params = %{"actor" => "https://mst3k.interlinked.me/users/luciferMysticus"}
- conn = build_conn(:get, "/doesntmattter", params)
-
- with_mock HTTPSignatures, validate_conn: fn _ -> false end do
- conn =
- conn
- |> put_req_header(
- "signature",
- "keyId=\"http://mastodon.example.org/users/admin#main-key"
- )
- |> HTTPSignaturePlug.call(%{})
-
- assert conn.assigns.valid_signature == false
- refute called(HTTPSignatures.validate_conn(:_))
- end
- end
end
diff --git a/test/plugs/idempotency_plug_test.exs b/test/plugs/idempotency_plug_test.exs
new file mode 100644
index 000000000..ac1735f13
--- /dev/null
+++ b/test/plugs/idempotency_plug_test.exs
@@ -0,0 +1,110 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Plugs.IdempotencyPlugTest do
+ use ExUnit.Case, async: true
+ use Plug.Test
+
+ alias Pleroma.Plugs.IdempotencyPlug
+ alias Plug.Conn
+
+ test "returns result from cache" do
+ key = "test1"
+ orig_request_id = "test1"
+ second_request_id = "test2"
+ body = "testing"
+ status = 200
+
+ :post
+ |> conn("/cofe")
+ |> put_req_header("idempotency-key", key)
+ |> Conn.put_resp_header("x-request-id", orig_request_id)
+ |> Conn.put_resp_content_type("application/json")
+ |> IdempotencyPlug.call([])
+ |> Conn.send_resp(status, body)
+
+ conn =
+ :post
+ |> conn("/cofe")
+ |> put_req_header("idempotency-key", key)
+ |> Conn.put_resp_header("x-request-id", second_request_id)
+ |> Conn.put_resp_content_type("application/json")
+ |> IdempotencyPlug.call([])
+
+ assert_raise Conn.AlreadySentError, fn ->
+ Conn.send_resp(conn, :im_a_teapot, "no cofe")
+ end
+
+ assert conn.resp_body == body
+ assert conn.status == status
+
+ assert [^second_request_id] = Conn.get_resp_header(conn, "x-request-id")
+ assert [^orig_request_id] = Conn.get_resp_header(conn, "x-original-request-id")
+ assert [^key] = Conn.get_resp_header(conn, "idempotency-key")
+ assert ["true"] = Conn.get_resp_header(conn, "idempotent-replayed")
+ assert ["application/json; charset=utf-8"] = Conn.get_resp_header(conn, "content-type")
+ end
+
+ test "pass conn downstream if the cache not found" do
+ key = "test2"
+ orig_request_id = "test3"
+ body = "testing"
+ status = 200
+
+ conn =
+ :post
+ |> conn("/cofe")
+ |> put_req_header("idempotency-key", key)
+ |> Conn.put_resp_header("x-request-id", orig_request_id)
+ |> Conn.put_resp_content_type("application/json")
+ |> IdempotencyPlug.call([])
+ |> Conn.send_resp(status, body)
+
+ assert conn.resp_body == body
+ assert conn.status == status
+
+ assert [] = Conn.get_resp_header(conn, "idempotent-replayed")
+ assert [^key] = Conn.get_resp_header(conn, "idempotency-key")
+ end
+
+ test "passes conn downstream if idempotency is not present in headers" do
+ orig_request_id = "test4"
+ body = "testing"
+ status = 200
+
+ conn =
+ :post
+ |> conn("/cofe")
+ |> Conn.put_resp_header("x-request-id", orig_request_id)
+ |> Conn.put_resp_content_type("application/json")
+ |> IdempotencyPlug.call([])
+ |> Conn.send_resp(status, body)
+
+ assert [] = Conn.get_resp_header(conn, "idempotency-key")
+ end
+
+ test "doesn't work with GET/DELETE" do
+ key = "test3"
+ body = "testing"
+ status = 200
+
+ conn =
+ :get
+ |> conn("/cofe")
+ |> put_req_header("idempotency-key", key)
+ |> IdempotencyPlug.call([])
+ |> Conn.send_resp(status, body)
+
+ assert [] = Conn.get_resp_header(conn, "idempotency-key")
+
+ conn =
+ :delete
+ |> conn("/cofe")
+ |> put_req_header("idempotency-key", key)
+ |> IdempotencyPlug.call([])
+ |> Conn.send_resp(status, body)
+
+ assert [] = Conn.get_resp_header(conn, "idempotency-key")
+ end
+end
diff --git a/test/plugs/instance_static_test.exs b/test/plugs/instance_static_test.exs
index e2dcfa3d8..6aabc45a4 100644
--- a/test/plugs/instance_static_test.exs
+++ b/test/plugs/instance_static_test.exs
@@ -8,14 +8,12 @@ defmodule Pleroma.Web.RuntimeStaticPlugTest do
@dir "test/tmp/instance_static"
setup do
- static_dir = Pleroma.Config.get([:instance, :static_dir])
- Pleroma.Config.put([:instance, :static_dir], @dir)
File.mkdir_p!(@dir)
+ on_exit(fn -> File.rm_rf(@dir) end)
+ end
- on_exit(fn ->
- Pleroma.Config.put([:instance, :static_dir], static_dir)
- File.rm_rf(@dir)
- end)
+ clear_config([:instance, :static_dir]) do
+ Pleroma.Config.put([:instance, :static_dir], @dir)
end
test "overrides index" do
diff --git a/test/plugs/legacy_authentication_plug_test.exs b/test/plugs/legacy_authentication_plug_test.exs
index 02f530058..9804e073b 100644
--- a/test/plugs/legacy_authentication_plug_test.exs
+++ b/test/plugs/legacy_authentication_plug_test.exs
@@ -5,19 +5,18 @@
defmodule Pleroma.Plugs.LegacyAuthenticationPlugTest do
use Pleroma.Web.ConnCase
+ import Pleroma.Factory
+
alias Pleroma.Plugs.LegacyAuthenticationPlug
alias Pleroma.User
- import Mock
-
setup do
- # password is "password"
- user = %User{
- id: 1,
- name: "dude",
- password_hash:
- "$6$9psBWV8gxkGOZWBz$PmfCycChoxeJ3GgGzwvhlgacb9mUoZ.KUXNCssekER4SJ7bOK53uXrHNb2e4i8yPFgSKyzaW9CcmrDXWIEMtD1"
- }
+ user =
+ insert(:user,
+ password: "password",
+ password_hash:
+ "$6$9psBWV8gxkGOZWBz$PmfCycChoxeJ3GgGzwvhlgacb9mUoZ.KUXNCssekER4SJ7bOK53uXrHNb2e4i8yPFgSKyzaW9CcmrDXWIEMtD1"
+ )
%{user: user}
end
@@ -36,6 +35,7 @@ defmodule Pleroma.Plugs.LegacyAuthenticationPlugTest do
assert ret_conn == conn
end
+ @tag :skip_on_mac
test "it authenticates the auth_user if present and password is correct and resets the password",
%{
conn: conn,
@@ -46,22 +46,12 @@ defmodule Pleroma.Plugs.LegacyAuthenticationPlugTest do
|> assign(:auth_credentials, %{username: "dude", password: "password"})
|> assign(:auth_user, user)
- conn =
- with_mocks([
- {:crypt, [], [crypt: fn _password, password_hash -> password_hash end]},
- {User, [],
- [
- reset_password: fn user, %{password: password, password_confirmation: password} ->
- {:ok, user}
- end
- ]}
- ]) do
- LegacyAuthenticationPlug.call(conn, %{})
- end
-
- assert conn.assigns.user == user
+ conn = LegacyAuthenticationPlug.call(conn, %{})
+
+ assert conn.assigns.user.id == user.id
end
+ @tag :skip_on_mac
test "it does nothing if the password is wrong", %{
conn: conn,
user: user
diff --git a/test/plugs/mapped_identity_to_signature_plug_test.exs b/test/plugs/mapped_identity_to_signature_plug_test.exs
new file mode 100644
index 000000000..bb45d9edf
--- /dev/null
+++ b/test/plugs/mapped_identity_to_signature_plug_test.exs
@@ -0,0 +1,59 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.Plugs.MappedSignatureToIdentityPlugTest do
+ use Pleroma.Web.ConnCase
+ alias Pleroma.Web.Plugs.MappedSignatureToIdentityPlug
+
+ import Tesla.Mock
+ import Plug.Conn
+
+ setup do
+ mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+ :ok
+ end
+
+ defp set_signature(conn, key_id) do
+ conn
+ |> put_req_header("signature", "keyId=\"#{key_id}\"")
+ |> assign(:valid_signature, true)
+ end
+
+ test "it successfully maps a valid identity with a valid signature" do
+ conn =
+ build_conn(:get, "/doesntmattter")
+ |> set_signature("http://mastodon.example.org/users/admin")
+ |> MappedSignatureToIdentityPlug.call(%{})
+
+ refute is_nil(conn.assigns.user)
+ end
+
+ test "it successfully maps a valid identity with a valid signature with payload" do
+ conn =
+ build_conn(:post, "/doesntmattter", %{"actor" => "http://mastodon.example.org/users/admin"})
+ |> set_signature("http://mastodon.example.org/users/admin")
+ |> MappedSignatureToIdentityPlug.call(%{})
+
+ refute is_nil(conn.assigns.user)
+ end
+
+ test "it considers a mapped identity to be invalid when it mismatches a payload" do
+ conn =
+ build_conn(:post, "/doesntmattter", %{"actor" => "http://mastodon.example.org/users/admin"})
+ |> set_signature("https://niu.moe/users/rye")
+ |> MappedSignatureToIdentityPlug.call(%{})
+
+ assert %{valid_signature: false} == conn.assigns
+ end
+
+ @tag skip: "known breakage; the testsuite presently depends on it"
+ test "it considers a mapped identity to be invalid when the identity cannot be found" do
+ conn =
+ build_conn(:post, "/doesntmattter", %{"actor" => "http://mastodon.example.org/users/admin"})
+ |> set_signature("http://niu.moe/users/rye")
+ |> MappedSignatureToIdentityPlug.call(%{})
+
+ assert %{valid_signature: false} == conn.assigns
+ end
+end
diff --git a/test/plugs/rate_limit_plug_test.exs b/test/plugs/rate_limit_plug_test.exs
deleted file mode 100644
index 2ec9a8fb7..000000000
--- a/test/plugs/rate_limit_plug_test.exs
+++ /dev/null
@@ -1,50 +0,0 @@
-defmodule Pleroma.Plugs.RateLimitPlugTest do
- use ExUnit.Case, async: true
- use Plug.Test
-
- alias Pleroma.Plugs.RateLimitPlug
-
- @opts RateLimitPlug.init(%{max_requests: 5, interval: 1})
-
- setup do
- enabled = Pleroma.Config.get([:app_account_creation, :enabled])
-
- Pleroma.Config.put([:app_account_creation, :enabled], true)
-
- on_exit(fn ->
- Pleroma.Config.put([:app_account_creation, :enabled], enabled)
- end)
-
- :ok
- end
-
- test "it restricts by opts" do
- conn = conn(:get, "/")
- bucket_name = conn.remote_ip |> Tuple.to_list() |> Enum.join(".")
- ms = 1000
-
- conn = RateLimitPlug.call(conn, @opts)
- {1, 4, _, _, _} = ExRated.inspect_bucket(bucket_name, ms, 5)
- conn = RateLimitPlug.call(conn, @opts)
- {2, 3, _, _, _} = ExRated.inspect_bucket(bucket_name, ms, 5)
- conn = RateLimitPlug.call(conn, @opts)
- {3, 2, _, _, _} = ExRated.inspect_bucket(bucket_name, ms, 5)
- conn = RateLimitPlug.call(conn, @opts)
- {4, 1, _, _, _} = ExRated.inspect_bucket(bucket_name, ms, 5)
- conn = RateLimitPlug.call(conn, @opts)
- {5, 0, to_reset, _, _} = ExRated.inspect_bucket(bucket_name, ms, 5)
- conn = RateLimitPlug.call(conn, @opts)
- assert conn.status == 403
- assert conn.halted
- assert conn.resp_body == "{\"error\":\"Rate limit exceeded.\"}"
-
- Process.sleep(to_reset)
-
- conn = conn(:get, "/")
- conn = RateLimitPlug.call(conn, @opts)
- {1, 4, _, _, _} = ExRated.inspect_bucket(bucket_name, ms, 5)
- refute conn.status == 403
- refute conn.halted
- refute conn.resp_body
- end
-end
diff --git a/test/plugs/rate_limiter_test.exs b/test/plugs/rate_limiter_test.exs
new file mode 100644
index 000000000..395095079
--- /dev/null
+++ b/test/plugs/rate_limiter_test.exs
@@ -0,0 +1,174 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Plugs.RateLimiterTest do
+ use ExUnit.Case, async: true
+ use Plug.Test
+
+ alias Pleroma.Plugs.RateLimiter
+
+ import Pleroma.Factory
+
+ # Note: each example must work with separate buckets in order to prevent concurrency issues
+
+ test "init/1" do
+ limiter_name = :test_init
+ Pleroma.Config.put([:rate_limit, limiter_name], {1, 1})
+
+ assert {limiter_name, {1, 1}, []} == RateLimiter.init(limiter_name)
+ assert nil == RateLimiter.init(:foo)
+ end
+
+ test "ip/1" do
+ assert "127.0.0.1" == RateLimiter.ip(%{remote_ip: {127, 0, 0, 1}})
+ end
+
+ test "it restricts by opts" do
+ limiter_name = :test_opts
+ scale = 1000
+ limit = 5
+
+ Pleroma.Config.put([:rate_limit, limiter_name], {scale, limit})
+
+ opts = RateLimiter.init(limiter_name)
+ conn = conn(:get, "/")
+ bucket_name = "#{limiter_name}:#{RateLimiter.ip(conn)}"
+
+ conn = RateLimiter.call(conn, opts)
+ assert {1, 4, _, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ conn = RateLimiter.call(conn, opts)
+ assert {2, 3, _, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ conn = RateLimiter.call(conn, opts)
+ assert {3, 2, _, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ conn = RateLimiter.call(conn, opts)
+ assert {4, 1, _, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ conn = RateLimiter.call(conn, opts)
+ assert {5, 0, to_reset, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ conn = RateLimiter.call(conn, opts)
+
+ assert %{"error" => "Throttled"} = Phoenix.ConnTest.json_response(conn, :too_many_requests)
+ assert conn.halted
+
+ Process.sleep(to_reset)
+
+ conn = conn(:get, "/")
+
+ conn = RateLimiter.call(conn, opts)
+ assert {1, 4, _, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ refute conn.status == Plug.Conn.Status.code(:too_many_requests)
+ refute conn.resp_body
+ refute conn.halted
+ end
+
+ test "`bucket_name` option overrides default bucket name" do
+ limiter_name = :test_bucket_name
+ scale = 1000
+ limit = 5
+
+ Pleroma.Config.put([:rate_limit, limiter_name], {scale, limit})
+ base_bucket_name = "#{limiter_name}:group1"
+ opts = RateLimiter.init({limiter_name, bucket_name: base_bucket_name})
+
+ conn = conn(:get, "/")
+ default_bucket_name = "#{limiter_name}:#{RateLimiter.ip(conn)}"
+ customized_bucket_name = "#{base_bucket_name}:#{RateLimiter.ip(conn)}"
+
+ RateLimiter.call(conn, opts)
+ assert {1, 4, _, _, _} = ExRated.inspect_bucket(customized_bucket_name, scale, limit)
+ assert {0, 5, _, _, _} = ExRated.inspect_bucket(default_bucket_name, scale, limit)
+ end
+
+ test "`params` option appends specified params' values to bucket name" do
+ limiter_name = :test_params
+ scale = 1000
+ limit = 5
+
+ Pleroma.Config.put([:rate_limit, limiter_name], {scale, limit})
+ opts = RateLimiter.init({limiter_name, params: ["id"]})
+ id = "1"
+
+ conn = conn(:get, "/?id=#{id}")
+ conn = Plug.Conn.fetch_query_params(conn)
+
+ default_bucket_name = "#{limiter_name}:#{RateLimiter.ip(conn)}"
+ parametrized_bucket_name = "#{limiter_name}:#{id}:#{RateLimiter.ip(conn)}"
+
+ RateLimiter.call(conn, opts)
+ assert {1, 4, _, _, _} = ExRated.inspect_bucket(parametrized_bucket_name, scale, limit)
+ assert {0, 5, _, _, _} = ExRated.inspect_bucket(default_bucket_name, scale, limit)
+ end
+
+ test "it supports combination of options modifying bucket name" do
+ limiter_name = :test_options_combo
+ scale = 1000
+ limit = 5
+
+ Pleroma.Config.put([:rate_limit, limiter_name], {scale, limit})
+ base_bucket_name = "#{limiter_name}:group1"
+ opts = RateLimiter.init({limiter_name, bucket_name: base_bucket_name, params: ["id"]})
+ id = "100"
+
+ conn = conn(:get, "/?id=#{id}")
+ conn = Plug.Conn.fetch_query_params(conn)
+
+ default_bucket_name = "#{limiter_name}:#{RateLimiter.ip(conn)}"
+ parametrized_bucket_name = "#{base_bucket_name}:#{id}:#{RateLimiter.ip(conn)}"
+
+ RateLimiter.call(conn, opts)
+ assert {1, 4, _, _, _} = ExRated.inspect_bucket(parametrized_bucket_name, scale, limit)
+ assert {0, 5, _, _, _} = ExRated.inspect_bucket(default_bucket_name, scale, limit)
+ end
+
+ test "optional limits for authenticated users" do
+ limiter_name = :test_authenticated
+ Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo)
+
+ scale = 1000
+ limit = 5
+ Pleroma.Config.put([:rate_limit, limiter_name], [{1, 10}, {scale, limit}])
+
+ opts = RateLimiter.init(limiter_name)
+
+ user = insert(:user)
+ conn = conn(:get, "/") |> assign(:user, user)
+ bucket_name = "#{limiter_name}:#{user.id}"
+
+ conn = RateLimiter.call(conn, opts)
+ assert {1, 4, _, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ conn = RateLimiter.call(conn, opts)
+ assert {2, 3, _, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ conn = RateLimiter.call(conn, opts)
+ assert {3, 2, _, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ conn = RateLimiter.call(conn, opts)
+ assert {4, 1, _, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ conn = RateLimiter.call(conn, opts)
+ assert {5, 0, to_reset, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ conn = RateLimiter.call(conn, opts)
+
+ assert %{"error" => "Throttled"} = Phoenix.ConnTest.json_response(conn, :too_many_requests)
+ assert conn.halted
+
+ Process.sleep(to_reset)
+
+ conn = conn(:get, "/") |> assign(:user, user)
+
+ conn = RateLimiter.call(conn, opts)
+ assert {1, 4, _, _, _} = ExRated.inspect_bucket(bucket_name, scale, limit)
+
+ refute conn.status == Plug.Conn.Status.code(:too_many_requests)
+ refute conn.resp_body
+ refute conn.halted
+ end
+end
diff --git a/test/plugs/set_format_plug_test.exs b/test/plugs/set_format_plug_test.exs
new file mode 100644
index 000000000..bb21956bb
--- /dev/null
+++ b/test/plugs/set_format_plug_test.exs
@@ -0,0 +1,38 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Plugs.SetFormatPlugTest do
+ use ExUnit.Case, async: true
+ use Plug.Test
+
+ alias Pleroma.Plugs.SetFormatPlug
+
+ test "set format from params" do
+ conn =
+ :get
+ |> conn("/cofe?_format=json")
+ |> SetFormatPlug.call([])
+
+ assert %{format: "json"} == conn.assigns
+ end
+
+ test "set format from header" do
+ conn =
+ :get
+ |> conn("/cofe")
+ |> put_private(:phoenix_format, "xml")
+ |> SetFormatPlug.call([])
+
+ assert %{format: "xml"} == conn.assigns
+ end
+
+ test "doesn't set format" do
+ conn =
+ :get
+ |> conn("/cofe")
+ |> SetFormatPlug.call([])
+
+ refute conn.assigns[:format]
+ end
+end
diff --git a/test/plugs/set_locale_plug_test.exs b/test/plugs/set_locale_plug_test.exs
new file mode 100644
index 000000000..b6c4c1cea
--- /dev/null
+++ b/test/plugs/set_locale_plug_test.exs
@@ -0,0 +1,46 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Plugs.SetLocalePlugTest do
+ use ExUnit.Case, async: true
+ use Plug.Test
+
+ alias Pleroma.Plugs.SetLocalePlug
+ alias Plug.Conn
+
+ test "default locale is `en`" do
+ conn =
+ :get
+ |> conn("/cofe")
+ |> SetLocalePlug.call([])
+
+ assert "en" == Gettext.get_locale()
+ assert %{locale: "en"} == conn.assigns
+ end
+
+ test "use supported locale from `accept-language`" do
+ conn =
+ :get
+ |> conn("/cofe")
+ |> Conn.put_req_header(
+ "accept-language",
+ "ru, fr-CH, fr;q=0.9, en;q=0.8, *;q=0.5"
+ )
+ |> SetLocalePlug.call([])
+
+ assert "ru" == Gettext.get_locale()
+ assert %{locale: "ru"} == conn.assigns
+ end
+
+ test "use default locale if locale from `accept-language` is not supported" do
+ conn =
+ :get
+ |> conn("/cofe")
+ |> Conn.put_req_header("accept-language", "tlh")
+ |> SetLocalePlug.call([])
+
+ assert "en" == Gettext.get_locale()
+ assert %{locale: "en"} == conn.assigns
+ end
+end
diff --git a/test/repo_test.exs b/test/repo_test.exs
index 85085a1fa..85b64d4d1 100644
--- a/test/repo_test.exs
+++ b/test/repo_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.RepoTest do
use Pleroma.DataCase
import Pleroma.Factory
diff --git a/test/reverse_proxy_test.exs b/test/reverse_proxy_test.exs
new file mode 100644
index 000000000..3a83c4c48
--- /dev/null
+++ b/test/reverse_proxy_test.exs
@@ -0,0 +1,300 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.ReverseProxyTest do
+ use Pleroma.Web.ConnCase, async: true
+ import ExUnit.CaptureLog
+ import Mox
+ alias Pleroma.ReverseProxy
+ alias Pleroma.ReverseProxy.ClientMock
+
+ setup_all do
+ {:ok, _} = Registry.start_link(keys: :unique, name: Pleroma.ReverseProxy.ClientMock)
+ :ok
+ end
+
+ setup :verify_on_exit!
+
+ defp user_agent_mock(user_agent, invokes) do
+ json = Jason.encode!(%{"user-agent": user_agent})
+
+ ClientMock
+ |> expect(:request, fn :get, url, _, _, _ ->
+ Registry.register(Pleroma.ReverseProxy.ClientMock, url, 0)
+
+ {:ok, 200,
+ [
+ {"content-type", "application/json"},
+ {"content-length", byte_size(json) |> to_string()}
+ ], %{url: url}}
+ end)
+ |> expect(:stream_body, invokes, fn %{url: url} ->
+ case Registry.lookup(Pleroma.ReverseProxy.ClientMock, url) do
+ [{_, 0}] ->
+ Registry.update_value(Pleroma.ReverseProxy.ClientMock, url, &(&1 + 1))
+ {:ok, json}
+
+ [{_, 1}] ->
+ Registry.unregister(Pleroma.ReverseProxy.ClientMock, url)
+ :done
+ end
+ end)
+ end
+
+ describe "user-agent" do
+ test "don't keep", %{conn: conn} do
+ user_agent_mock("hackney/1.15.1", 2)
+ conn = ReverseProxy.call(conn, "/user-agent")
+ assert json_response(conn, 200) == %{"user-agent" => "hackney/1.15.1"}
+ end
+
+ test "keep", %{conn: conn} do
+ user_agent_mock(Pleroma.Application.user_agent(), 2)
+ conn = ReverseProxy.call(conn, "/user-agent-keep", keep_user_agent: true)
+ assert json_response(conn, 200) == %{"user-agent" => Pleroma.Application.user_agent()}
+ end
+ end
+
+ test "closed connection", %{conn: conn} do
+ ClientMock
+ |> expect(:request, fn :get, "/closed", _, _, _ -> {:ok, 200, [], %{}} end)
+ |> expect(:stream_body, fn _ -> {:error, :closed} end)
+ |> expect(:close, fn _ -> :ok end)
+
+ conn = ReverseProxy.call(conn, "/closed")
+ assert conn.halted
+ end
+
+ describe "max_body " do
+ test "length returns error if content-length more than option", %{conn: conn} do
+ user_agent_mock("hackney/1.15.1", 0)
+
+ assert capture_log(fn ->
+ ReverseProxy.call(conn, "/user-agent", max_body_length: 4)
+ end) =~
+ "[error] Elixir.Pleroma.ReverseProxy: request to \"/user-agent\" failed: :body_too_large"
+ end
+
+ defp stream_mock(invokes, with_close? \\ false) do
+ ClientMock
+ |> expect(:request, fn :get, "/stream-bytes/" <> length, _, _, _ ->
+ Registry.register(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length, 0)
+
+ {:ok, 200, [{"content-type", "application/octet-stream"}],
+ %{url: "/stream-bytes/" <> length}}
+ end)
+ |> expect(:stream_body, invokes, fn %{url: "/stream-bytes/" <> length} ->
+ max = String.to_integer(length)
+
+ case Registry.lookup(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length) do
+ [{_, current}] when current < max ->
+ Registry.update_value(
+ Pleroma.ReverseProxy.ClientMock,
+ "/stream-bytes/" <> length,
+ &(&1 + 10)
+ )
+
+ {:ok, "0123456789"}
+
+ [{_, ^max}] ->
+ Registry.unregister(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length)
+ :done
+ end
+ end)
+
+ if with_close? do
+ expect(ClientMock, :close, fn _ -> :ok end)
+ end
+ end
+
+ test "max_body_length returns error if streaming body more than that option", %{conn: conn} do
+ stream_mock(3, true)
+
+ assert capture_log(fn ->
+ ReverseProxy.call(conn, "/stream-bytes/50", max_body_length: 30)
+ end) =~
+ "[warn] Elixir.Pleroma.ReverseProxy request to /stream-bytes/50 failed while reading/chunking: :body_too_large"
+ end
+ end
+
+ describe "HEAD requests" do
+ test "common", %{conn: conn} do
+ ClientMock
+ |> expect(:request, fn :head, "/head", _, _, _ ->
+ {:ok, 200, [{"content-type", "text/html; charset=utf-8"}]}
+ end)
+
+ conn = ReverseProxy.call(Map.put(conn, :method, "HEAD"), "/head")
+ assert html_response(conn, 200) == ""
+ end
+ end
+
+ defp error_mock(status) when is_integer(status) do
+ ClientMock
+ |> expect(:request, fn :get, "/status/" <> _, _, _, _ ->
+ {:error, status}
+ end)
+ end
+
+ describe "returns error on" do
+ test "500", %{conn: conn} do
+ error_mock(500)
+
+ capture_log(fn -> ReverseProxy.call(conn, "/status/500") end) =~
+ "[error] Elixir.Pleroma.ReverseProxy: request to /status/500 failed with HTTP status 500"
+ end
+
+ test "400", %{conn: conn} do
+ error_mock(400)
+
+ capture_log(fn -> ReverseProxy.call(conn, "/status/400") end) =~
+ "[error] Elixir.Pleroma.ReverseProxy: request to /status/400 failed with HTTP status 400"
+ end
+
+ test "204", %{conn: conn} do
+ ClientMock
+ |> expect(:request, fn :get, "/status/204", _, _, _ -> {:ok, 204, [], %{}} end)
+
+ capture_log(fn ->
+ conn = ReverseProxy.call(conn, "/status/204")
+ assert conn.resp_body == "Request failed: No Content"
+ assert conn.halted
+ end) =~
+ "[error] Elixir.Pleroma.ReverseProxy: request to \"/status/204\" failed with HTTP status 204"
+ end
+ end
+
+ test "streaming", %{conn: conn} do
+ stream_mock(21)
+ conn = ReverseProxy.call(conn, "/stream-bytes/200")
+ assert conn.state == :chunked
+ assert byte_size(conn.resp_body) == 200
+ assert Plug.Conn.get_resp_header(conn, "content-type") == ["application/octet-stream"]
+ end
+
+ defp headers_mock(_) do
+ ClientMock
+ |> expect(:request, fn :get, "/headers", headers, _, _ ->
+ Registry.register(Pleroma.ReverseProxy.ClientMock, "/headers", 0)
+ {:ok, 200, [{"content-type", "application/json"}], %{url: "/headers", headers: headers}}
+ end)
+ |> expect(:stream_body, 2, fn %{url: url, headers: headers} ->
+ case Registry.lookup(Pleroma.ReverseProxy.ClientMock, url) do
+ [{_, 0}] ->
+ Registry.update_value(Pleroma.ReverseProxy.ClientMock, url, &(&1 + 1))
+ headers = for {k, v} <- headers, into: %{}, do: {String.capitalize(k), v}
+ {:ok, Jason.encode!(%{headers: headers})}
+
+ [{_, 1}] ->
+ Registry.unregister(Pleroma.ReverseProxy.ClientMock, url)
+ :done
+ end
+ end)
+
+ :ok
+ end
+
+ describe "keep request headers" do
+ setup [:headers_mock]
+
+ test "header passes", %{conn: conn} do
+ conn =
+ Plug.Conn.put_req_header(
+ conn,
+ "accept",
+ "text/html"
+ )
+ |> ReverseProxy.call("/headers")
+
+ %{"headers" => headers} = json_response(conn, 200)
+ assert headers["Accept"] == "text/html"
+ end
+
+ test "header is filtered", %{conn: conn} do
+ conn =
+ Plug.Conn.put_req_header(
+ conn,
+ "accept-language",
+ "en-US"
+ )
+ |> ReverseProxy.call("/headers")
+
+ %{"headers" => headers} = json_response(conn, 200)
+ refute headers["Accept-Language"]
+ end
+ end
+
+ test "returns 400 on non GET, HEAD requests", %{conn: conn} do
+ conn = ReverseProxy.call(Map.put(conn, :method, "POST"), "/ip")
+ assert conn.status == 400
+ end
+
+ describe "cache resp headers" do
+ test "returns headers", %{conn: conn} do
+ ClientMock
+ |> expect(:request, fn :get, "/cache/" <> ttl, _, _, _ ->
+ {:ok, 200, [{"cache-control", "public, max-age=" <> ttl}], %{}}
+ end)
+ |> expect(:stream_body, fn _ -> :done end)
+
+ conn = ReverseProxy.call(conn, "/cache/10")
+ assert {"cache-control", "public, max-age=10"} in conn.resp_headers
+ end
+
+ test "add cache-control", %{conn: conn} do
+ ClientMock
+ |> expect(:request, fn :get, "/cache", _, _, _ ->
+ {:ok, 200, [{"ETag", "some ETag"}], %{}}
+ end)
+ |> expect(:stream_body, fn _ -> :done end)
+
+ conn = ReverseProxy.call(conn, "/cache")
+ assert {"cache-control", "public"} in conn.resp_headers
+ end
+ end
+
+ defp disposition_headers_mock(headers) do
+ ClientMock
+ |> expect(:request, fn :get, "/disposition", _, _, _ ->
+ Registry.register(Pleroma.ReverseProxy.ClientMock, "/disposition", 0)
+
+ {:ok, 200, headers, %{url: "/disposition"}}
+ end)
+ |> expect(:stream_body, 2, fn %{url: "/disposition"} ->
+ case Registry.lookup(Pleroma.ReverseProxy.ClientMock, "/disposition") do
+ [{_, 0}] ->
+ Registry.update_value(Pleroma.ReverseProxy.ClientMock, "/disposition", &(&1 + 1))
+ {:ok, ""}
+
+ [{_, 1}] ->
+ Registry.unregister(Pleroma.ReverseProxy.ClientMock, "/disposition")
+ :done
+ end
+ end)
+ end
+
+ describe "response content disposition header" do
+ test "not atachment", %{conn: conn} do
+ disposition_headers_mock([
+ {"content-type", "image/gif"},
+ {"content-length", 0}
+ ])
+
+ conn = ReverseProxy.call(conn, "/disposition")
+
+ assert {"content-type", "image/gif"} in conn.resp_headers
+ end
+
+ test "with content-disposition header", %{conn: conn} do
+ disposition_headers_mock([
+ {"content-disposition", "attachment; filename=\"filename.jpg\""},
+ {"content-length", 0}
+ ])
+
+ conn = ReverseProxy.call(conn, "/disposition")
+
+ assert {"content-disposition", "attachment; filename=\"filename.jpg\""} in conn.resp_headers
+ end
+ end
+end
diff --git a/test/signature_test.exs b/test/signature_test.exs
new file mode 100644
index 000000000..26337eaf9
--- /dev/null
+++ b/test/signature_test.exs
@@ -0,0 +1,117 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.SignatureTest do
+ use Pleroma.DataCase
+
+ import ExUnit.CaptureLog
+ import Pleroma.Factory
+ import Tesla.Mock
+
+ alias Pleroma.Signature
+
+ setup do
+ mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+ :ok
+ end
+
+ @private_key "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEA48qb4v6kqigZutO9Ot0wkp27GIF2LiVaADgxQORZozZR63jH\nTaoOrS3Xhngbgc8SSOhfXET3omzeCLqaLNfXnZ8OXmuhJfJSU6mPUvmZ9QdT332j\nfN/g3iWGhYMf/M9ftCKh96nvFVO/tMruzS9xx7tkrfJjehdxh/3LlJMMImPtwcD7\nkFXwyt1qZTAU6Si4oQAJxRDQXHp1ttLl3Ob829VM7IKkrVmY8TD+JSlV0jtVJPj6\n1J19ytKTx/7UaucYvb9HIiBpkuiy5n/irDqKLVf5QEdZoNCdojOZlKJmTLqHhzKP\n3E9TxsUjhrf4/EqegNc/j982RvOxeu4i40zMQwIDAQABAoIBAQDH5DXjfh21i7b4\ncXJuw0cqget617CDUhemdakTDs9yH+rHPZd3mbGDWuT0hVVuFe4vuGpmJ8c+61X0\nRvugOlBlavxK8xvYlsqTzAmPgKUPljyNtEzQ+gz0I+3mH2jkin2rL3D+SksZZgKm\nfiYMPIQWB2WUF04gB46DDb2mRVuymGHyBOQjIx3WC0KW2mzfoFUFRlZEF+Nt8Ilw\nT+g/u0aZ1IWoszbsVFOEdghgZET0HEarum0B2Je/ozcPYtwmU10iBANGMKdLqaP/\nj954BPunrUf6gmlnLZKIKklJj0advx0NA+cL79+zeVB3zexRYSA5o9q0WPhiuTwR\n/aedWHnBAoGBAP0sDWBAM1Y4TRAf8ZI9PcztwLyHPzfEIqzbObJJnx1icUMt7BWi\n+/RMOnhrlPGE1kMhOqSxvXYN3u+eSmWTqai2sSH5Hdw2EqnrISSTnwNUPINX7fHH\njEkgmXQ6ixE48SuBZnb4w1EjdB/BA6/sjL+FNhggOc87tizLTkMXmMtTAoGBAOZV\n+wPuAMBDBXmbmxCuDIjoVmgSlgeRunB1SA8RCPAFAiUo3+/zEgzW2Oz8kgI+xVwM\n33XkLKrWG1Orhpp6Hm57MjIc5MG+zF4/YRDpE/KNG9qU1tiz0UD5hOpIU9pP4bR/\ngxgPxZzvbk4h5BfHWLpjlk8UUpgk6uxqfti48c1RAoGBALBOKDZ6HwYRCSGMjUcg\n3NPEUi84JD8qmFc2B7Tv7h2he2ykIz9iFAGpwCIyETQsJKX1Ewi0OlNnD3RhEEAy\nl7jFGQ+mkzPSeCbadmcpYlgIJmf1KN/x7fDTAepeBpCEzfZVE80QKbxsaybd3Dp8\nCfwpwWUFtBxr4c7J+gNhAGe/AoGAPn8ZyqkrPv9wXtyfqFjxQbx4pWhVmNwrkBPi\nZ2Qh3q4dNOPwTvTO8vjghvzIyR8rAZzkjOJKVFgftgYWUZfM5gE7T2mTkBYq8W+U\n8LetF+S9qAM2gDnaDx0kuUTCq7t87DKk6URuQ/SbI0wCzYjjRD99KxvChVGPBHKo\n1DjqMuECgYEAgJGNm7/lJCS2wk81whfy/ttKGsEIkyhPFYQmdGzSYC5aDc2gp1R3\nxtOkYEvdjfaLfDGEa4UX8CHHF+w3t9u8hBtcdhMH6GYb9iv6z0VBTt4A/11HUR49\n3Z7TQ18Iyh3jAUCzFV9IJlLIExq5Y7P4B3ojWFBN607sDCt8BMPbDYs=\n-----END RSA PRIVATE KEY-----"
+
+ @public_key %{
+ "id" => "https://mastodon.social/users/lambadalambda#main-key",
+ "owner" => "https://mastodon.social/users/lambadalambda",
+ "publicKeyPem" =>
+ "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0P/Tq4gb4G/QVuMGbJo\nC/AfMNcv+m7NfrlOwkVzcU47jgESuYI4UtJayissCdBycHUnfVUd9qol+eznSODz\nCJhfJloqEIC+aSnuEPGA0POtWad6DU0E6/Ho5zQn5WAWUwbRQqowbrsm/GHo2+3v\neR5jGenwA6sYhINg/c3QQbksyV0uJ20Umyx88w8+TJuv53twOfmyDWuYNoQ3y5cc\nHKOZcLHxYOhvwg3PFaGfFHMFiNmF40dTXt9K96r7sbzc44iLD+VphbMPJEjkMuf8\nPGEFOBzy8pm3wJZw2v32RNW2VESwMYyqDzwHXGSq1a73cS7hEnc79gXlELsK04L9\nQQIDAQAB\n-----END PUBLIC KEY-----\n"
+ }
+
+ @rsa_public_key {
+ :RSAPublicKey,
+ 24_650_000_183_914_698_290_885_268_529_673_621_967_457_234_469_123_179_408_466_269_598_577_505_928_170_923_974_132_111_403_341_217_239_999_189_084_572_368_839_502_170_501_850_920_051_662_384_964_248_315_257_926_552_945_648_828_895_432_624_227_029_881_278_113_244_073_644_360_744_504_606_177_648_469_825_063_267_913_017_309_199_785_535_546_734_904_379_798_564_556_494_962_268_682_532_371_146_333_972_821_570_577_277_375_020_977_087_539_994_500_097_107_935_618_711_808_260_846_821_077_839_605_098_669_707_417_692_791_905_543_116_911_754_774_323_678_879_466_618_738_207_538_013_885_607_095_203_516_030_057_611_111_308_904_599_045_146_148_350_745_339_208_006_497_478_057_622_336_882_506_112_530_056_970_653_403_292_123_624_453_213_574_011_183_684_739_084_105_206_483_178_943_532_208_537_215_396_831_110_268_758_639_826_369_857,
+ # credo:disable-for-previous-line Credo.Check.Readability.MaxLineLength
+ 65_537
+ }
+
+ defp make_fake_signature(key_id), do: "keyId=\"#{key_id}\""
+
+ defp make_fake_conn(key_id),
+ do: %Plug.Conn{req_headers: %{"signature" => make_fake_signature(key_id <> "#main-key")}}
+
+ describe "fetch_public_key/1" do
+ test "it returns key" do
+ expected_result = {:ok, @rsa_public_key}
+
+ user = insert(:user, %{info: %{source_data: %{"publicKey" => @public_key}}})
+
+ assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == expected_result
+ end
+
+ test "it returns error when not found user" do
+ assert capture_log(fn ->
+ assert Signature.fetch_public_key(make_fake_conn("test-ap_id")) == {:error, :error}
+ end) =~ "[error] Could not decode user"
+ end
+
+ test "it returns error if public key is empty" do
+ user = insert(:user, %{info: %{source_data: %{"publicKey" => %{}}}})
+
+ assert Signature.fetch_public_key(make_fake_conn(user.ap_id)) == {:error, :error}
+ end
+ end
+
+ describe "refetch_public_key/1" do
+ test "it returns key" do
+ ap_id = "https://mastodon.social/users/lambadalambda"
+
+ assert Signature.refetch_public_key(make_fake_conn(ap_id)) == {:ok, @rsa_public_key}
+ end
+
+ test "it returns error when not found user" do
+ assert capture_log(fn ->
+ assert Signature.refetch_public_key(make_fake_conn("test-ap_id")) ==
+ {:error, {:error, :ok}}
+ end) =~ "[error] Could not decode user"
+ end
+ end
+
+ describe "sign/2" do
+ test "it returns signature headers" do
+ user =
+ insert(:user, %{
+ ap_id: "https://mastodon.social/users/lambadalambda",
+ info: %{keys: @private_key}
+ })
+
+ assert Signature.sign(
+ user,
+ %{
+ host: "test.test",
+ "content-length": 100
+ }
+ ) ==
+ "keyId=\"https://mastodon.social/users/lambadalambda#main-key\",algorithm=\"rsa-sha256\",headers=\"content-length host\",signature=\"sibUOoqsFfTDerquAkyprxzDjmJm6erYc42W5w1IyyxusWngSinq5ILTjaBxFvfarvc7ci1xAi+5gkBwtshRMWm7S+Uqix24Yg5EYafXRun9P25XVnYBEIH4XQ+wlnnzNIXQkU3PU9e6D8aajDZVp3hPJNeYt1gIPOA81bROI8/glzb1SAwQVGRbqUHHHKcwR8keiR/W2h7BwG3pVRy4JgnIZRSW7fQogKedDg02gzRXwUDFDk0pr2p3q6bUWHUXNV8cZIzlMK+v9NlyFbVYBTHctAR26GIAN6Hz0eV0mAQAePHDY1mXppbA8Gpp6hqaMuYfwifcXmcc+QFm4e+n3A==\""
+ end
+
+ test "it returns error" do
+ user =
+ insert(:user, %{ap_id: "https://mastodon.social/users/lambadalambda", info: %{keys: ""}})
+
+ assert Signature.sign(
+ user,
+ %{host: "test.test", "content-length": 100}
+ ) == {:error, []}
+ end
+ end
+
+ describe "key_id_to_actor_id/1" do
+ test "it properly deduces the actor id for misskey" do
+ assert Signature.key_id_to_actor_id("https://example.com/users/1234/publickey") ==
+ "https://example.com/users/1234"
+ end
+
+ test "it properly deduces the actor id for mastodon and pleroma" do
+ assert Signature.key_id_to_actor_id("https://example.com/users/1234#main-key") ==
+ "https://example.com/users/1234"
+ end
+ end
+end
diff --git a/test/support/builders/user_builder.ex b/test/support/builders/user_builder.ex
index f58e1b0ad..6da16f71a 100644
--- a/test/support/builders/user_builder.ex
+++ b/test/support/builders/user_builder.ex
@@ -9,7 +9,8 @@ defmodule Pleroma.Builders.UserBuilder do
nickname: "testname",
password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),
bio: "A tester.",
- ap_id: "some id"
+ ap_id: "some id",
+ last_digest_emailed_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)
}
Map.merge(user, data)
diff --git a/test/support/data_case.ex b/test/support/data_case.ex
index df260bd3f..f3d98e7e3 100644
--- a/test/support/data_case.ex
+++ b/test/support/data_case.ex
@@ -42,19 +42,18 @@ defmodule Pleroma.DataCase do
:ok
end
- def ensure_local_uploader(_context) do
+ def ensure_local_uploader(context) do
+ test_uploader = Map.get(context, :uploader, Pleroma.Uploaders.Local)
uploader = Pleroma.Config.get([Pleroma.Upload, :uploader])
filters = Pleroma.Config.get([Pleroma.Upload, :filters])
- unless uploader == Pleroma.Uploaders.Local || filters != [] do
- Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
- Pleroma.Config.put([Pleroma.Upload, :filters], [])
+ Pleroma.Config.put([Pleroma.Upload, :uploader], test_uploader)
+ Pleroma.Config.put([Pleroma.Upload, :filters], [])
- on_exit(fn ->
- Pleroma.Config.put([Pleroma.Upload, :uploader], uploader)
- Pleroma.Config.put([Pleroma.Upload, :filters], filters)
- end)
- end
+ on_exit(fn ->
+ Pleroma.Config.put([Pleroma.Upload, :uploader], uploader)
+ Pleroma.Config.put([Pleroma.Upload, :filters], filters)
+ end)
:ok
end
diff --git a/test/support/factory.ex b/test/support/factory.ex
index be6247ca4..62d1de717 100644
--- a/test/support/factory.ex
+++ b/test/support/factory.ex
@@ -1,9 +1,10 @@
# Pleroma: A lightweight social networking server
-# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Factory do
use ExMachina.Ecto, repo: Pleroma.Repo
+ alias Pleroma.Object
alias Pleroma.User
def participation_factory do
@@ -30,13 +31,15 @@ defmodule Pleroma.Factory do
nickname: sequence(:nickname, &"nick#{&1}"),
password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),
bio: sequence(:bio, &"Tester Number #{&1}"),
- info: %{}
+ info: %{},
+ last_digest_emailed_at: NaiveDateTime.utc_now()
}
%{
user
| ap_id: User.ap_id(user),
follower_address: User.ap_followers(user),
+ following_address: User.ap_following(user),
following: [User.ap_id(user)]
}
end
@@ -117,21 +120,46 @@ defmodule Pleroma.Factory do
user = attrs[:user] || insert(:user)
note = attrs[:note] || insert(:note, user: user)
- data = %{
- "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(),
- "type" => "Create",
- "actor" => note.data["actor"],
- "to" => note.data["to"],
- "object" => note.data,
- "published" => DateTime.utc_now() |> DateTime.to_iso8601(),
- "context" => note.data["context"]
- }
+ data_attrs = attrs[:data_attrs] || %{}
+ attrs = Map.drop(attrs, [:user, :note, :data_attrs])
+
+ data =
+ %{
+ "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(),
+ "type" => "Create",
+ "actor" => note.data["actor"],
+ "to" => note.data["to"],
+ "object" => note.data["id"],
+ "published" => DateTime.utc_now() |> DateTime.to_iso8601(),
+ "context" => note.data["context"]
+ }
+ |> Map.merge(data_attrs)
%Pleroma.Activity{
data: data,
actor: data["actor"],
recipients: data["to"]
}
+ |> Map.merge(attrs)
+ end
+
+ defp expiration_offset_by_minutes(attrs, minutes) do
+ scheduled_at =
+ NaiveDateTime.utc_now()
+ |> NaiveDateTime.add(:timer.minutes(minutes), :millisecond)
+ |> NaiveDateTime.truncate(:second)
+
+ %Pleroma.ActivityExpiration{}
+ |> Map.merge(attrs)
+ |> Map.put(:scheduled_at, scheduled_at)
+ end
+
+ def expiration_in_the_past_factory(attrs \\ %{}) do
+ expiration_offset_by_minutes(attrs, -60)
+ end
+
+ def expiration_in_the_future_factory(attrs \\ %{}) do
+ expiration_offset_by_minutes(attrs, 61)
end
def article_activity_factory do
@@ -174,15 +202,16 @@ defmodule Pleroma.Factory do
}
end
- def like_activity_factory do
- note_activity = insert(:note_activity)
+ def like_activity_factory(attrs \\ %{}) do
+ note_activity = attrs[:note_activity] || insert(:note_activity)
+ object = Object.normalize(note_activity)
user = insert(:user)
data = %{
"id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(),
"actor" => user.ap_id,
"type" => "Like",
- "object" => note_activity.data["object"]["id"],
+ "object" => object.data["id"],
"published_at" => DateTime.utc_now() |> DateTime.to_iso8601()
}
@@ -310,4 +339,18 @@ defmodule Pleroma.Factory do
}
}
end
+
+ def config_factory do
+ %Pleroma.Web.AdminAPI.Config{
+ key: sequence(:key, &"some_key_#{&1}"),
+ group: "pleroma",
+ value:
+ sequence(
+ :value,
+ fn key ->
+ :erlang.term_to_binary(%{another_key: "#{key}somevalue", another: "#{key}somevalue"})
+ end
+ )
+ }
+ end
end
diff --git a/test/support/helpers.ex b/test/support/helpers.ex
index 6e389ce52..a601b3ec8 100644
--- a/test/support/helpers.ex
+++ b/test/support/helpers.ex
@@ -7,8 +7,58 @@ defmodule Pleroma.Tests.Helpers do
Helpers for use in tests.
"""
+ defmacro clear_config(config_path) do
+ quote do
+ clear_config(unquote(config_path)) do
+ end
+ end
+ end
+
+ defmacro clear_config(config_path, do: yield) do
+ quote do
+ setup do
+ initial_setting = Pleroma.Config.get(unquote(config_path))
+ unquote(yield)
+ on_exit(fn -> Pleroma.Config.put(unquote(config_path), initial_setting) end)
+ :ok
+ end
+ end
+ end
+
+ defmacro clear_config_all(config_path) do
+ quote do
+ clear_config_all(unquote(config_path)) do
+ end
+ end
+ end
+
+ defmacro clear_config_all(config_path, do: yield) do
+ quote do
+ setup_all do
+ initial_setting = Pleroma.Config.get(unquote(config_path))
+ unquote(yield)
+ on_exit(fn -> Pleroma.Config.put(unquote(config_path), initial_setting) end)
+ :ok
+ end
+ end
+ end
+
defmacro __using__(_opts) do
quote do
+ import Pleroma.Tests.Helpers,
+ only: [
+ clear_config: 1,
+ clear_config: 2,
+ clear_config_all: 1,
+ clear_config_all: 2
+ ]
+
+ def collect_ids(collection) do
+ collection
+ |> Enum.map(& &1.id)
+ |> Enum.sort()
+ end
+
def refresh_record(%{id: id, __struct__: model} = _),
do: refresh_record(model, %{id: id})
@@ -24,6 +74,15 @@ defmodule Pleroma.Tests.Helpers do
|> Poison.encode!()
|> Poison.decode!()
end
+
+ defmacro guards_config(config_path) do
+ quote do
+ initial_setting = Pleroma.Config.get(config_path)
+
+ Pleroma.Config.put(config_path, true)
+ on_exit(fn -> Pleroma.Config.put(config_path, initial_setting) end)
+ end
+ end
end
end
end
diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index 66d7d5ba9..3adb5ba3b 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -31,8 +31,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body:
- File.read!("test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json")
+ body: File.read!("test/fixtures/tesla_mock/https___osada.macgirvin.com_channel_mike.json")
}}
end
@@ -40,7 +39,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/status.emelie.json")
+ body: File.read!("test/fixtures/tesla_mock/status.emelie.json")
}}
end
@@ -48,7 +47,19 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/emelie.json")
+ body: File.read!("test/fixtures/tesla_mock/emelie.json")
+ }}
+ end
+
+ def get("https://mastodon.social/users/not_found", _, _, _) do
+ {:ok, %Tesla.Env{status: 404}}
+ end
+
+ def get("https://mastodon.sdf.org/users/rinpatch", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/rinpatch.json")
}}
end
@@ -61,7 +72,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/webfinger_emelie.json")
+ body: File.read!("test/fixtures/tesla_mock/webfinger_emelie.json")
}}
end
@@ -69,7 +80,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/emelie.atom")
+ body: File.read!("test/fixtures/tesla_mock/emelie.atom")
}}
end
@@ -82,7 +93,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json")
+ body: File.read!("test/fixtures/tesla_mock/mike@osada.macgirvin.com.json")
}}
end
@@ -95,7 +106,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml")
+ body: File.read!("test/fixtures/tesla_mock/https___social.heldscal.la_user_29191.xml")
}}
end
@@ -103,7 +114,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.atom")
+ body: File.read!("test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.atom")
}}
end
@@ -116,7 +127,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.xml")
+ body: File.read!("test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.xml")
}}
end
@@ -129,7 +140,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/atarifrosch_feed.xml")
+ body: File.read!("test/fixtures/tesla_mock/atarifrosch_feed.xml")
}}
end
@@ -142,7 +153,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/atarifrosch_webfinger.xml")
+ body: File.read!("test/fixtures/tesla_mock/atarifrosch_webfinger.xml")
}}
end
@@ -150,7 +161,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/https___mamot.fr_users_Skruyb.atom")
+ body: File.read!("test/fixtures/tesla_mock/https___mamot.fr_users_Skruyb.atom")
}}
end
@@ -163,7 +174,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/skruyb@mamot.fr.atom")
+ body: File.read!("test/fixtures/tesla_mock/skruyb@mamot.fr.atom")
}}
end
@@ -176,7 +187,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/nonexistant@social.heldscal.la.xml")
+ body: File.read!("test/fixtures/tesla_mock/nonexistant@social.heldscal.la.xml")
}}
end
@@ -189,7 +200,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/lain_squeet.me_webfinger.xml")
+ body: File.read!("test/fixtures/tesla_mock/lain_squeet.me_webfinger.xml")
}}
end
@@ -202,7 +213,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/lucifermysticus.json")
+ body: File.read!("test/fixtures/tesla_mock/lucifermysticus.json")
}}
end
@@ -210,7 +221,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/https___prismo.news__mxb.json")
+ body: File.read!("test/fixtures/tesla_mock/https___prismo.news__mxb.json")
}}
end
@@ -223,7 +234,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/kaniini@hubzilla.example.org.json")
+ body: File.read!("test/fixtures/tesla_mock/kaniini@hubzilla.example.org.json")
}}
end
@@ -231,7 +242,15 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/rye.json")
+ body: File.read!("test/fixtures/tesla_mock/rye.json")
+ }}
+ end
+
+ def get("https://n1u.moe/users/rye", _, _, Accept: "application/activity+json") do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/rye.json")
}}
end
@@ -241,7 +260,7 @@ defmodule HttpRequestMock do
status: 200,
body:
File.read!(
- "test/fixtures/httpoison_mock/http___mastodon.example.org_users_admin_status_1234.json"
+ "test/fixtures/tesla_mock/http___mastodon.example.org_users_admin_status_1234.json"
)
}}
end
@@ -250,7 +269,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/puckipedia.com.json")
+ body: File.read!("test/fixtures/tesla_mock/puckipedia.com.json")
}}
end
@@ -258,7 +277,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/7even.json")
+ body: File.read!("test/fixtures/tesla_mock/7even.json")
}}
end
@@ -266,7 +285,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/peertube.moe-vid.json")
+ body: File.read!("test/fixtures/tesla_mock/peertube.moe-vid.json")
}}
end
@@ -274,7 +293,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/baptiste.gelex.xyz-user.json")
+ body: File.read!("test/fixtures/tesla_mock/baptiste.gelex.xyz-user.json")
}}
end
@@ -282,7 +301,23 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/baptiste.gelex.xyz-article.json")
+ body: File.read!("test/fixtures/tesla_mock/baptiste.gelex.xyz-article.json")
+ }}
+ end
+
+ def get("https://wedistribute.org/wp-json/pterotype/v1/object/85810", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/wedistribute-article.json")
+ }}
+ end
+
+ def get("https://wedistribute.org/wp-json/pterotype/v1/actor/-blog", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/wedistribute-user.json")
}}
end
@@ -290,10 +325,14 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/admin@mastdon.example.org.json")
+ body: File.read!("test/fixtures/tesla_mock/admin@mastdon.example.org.json")
}}
end
+ def get("http://mastodon.example.org/users/gargron", _, _, Accept: "application/activity+json") do
+ {:error, :nxdomain}
+ end
+
def get(
"http://mastodon.example.org/@admin/99541947525187367",
_,
@@ -311,7 +350,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/7369654.html")
+ body: File.read!("test/fixtures/tesla_mock/7369654.html")
}}
end
@@ -319,7 +358,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/mayumayu.json")
+ body: File.read!("test/fixtures/tesla_mock/mayumayu.json")
}}
end
@@ -332,7 +371,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/mayumayupost.json")
+ body: File.read!("test/fixtures/tesla_mock/mayumayupost.json")
}}
end
@@ -342,7 +381,7 @@ defmodule HttpRequestMock do
status: 200,
body:
File.read!(
- "test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml"
+ "test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml"
)
}}
end
@@ -355,7 +394,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml")
+ body: File.read!("test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain.xml")
}}
end
@@ -365,7 +404,7 @@ defmodule HttpRequestMock do
status: 200,
body:
File.read!(
- "test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml"
+ "test/fixtures/tesla_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml"
)
}}
end
@@ -379,7 +418,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml")
+ body: File.read!("test/fixtures/tesla_mock/https___shitposter.club_user_1.xml")
}}
end
@@ -387,8 +426,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body:
- File.read!("test/fixtures/httpoison_mock/https___shitposter.club_notice_2827873.html")
+ body: File.read!("test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.html")
}}
end
@@ -398,7 +436,7 @@ defmodule HttpRequestMock do
status: 200,
body:
File.read!(
- "test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml"
+ "test/fixtures/tesla_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml"
)
}}
end
@@ -411,7 +449,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/spc_5381.atom")
+ body: File.read!("test/fixtures/tesla_mock/spc_5381.atom")
}}
end
@@ -424,7 +462,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/spc_5381_xrd.xml")
+ body: File.read!("test/fixtures/tesla_mock/spc_5381_xrd.xml")
}}
end
@@ -432,7 +470,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/shitposter.club_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/shitposter.club_host_meta")
}}
end
@@ -440,7 +478,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/7369654.atom")
+ body: File.read!("test/fixtures/tesla_mock/7369654.atom")
}}
end
@@ -448,7 +486,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/7369654.html")
+ body: File.read!("test/fixtures/tesla_mock/7369654.html")
}}
end
@@ -456,7 +494,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/sakamoto_eal_feed.atom")
+ body: File.read!("test/fixtures/tesla_mock/sakamoto_eal_feed.atom")
}}
end
@@ -464,7 +502,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/social.sakamoto.gq_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/social.sakamoto.gq_host_meta")
}}
end
@@ -477,7 +515,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/eal_sakamoto.xml")
+ body: File.read!("test/fixtures/tesla_mock/eal_sakamoto.xml")
}}
end
@@ -487,14 +525,14 @@ defmodule HttpRequestMock do
_,
Accept: "application/atom+xml"
) do
- {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/httpoison_mock/sakamoto.atom")}}
+ {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/sakamoto.atom")}}
end
def get("http://mastodon.social/.well-known/host-meta", _, _, _) do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/mastodon.social_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/mastodon.social_host_meta")
}}
end
@@ -508,9 +546,7 @@ defmodule HttpRequestMock do
%Tesla.Env{
status: 200,
body:
- File.read!(
- "test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml"
- )
+ File.read!("test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.xml")
}}
end
@@ -518,7 +554,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/gs.example.org_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/gs.example.org_host_meta")
}}
end
@@ -532,19 +568,26 @@ defmodule HttpRequestMock do
%Tesla.Env{
status: 200,
body:
- File.read!(
- "test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml"
- )
+ File.read!("test/fixtures/tesla_mock/http___gs.example.org_4040_index.php_user_1.xml")
}}
end
+ def get(
+ "http://gs.example.org:4040/index.php/user/1",
+ _,
+ _,
+ Accept: "application/activity+json"
+ ) do
+ {:ok, %Tesla.Env{status: 406, body: ""}}
+ end
+
def get("http://gs.example.org/index.php/api/statuses/user_timeline/1.atom", _, _, _) do
{:ok,
%Tesla.Env{
status: 200,
body:
File.read!(
- "test/fixtures/httpoison_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml"
+ "test/fixtures/tesla_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml"
)
}}
end
@@ -555,14 +598,14 @@ defmodule HttpRequestMock do
status: 200,
body:
File.read!(
- "test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml"
+ "test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml"
)
}}
end
def get("http://squeet.me/.well-known/host-meta", _, _, _) do
{:ok,
- %Tesla.Env{status: 200, body: File.read!("test/fixtures/httpoison_mock/squeet.me_host_meta")}}
+ %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/squeet.me_host_meta")}}
end
def get(
@@ -574,7 +617,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/lain_squeet.me_webfinger.xml")
+ body: File.read!("test/fixtures/tesla_mock/lain_squeet.me_webfinger.xml")
}}
end
@@ -587,15 +630,24 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/shp@social.heldscal.la.xml")
+ body: File.read!("test/fixtures/tesla_mock/shp@social.heldscal.la.xml")
}}
end
+ def get(
+ "https://social.heldscal.la/.well-known/webfinger?resource=invalid_content@social.heldscal.la",
+ _,
+ _,
+ Accept: "application/xrd+xml,application/jrd+json"
+ ) do
+ {:ok, %Tesla.Env{status: 200, body: ""}}
+ end
+
def get("http://framatube.org/.well-known/host-meta", _, _, _) do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/framatube.org_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/framatube.org_host_meta")
}}
end
@@ -609,7 +661,7 @@ defmodule HttpRequestMock do
%Tesla.Env{
status: 200,
headers: [{"content-type", "application/json"}],
- body: File.read!("test/fixtures/httpoison_mock/framasoft@framatube.org.json")
+ body: File.read!("test/fixtures/tesla_mock/framasoft@framatube.org.json")
}}
end
@@ -617,7 +669,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/gnusocial.de_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/gnusocial.de_host_meta")
}}
end
@@ -630,7 +682,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/winterdienst_webfinger.json")
+ body: File.read!("test/fixtures/tesla_mock/winterdienst_webfinger.json")
}}
end
@@ -638,7 +690,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/status.alpicola.com_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/status.alpicola.com_host_meta")
}}
end
@@ -646,7 +698,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/macgirvin.com_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/macgirvin.com_host_meta")
}}
end
@@ -654,7 +706,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/gerzilla.de_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/gerzilla.de_host_meta")
}}
end
@@ -668,7 +720,7 @@ defmodule HttpRequestMock do
%Tesla.Env{
status: 200,
headers: [{"content-type", "application/json"}],
- body: File.read!("test/fixtures/httpoison_mock/kaniini@gerzilla.de.json")
+ body: File.read!("test/fixtures/tesla_mock/kaniini@gerzilla.de.json")
}}
end
@@ -678,7 +730,7 @@ defmodule HttpRequestMock do
status: 200,
body:
File.read!(
- "test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml"
+ "test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml"
)
}}
end
@@ -692,7 +744,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml")
+ body: File.read!("test/fixtures/tesla_mock/https___social.heldscal.la_user_23211.xml")
}}
end
@@ -700,7 +752,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/social.heldscal.la_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/social.heldscal.la_host_meta")
}}
end
@@ -708,7 +760,7 @@ defmodule HttpRequestMock do
{:ok,
%Tesla.Env{
status: 200,
- body: File.read!("test/fixtures/httpoison_mock/social.heldscal.la_host_meta")
+ body: File.read!("test/fixtures/tesla_mock/social.heldscal.la_host_meta")
}}
end
@@ -728,6 +780,78 @@ defmodule HttpRequestMock do
{:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/ogp.html")}}
end
+ def get("https://example.com/ogp", _, _, _) do
+ {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/ogp.html")}}
+ end
+
+ def get("https://pleroma.local/notice/9kCP7V", _, _, _) do
+ {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/ogp.html")}}
+ end
+
+ def get("http://localhost:4001/users/masto_closed/followers", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/users_mock/masto_closed_followers.json")
+ }}
+ end
+
+ def get("http://localhost:4001/users/masto_closed/followers?page=1", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/users_mock/masto_closed_followers_page.json")
+ }}
+ end
+
+ def get("http://localhost:4001/users/masto_closed/following", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/users_mock/masto_closed_following.json")
+ }}
+ end
+
+ def get("http://localhost:4001/users/masto_closed/following?page=1", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/users_mock/masto_closed_following_page.json")
+ }}
+ end
+
+ def get("http://localhost:4001/users/fuser2/followers", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/users_mock/pleroma_followers.json")
+ }}
+ end
+
+ def get("http://localhost:4001/users/fuser2/following", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/users_mock/pleroma_following.json")
+ }}
+ end
+
+ def get("http://domain-with-errors:4001/users/fuser1/followers", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 504,
+ body: ""
+ }}
+ end
+
+ def get("http://domain-with-errors:4001/users/fuser1/following", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 504,
+ body: ""
+ }}
+ end
+
def get("http://example.com/ogp-missing-data", _, _, _) do
{:ok,
%Tesla.Env{
@@ -736,6 +860,14 @@ defmodule HttpRequestMock do
}}
end
+ def get("https://example.com/ogp-missing-data", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/rich_media/ogp-missing-data.html")
+ }}
+ end
+
def get("http://example.com/malformed", _, _, _) do
{:ok,
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/malformed-data.html")}}
@@ -753,6 +885,89 @@ defmodule HttpRequestMock do
}}
end
+ def get(
+ "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=lain@zetsubou.xn--q9jyb4c",
+ _,
+ _,
+ Accept: "application/xrd+xml,application/jrd+json"
+ ) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/lain.xml")
+ }}
+ end
+
+ def get(
+ "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=https://zetsubou.xn--q9jyb4c/users/lain",
+ _,
+ _,
+ Accept: "application/xrd+xml,application/jrd+json"
+ ) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/lain.xml")
+ }}
+ end
+
+ def get(
+ "https://zetsubou.xn--q9jyb4c/.well-known/host-meta",
+ _,
+ _,
+ _
+ ) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/host-meta-zetsubou.xn--q9jyb4c.xml")
+ }}
+ end
+
+ def get("https://info.pleroma.site/activity.json", _, _, Accept: "application/activity+json") do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/https__info.pleroma.site_activity.json")
+ }}
+ end
+
+ def get("https://info.pleroma.site/activity.json", _, _, _) do
+ {:ok, %Tesla.Env{status: 404, body: ""}}
+ end
+
+ def get("https://info.pleroma.site/activity2.json", _, _, Accept: "application/activity+json") do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/https__info.pleroma.site_activity2.json")
+ }}
+ end
+
+ def get("https://info.pleroma.site/activity2.json", _, _, _) do
+ {:ok, %Tesla.Env{status: 404, body: ""}}
+ end
+
+ def get("https://info.pleroma.site/activity3.json", _, _, Accept: "application/activity+json") do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/https__info.pleroma.site_activity3.json")
+ }}
+ end
+
+ def get("https://info.pleroma.site/activity3.json", _, _, _) do
+ {:ok, %Tesla.Env{status: 404, body: ""}}
+ end
+
+ def get("https://mstdn.jp/.well-known/webfinger?resource=acct:kpherox@mstdn.jp", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/kpherox@mstdn.jp.xml")
+ }}
+ end
+
def get(url, query, body, headers) do
{:error,
"Not implemented the mock response for get #{inspect(url)}, #{query}, #{inspect(body)}, #{
@@ -773,6 +988,30 @@ defmodule HttpRequestMock do
}}
end
+ def post("http://mastodon.example.org/inbox", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: ""
+ }}
+ end
+
+ def post("https://hubzilla.example.org/inbox", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: ""
+ }}
+ end
+
+ def post("http://gs.example.org/index.php/main/salmon/user/1", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: ""
+ }}
+ end
+
def post("http://200.site" <> _, _, _, _) do
{:ok,
%Tesla.Env{
diff --git a/test/support/mrf_module_mock.ex b/test/support/mrf_module_mock.ex
new file mode 100644
index 000000000..12c7e22bc
--- /dev/null
+++ b/test/support/mrf_module_mock.ex
@@ -0,0 +1,13 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule MRFModuleMock do
+ @behaviour Pleroma.Web.ActivityPub.MRF
+
+ @impl true
+ def filter(message), do: {:ok, message}
+
+ @impl true
+ def describe, do: {:ok, %{mrf_module_mock: "some config data"}}
+end
diff --git a/test/tasks/config_test.exs b/test/tasks/config_test.exs
new file mode 100644
index 000000000..9cd47380c
--- /dev/null
+++ b/test/tasks/config_test.exs
@@ -0,0 +1,66 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Mix.Tasks.Pleroma.ConfigTest do
+ use Pleroma.DataCase
+ alias Pleroma.Repo
+ alias Pleroma.Web.AdminAPI.Config
+
+ setup_all do
+ Mix.shell(Mix.Shell.Process)
+ temp_file = "config/temp.exported_from_db.secret.exs"
+
+ on_exit(fn ->
+ Mix.shell(Mix.Shell.IO)
+ Application.delete_env(:pleroma, :first_setting)
+ Application.delete_env(:pleroma, :second_setting)
+ :ok = File.rm(temp_file)
+ end)
+
+ {:ok, temp_file: temp_file}
+ end
+
+ clear_config_all([:instance, :dynamic_configuration]) do
+ Pleroma.Config.put([:instance, :dynamic_configuration], true)
+ end
+
+ test "settings are migrated to db" do
+ assert Repo.all(Config) == []
+
+ Application.put_env(:pleroma, :first_setting, key: "value", key2: [Pleroma.Repo])
+ Application.put_env(:pleroma, :second_setting, key: "value2", key2: [Pleroma.Activity])
+
+ Mix.Tasks.Pleroma.Config.run(["migrate_to_db"])
+
+ first_db = Config.get_by_params(%{group: "pleroma", key: ":first_setting"})
+ second_db = Config.get_by_params(%{group: "pleroma", key: ":second_setting"})
+ refute Config.get_by_params(%{group: "pleroma", key: "Pleroma.Repo"})
+
+ assert Config.from_binary(first_db.value) == [key: "value", key2: [Pleroma.Repo]]
+ assert Config.from_binary(second_db.value) == [key: "value2", key2: [Pleroma.Activity]]
+ end
+
+ test "settings are migrated to file and deleted from db", %{temp_file: temp_file} do
+ Config.create(%{
+ group: "pleroma",
+ key: ":setting_first",
+ value: [key: "value", key2: [Pleroma.Activity]]
+ })
+
+ Config.create(%{
+ group: "pleroma",
+ key: ":setting_second",
+ value: [key: "valu2", key2: [Pleroma.Repo]]
+ })
+
+ Mix.Tasks.Pleroma.Config.run(["migrate_from_db", "temp", "true"])
+
+ assert Repo.all(Config) == []
+ assert File.exists?(temp_file)
+ {:ok, file} = File.read(temp_file)
+
+ assert file =~ "config :pleroma, :setting_first,"
+ assert file =~ "config :pleroma, :setting_second,"
+ end
+end
diff --git a/test/tasks/database_test.exs b/test/tasks/database_test.exs
index 579130b05..a9925c361 100644
--- a/test/tasks/database_test.exs
+++ b/test/tasks/database_test.exs
@@ -3,8 +3,12 @@
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Mix.Tasks.Pleroma.DatabaseTest do
+ alias Pleroma.Activity
+ alias Pleroma.Object
alias Pleroma.Repo
alias Pleroma.User
+ alias Pleroma.Web.CommonAPI
+
use Pleroma.DataCase
import Pleroma.Factory
@@ -19,6 +23,52 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
:ok
end
+ describe "running remove_embedded_objects" do
+ test "it replaces objects with references" do
+ user = insert(:user)
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "test"})
+ new_data = Map.put(activity.data, "object", activity.object.data)
+
+ {:ok, activity} =
+ activity
+ |> Activity.change(%{data: new_data})
+ |> Repo.update()
+
+ assert is_map(activity.data["object"])
+
+ Mix.Tasks.Pleroma.Database.run(["remove_embedded_objects"])
+
+ activity = Activity.get_by_id_with_object(activity.id)
+ assert is_binary(activity.data["object"])
+ end
+ end
+
+ describe "prune_objects" do
+ test "it prunes old objects from the database" do
+ insert(:note)
+ deadline = Pleroma.Config.get([:instance, :remote_post_retention_days]) + 1
+
+ date =
+ Timex.now()
+ |> Timex.shift(days: -deadline)
+ |> Timex.to_naive_datetime()
+ |> NaiveDateTime.truncate(:second)
+
+ %{id: id} =
+ :note
+ |> insert()
+ |> Ecto.Changeset.change(%{inserted_at: date})
+ |> Repo.update!()
+
+ assert length(Repo.all(Object)) == 2
+
+ Mix.Tasks.Pleroma.Database.run(["prune_objects"])
+
+ assert length(Repo.all(Object)) == 1
+ refute Object.get_by_id(id)
+ end
+ end
+
describe "running update_users_following_followers_counts" do
test "following and followers count are updated" do
[user, user2] = insert_pair(:user)
@@ -46,4 +96,37 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do
assert user.info.follower_count == 0
end
end
+
+ describe "running fix_likes_collections" do
+ test "it turns OrderedCollection likes into empty arrays" do
+ [user, user2] = insert_pair(:user)
+
+ {:ok, %{id: id, object: object}} = CommonAPI.post(user, %{"status" => "test"})
+ {:ok, %{object: object2}} = CommonAPI.post(user, %{"status" => "test test"})
+
+ CommonAPI.favorite(id, user2)
+
+ likes = %{
+ "first" =>
+ "http://mastodon.example.org/objects/dbdbc507-52c8-490d-9b7c-1e1d52e5c132/likes?page=1",
+ "id" => "http://mastodon.example.org/objects/dbdbc507-52c8-490d-9b7c-1e1d52e5c132/likes",
+ "totalItems" => 3,
+ "type" => "OrderedCollection"
+ }
+
+ new_data = Map.put(object2.data, "likes", likes)
+
+ object2
+ |> Ecto.Changeset.change(%{data: new_data})
+ |> Repo.update()
+
+ assert length(Object.get_by_id(object.id).data["likes"]) == 1
+ assert is_map(Object.get_by_id(object2.id).data["likes"])
+
+ assert :ok == Mix.Tasks.Pleroma.Database.run(["fix_likes_collections"])
+
+ assert length(Object.get_by_id(object.id).data["likes"]) == 1
+ assert Enum.empty?(Object.get_by_id(object2.id).data["likes"])
+ end
+ end
end
diff --git a/test/tasks/digest_test.exs b/test/tasks/digest_test.exs
new file mode 100644
index 000000000..4bfa1fb93
--- /dev/null
+++ b/test/tasks/digest_test.exs
@@ -0,0 +1,51 @@
+defmodule Mix.Tasks.Pleroma.DigestTest do
+ use Pleroma.DataCase
+
+ import Pleroma.Factory
+ import Swoosh.TestAssertions
+
+ alias Pleroma.Web.CommonAPI
+
+ setup_all do
+ Mix.shell(Mix.Shell.Process)
+
+ on_exit(fn ->
+ Mix.shell(Mix.Shell.IO)
+ end)
+
+ :ok
+ end
+
+ describe "pleroma.digest test" do
+ test "Sends digest to the given user" do
+ user1 = insert(:user)
+ user2 = insert(:user)
+
+ Enum.each(0..10, fn i ->
+ {:ok, _activity} =
+ CommonAPI.post(user1, %{
+ "status" => "hey ##{i} @#{user2.nickname}!"
+ })
+ end)
+
+ yesterday =
+ NaiveDateTime.add(
+ NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second),
+ -60 * 60 * 24,
+ :second
+ )
+
+ {:ok, yesterday_date} = Timex.format(yesterday, "%F", :strftime)
+
+ :ok = Mix.Tasks.Pleroma.Digest.run(["test", user2.nickname, yesterday_date])
+
+ assert_receive {:mix_shell, :info, [message]}
+ assert message =~ "Digest email have been sent"
+
+ assert_email_sent(
+ to: {user2.name, user2.email},
+ html_body: ~r/here is what you've missed!/i
+ )
+ end
+ end
+end
diff --git a/test/tasks/ecto/ecto_test.exs b/test/tasks/ecto/ecto_test.exs
new file mode 100644
index 000000000..a1b9ca174
--- /dev/null
+++ b/test/tasks/ecto/ecto_test.exs
@@ -0,0 +1,15 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Mix.Tasks.Pleroma.EctoTest do
+ use ExUnit.Case, async: true
+
+ test "raise on bad path" do
+ assert_raise RuntimeError, ~r/Could not find migrations directory/, fn ->
+ Mix.Tasks.Pleroma.Ecto.ensure_migrations_path(Pleroma.Repo,
+ migrations_path: "some-path"
+ )
+ end
+ end
+end
diff --git a/test/tasks/ecto/migrate_test.exs b/test/tasks/ecto/migrate_test.exs
new file mode 100644
index 000000000..0538a7b40
--- /dev/null
+++ b/test/tasks/ecto/migrate_test.exs
@@ -0,0 +1,20 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-onl
+
+defmodule Mix.Tasks.Pleroma.Ecto.MigrateTest do
+ use Pleroma.DataCase, async: true
+ import ExUnit.CaptureLog
+ require Logger
+
+ test "ecto.migrate info message" do
+ level = Logger.level()
+ Logger.configure(level: :warn)
+
+ assert capture_log(fn ->
+ Mix.Tasks.Pleroma.Ecto.Migrate.run()
+ end) =~ "[info] Already up"
+
+ Logger.configure(level: level)
+ end
+end
diff --git a/test/tasks/ecto/rollback_test.exs b/test/tasks/ecto/rollback_test.exs
new file mode 100644
index 000000000..c33c4e940
--- /dev/null
+++ b/test/tasks/ecto/rollback_test.exs
@@ -0,0 +1,20 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Mix.Tasks.Pleroma.Ecto.RollbackTest do
+ use Pleroma.DataCase
+ import ExUnit.CaptureLog
+ require Logger
+
+ test "ecto.rollback info message" do
+ level = Logger.level()
+ Logger.configure(level: :warn)
+
+ assert capture_log(fn ->
+ Mix.Tasks.Pleroma.Ecto.Rollback.run()
+ end) =~ "[info] Rollback succesfully"
+
+ Logger.configure(level: level)
+ end
+end
diff --git a/test/tasks/instance.exs b/test/tasks/instance_test.exs
index 6917a2376..70986374e 100644
--- a/test/tasks/instance.exs
+++ b/test/tasks/instance_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.InstanceTest do
use ExUnit.Case, async: true
@@ -36,7 +40,19 @@ defmodule Pleroma.InstanceTest do
"--dbpass",
"dbpass",
"--indexable",
- "y"
+ "y",
+ "--db-configurable",
+ "y",
+ "--rum",
+ "y",
+ "--listen-port",
+ "4000",
+ "--listen-ip",
+ "127.0.0.1",
+ "--uploads-dir",
+ "test/uploads",
+ "--static-dir",
+ "instance/static/"
])
end
@@ -53,10 +69,12 @@ defmodule Pleroma.InstanceTest do
assert generated_config =~ "database: \"dbname\""
assert generated_config =~ "username: \"dbuser\""
assert generated_config =~ "password: \"dbpass\""
+ assert generated_config =~ "dynamic_configuration: true"
+ assert generated_config =~ "http: [ip: {127, 0, 0, 1}, port: 4000]"
assert File.read!(tmp_path() <> "setup.psql") == generated_setup_psql()
end
defp generated_setup_psql do
- ~s(CREATE USER dbuser WITH ENCRYPTED PASSWORD 'dbpass';\nCREATE DATABASE dbname OWNER dbuser;\n\\c dbname;\n--Extensions made by ecto.migrate that need superuser access\nCREATE EXTENSION IF NOT EXISTS citext;\nCREATE EXTENSION IF NOT EXISTS pg_trgm;\nCREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";\n)
+ ~s(CREATE USER dbuser WITH ENCRYPTED PASSWORD 'dbpass';\nCREATE DATABASE dbname OWNER dbuser;\n\\c dbname;\n--Extensions made by ecto.migrate that need superuser access\nCREATE EXTENSION IF NOT EXISTS citext;\nCREATE EXTENSION IF NOT EXISTS pg_trgm;\nCREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";\nCREATE EXTENSION IF NOT EXISTS rum;\n)
end
end
diff --git a/test/tasks/pleroma_test.exs b/test/tasks/pleroma_test.exs
new file mode 100644
index 000000000..a20bd9cf2
--- /dev/null
+++ b/test/tasks/pleroma_test.exs
@@ -0,0 +1,50 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Mix.PleromaTest do
+ use ExUnit.Case, async: true
+ import Mix.Pleroma
+
+ setup_all do
+ Mix.shell(Mix.Shell.Process)
+
+ on_exit(fn ->
+ Mix.shell(Mix.Shell.IO)
+ end)
+
+ :ok
+ end
+
+ describe "shell_prompt/1" do
+ test "input" do
+ send(self(), {:mix_shell_input, :prompt, "Yes"})
+
+ answer = shell_prompt("Do you want this?")
+ assert_received {:mix_shell, :prompt, [message]}
+ assert message =~ "Do you want this?"
+ assert answer == "Yes"
+ end
+
+ test "with defval" do
+ send(self(), {:mix_shell_input, :prompt, "\n"})
+
+ answer = shell_prompt("Do you want this?", "defval")
+
+ assert_received {:mix_shell, :prompt, [message]}
+ assert message =~ "Do you want this? [defval]"
+ assert answer == "defval"
+ end
+ end
+
+ describe "get_option/3" do
+ test "get from options" do
+ assert get_option([domain: "some-domain.com"], :domain, "Promt") == "some-domain.com"
+ end
+
+ test "get from prompt" do
+ send(self(), {:mix_shell_input, :prompt, "another-domain.com"})
+ assert get_option([], :domain, "Prompt") == "another-domain.com"
+ end
+ end
+end
diff --git a/test/tasks/relay_test.exs b/test/tasks/relay_test.exs
index 9d260da3e..0d341c8d6 100644
--- a/test/tasks/relay_test.exs
+++ b/test/tasks/relay_test.exs
@@ -69,4 +69,27 @@ defmodule Mix.Tasks.Pleroma.RelayTest do
assert undo_activity.data["object"] == cancelled_activity.data
end
end
+
+ describe "mix pleroma.relay list" do
+ test "Prints relay subscription list" do
+ :ok = Mix.Tasks.Pleroma.Relay.run(["list"])
+
+ refute_receive {:mix_shell, :info, _}
+
+ Pleroma.Web.ActivityPub.Relay.get_actor()
+ |> Ecto.Changeset.change(
+ following: [
+ "http://test-app.com/user/test1",
+ "http://test-app.com/user/test1",
+ "http://test-app-42.com/user/test1"
+ ]
+ )
+ |> Pleroma.User.update_and_set_cache()
+
+ :ok = Mix.Tasks.Pleroma.Relay.run(["list"])
+
+ assert_receive {:mix_shell, :info, ["test-app.com"]}
+ assert_receive {:mix_shell, :info, ["test-app-42.com"]}
+ end
+ end
end
diff --git a/test/tasks/robots_txt_test.exs b/test/tasks/robots_txt_test.exs
new file mode 100644
index 000000000..917df2675
--- /dev/null
+++ b/test/tasks/robots_txt_test.exs
@@ -0,0 +1,45 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Mix.Tasks.Pleroma.RobotsTxtTest do
+ use ExUnit.Case
+ use Pleroma.Tests.Helpers
+ alias Mix.Tasks.Pleroma.RobotsTxt
+
+ clear_config([:instance, :static_dir])
+
+ test "creates new dir" do
+ path = "test/fixtures/new_dir/"
+ file_path = path <> "robots.txt"
+ Pleroma.Config.put([:instance, :static_dir], path)
+
+ on_exit(fn ->
+ {:ok, ["test/fixtures/new_dir/", "test/fixtures/new_dir/robots.txt"]} = File.rm_rf(path)
+ end)
+
+ RobotsTxt.run(["disallow_all"])
+
+ assert File.exists?(file_path)
+ {:ok, file} = File.read(file_path)
+
+ assert file == "User-Agent: *\nDisallow: /\n"
+ end
+
+ test "to existance folder" do
+ path = "test/fixtures/"
+ file_path = path <> "robots.txt"
+ Pleroma.Config.put([:instance, :static_dir], path)
+
+ on_exit(fn ->
+ :ok = File.rm(file_path)
+ end)
+
+ RobotsTxt.run(["disallow_all"])
+
+ assert File.exists?(file_path)
+ {:ok, file} = File.read(file_path)
+
+ assert file == "User-Agent: *\nDisallow: /\n"
+ end
+end
diff --git a/test/tasks/user_test.exs b/test/tasks/user_test.exs
index 260ce0d95..2b9453042 100644
--- a/test/tasks/user_test.exs
+++ b/test/tasks/user_test.exs
@@ -5,6 +5,9 @@
defmodule Mix.Tasks.Pleroma.UserTest do
alias Pleroma.Repo
alias Pleroma.User
+ alias Pleroma.Web.OAuth.Authorization
+ alias Pleroma.Web.OAuth.Token
+
use Pleroma.DataCase
import Pleroma.Factory
@@ -89,8 +92,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do
assert_received {:mix_shell, :info, [message]}
assert message =~ " deleted"
- user = User.get_cached_by_nickname(user.nickname)
- assert user.info.deactivated
+ refute User.get_by_nickname(user.nickname)
end
test "no user to delete" do
@@ -328,6 +330,13 @@ defmodule Mix.Tasks.Pleroma.UserTest do
assert_received {:mix_shell, :info, [message]}
assert message =~ "Invite for token #{invite.token} was revoked."
end
+
+ test "it prints an error message when invite is not exist" do
+ Mix.Tasks.Pleroma.User.run(["revoke_invite", "foo"])
+
+ assert_received {:mix_shell, :error, [message]}
+ assert message =~ "No invite found"
+ end
end
describe "running delete_activities" do
@@ -338,6 +347,13 @@ defmodule Mix.Tasks.Pleroma.UserTest do
assert_received {:mix_shell, :info, [message]}
assert message == "User #{nickname} statuses deleted."
end
+
+ test "it prints an error message when user is not exist" do
+ Mix.Tasks.Pleroma.User.run(["delete_activities", "foo"])
+
+ assert_received {:mix_shell, :error, [message]}
+ assert message =~ "No local user"
+ end
end
describe "running toggle_confirmed" do
@@ -365,5 +381,93 @@ defmodule Mix.Tasks.Pleroma.UserTest do
refute user.info.confirmation_pending
refute user.info.confirmation_token
end
+
+ test "it prints an error message when user is not exist" do
+ Mix.Tasks.Pleroma.User.run(["toggle_confirmed", "foo"])
+
+ assert_received {:mix_shell, :error, [message]}
+ assert message =~ "No local user"
+ end
+ end
+
+ describe "search" do
+ test "it returns users matching" do
+ user = insert(:user)
+ moon = insert(:user, nickname: "moon", name: "fediverse expert moon")
+ moot = insert(:user, nickname: "moot")
+ kawen = insert(:user, nickname: "kawen", name: "fediverse expert moon")
+
+ {:ok, user} = User.follow(user, kawen)
+
+ assert [moon.id, kawen.id] == User.Search.search("moon") |> Enum.map(& &1.id)
+ res = User.search("moo") |> Enum.map(& &1.id)
+ assert moon.id in res
+ assert moot.id in res
+ assert kawen.id in res
+ assert [moon.id, kawen.id] == User.Search.search("moon fediverse") |> Enum.map(& &1.id)
+
+ assert [kawen.id, moon.id] ==
+ User.Search.search("moon fediverse", for_user: user) |> Enum.map(& &1.id)
+ end
+ end
+
+ describe "signing out" do
+ test "it deletes all user's tokens and authorizations" do
+ user = insert(:user)
+ insert(:oauth_token, user: user)
+ insert(:oauth_authorization, user: user)
+
+ assert Repo.get_by(Token, user_id: user.id)
+ assert Repo.get_by(Authorization, user_id: user.id)
+
+ :ok = Mix.Tasks.Pleroma.User.run(["sign_out", user.nickname])
+
+ refute Repo.get_by(Token, user_id: user.id)
+ refute Repo.get_by(Authorization, user_id: user.id)
+ end
+
+ test "it prints an error message when user is not exist" do
+ Mix.Tasks.Pleroma.User.run(["sign_out", "foo"])
+
+ assert_received {:mix_shell, :error, [message]}
+ assert message =~ "No local user"
+ end
+ end
+
+ describe "tagging" do
+ test "it add tags to a user" do
+ user = insert(:user)
+
+ :ok = Mix.Tasks.Pleroma.User.run(["tag", user.nickname, "pleroma"])
+
+ user = User.get_cached_by_nickname(user.nickname)
+ assert "pleroma" in user.tags
+ end
+
+ test "it prints an error message when user is not exist" do
+ Mix.Tasks.Pleroma.User.run(["tag", "foo"])
+
+ assert_received {:mix_shell, :error, [message]}
+ assert message =~ "Could not change user tags"
+ end
+ end
+
+ describe "untagging" do
+ test "it deletes tags from a user" do
+ user = insert(:user, tags: ["pleroma"])
+ assert "pleroma" in user.tags
+
+ :ok = Mix.Tasks.Pleroma.User.run(["untag", user.nickname, "pleroma"])
+
+ user = User.get_cached_by_nickname(user.nickname)
+ assert Enum.empty?(user.tags)
+ end
+
+ test "it prints an error message when user is not exist" do
+ Mix.Tasks.Pleroma.User.run(["untag", "foo"])
+
+ assert_received {:mix_shell, :error, [message]}
+ assert message =~ "Could not change user tags"
+ end
end
end
diff --git a/test/test_helper.exs b/test/test_helper.exs
index f604ba63d..a927b2c3d 100644
--- a/test/test_helper.exs
+++ b/test/test_helper.exs
@@ -2,7 +2,8 @@
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
-ExUnit.start()
-
+os_exclude = if :os.type() == {:unix, :darwin}, do: [skip_on_mac: true], else: []
+ExUnit.start(exclude: os_exclude)
Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, :manual)
+Mox.defmock(Pleroma.ReverseProxy.ClientMock, for: Pleroma.ReverseProxy.Client)
{:ok, _} = Application.ensure_all_started(:ex_machina)
diff --git a/test/upload/filter/anonymize_filename_test.exs b/test/upload/filter/anonymize_filename_test.exs
new file mode 100644
index 000000000..6b33e7395
--- /dev/null
+++ b/test/upload/filter/anonymize_filename_test.exs
@@ -0,0 +1,40 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Upload.Filter.AnonymizeFilenameTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Config
+ alias Pleroma.Upload
+
+ setup do
+ upload_file = %Upload{
+ name: "an… image.jpg",
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image_tmp.jpg")
+ }
+
+ %{upload_file: upload_file}
+ end
+
+ clear_config([Pleroma.Upload.Filter.AnonymizeFilename, :text])
+
+ test "it replaces filename on pre-defined text", %{upload_file: upload_file} do
+ Config.put([Upload.Filter.AnonymizeFilename, :text], "custom-file.png")
+ {:ok, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
+ assert name == "custom-file.png"
+ end
+
+ test "it replaces filename on pre-defined text expression", %{upload_file: upload_file} do
+ Config.put([Upload.Filter.AnonymizeFilename, :text], "custom-file.{extension}")
+ {:ok, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
+ assert name == "custom-file.jpg"
+ end
+
+ test "it replaces filename on random text", %{upload_file: upload_file} do
+ {:ok, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
+ assert <<_::bytes-size(14)>> <> ".jpg" = name
+ refute name == "an… image.jpg"
+ end
+end
diff --git a/test/upload/filter/dedupe_test.exs b/test/upload/filter/dedupe_test.exs
new file mode 100644
index 000000000..3de94dc20
--- /dev/null
+++ b/test/upload/filter/dedupe_test.exs
@@ -0,0 +1,31 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Upload.Filter.DedupeTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Upload
+ alias Pleroma.Upload.Filter.Dedupe
+
+ @shasum "e30397b58d226d6583ab5b8b3c5defb0c682bda5c31ef07a9f57c1c4986e3781"
+
+ test "adds shasum" do
+ File.cp!(
+ "test/fixtures/image.jpg",
+ "test/fixtures/image_tmp.jpg"
+ )
+
+ upload = %Upload{
+ name: "an… image.jpg",
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image_tmp.jpg"),
+ tempfile: Path.absname("test/fixtures/image_tmp.jpg")
+ }
+
+ assert {
+ :ok,
+ %Pleroma.Upload{id: @shasum, path: @shasum <> ".jpg"}
+ } = Dedupe.filter(upload)
+ end
+end
diff --git a/test/upload/filter/mogrifun_test.exs b/test/upload/filter/mogrifun_test.exs
new file mode 100644
index 000000000..d5a8751cc
--- /dev/null
+++ b/test/upload/filter/mogrifun_test.exs
@@ -0,0 +1,44 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Upload.Filter.MogrifunTest do
+ use Pleroma.DataCase
+ import Mock
+
+ alias Pleroma.Upload
+ alias Pleroma.Upload.Filter
+
+ test "apply mogrify filter" do
+ File.cp!(
+ "test/fixtures/image.jpg",
+ "test/fixtures/image_tmp.jpg"
+ )
+
+ upload = %Upload{
+ name: "an… image.jpg",
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image_tmp.jpg"),
+ tempfile: Path.absname("test/fixtures/image_tmp.jpg")
+ }
+
+ task =
+ Task.async(fn ->
+ assert_receive {:apply_filter, {}}, 4_000
+ end)
+
+ with_mocks([
+ {Mogrify, [],
+ [
+ open: fn _f -> %Mogrify.Image{} end,
+ custom: fn _m, _a -> send(task.pid, {:apply_filter, {}}) end,
+ custom: fn _m, _a, _o -> send(task.pid, {:apply_filter, {}}) end,
+ save: fn _f, _o -> :ok end
+ ]}
+ ]) do
+ assert Filter.Mogrifun.filter(upload) == :ok
+ end
+
+ Task.await(task)
+ end
+end
diff --git a/test/upload/filter/mogrify_test.exs b/test/upload/filter/mogrify_test.exs
new file mode 100644
index 000000000..210320d30
--- /dev/null
+++ b/test/upload/filter/mogrify_test.exs
@@ -0,0 +1,45 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Upload.Filter.MogrifyTest do
+ use Pleroma.DataCase
+ import Mock
+
+ alias Pleroma.Config
+ alias Pleroma.Upload
+ alias Pleroma.Upload.Filter
+
+ clear_config([Filter.Mogrify, :args])
+
+ test "apply mogrify filter" do
+ Config.put([Filter.Mogrify, :args], [{"tint", "40"}])
+
+ File.cp!(
+ "test/fixtures/image.jpg",
+ "test/fixtures/image_tmp.jpg"
+ )
+
+ upload = %Upload{
+ name: "an… image.jpg",
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image_tmp.jpg"),
+ tempfile: Path.absname("test/fixtures/image_tmp.jpg")
+ }
+
+ task =
+ Task.async(fn ->
+ assert_receive {:apply_filter, {_, "tint", "40"}}, 4_000
+ end)
+
+ with_mock Mogrify,
+ open: fn _f -> %Mogrify.Image{} end,
+ custom: fn _m, _a -> :ok end,
+ custom: fn m, a, o -> send(task.pid, {:apply_filter, {m, a, o}}) end,
+ save: fn _f, _o -> :ok end do
+ assert Filter.Mogrify.filter(upload) == :ok
+ end
+
+ Task.await(task)
+ end
+end
diff --git a/test/upload/filter_test.exs b/test/upload/filter_test.exs
new file mode 100644
index 000000000..03887c06a
--- /dev/null
+++ b/test/upload/filter_test.exs
@@ -0,0 +1,33 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Upload.FilterTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Config
+ alias Pleroma.Upload.Filter
+
+ clear_config([Pleroma.Upload.Filter.AnonymizeFilename, :text])
+
+ test "applies filters" do
+ Config.put([Pleroma.Upload.Filter.AnonymizeFilename, :text], "custom-file.png")
+
+ File.cp!(
+ "test/fixtures/image.jpg",
+ "test/fixtures/image_tmp.jpg"
+ )
+
+ upload = %Pleroma.Upload{
+ name: "an… image.jpg",
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image_tmp.jpg"),
+ tempfile: Path.absname("test/fixtures/image_tmp.jpg")
+ }
+
+ assert Filter.filter([], upload) == {:ok, upload}
+
+ assert {:ok, upload} = Filter.filter([Pleroma.Upload.Filter.AnonymizeFilename], upload)
+ assert upload.name == "custom-file.png"
+ end
+end
diff --git a/test/upload_test.exs b/test/upload_test.exs
index 946ebcb5a..6721fe82e 100644
--- a/test/upload_test.exs
+++ b/test/upload_test.exs
@@ -3,31 +3,110 @@
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.UploadTest do
- alias Pleroma.Upload
use Pleroma.DataCase
- describe "Storing a file with the Local uploader" do
+ import ExUnit.CaptureLog
+
+ alias Pleroma.Upload
+ alias Pleroma.Uploaders.Uploader
+
+ @upload_file %Plug.Upload{
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image_tmp.jpg"),
+ filename: "image.jpg"
+ }
+
+ defmodule TestUploaderBase do
+ def put_file(%{path: path} = _upload, module_name) do
+ task_pid =
+ Task.async(fn ->
+ :timer.sleep(10)
+
+ {Uploader, path}
+ |> :global.whereis_name()
+ |> send({Uploader, self(), {:test}, %{}})
+
+ assert_receive {Uploader, {:test}}, 4_000
+ end)
+
+ Agent.start(fn -> task_pid end, name: module_name)
+
+ :wait_callback
+ end
+ end
+
+ describe "Tried storing a file when http callback response success result" do
+ defmodule TestUploaderSuccess do
+ def http_callback(conn, _params),
+ do: {:ok, conn, {:file, "post-process-file.jpg"}}
+
+ def put_file(upload), do: TestUploaderBase.put_file(upload, __MODULE__)
+ end
+
+ setup do: [uploader: TestUploaderSuccess]
setup [:ensure_local_uploader]
- test "returns a media url" do
+ test "it returns file" do
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
- file = %Plug.Upload{
- content_type: "image/jpg",
- path: Path.absname("test/fixtures/image_tmp.jpg"),
- filename: "image.jpg"
- }
+ assert Upload.store(@upload_file) ==
+ {:ok,
+ %{
+ "name" => "image.jpg",
+ "type" => "Document",
+ "url" => [
+ %{
+ "href" => "http://localhost:4001/media/post-process-file.jpg",
+ "mediaType" => "image/jpeg",
+ "type" => "Link"
+ }
+ ]
+ }}
+
+ Task.await(Agent.get(TestUploaderSuccess, fn task_pid -> task_pid end))
+ end
+ end
- {:ok, data} = Upload.store(file)
+ describe "Tried storing a file when http callback response error" do
+ defmodule TestUploaderError do
+ def http_callback(conn, _params), do: {:error, conn, "Errors"}
- assert %{"url" => [%{"href" => url}]} = data
+ def put_file(upload), do: TestUploaderBase.put_file(upload, __MODULE__)
+ end
- assert String.starts_with?(url, Pleroma.Web.base_url() <> "/media/")
+ setup do: [uploader: TestUploaderError]
+ setup [:ensure_local_uploader]
+
+ test "it returns error" do
+ File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
+
+ assert capture_log(fn ->
+ assert Upload.store(@upload_file) == {:error, "Errors"}
+ Task.await(Agent.get(TestUploaderError, fn task_pid -> task_pid end))
+ end) =~
+ "[error] Elixir.Pleroma.Upload store (using Pleroma.UploadTest.TestUploaderError) failed: \"Errors\""
+ end
+ end
+
+ describe "Tried storing a file when http callback doesn't response by timeout" do
+ defmodule(TestUploader, do: def(put_file(_upload), do: :wait_callback))
+ setup do: [uploader: TestUploader]
+ setup [:ensure_local_uploader]
+
+ test "it returns error" do
+ File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
+
+ assert capture_log(fn ->
+ assert Upload.store(@upload_file) == {:error, "Uploader callback timeout"}
+ end) =~
+ "[error] Elixir.Pleroma.Upload store (using Pleroma.UploadTest.TestUploader) failed: \"Uploader callback timeout\""
end
+ end
- test "returns a media url with configured base_url" do
- base_url = "https://cache.pleroma.social"
+ describe "Storing a file with the Local uploader" do
+ setup [:ensure_local_uploader]
+ test "returns a media url" do
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
file = %Plug.Upload{
@@ -36,11 +115,11 @@ defmodule Pleroma.UploadTest do
filename: "image.jpg"
}
- {:ok, data} = Upload.store(file, base_url: base_url)
+ {:ok, data} = Upload.store(file)
assert %{"url" => [%{"href" => url}]} = data
- assert String.starts_with?(url, base_url <> "/media/")
+ assert String.starts_with?(url, Pleroma.Web.base_url() <> "/media/")
end
test "copies the file to the configured folder with deduping" do
@@ -169,4 +248,28 @@ defmodule Pleroma.UploadTest do
"%3A%3F%23%5B%5D%40%21%24%26%5C%27%28%29%2A%2B%2C%3B%3D.jpg"
end
end
+
+ describe "Setting a custom base_url for uploaded media" do
+ clear_config([Pleroma.Upload, :base_url]) do
+ Pleroma.Config.put([Pleroma.Upload, :base_url], "https://cache.pleroma.social")
+ end
+
+ test "returns a media url with configured base_url" do
+ base_url = Pleroma.Config.get([Pleroma.Upload, :base_url])
+
+ File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
+
+ file = %Plug.Upload{
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image_tmp.jpg"),
+ filename: "image.jpg"
+ }
+
+ {:ok, data} = Upload.store(file, base_url: base_url)
+
+ assert %{"url" => [%{"href" => url}]} = data
+
+ refute String.starts_with?(url, base_url <> "/media/")
+ end
+ end
end
diff --git a/test/uploaders/local_test.exs b/test/uploaders/local_test.exs
new file mode 100644
index 000000000..fc442d0f1
--- /dev/null
+++ b/test/uploaders/local_test.exs
@@ -0,0 +1,32 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Uploaders.LocalTest do
+ use Pleroma.DataCase
+ alias Pleroma.Uploaders.Local
+
+ describe "get_file/1" do
+ test "it returns path to local folder for files" do
+ assert Local.get_file("") == {:ok, {:static_dir, "test/uploads"}}
+ end
+ end
+
+ describe "put_file/1" do
+ test "put file to local folder" do
+ file_path = "local_upload/files/image.jpg"
+
+ file = %Pleroma.Upload{
+ name: "image.jpg",
+ content_type: "image/jpg",
+ path: file_path,
+ tempfile: Path.absname("test/fixtures/image_tmp.jpg")
+ }
+
+ assert Local.put_file(file) == :ok
+
+ assert Path.join([Local.upload_path(), file_path])
+ |> File.exists?()
+ end
+ end
+end
diff --git a/test/uploaders/mdii_test.exs b/test/uploaders/mdii_test.exs
new file mode 100644
index 000000000..d432d40f0
--- /dev/null
+++ b/test/uploaders/mdii_test.exs
@@ -0,0 +1,50 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Uploaders.MDIITest do
+ use Pleroma.DataCase
+ alias Pleroma.Uploaders.MDII
+ import Tesla.Mock
+
+ describe "get_file/1" do
+ test "it returns path to local folder for files" do
+ assert MDII.get_file("") == {:ok, {:static_dir, "test/uploads"}}
+ end
+ end
+
+ describe "put_file/1" do
+ setup do
+ file_upload = %Pleroma.Upload{
+ name: "mdii-image.jpg",
+ content_type: "image/jpg",
+ path: "test_folder/mdii-image.jpg",
+ tempfile: Path.absname("test/fixtures/image_tmp.jpg")
+ }
+
+ [file_upload: file_upload]
+ end
+
+ test "save file", %{file_upload: file_upload} do
+ mock(fn
+ %{method: :post, url: "https://mdii.sakura.ne.jp/mdii-post.cgi?jpg"} ->
+ %Tesla.Env{status: 200, body: "mdii-image"}
+ end)
+
+ assert MDII.put_file(file_upload) ==
+ {:ok, {:url, "https://mdii.sakura.ne.jp/mdii-image.jpg"}}
+ end
+
+ test "save file to local if MDII isn`t available", %{file_upload: file_upload} do
+ mock(fn
+ %{method: :post, url: "https://mdii.sakura.ne.jp/mdii-post.cgi?jpg"} ->
+ %Tesla.Env{status: 500}
+ end)
+
+ assert MDII.put_file(file_upload) == :ok
+
+ assert Path.join([Pleroma.Uploaders.Local.upload_path(), file_upload.path])
+ |> File.exists?()
+ end
+ end
+end
diff --git a/test/uploaders/s3_test.exs b/test/uploaders/s3_test.exs
new file mode 100644
index 000000000..171316340
--- /dev/null
+++ b/test/uploaders/s3_test.exs
@@ -0,0 +1,82 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Uploaders.S3Test do
+ use Pleroma.DataCase
+
+ alias Pleroma.Config
+ alias Pleroma.Uploaders.S3
+
+ import Mock
+ import ExUnit.CaptureLog
+
+ clear_config([Pleroma.Uploaders.S3]) do
+ Config.put([Pleroma.Uploaders.S3],
+ bucket: "test_bucket",
+ public_endpoint: "https://s3.amazonaws.com"
+ )
+ end
+
+ describe "get_file/1" do
+ test "it returns path to local folder for files" do
+ assert S3.get_file("test_image.jpg") == {
+ :ok,
+ {:url, "https://s3.amazonaws.com/test_bucket/test_image.jpg"}
+ }
+ end
+
+ test "it returns path without bucket when truncated_namespace set to ''" do
+ Config.put([Pleroma.Uploaders.S3],
+ bucket: "test_bucket",
+ public_endpoint: "https://s3.amazonaws.com",
+ truncated_namespace: ""
+ )
+
+ assert S3.get_file("test_image.jpg") == {
+ :ok,
+ {:url, "https://s3.amazonaws.com/test_image.jpg"}
+ }
+ end
+
+ test "it returns path with bucket namespace when namespace is set" do
+ Config.put([Pleroma.Uploaders.S3],
+ bucket: "test_bucket",
+ public_endpoint: "https://s3.amazonaws.com",
+ bucket_namespace: "family"
+ )
+
+ assert S3.get_file("test_image.jpg") == {
+ :ok,
+ {:url, "https://s3.amazonaws.com/family:test_bucket/test_image.jpg"}
+ }
+ end
+ end
+
+ describe "put_file/1" do
+ setup do
+ file_upload = %Pleroma.Upload{
+ name: "image-tet.jpg",
+ content_type: "image/jpg",
+ path: "test_folder/image-tet.jpg",
+ tempfile: Path.absname("test/fixtures/image_tmp.jpg")
+ }
+
+ [file_upload: file_upload]
+ end
+
+ test "save file", %{file_upload: file_upload} do
+ with_mock ExAws, request: fn _ -> {:ok, :ok} end do
+ assert S3.put_file(file_upload) == {:ok, {:file, "test_folder/image-tet.jpg"}}
+ end
+ end
+
+ test "returns error", %{file_upload: file_upload} do
+ with_mock ExAws, request: fn _ -> {:error, "S3 Upload failed"} end do
+ assert capture_log(fn ->
+ assert S3.put_file(file_upload) == {:error, "S3 Upload failed"}
+ end) =~ "Elixir.Pleroma.Uploaders.S3: {:error, \"S3 Upload failed\"}"
+ end
+ end
+ end
+end
diff --git a/test/user_info_test.exs b/test/user_info_test.exs
new file mode 100644
index 000000000..2d795594e
--- /dev/null
+++ b/test/user_info_test.exs
@@ -0,0 +1,24 @@
+defmodule Pleroma.UserInfoTest do
+ alias Pleroma.Repo
+ alias Pleroma.User.Info
+
+ use Pleroma.DataCase
+
+ import Pleroma.Factory
+
+ describe "update_email_notifications/2" do
+ setup do
+ user = insert(:user, %{info: %{email_notifications: %{"digest" => true}}})
+
+ {:ok, user: user}
+ end
+
+ test "Notifications are updated", %{user: user} do
+ true = user.info.email_notifications["digest"]
+ changeset = Info.update_email_notifications(user.info, %{"digest" => false})
+ assert changeset.valid?
+ {:ok, result} = Ecto.Changeset.apply_action(changeset, :insert)
+ assert result.email_notifications["digest"] == false
+ end
+ end
+end
diff --git a/test/user_invite_token_test.exs b/test/user_invite_token_test.exs
index 276788254..111e40361 100644
--- a/test/user_invite_token_test.exs
+++ b/test/user_invite_token_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.UserInviteTokenTest do
use ExUnit.Case, async: true
use Pleroma.DataCase
diff --git a/test/user_search_test.exs b/test/user_search_test.exs
new file mode 100644
index 000000000..48ce973ad
--- /dev/null
+++ b/test/user_search_test.exs
@@ -0,0 +1,311 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.UserSearchTest do
+ alias Pleroma.Repo
+ alias Pleroma.User
+ use Pleroma.DataCase
+
+ import Pleroma.Factory
+
+ setup_all do
+ Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+ :ok
+ end
+
+ describe "User.search" do
+ test "accepts limit parameter" do
+ Enum.each(0..4, &insert(:user, %{nickname: "john#{&1}"}))
+ assert length(User.search("john", limit: 3)) == 3
+ assert length(User.search("john")) == 5
+ end
+
+ test "accepts offset parameter" do
+ Enum.each(0..4, &insert(:user, %{nickname: "john#{&1}"}))
+ assert length(User.search("john", limit: 3)) == 3
+ assert length(User.search("john", limit: 3, offset: 3)) == 2
+ end
+
+ test "finds a user by full or partial nickname" do
+ user = insert(:user, %{nickname: "john"})
+
+ Enum.each(["john", "jo", "j"], fn query ->
+ assert user ==
+ User.search(query)
+ |> List.first()
+ |> Map.put(:search_rank, nil)
+ |> Map.put(:search_type, nil)
+ end)
+ end
+
+ test "finds a user by full or partial name" do
+ user = insert(:user, %{name: "John Doe"})
+
+ Enum.each(["John Doe", "JOHN", "doe", "j d", "j", "d"], fn query ->
+ assert user ==
+ User.search(query)
+ |> List.first()
+ |> Map.put(:search_rank, nil)
+ |> Map.put(:search_type, nil)
+ end)
+ end
+
+ test "finds users, preferring nickname matches over name matches" do
+ u1 = insert(:user, %{name: "lain", nickname: "nick1"})
+ u2 = insert(:user, %{nickname: "lain", name: "nick1"})
+
+ assert [u2.id, u1.id] == Enum.map(User.search("lain"), & &1.id)
+ end
+
+ test "finds users, considering density of matched tokens" do
+ u1 = insert(:user, %{name: "Bar Bar plus Word Word"})
+ u2 = insert(:user, %{name: "Word Word Bar Bar Bar"})
+
+ assert [u2.id, u1.id] == Enum.map(User.search("bar word"), & &1.id)
+ end
+
+ test "finds users, ranking by similarity" do
+ u1 = insert(:user, %{name: "lain"})
+ _u2 = insert(:user, %{name: "ean"})
+ u3 = insert(:user, %{name: "ebn", nickname: "lain@mastodon.social"})
+ u4 = insert(:user, %{nickname: "lain@pleroma.soykaf.com"})
+
+ assert [u4.id, u3.id, u1.id] == Enum.map(User.search("lain@ple", for_user: u1), & &1.id)
+ end
+
+ test "finds users, handling misspelled requests" do
+ u1 = insert(:user, %{name: "lain"})
+
+ assert [u1.id] == Enum.map(User.search("laiin"), & &1.id)
+ end
+
+ test "finds users, boosting ranks of friends and followers" do
+ u1 = insert(:user)
+ u2 = insert(:user, %{name: "Doe"})
+ follower = insert(:user, %{name: "Doe"})
+ friend = insert(:user, %{name: "Doe"})
+
+ {:ok, follower} = User.follow(follower, u1)
+ {:ok, u1} = User.follow(u1, friend)
+
+ assert [friend.id, follower.id, u2.id] --
+ Enum.map(User.search("doe", resolve: false, for_user: u1), & &1.id) == []
+ end
+
+ test "finds followers of user by partial name" do
+ u1 = insert(:user)
+ u2 = insert(:user, %{name: "Jimi"})
+ follower_jimi = insert(:user, %{name: "Jimi Hendrix"})
+ follower_lizz = insert(:user, %{name: "Lizz Wright"})
+ friend = insert(:user, %{name: "Jimi"})
+
+ {:ok, follower_jimi} = User.follow(follower_jimi, u1)
+ {:ok, _follower_lizz} = User.follow(follower_lizz, u2)
+ {:ok, u1} = User.follow(u1, friend)
+
+ assert Enum.map(User.search("jimi", following: true, for_user: u1), & &1.id) == [
+ follower_jimi.id
+ ]
+
+ assert User.search("lizz", following: true, for_user: u1) == []
+ end
+
+ test "find local and remote users for authenticated users" do
+ u1 = insert(:user, %{name: "lain"})
+ u2 = insert(:user, %{name: "ebn", nickname: "lain@mastodon.social", local: false})
+ u3 = insert(:user, %{nickname: "lain@pleroma.soykaf.com", local: false})
+
+ results =
+ "lain"
+ |> User.search(for_user: u1)
+ |> Enum.map(& &1.id)
+ |> Enum.sort()
+
+ assert [u1.id, u2.id, u3.id] == results
+ end
+
+ test "find only local users for unauthenticated users" do
+ %{id: id} = insert(:user, %{name: "lain"})
+ insert(:user, %{name: "ebn", nickname: "lain@mastodon.social", local: false})
+ insert(:user, %{nickname: "lain@pleroma.soykaf.com", local: false})
+
+ assert [%{id: ^id}] = User.search("lain")
+ end
+
+ test "find only local users for authenticated users when `limit_to_local_content` is `:all`" do
+ Pleroma.Config.put([:instance, :limit_to_local_content], :all)
+
+ %{id: id} = insert(:user, %{name: "lain"})
+ insert(:user, %{name: "ebn", nickname: "lain@mastodon.social", local: false})
+ insert(:user, %{nickname: "lain@pleroma.soykaf.com", local: false})
+
+ assert [%{id: ^id}] = User.search("lain")
+
+ Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
+ end
+
+ test "find all users for unauthenticated users when `limit_to_local_content` is `false`" do
+ Pleroma.Config.put([:instance, :limit_to_local_content], false)
+
+ u1 = insert(:user, %{name: "lain"})
+ u2 = insert(:user, %{name: "ebn", nickname: "lain@mastodon.social", local: false})
+ u3 = insert(:user, %{nickname: "lain@pleroma.soykaf.com", local: false})
+
+ results =
+ "lain"
+ |> User.search()
+ |> Enum.map(& &1.id)
+ |> Enum.sort()
+
+ assert [u1.id, u2.id, u3.id] == results
+
+ Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated)
+ end
+
+ test "finds a user whose name is nil" do
+ _user = insert(:user, %{name: "notamatch", nickname: "testuser@pleroma.amplifie.red"})
+ user_two = insert(:user, %{name: nil, nickname: "lain@pleroma.soykaf.com"})
+
+ assert user_two ==
+ User.search("lain@pleroma.soykaf.com")
+ |> List.first()
+ |> Map.put(:search_rank, nil)
+ |> Map.put(:search_type, nil)
+ end
+
+ test "does not yield false-positive matches" do
+ insert(:user, %{name: "John Doe"})
+
+ Enum.each(["mary", "a", ""], fn query ->
+ assert [] == User.search(query)
+ end)
+ end
+
+ test "works with URIs" do
+ user = insert(:user)
+
+ results =
+ User.search("http://mastodon.example.org/users/admin", resolve: true, for_user: user)
+
+ result = results |> List.first()
+
+ user = User.get_cached_by_ap_id("http://mastodon.example.org/users/admin")
+
+ assert length(results) == 1
+
+ expected =
+ result
+ |> Map.put(:search_rank, nil)
+ |> Map.put(:search_type, nil)
+ |> Map.put(:last_digest_emailed_at, nil)
+
+ assert user == expected
+ end
+
+ test "excludes a blocked users from search result" do
+ user = insert(:user, %{nickname: "Bill"})
+
+ [blocked_user | users] = Enum.map(0..3, &insert(:user, %{nickname: "john#{&1}"}))
+
+ blocked_user2 =
+ insert(
+ :user,
+ %{nickname: "john awful", ap_id: "https://awful-and-rude-instance.com/user/bully"}
+ )
+
+ User.block_domain(user, "awful-and-rude-instance.com")
+ User.block(user, blocked_user)
+
+ account_ids = User.search("john", for_user: refresh_record(user)) |> collect_ids
+
+ assert account_ids == collect_ids(users)
+ refute Enum.member?(account_ids, blocked_user.id)
+ refute Enum.member?(account_ids, blocked_user2.id)
+ assert length(account_ids) == 3
+ end
+
+ test "local user has the same search_rank as for users with the same nickname, but another domain" do
+ user = insert(:user)
+ insert(:user, nickname: "lain@mastodon.social")
+ insert(:user, nickname: "lain")
+ insert(:user, nickname: "lain@pleroma.social")
+
+ assert User.search("lain@localhost", resolve: true, for_user: user)
+ |> Enum.each(fn u -> u.search_rank == 0.5 end)
+ end
+
+ test "localhost is the part of the domain" do
+ user = insert(:user)
+ insert(:user, nickname: "another@somedomain")
+ insert(:user, nickname: "lain")
+ insert(:user, nickname: "lain@examplelocalhost")
+
+ result = User.search("lain@examplelocalhost", resolve: true, for_user: user)
+ assert Enum.each(result, fn u -> u.search_rank == 0.5 end)
+ assert length(result) == 2
+ end
+
+ test "local user search with users" do
+ user = insert(:user)
+ local_user = insert(:user, nickname: "lain")
+ insert(:user, nickname: "another@localhost.com")
+ insert(:user, nickname: "localhost@localhost.com")
+
+ [result] = User.search("lain@localhost", resolve: true, for_user: user)
+ assert Map.put(result, :search_rank, nil) |> Map.put(:search_type, nil) == local_user
+ end
+
+ test "works with idna domains" do
+ user = insert(:user, nickname: "lain@" <> to_string(:idna.encode("zetsubou.みんな")))
+
+ results = User.search("lain@zetsubou.みんな", resolve: false, for_user: user)
+
+ result = List.first(results)
+
+ assert user == result |> Map.put(:search_rank, nil) |> Map.put(:search_type, nil)
+ end
+
+ test "works with idna domains converted input" do
+ user = insert(:user, nickname: "lain@" <> to_string(:idna.encode("zetsubou.みんな")))
+
+ results =
+ User.search("lain@zetsubou." <> to_string(:idna.encode("zetsubou.みんな")),
+ resolve: false,
+ for_user: user
+ )
+
+ result = List.first(results)
+
+ assert user == result |> Map.put(:search_rank, nil) |> Map.put(:search_type, nil)
+ end
+
+ test "works with idna domains and bad chars in domain" do
+ user = insert(:user, nickname: "lain@" <> to_string(:idna.encode("zetsubou.みんな")))
+
+ results =
+ User.search("lain@zetsubou!@#$%^&*()+,-/:;<=>?[]'_{}|~`.みんな",
+ resolve: false,
+ for_user: user
+ )
+
+ result = List.first(results)
+
+ assert user == result |> Map.put(:search_rank, nil) |> Map.put(:search_type, nil)
+ end
+
+ test "works with idna domains and query as link" do
+ user = insert(:user, nickname: "lain@" <> to_string(:idna.encode("zetsubou.みんな")))
+
+ results =
+ User.search("https://zetsubou.みんな/users/lain",
+ resolve: false,
+ for_user: user
+ )
+
+ result = List.first(results)
+
+ assert user == result |> Map.put(:search_rank, nil) |> Map.put(:search_type, nil)
+ end
+ end
+end
diff --git a/test/user_test.exs b/test/user_test.exs
index 019f2b56d..661ffc0b3 100644
--- a/test/user_test.exs
+++ b/test/user_test.exs
@@ -14,12 +14,15 @@ defmodule Pleroma.UserTest do
use Pleroma.DataCase
import Pleroma.Factory
+ import Mock
setup_all do
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
:ok
end
+ clear_config([:instance, :account_activation_required])
+
describe "when tags are nil" do
test "tagging a user" do
user = insert(:user, %{tags: nil})
@@ -53,6 +56,14 @@ defmodule Pleroma.UserTest do
assert expected_followers_collection == User.ap_followers(user)
end
+ test "ap_following returns the following collection for the user" do
+ user = UserBuilder.build()
+
+ expected_followers_collection = "#{User.ap_id(user)}/following"
+
+ assert expected_followers_collection == User.ap_following(user)
+ end
+
test "returns all pending follow requests" do
unlocked = insert(:user)
locked = insert(:user, %{info: %{locked: true}})
@@ -75,12 +86,23 @@ defmodule Pleroma.UserTest do
Pleroma.Web.TwitterAPI.TwitterAPI.follow(pending_follower, %{"user_id" => locked.id})
Pleroma.Web.TwitterAPI.TwitterAPI.follow(pending_follower, %{"user_id" => locked.id})
Pleroma.Web.TwitterAPI.TwitterAPI.follow(accepted_follower, %{"user_id" => locked.id})
- User.maybe_follow(accepted_follower, locked)
+ User.follow(accepted_follower, locked)
assert {:ok, [activity]} = User.get_follow_requests(locked)
assert activity
end
+ test "clears follow requests when requester is blocked" do
+ followed = insert(:user, %{info: %{locked: true}})
+ follower = insert(:user)
+
+ CommonAPI.follow(follower, followed)
+ assert {:ok, [_activity]} = User.get_follow_requests(followed)
+
+ {:ok, _follower} = User.block(followed, follower)
+ assert {:ok, []} = User.get_follow_requests(followed)
+ end
+
test "follow_all follows mutliple users" do
user = insert(:user)
followed_zero = insert(:user)
@@ -183,24 +205,64 @@ defmodule Pleroma.UserTest do
# assert websub
# end
- test "unfollow takes a user and another user" do
- followed = insert(:user)
- user = insert(:user, %{following: [User.ap_followers(followed)]})
+ describe "unfollow/2" do
+ setup do
+ setting = Pleroma.Config.get([:instance, :external_user_synchronization])
- {:ok, user, _activity} = User.unfollow(user, followed)
+ on_exit(fn ->
+ Pleroma.Config.put([:instance, :external_user_synchronization], setting)
+ end)
- user = User.get_cached_by_id(user.id)
+ :ok
+ end
- assert user.following == []
- end
+ test "unfollow with syncronizes external user" do
+ Pleroma.Config.put([:instance, :external_user_synchronization], true)
- test "unfollow doesn't unfollow yourself" do
- user = insert(:user)
+ followed =
+ insert(:user,
+ nickname: "fuser1",
+ follower_address: "http://localhost:4001/users/fuser1/followers",
+ following_address: "http://localhost:4001/users/fuser1/following",
+ ap_id: "http://localhost:4001/users/fuser1"
+ )
- {:error, _} = User.unfollow(user, user)
+ user =
+ insert(:user, %{
+ local: false,
+ nickname: "fuser2",
+ ap_id: "http://localhost:4001/users/fuser2",
+ follower_address: "http://localhost:4001/users/fuser2/followers",
+ following_address: "http://localhost:4001/users/fuser2/following",
+ following: [User.ap_followers(followed)]
+ })
- user = User.get_cached_by_id(user.id)
- assert user.following == [user.ap_id]
+ {:ok, user, _activity} = User.unfollow(user, followed)
+
+ user = User.get_cached_by_id(user.id)
+
+ assert user.following == []
+ end
+
+ test "unfollow takes a user and another user" do
+ followed = insert(:user)
+ user = insert(:user, %{following: [User.ap_followers(followed)]})
+
+ {:ok, user, _activity} = User.unfollow(user, followed)
+
+ user = User.get_cached_by_id(user.id)
+
+ assert user.following == []
+ end
+
+ test "unfollow doesn't unfollow yourself" do
+ user = insert(:user)
+
+ {:error, _} = User.unfollow(user, user)
+
+ user = User.get_cached_by_id(user.id)
+ assert user.following == [user.ap_id]
+ end
end
test "test if a user is following another user" do
@@ -227,6 +289,9 @@ defmodule Pleroma.UserTest do
password_confirmation: "test",
email: "email@example.com"
}
+ clear_config([:instance, :autofollowed_nicknames])
+ clear_config([:instance, :welcome_message])
+ clear_config([:instance, :welcome_user_nickname])
test "it autofollows accounts that are set for it" do
user = insert(:user)
@@ -243,8 +308,6 @@ defmodule Pleroma.UserTest do
assert User.following?(registered_user, user)
refute User.following?(registered_user, remote_user)
-
- Pleroma.Config.put([:instance, :autofollowed_nicknames], [])
end
test "it sends a welcome message if it is set" do
@@ -260,9 +323,6 @@ defmodule Pleroma.UserTest do
assert registered_user.ap_id in activity.recipients
assert Object.normalize(activity).data["content"] =~ "cool site"
assert activity.actor == welcome_user.ap_id
-
- Pleroma.Config.put([:instance, :welcome_user_nickname], nil)
- Pleroma.Config.put([:instance, :welcome_message], nil)
end
test "it requires an email, name, nickname and password, bio is optional" do
@@ -328,15 +388,8 @@ defmodule Pleroma.UserTest do
email: "email@example.com"
}
- setup do
- setting = Pleroma.Config.get([:instance, :account_activation_required])
-
- unless setting do
- Pleroma.Config.put([:instance, :account_activation_required], true)
- on_exit(fn -> Pleroma.Config.put([:instance, :account_activation_required], setting) end)
- end
-
- :ok
+ clear_config([:instance, :account_activation_required]) do
+ Pleroma.Config.put([:instance, :account_activation_required], true)
end
test "it creates unconfirmed user" do
@@ -488,6 +541,9 @@ defmodule Pleroma.UserTest do
avatar: %{some: "avatar"}
}
+ clear_config([:instance, :user_bio_length])
+ clear_config([:instance, :user_name_length])
+
test "it confirms validity" do
cs = User.remote_user_creation(@valid_remote)
assert cs.valid?
@@ -516,7 +572,10 @@ defmodule Pleroma.UserTest do
end
test "it restricts some sizes" do
- [bio: 5000, name: 100]
+ bio_limit = Pleroma.Config.get([:instance, :user_bio_length], 5000)
+ name_limit = Pleroma.Config.get([:instance, :user_name_length], 100)
+
+ [bio: bio_limit, name: name_limit]
|> Enum.each(fn {field, size} ->
string = String.pad_leading(".", size)
cs = User.remote_user_creation(Map.put(@valid_remote, field, string))
@@ -678,10 +737,12 @@ defmodule Pleroma.UserTest do
muted_user = insert(:user)
refute User.mutes?(user, muted_user)
+ refute User.muted_notifications?(user, muted_user)
{:ok, user} = User.mute(user, muted_user)
assert User.mutes?(user, muted_user)
+ assert User.muted_notifications?(user, muted_user)
end
test "it unmutes users" do
@@ -692,6 +753,20 @@ defmodule Pleroma.UserTest do
{:ok, user} = User.unmute(user, muted_user)
refute User.mutes?(user, muted_user)
+ refute User.muted_notifications?(user, muted_user)
+ end
+
+ test "it mutes user without notifications" do
+ user = insert(:user)
+ muted_user = insert(:user)
+
+ refute User.mutes?(user, muted_user)
+ refute User.muted_notifications?(user, muted_user)
+
+ {:ok, user} = User.mute(user, muted_user, false)
+
+ assert User.mutes?(user, muted_user)
+ refute User.muted_notifications?(user, muted_user)
end
end
@@ -799,6 +874,48 @@ defmodule Pleroma.UserTest do
assert User.blocks?(user, collateral_user)
end
+ test "does not block domain with same end" do
+ user = insert(:user)
+
+ collateral_user =
+ insert(:user, %{ap_id: "https://another-awful-and-rude-instance.com/user/bully"})
+
+ {:ok, user} = User.block_domain(user, "awful-and-rude-instance.com")
+
+ refute User.blocks?(user, collateral_user)
+ end
+
+ test "does not block domain with same end if wildcard added" do
+ user = insert(:user)
+
+ collateral_user =
+ insert(:user, %{ap_id: "https://another-awful-and-rude-instance.com/user/bully"})
+
+ {:ok, user} = User.block_domain(user, "*.awful-and-rude-instance.com")
+
+ refute User.blocks?(user, collateral_user)
+ end
+
+ test "blocks domain with wildcard for subdomain" do
+ user = insert(:user)
+
+ user_from_subdomain =
+ insert(:user, %{ap_id: "https://subdomain.awful-and-rude-instance.com/user/bully"})
+
+ user_with_two_subdomains =
+ insert(:user, %{
+ ap_id: "https://subdomain.second_subdomain.awful-and-rude-instance.com/user/bully"
+ })
+
+ user_domain = insert(:user, %{ap_id: "https://awful-and-rude-instance.com/user/bully"})
+
+ {:ok, user} = User.block_domain(user, "*.awful-and-rude-instance.com")
+
+ assert User.blocks?(user, user_from_subdomain)
+ assert User.blocks?(user, user_with_two_subdomains)
+ assert User.blocks?(user, user_domain)
+ end
+
test "unblocks domains" do
user = insert(:user)
collateral_user = insert(:user, %{ap_id: "https://awful-and-rude-instance.com/user/bully"})
@@ -915,47 +1032,85 @@ defmodule Pleroma.UserTest do
end
end
- test ".delete_user_activities deletes all create activities" do
- user = insert(:user)
+ describe "delete" do
+ setup do
+ {:ok, user} = insert(:user) |> User.set_cache()
- {:ok, activity} = CommonAPI.post(user, %{"status" => "2hu"})
+ [user: user]
+ end
+
+ clear_config([:instance, :federating])
+
+ test ".delete_user_activities deletes all create activities", %{user: user} do
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "2hu"})
- Ecto.Adapters.SQL.Sandbox.unboxed_run(Repo, fn ->
{:ok, _} = User.delete_user_activities(user)
+
# TODO: Remove favorites, repeats, delete activities.
refute Activity.get_by_id(activity.id)
- end)
- end
+ end
- test ".delete deactivates a user, all follow relationships and all create activities" do
- user = insert(:user)
- followed = insert(:user)
- follower = insert(:user)
+ test "it deletes deactivated user" do
+ {:ok, user} = insert(:user, info: %{deactivated: true}) |> User.set_cache()
- {:ok, user} = User.follow(user, followed)
- {:ok, follower} = User.follow(follower, user)
+ assert {:ok, _} = User.delete(user)
+ refute User.get_by_id(user.id)
+ end
- {:ok, activity} = CommonAPI.post(user, %{"status" => "2hu"})
- {:ok, activity_two} = CommonAPI.post(follower, %{"status" => "3hu"})
+ test "it deletes a user, all follow relationships and all activities", %{user: user} do
+ follower = insert(:user)
+ {:ok, follower} = User.follow(follower, user)
- {:ok, _, _} = CommonAPI.favorite(activity_two.id, user)
- {:ok, _, _} = CommonAPI.favorite(activity.id, follower)
- {:ok, _, _} = CommonAPI.repeat(activity.id, follower)
+ object = insert(:note, user: user)
+ activity = insert(:note_activity, user: user, note: object)
- {:ok, _} = User.delete(user)
+ object_two = insert(:note, user: follower)
+ activity_two = insert(:note_activity, user: follower, note: object_two)
- followed = User.get_cached_by_id(followed.id)
- follower = User.get_cached_by_id(follower.id)
- user = User.get_cached_by_id(user.id)
+ {:ok, like, _} = CommonAPI.favorite(activity_two.id, user)
+ {:ok, like_two, _} = CommonAPI.favorite(activity.id, follower)
+ {:ok, repeat, _} = CommonAPI.repeat(activity_two.id, user)
+
+ {:ok, _} = User.delete(user)
- assert user.info.deactivated
+ follower = User.get_cached_by_id(follower.id)
- refute User.following?(user, followed)
- refute User.following?(followed, follower)
+ refute User.following?(follower, user)
+ refute User.get_by_id(user.id)
+ assert {:ok, nil} == Cachex.get(:user_cache, "ap_id:#{user.ap_id}")
- # TODO: Remove favorites, repeats, delete activities.
+ user_activities =
+ user.ap_id
+ |> Activity.query_by_actor()
+ |> Repo.all()
+ |> Enum.map(fn act -> act.data["type"] end)
+
+ assert Enum.all?(user_activities, fn act -> act in ~w(Delete Undo) end)
+
+ refute Activity.get_by_id(activity.id)
+ refute Activity.get_by_id(like.id)
+ refute Activity.get_by_id(like_two.id)
+ refute Activity.get_by_id(repeat.id)
+ end
- refute Activity.get_by_id(activity.id)
+ test_with_mock "it sends out User Delete activity",
+ %{user: user},
+ Pleroma.Web.ActivityPub.Publisher,
+ [:passthrough],
+ [] do
+ Pleroma.Config.put([:instance, :federating], true)
+
+ {:ok, follower} = User.get_or_fetch_by_ap_id("http://mastodon.example.org/users/admin")
+ {:ok, _} = User.follow(follower, user)
+
+ {:ok, _user} = User.delete(user)
+
+ assert called(
+ Pleroma.Web.ActivityPub.Publisher.publish_one(%{
+ inbox: "http://mastodon.example.org/inbox"
+ })
+ )
+ end
end
test "get_public_key_for_ap_id fetches a user that's not in the db" do
@@ -1010,103 +1165,6 @@ defmodule Pleroma.UserTest do
end
end
- describe "User.search" do
- test "finds a user by full or partial nickname" do
- user = insert(:user, %{nickname: "john"})
-
- Enum.each(["john", "jo", "j"], fn query ->
- assert user ==
- User.search(query)
- |> List.first()
- |> Map.put(:search_rank, nil)
- |> Map.put(:search_type, nil)
- end)
- end
-
- test "finds a user by full or partial name" do
- user = insert(:user, %{name: "John Doe"})
-
- Enum.each(["John Doe", "JOHN", "doe", "j d", "j", "d"], fn query ->
- assert user ==
- User.search(query)
- |> List.first()
- |> Map.put(:search_rank, nil)
- |> Map.put(:search_type, nil)
- end)
- end
-
- test "finds users, preferring nickname matches over name matches" do
- u1 = insert(:user, %{name: "lain", nickname: "nick1"})
- u2 = insert(:user, %{nickname: "lain", name: "nick1"})
-
- assert [u2.id, u1.id] == Enum.map(User.search("lain"), & &1.id)
- end
-
- test "finds users, considering density of matched tokens" do
- u1 = insert(:user, %{name: "Bar Bar plus Word Word"})
- u2 = insert(:user, %{name: "Word Word Bar Bar Bar"})
-
- assert [u2.id, u1.id] == Enum.map(User.search("bar word"), & &1.id)
- end
-
- test "finds users, ranking by similarity" do
- u1 = insert(:user, %{name: "lain"})
- _u2 = insert(:user, %{name: "ean"})
- u3 = insert(:user, %{name: "ebn", nickname: "lain@mastodon.social"})
- u4 = insert(:user, %{nickname: "lain@pleroma.soykaf.com"})
-
- assert [u4.id, u3.id, u1.id] == Enum.map(User.search("lain@ple"), & &1.id)
- end
-
- test "finds users, handling misspelled requests" do
- u1 = insert(:user, %{name: "lain"})
-
- assert [u1.id] == Enum.map(User.search("laiin"), & &1.id)
- end
-
- test "finds users, boosting ranks of friends and followers" do
- u1 = insert(:user)
- u2 = insert(:user, %{name: "Doe"})
- follower = insert(:user, %{name: "Doe"})
- friend = insert(:user, %{name: "Doe"})
-
- {:ok, follower} = User.follow(follower, u1)
- {:ok, u1} = User.follow(u1, friend)
-
- assert [friend.id, follower.id, u2.id] --
- Enum.map(User.search("doe", resolve: false, for_user: u1), & &1.id) == []
- end
-
- test "finds a user whose name is nil" do
- _user = insert(:user, %{name: "notamatch", nickname: "testuser@pleroma.amplifie.red"})
- user_two = insert(:user, %{name: nil, nickname: "lain@pleroma.soykaf.com"})
-
- assert user_two ==
- User.search("lain@pleroma.soykaf.com")
- |> List.first()
- |> Map.put(:search_rank, nil)
- |> Map.put(:search_type, nil)
- end
-
- test "does not yield false-positive matches" do
- insert(:user, %{name: "John Doe"})
-
- Enum.each(["mary", "a", ""], fn query ->
- assert [] == User.search(query)
- end)
- end
-
- test "works with URIs" do
- results = User.search("http://mastodon.example.org/users/admin", resolve: true)
- result = results |> List.first()
-
- user = User.get_cached_by_ap_id("http://mastodon.example.org/users/admin")
-
- assert length(results) == 1
- assert user == result |> Map.put(:search_rank, nil) |> Map.put(:search_type, nil)
- end
- end
-
test "auth_active?/1 works correctly" do
Pleroma.Config.put([:instance, :account_activation_required], true)
@@ -1117,8 +1175,6 @@ defmodule Pleroma.UserTest do
refute User.auth_active?(local_user)
assert User.auth_active?(confirmed_user)
assert User.auth_active?(remote_user)
-
- Pleroma.Config.put([:instance, :account_activation_required], false)
end
describe "superuser?/1" do
@@ -1163,8 +1219,6 @@ defmodule Pleroma.UserTest do
other_user = insert(:user, local: true)
refute User.visible_for?(user, other_user)
-
- Pleroma.Config.put([:instance, :account_activation_required], false)
end
test "returns true when the account is unauthenticated and auth is not required" do
@@ -1181,8 +1235,6 @@ defmodule Pleroma.UserTest do
other_user = insert(:user, local: true, info: %{is_admin: true})
assert User.visible_for?(user, other_user)
-
- Pleroma.Config.put([:instance, :account_activation_required], false)
end
end
@@ -1234,6 +1286,109 @@ defmodule Pleroma.UserTest do
assert Map.get(user_show, "followers_count") == 2
end
+ describe "list_inactive_users_query/1" do
+ defp days_ago(days) do
+ NaiveDateTime.add(
+ NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second),
+ -days * 60 * 60 * 24,
+ :second
+ )
+ end
+
+ test "Users are inactive by default" do
+ total = 10
+
+ users =
+ Enum.map(1..total, fn _ ->
+ insert(:user, last_digest_emailed_at: days_ago(20), info: %{deactivated: false})
+ end)
+
+ inactive_users_ids =
+ Pleroma.User.list_inactive_users_query()
+ |> Pleroma.Repo.all()
+ |> Enum.map(& &1.id)
+
+ Enum.each(users, fn user ->
+ assert user.id in inactive_users_ids
+ end)
+ end
+
+ test "Only includes users who has no recent activity" do
+ total = 10
+
+ users =
+ Enum.map(1..total, fn _ ->
+ insert(:user, last_digest_emailed_at: days_ago(20), info: %{deactivated: false})
+ end)
+
+ {inactive, active} = Enum.split(users, trunc(total / 2))
+
+ Enum.map(active, fn user ->
+ to = Enum.random(users -- [user])
+
+ {:ok, _} =
+ Pleroma.Web.TwitterAPI.TwitterAPI.create_status(user, %{
+ "status" => "hey @#{to.nickname}"
+ })
+ end)
+
+ inactive_users_ids =
+ Pleroma.User.list_inactive_users_query()
+ |> Pleroma.Repo.all()
+ |> Enum.map(& &1.id)
+
+ Enum.each(active, fn user ->
+ refute user.id in inactive_users_ids
+ end)
+
+ Enum.each(inactive, fn user ->
+ assert user.id in inactive_users_ids
+ end)
+ end
+
+ test "Only includes users with no read notifications" do
+ total = 10
+
+ users =
+ Enum.map(1..total, fn _ ->
+ insert(:user, last_digest_emailed_at: days_ago(20), info: %{deactivated: false})
+ end)
+
+ [sender | recipients] = users
+ {inactive, active} = Enum.split(recipients, trunc(total / 2))
+
+ Enum.each(recipients, fn to ->
+ {:ok, _} =
+ Pleroma.Web.TwitterAPI.TwitterAPI.create_status(sender, %{
+ "status" => "hey @#{to.nickname}"
+ })
+
+ {:ok, _} =
+ Pleroma.Web.TwitterAPI.TwitterAPI.create_status(sender, %{
+ "status" => "hey again @#{to.nickname}"
+ })
+ end)
+
+ Enum.each(active, fn user ->
+ [n1, _n2] = Pleroma.Notification.for_user(user)
+ {:ok, _} = Pleroma.Notification.read_one(user, n1.id)
+ end)
+
+ inactive_users_ids =
+ Pleroma.User.list_inactive_users_query()
+ |> Pleroma.Repo.all()
+ |> Enum.map(& &1.id)
+
+ Enum.each(active, fn user ->
+ refute user.id in inactive_users_ids
+ end)
+
+ Enum.each(inactive, fn user ->
+ assert user.id in inactive_users_ids
+ end)
+ end
+ end
+
describe "toggle_confirmation/1" do
test "if user is confirmed" do
user = insert(:user, info: %{confirmation_pending: false})
@@ -1266,4 +1421,199 @@ defmodule Pleroma.UserTest do
assert user.info.keys == "xxx"
end
end
+
+ describe "get_ap_ids_by_nicknames" do
+ test "it returns a list of AP ids for a given set of nicknames" do
+ user = insert(:user)
+ user_two = insert(:user)
+
+ ap_ids = User.get_ap_ids_by_nicknames([user.nickname, user_two.nickname, "nonexistent"])
+ assert length(ap_ids) == 2
+ assert user.ap_id in ap_ids
+ assert user_two.ap_id in ap_ids
+ end
+ end
+
+ describe "sync followers count" do
+ setup do
+ user1 = insert(:user, local: false, ap_id: "http://localhost:4001/users/masto_closed")
+ user2 = insert(:user, local: false, ap_id: "http://localhost:4001/users/fuser2")
+ insert(:user, local: true)
+ insert(:user, local: false, info: %{deactivated: true})
+ {:ok, user1: user1, user2: user2}
+ end
+
+ test "external_users/1 external active users with limit", %{user1: user1, user2: user2} do
+ [fdb_user1] = User.external_users(limit: 1)
+
+ assert fdb_user1.ap_id
+ assert fdb_user1.ap_id == user1.ap_id
+ assert fdb_user1.id == user1.id
+
+ [fdb_user2] = User.external_users(max_id: fdb_user1.id, limit: 1)
+
+ assert fdb_user2.ap_id
+ assert fdb_user2.ap_id == user2.ap_id
+ assert fdb_user2.id == user2.id
+
+ assert User.external_users(max_id: fdb_user2.id, limit: 1) == []
+ end
+ end
+
+ describe "set_info_cache/2" do
+ setup do
+ user = insert(:user)
+ {:ok, user: user}
+ end
+
+ test "update from args", %{user: user} do
+ User.set_info_cache(user, %{following_count: 15, follower_count: 18})
+
+ %{follower_count: followers, following_count: following} = User.get_cached_user_info(user)
+ assert followers == 18
+ assert following == 15
+ end
+
+ test "without args", %{user: user} do
+ User.set_info_cache(user, %{})
+
+ %{follower_count: followers, following_count: following} = User.get_cached_user_info(user)
+ assert followers == 0
+ assert following == 0
+ end
+ end
+
+ describe "user_info/2" do
+ setup do
+ user = insert(:user)
+ {:ok, user: user}
+ end
+
+ test "update from args", %{user: user} do
+ %{follower_count: followers, following_count: following} =
+ User.user_info(user, %{following_count: 15, follower_count: 18})
+
+ assert followers == 18
+ assert following == 15
+ end
+
+ test "without args", %{user: user} do
+ %{follower_count: followers, following_count: following} = User.user_info(user)
+
+ assert followers == 0
+ assert following == 0
+ end
+ end
+
+ describe "is_internal_user?/1" do
+ test "non-internal user returns false" do
+ user = insert(:user)
+ refute User.is_internal_user?(user)
+ end
+
+ test "user with no nickname returns true" do
+ user = insert(:user, %{nickname: nil})
+ assert User.is_internal_user?(user)
+ end
+
+ test "user with internal-prefixed nickname returns true" do
+ user = insert(:user, %{nickname: "internal.test"})
+ assert User.is_internal_user?(user)
+ end
+ end
+
+ describe "update_and_set_cache/1" do
+ test "returns error when user is stale instead Ecto.StaleEntryError" do
+ user = insert(:user)
+
+ changeset = Ecto.Changeset.change(user, bio: "test")
+
+ Repo.delete(user)
+
+ assert {:error, %Ecto.Changeset{errors: [id: {"is stale", [stale: true]}], valid?: false}} =
+ User.update_and_set_cache(changeset)
+ end
+
+ test "performs update cache if user updated" do
+ user = insert(:user)
+ assert {:ok, nil} = Cachex.get(:user_cache, "ap_id:#{user.ap_id}")
+
+ changeset = Ecto.Changeset.change(user, bio: "test-bio")
+
+ assert {:ok, %User{bio: "test-bio"} = user} = User.update_and_set_cache(changeset)
+ assert {:ok, user} = Cachex.get(:user_cache, "ap_id:#{user.ap_id}")
+ assert %User{bio: "test-bio"} = User.get_cached_by_ap_id(user.ap_id)
+ end
+ end
+
+ describe "following/followers synchronization" do
+ clear_config([:instance, :external_user_synchronization])
+
+ test "updates the counters normally on following/getting a follow when disabled" do
+ Pleroma.Config.put([:instance, :external_user_synchronization], false)
+ user = insert(:user)
+
+ other_user =
+ insert(:user,
+ local: false,
+ follower_address: "http://localhost:4001/users/masto_closed/followers",
+ following_address: "http://localhost:4001/users/masto_closed/following",
+ info: %{ap_enabled: true}
+ )
+
+ assert User.user_info(other_user).following_count == 0
+ assert User.user_info(other_user).follower_count == 0
+
+ {:ok, user} = Pleroma.User.follow(user, other_user)
+ other_user = Pleroma.User.get_by_id(other_user.id)
+
+ assert User.user_info(user).following_count == 1
+ assert User.user_info(other_user).follower_count == 1
+ end
+
+ test "syncronizes the counters with the remote instance for the followed when enabled" do
+ Pleroma.Config.put([:instance, :external_user_synchronization], false)
+
+ user = insert(:user)
+
+ other_user =
+ insert(:user,
+ local: false,
+ follower_address: "http://localhost:4001/users/masto_closed/followers",
+ following_address: "http://localhost:4001/users/masto_closed/following",
+ info: %{ap_enabled: true}
+ )
+
+ assert User.user_info(other_user).following_count == 0
+ assert User.user_info(other_user).follower_count == 0
+
+ Pleroma.Config.put([:instance, :external_user_synchronization], true)
+ {:ok, _user} = User.follow(user, other_user)
+ other_user = User.get_by_id(other_user.id)
+
+ assert User.user_info(other_user).follower_count == 437
+ end
+
+ test "syncronizes the counters with the remote instance for the follower when enabled" do
+ Pleroma.Config.put([:instance, :external_user_synchronization], false)
+
+ user = insert(:user)
+
+ other_user =
+ insert(:user,
+ local: false,
+ follower_address: "http://localhost:4001/users/masto_closed/followers",
+ following_address: "http://localhost:4001/users/masto_closed/following",
+ info: %{ap_enabled: true}
+ )
+
+ assert User.user_info(other_user).following_count == 0
+ assert User.user_info(other_user).follower_count == 0
+
+ Pleroma.Config.put([:instance, :external_user_synchronization], true)
+ {:ok, other_user} = User.follow(other_user, user)
+
+ assert User.user_info(other_user).following_count == 152
+ end
+ end
end
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs
index 30adfda36..77f5e39fa 100644
--- a/test/web/activity_pub/activity_pub_controller_test.exs
+++ b/test/web/activity_pub/activity_pub_controller_test.exs
@@ -11,13 +11,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ObjectView
alias Pleroma.Web.ActivityPub.UserView
+ alias Pleroma.Web.ActivityPub.Utils
+ alias Pleroma.Web.CommonAPI
setup_all do
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
:ok
end
+ clear_config_all([:instance, :federating],
+ do: Pleroma.Config.put([:instance, :federating], true)
+ )
+
describe "/relay" do
+ clear_config([:instance, :allow_relay])
+
test "with the relay active, it returns the relay user", %{conn: conn} do
res =
conn
@@ -34,8 +42,17 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|> get(activity_pub_path(conn, :relay))
|> json_response(404)
|> assert
+ end
+ end
+
+ describe "/internal/fetch" do
+ test "it returns the internal fetch user", %{conn: conn} do
+ res =
+ conn
+ |> get(activity_pub_path(conn, :internal_fetch))
+ |> json_response(200)
- Pleroma.Config.put([:instance, :allow_relay], true)
+ assert res["id"] =~ "/fetch"
end
end
@@ -160,17 +177,65 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
end
describe "/object/:uuid/likes" do
- test "it returns the like activities in a collection", %{conn: conn} do
+ setup do
like = insert(:like_activity)
- uuid = String.split(like.data["object"], "/") |> List.last()
+ like_object_ap_id = Object.normalize(like).data["id"]
+
+ uuid =
+ like_object_ap_id
+ |> String.split("/")
+ |> List.last()
+ [id: like.data["id"], uuid: uuid]
+ end
+
+ test "it returns the like activities in a collection", %{conn: conn, id: id, uuid: uuid} do
result =
conn
|> put_req_header("accept", "application/activity+json")
|> get("/objects/#{uuid}/likes")
|> json_response(200)
- assert List.first(result["first"]["orderedItems"])["id"] == like.data["id"]
+ assert List.first(result["first"]["orderedItems"])["id"] == id
+ assert result["type"] == "OrderedCollection"
+ assert result["totalItems"] == 1
+ refute result["first"]["next"]
+ end
+
+ test "it does not crash when page number is exceeded total pages", %{conn: conn, uuid: uuid} do
+ result =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/objects/#{uuid}/likes?page=2")
+ |> json_response(200)
+
+ assert result["type"] == "OrderedCollectionPage"
+ assert result["totalItems"] == 1
+ refute result["next"]
+ assert Enum.empty?(result["orderedItems"])
+ end
+
+ test "it contains the next key when likes count is more than 10", %{conn: conn} do
+ note = insert(:note_activity)
+ insert_list(11, :like_activity, note_activity: note)
+
+ uuid =
+ note
+ |> Object.normalize()
+ |> Map.get(:data)
+ |> Map.get("id")
+ |> String.split("/")
+ |> List.last()
+
+ result =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/objects/#{uuid}/likes?page=1")
+ |> json_response(200)
+
+ assert result["totalItems"] == 11
+ assert length(result["orderedItems"]) == 10
+ assert result["next"]
end
end
@@ -234,13 +299,17 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
end
describe "/users/:nickname/inbox" do
- test "it inserts an incoming activity into the database", %{conn: conn} do
- user = insert(:user)
-
+ setup do
data =
File.read!("test/fixtures/mastodon-post-activity.json")
|> Poison.decode!()
- |> Map.put("bcc", [user.ap_id])
+
+ [data: data]
+ end
+
+ test "it inserts an incoming activity into the database", %{conn: conn, data: data} do
+ user = insert(:user)
+ data = Map.put(data, "bcc", [user.ap_id])
conn =
conn
@@ -253,16 +322,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
assert Activity.get_by_ap_id(data["id"])
end
- test "it accepts messages from actors that are followed by the user", %{conn: conn} do
+ test "it accepts messages from actors that are followed by the user", %{
+ conn: conn,
+ data: data
+ } do
recipient = insert(:user)
actor = insert(:user, %{ap_id: "http://mastodon.example.org/users/actor"})
{:ok, recipient} = User.follow(recipient, actor)
- data =
- File.read!("test/fixtures/mastodon-post-activity.json")
- |> Poison.decode!()
-
object =
data["object"]
|> Map.put("attributedTo", actor.ap_id)
@@ -298,6 +366,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
test "it returns a note activity in a collection", %{conn: conn} do
note_activity = insert(:direct_note_activity)
+ note_object = Object.normalize(note_activity)
user = User.get_cached_by_ap_id(hd(note_activity.data["to"]))
conn =
@@ -306,16 +375,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|> put_req_header("accept", "application/activity+json")
|> get("/users/#{user.nickname}/inbox")
- assert response(conn, 200) =~ note_activity.data["object"]["content"]
+ assert response(conn, 200) =~ note_object.data["content"]
end
- test "it clears `unreachable` federation status of the sender", %{conn: conn} do
+ test "it clears `unreachable` federation status of the sender", %{conn: conn, data: data} do
user = insert(:user)
-
- data =
- File.read!("test/fixtures/mastodon-post-activity.json")
- |> Poison.decode!()
- |> Map.put("bcc", [user.ap_id])
+ data = Map.put(data, "bcc", [user.ap_id])
sender_host = URI.parse(data["actor"]).host
Instances.set_consistently_unreachable(sender_host)
@@ -330,6 +395,47 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
assert "ok" == json_response(conn, 200)
assert Instances.reachable?(sender_host)
end
+
+ test "it removes all follower collections but actor's", %{conn: conn} do
+ [actor, recipient] = insert_pair(:user)
+
+ data =
+ File.read!("test/fixtures/activitypub-client-post-activity.json")
+ |> Poison.decode!()
+
+ object = Map.put(data["object"], "attributedTo", actor.ap_id)
+
+ data =
+ data
+ |> Map.put("id", Utils.generate_object_id())
+ |> Map.put("actor", actor.ap_id)
+ |> Map.put("object", object)
+ |> Map.put("cc", [
+ recipient.follower_address,
+ actor.follower_address
+ ])
+ |> Map.put("to", [
+ recipient.ap_id,
+ recipient.follower_address,
+ "https://www.w3.org/ns/activitystreams#Public"
+ ])
+
+ conn
+ |> assign(:valid_signature, true)
+ |> put_req_header("content-type", "application/activity+json")
+ |> post("/users/#{recipient.nickname}/inbox", data)
+ |> json_response(200)
+
+ activity = Activity.get_by_ap_id(data["id"])
+
+ assert activity.id
+ assert actor.follower_address in activity.recipients
+ assert actor.follower_address in activity.data["cc"]
+
+ refute recipient.follower_address in activity.recipients
+ refute recipient.follower_address in activity.data["cc"]
+ refute recipient.follower_address in activity.data["to"]
+ end
end
describe "/users/:nickname/outbox" do
@@ -347,6 +453,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
test "it returns a note activity in a collection", %{conn: conn} do
note_activity = insert(:note_activity)
+ note_object = Object.normalize(note_activity)
user = User.get_cached_by_ap_id(note_activity.data["actor"])
conn =
@@ -354,7 +461,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|> put_req_header("accept", "application/activity+json")
|> get("/users/#{user.nickname}/outbox")
- assert response(conn, 200) =~ note_activity.data["object"]["content"]
+ assert response(conn, 200) =~ note_object.data["content"]
end
test "it returns an announce activity in a collection", %{conn: conn} do
@@ -416,12 +523,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
test "it erects a tombstone when receiving a delete activity", %{conn: conn} do
note_activity = insert(:note_activity)
+ note_object = Object.normalize(note_activity)
user = User.get_cached_by_ap_id(note_activity.data["actor"])
data = %{
type: "Delete",
object: %{
- id: note_activity.data["object"]["id"]
+ id: note_object.data["id"]
}
}
@@ -434,19 +542,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
result = json_response(conn, 201)
assert Activity.get_by_ap_id(result["id"])
- object = Object.get_by_ap_id(note_activity.data["object"]["id"])
- assert object
+ assert object = Object.get_by_ap_id(note_object.data["id"])
assert object.data["type"] == "Tombstone"
end
test "it rejects delete activity of object from other actor", %{conn: conn} do
note_activity = insert(:note_activity)
+ note_object = Object.normalize(note_activity)
user = insert(:user)
data = %{
type: "Delete",
object: %{
- id: note_activity.data["object"]["id"]
+ id: note_object.data["id"]
}
}
@@ -461,12 +569,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
test "it increases like count when receiving a like action", %{conn: conn} do
note_activity = insert(:note_activity)
+ note_object = Object.normalize(note_activity)
user = User.get_cached_by_ap_id(note_activity.data["actor"])
data = %{
type: "Like",
object: %{
- id: note_activity.data["object"]["id"]
+ id: note_object.data["id"]
}
}
@@ -479,8 +588,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
result = json_response(conn, 201)
assert Activity.get_by_ap_id(result["id"])
- object = Object.get_by_ap_id(note_activity.data["object"]["id"])
- assert object
+ assert object = Object.get_by_ap_id(note_object.data["id"])
assert object.data["like_count"] == 1
end
end
@@ -499,7 +607,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
assert result["first"]["orderedItems"] == [user.ap_id]
end
- test "it returns returns empty if the user has 'hide_followers' set", %{conn: conn} do
+ test "it returns returns a uri if the user has 'hide_followers' set", %{conn: conn} do
user = insert(:user)
user_two = insert(:user, %{info: %{hide_followers: true}})
User.follow(user, user_two)
@@ -509,8 +617,35 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|> get("/users/#{user_two.nickname}/followers")
|> json_response(200)
- assert result["first"]["orderedItems"] == []
- assert result["totalItems"] == 0
+ assert is_binary(result["first"])
+ end
+
+ test "it returns a 403 error on pages, if the user has 'hide_followers' set and the request is not authenticated",
+ %{conn: conn} do
+ user = insert(:user, %{info: %{hide_followers: true}})
+
+ result =
+ conn
+ |> get("/users/#{user.nickname}/followers?page=1")
+
+ assert result.status == 403
+ assert result.resp_body == ""
+ end
+
+ test "it renders the page, if the user has 'hide_followers' set and the request is authenticated with the same user",
+ %{conn: conn} do
+ user = insert(:user, %{info: %{hide_followers: true}})
+ other_user = insert(:user)
+ {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user)
+
+ result =
+ conn
+ |> assign(:user, user)
+ |> get("/users/#{user.nickname}/followers?page=1")
+ |> json_response(200)
+
+ assert result["totalItems"] == 1
+ assert result["orderedItems"] == [other_user.ap_id]
end
test "it works for more than 10 users", %{conn: conn} do
@@ -554,7 +689,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
assert result["first"]["orderedItems"] == [user_two.ap_id]
end
- test "it returns returns empty if the user has 'hide_follows' set", %{conn: conn} do
+ test "it returns a uri if the user has 'hide_follows' set", %{conn: conn} do
user = insert(:user, %{info: %{hide_follows: true}})
user_two = insert(:user)
User.follow(user, user_two)
@@ -564,8 +699,35 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
|> get("/users/#{user.nickname}/following")
|> json_response(200)
- assert result["first"]["orderedItems"] == []
- assert result["totalItems"] == 0
+ assert is_binary(result["first"])
+ end
+
+ test "it returns a 403 error on pages, if the user has 'hide_follows' set and the request is not authenticated",
+ %{conn: conn} do
+ user = insert(:user, %{info: %{hide_follows: true}})
+
+ result =
+ conn
+ |> get("/users/#{user.nickname}/following?page=1")
+
+ assert result.status == 403
+ assert result.resp_body == ""
+ end
+
+ test "it renders the page, if the user has 'hide_follows' set and the request is authenticated with the same user",
+ %{conn: conn} do
+ user = insert(:user, %{info: %{hide_follows: true}})
+ other_user = insert(:user)
+ {:ok, user, _other_user, _activity} = CommonAPI.follow(user, other_user)
+
+ result =
+ conn
+ |> assign(:user, user)
+ |> get("/users/#{user.nickname}/following?page=1")
+ |> json_response(200)
+
+ assert result["totalItems"] == 1
+ assert result["orderedItems"] == [other_user.ap_id]
end
test "it works for more than 10 users", %{conn: conn} do
diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs
index 76586ee4a..1515f4eb6 100644
--- a/test/web/activity_pub/activity_pub_test.exs
+++ b/test/web/activity_pub/activity_pub_test.exs
@@ -6,11 +6,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
use Pleroma.DataCase
alias Pleroma.Activity
alias Pleroma.Builders.ActivityBuilder
- alias Pleroma.Instances
alias Pleroma.Object
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
- alias Pleroma.Web.ActivityPub.Publisher
alias Pleroma.Web.ActivityPub.Utils
alias Pleroma.Web.CommonAPI
@@ -254,10 +252,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
}
{:ok, %Activity{} = activity} = ActivityPub.insert(data)
- object = Object.normalize(activity.data["object"])
-
+ assert object = Object.normalize(activity)
assert is_binary(object.data["id"])
- assert %Object{} = Object.get_by_ap_id(activity.data["object"])
end
end
@@ -542,6 +538,29 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
assert Enum.member?(activities, activity_one)
end
+ test "doesn't return thread muted activities" do
+ user = insert(:user)
+ _activity_one = insert(:note_activity)
+ note_two = insert(:note, data: %{"context" => "suya.."})
+ activity_two = insert(:note_activity, note: note_two)
+
+ {:ok, _activity_two} = CommonAPI.add_mute(user, activity_two)
+
+ assert [_activity_one] = ActivityPub.fetch_activities([], %{"muting_user" => user})
+ end
+
+ test "returns thread muted activities when with_muted is set" do
+ user = insert(:user)
+ _activity_one = insert(:note_activity)
+ note_two = insert(:note, data: %{"context" => "suya.."})
+ activity_two = insert(:note_activity, note: note_two)
+
+ {:ok, _activity_two} = CommonAPI.add_mute(user, activity_two)
+
+ assert [_activity_two, _activity_one] =
+ ActivityPub.fetch_activities([], %{"muting_user" => user, "with_muted" => true})
+ end
+
test "does include announces on request" do
activity_three = insert(:note_activity)
user = insert(:user)
@@ -659,7 +678,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
describe "like an object" do
test "adds a like activity to the db" do
note_activity = insert(:note_activity)
- object = Object.get_by_ap_id(note_activity.data["object"]["id"])
+ assert object = Object.normalize(note_activity)
+
user = insert(:user)
user_two = insert(:user)
@@ -678,9 +698,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
assert like_activity == same_like_activity
assert object.data["likes"] == [user.ap_id]
-
- [note_activity] = Activity.get_all_create_by_object_ap_id(object.data["id"])
- assert note_activity.data["object"]["like_count"] == 1
+ assert object.data["like_count"] == 1
{:ok, _like_activity, object} = ActivityPub.like(user_two, object)
assert object.data["like_count"] == 2
@@ -690,7 +708,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
describe "unliking" do
test "unliking a previously liked object" do
note_activity = insert(:note_activity)
- object = Object.get_by_ap_id(note_activity.data["object"]["id"])
+ object = Object.normalize(note_activity)
user = insert(:user)
# Unliking something that hasn't been liked does nothing
@@ -710,7 +728,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
describe "announcing an object" do
test "adds an announce activity to the db" do
note_activity = insert(:note_activity)
- object = Object.get_by_ap_id(note_activity.data["object"]["id"])
+ object = Object.normalize(note_activity)
user = insert(:user)
{:ok, announce_activity, object} = ActivityPub.announce(user, object)
@@ -731,7 +749,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
describe "unannouncing an object" do
test "unannouncing a previously announced object" do
note_activity = insert(:note_activity)
- object = Object.get_by_ap_id(note_activity.data["object"]["id"])
+ object = Object.normalize(note_activity)
user = insert(:user)
# Unannouncing an object that is not announced does nothing
@@ -810,10 +828,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
assert activity.data["type"] == "Undo"
assert activity.data["actor"] == follower.ap_id
- assert is_map(activity.data["object"])
- assert activity.data["object"]["type"] == "Follow"
- assert activity.data["object"]["object"] == followed.ap_id
- assert activity.data["object"]["id"] == follow_activity.data["id"]
+ embedded_object = activity.data["object"]
+ assert is_map(embedded_object)
+ assert embedded_object["type"] == "Follow"
+ assert embedded_object["object"] == followed.ap_id
+ assert embedded_object["id"] == follow_activity.data["id"]
end
end
@@ -839,22 +858,23 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
assert activity.data["type"] == "Undo"
assert activity.data["actor"] == blocker.ap_id
- assert is_map(activity.data["object"])
- assert activity.data["object"]["type"] == "Block"
- assert activity.data["object"]["object"] == blocked.ap_id
- assert activity.data["object"]["id"] == block_activity.data["id"]
+ embedded_object = activity.data["object"]
+ assert is_map(embedded_object)
+ assert embedded_object["type"] == "Block"
+ assert embedded_object["object"] == blocked.ap_id
+ assert embedded_object["id"] == block_activity.data["id"]
end
end
describe "deletion" do
test "it creates a delete activity and deletes the original object" do
note = insert(:note_activity)
- object = Object.get_by_ap_id(note.data["object"]["id"])
+ object = Object.normalize(note)
{:ok, delete} = ActivityPub.delete(object)
assert delete.data["type"] == "Delete"
assert delete.data["actor"] == note.data["actor"]
- assert delete.data["object"] == note.data["object"]["id"]
+ assert delete.data["object"] == object.data["id"]
assert Activity.get_by_id(delete.id) != nil
@@ -900,13 +920,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
test "it creates a delete activity and checks that it is also sent to users mentioned by the deleted object" do
user = insert(:user)
note = insert(:note_activity)
+ object = Object.normalize(note)
{:ok, object} =
- Object.get_by_ap_id(note.data["object"]["id"])
+ object
|> Object.change(%{
data: %{
- "actor" => note.data["object"]["actor"],
- "id" => note.data["object"]["id"],
+ "actor" => object.data["actor"],
+ "id" => object.data["id"],
"to" => [user.ap_id],
"type" => "Note"
}
@@ -1018,8 +1039,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
assert update.data["actor"] == user.ap_id
assert update.data["to"] == [user.follower_address]
- assert update.data["object"]["id"] == user_data["id"]
- assert update.data["object"]["type"] == user_data["type"]
+ assert embedded_object = update.data["object"]
+ assert embedded_object["id"] == user_data["id"]
+ assert embedded_object["type"] == user_data["type"]
end
end
@@ -1076,111 +1098,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
} = activity
end
- describe "publish_one/1" do
- test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is not specified",
- Instances,
- [:passthrough],
- [] do
- actor = insert(:user)
- inbox = "http://200.site/users/nick1/inbox"
-
- assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
-
- assert called(Instances.set_reachable(inbox))
- end
-
- test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is set",
- Instances,
- [:passthrough],
- [] do
- actor = insert(:user)
- inbox = "http://200.site/users/nick1/inbox"
-
- assert {:ok, _} =
- Publisher.publish_one(%{
- inbox: inbox,
- json: "{}",
- actor: actor,
- id: 1,
- unreachable_since: NaiveDateTime.utc_now()
- })
-
- assert called(Instances.set_reachable(inbox))
- end
-
- test_with_mock "does NOT call `Instances.set_reachable` on successful federation if `unreachable_since` is nil",
- Instances,
- [:passthrough],
- [] do
- actor = insert(:user)
- inbox = "http://200.site/users/nick1/inbox"
-
- assert {:ok, _} =
- Publisher.publish_one(%{
- inbox: inbox,
- json: "{}",
- actor: actor,
- id: 1,
- unreachable_since: nil
- })
-
- refute called(Instances.set_reachable(inbox))
- end
-
- test_with_mock "calls `Instances.set_unreachable` on target inbox on non-2xx HTTP response code",
- Instances,
- [:passthrough],
- [] do
- actor = insert(:user)
- inbox = "http://404.site/users/nick1/inbox"
-
- assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
-
- assert called(Instances.set_unreachable(inbox))
- end
-
- test_with_mock "it calls `Instances.set_unreachable` on target inbox on request error of any kind",
- Instances,
- [:passthrough],
- [] do
- actor = insert(:user)
- inbox = "http://connrefused.site/users/nick1/inbox"
-
- assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
-
- assert called(Instances.set_unreachable(inbox))
- end
-
- test_with_mock "does NOT call `Instances.set_unreachable` if target is reachable",
- Instances,
- [:passthrough],
- [] do
- actor = insert(:user)
- inbox = "http://200.site/users/nick1/inbox"
+ test "fetch_activities/2 returns activities addressed to a list " do
+ user = insert(:user)
+ member = insert(:user)
+ {:ok, list} = Pleroma.List.create("foo", user)
+ {:ok, list} = Pleroma.List.follow(list, member)
- assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
+ {:ok, activity} =
+ CommonAPI.post(user, %{"status" => "foobar", "visibility" => "list:#{list.id}"})
- refute called(Instances.set_unreachable(inbox))
- end
+ activity = Repo.preload(activity, :bookmark)
+ activity = %Activity{activity | thread_muted?: !!activity.thread_muted?}
- test_with_mock "does NOT call `Instances.set_unreachable` if target instance has non-nil `unreachable_since`",
- Instances,
- [:passthrough],
- [] do
- actor = insert(:user)
- inbox = "http://connrefused.site/users/nick1/inbox"
-
- assert {:error, _} =
- Publisher.publish_one(%{
- inbox: inbox,
- json: "{}",
- actor: actor,
- id: 1,
- unreachable_since: NaiveDateTime.utc_now()
- })
-
- refute called(Instances.set_unreachable(inbox))
- end
+ assert ActivityPub.fetch_activities([], %{"user" => user}) == [activity]
end
def data_uri do
@@ -1215,4 +1145,65 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
assert result.id == activity.id
end
end
+
+ describe "fetch_follow_information_for_user" do
+ test "syncronizes following/followers counters" do
+ user =
+ insert(:user,
+ local: false,
+ follower_address: "http://localhost:4001/users/fuser2/followers",
+ following_address: "http://localhost:4001/users/fuser2/following"
+ )
+
+ {:ok, info} = ActivityPub.fetch_follow_information_for_user(user)
+ assert info.follower_count == 527
+ assert info.following_count == 267
+ end
+
+ test "detects hidden followers" do
+ mock(fn env ->
+ case env.url do
+ "http://localhost:4001/users/masto_closed/followers?page=1" ->
+ %Tesla.Env{status: 403, body: ""}
+
+ _ ->
+ apply(HttpRequestMock, :request, [env])
+ end
+ end)
+
+ user =
+ insert(:user,
+ local: false,
+ follower_address: "http://localhost:4001/users/masto_closed/followers",
+ following_address: "http://localhost:4001/users/masto_closed/following"
+ )
+
+ {:ok, info} = ActivityPub.fetch_follow_information_for_user(user)
+ assert info.hide_followers == true
+ assert info.hide_follows == false
+ end
+
+ test "detects hidden follows" do
+ mock(fn env ->
+ case env.url do
+ "http://localhost:4001/users/masto_closed/following?page=1" ->
+ %Tesla.Env{status: 403, body: ""}
+
+ _ ->
+ apply(HttpRequestMock, :request, [env])
+ end
+ end)
+
+ user =
+ insert(:user,
+ local: false,
+ follower_address: "http://localhost:4001/users/masto_closed/followers",
+ following_address: "http://localhost:4001/users/masto_closed/following"
+ )
+
+ {:ok, info} = ActivityPub.fetch_follow_information_for_user(user)
+ assert info.hide_followers == false
+ assert info.hide_follows == true
+ end
+ end
end
diff --git a/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs b/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs
new file mode 100644
index 000000000..03dc299ec
--- /dev/null
+++ b/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs
@@ -0,0 +1,145 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do
+ use Pleroma.DataCase
+ import Pleroma.Factory
+ import ExUnit.CaptureLog
+
+ alias Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy
+
+ @linkless_message %{
+ "type" => "Create",
+ "object" => %{
+ "content" => "hi world!"
+ }
+ }
+
+ @linkful_message %{
+ "type" => "Create",
+ "object" => %{
+ "content" => "<a href='https://example.com'>hi world!</a>"
+ }
+ }
+
+ @response_message %{
+ "type" => "Create",
+ "object" => %{
+ "name" => "yes",
+ "type" => "Answer"
+ }
+ }
+
+ describe "with new user" do
+ test "it allows posts without links" do
+ user = insert(:user)
+
+ assert user.info.note_count == 0
+
+ message =
+ @linkless_message
+ |> Map.put("actor", user.ap_id)
+
+ {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+ end
+
+ test "it disallows posts with links" do
+ user = insert(:user)
+
+ assert user.info.note_count == 0
+
+ message =
+ @linkful_message
+ |> Map.put("actor", user.ap_id)
+
+ {:reject, _} = AntiLinkSpamPolicy.filter(message)
+ end
+ end
+
+ describe "with old user" do
+ test "it allows posts without links" do
+ user = insert(:user, info: %{note_count: 1})
+
+ assert user.info.note_count == 1
+
+ message =
+ @linkless_message
+ |> Map.put("actor", user.ap_id)
+
+ {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+ end
+
+ test "it allows posts with links" do
+ user = insert(:user, info: %{note_count: 1})
+
+ assert user.info.note_count == 1
+
+ message =
+ @linkful_message
+ |> Map.put("actor", user.ap_id)
+
+ {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+ end
+ end
+
+ describe "with followed new user" do
+ test "it allows posts without links" do
+ user = insert(:user, info: %{follower_count: 1})
+
+ assert user.info.follower_count == 1
+
+ message =
+ @linkless_message
+ |> Map.put("actor", user.ap_id)
+
+ {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+ end
+
+ test "it allows posts with links" do
+ user = insert(:user, info: %{follower_count: 1})
+
+ assert user.info.follower_count == 1
+
+ message =
+ @linkful_message
+ |> Map.put("actor", user.ap_id)
+
+ {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+ end
+ end
+
+ describe "with unknown actors" do
+ test "it rejects posts without links" do
+ message =
+ @linkless_message
+ |> Map.put("actor", "http://invalid.actor")
+
+ assert capture_log(fn ->
+ {:reject, _} = AntiLinkSpamPolicy.filter(message)
+ end) =~ "[error] Could not decode user at fetch http://invalid.actor"
+ end
+
+ test "it rejects posts with links" do
+ message =
+ @linkful_message
+ |> Map.put("actor", "http://invalid.actor")
+
+ assert capture_log(fn ->
+ {:reject, _} = AntiLinkSpamPolicy.filter(message)
+ end) =~ "[error] Could not decode user at fetch http://invalid.actor"
+ end
+ end
+
+ describe "with contentless-objects" do
+ test "it does not reject them or error out" do
+ user = insert(:user, info: %{note_count: 1})
+
+ message =
+ @response_message
+ |> Map.put("actor", user.ap_id)
+
+ {:ok, _message} = AntiLinkSpamPolicy.filter(message)
+ end
+ end
+end
diff --git a/test/web/activity_pub/mrf/ensure_re_prepended_test.exs b/test/web/activity_pub/mrf/ensure_re_prepended_test.exs
new file mode 100644
index 000000000..dbc8b9e80
--- /dev/null
+++ b/test/web/activity_pub/mrf/ensure_re_prepended_test.exs
@@ -0,0 +1,82 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.EnsureRePrependedTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Activity
+ alias Pleroma.Object
+ alias Pleroma.Web.ActivityPub.MRF.EnsureRePrepended
+
+ describe "rewrites summary" do
+ test "it adds `re:` to summary object when child summary and parent summary equal" do
+ message = %{
+ "type" => "Create",
+ "object" => %{
+ "summary" => "object-summary",
+ "inReplyTo" => %Activity{object: %Object{data: %{"summary" => "object-summary"}}}
+ }
+ }
+
+ assert {:ok, res} = EnsureRePrepended.filter(message)
+ assert res["object"]["summary"] == "re: object-summary"
+ end
+
+ test "it adds `re:` to summary object when child summary containts re-subject of parent summary " do
+ message = %{
+ "type" => "Create",
+ "object" => %{
+ "summary" => "object-summary",
+ "inReplyTo" => %Activity{object: %Object{data: %{"summary" => "re: object-summary"}}}
+ }
+ }
+
+ assert {:ok, res} = EnsureRePrepended.filter(message)
+ assert res["object"]["summary"] == "re: object-summary"
+ end
+ end
+
+ describe "skip filter" do
+ test "it skip if type isn't 'Create'" do
+ message = %{
+ "type" => "Annotation",
+ "object" => %{"summary" => "object-summary"}
+ }
+
+ assert {:ok, res} = EnsureRePrepended.filter(message)
+ assert res == message
+ end
+
+ test "it skip if summary is empty" do
+ message = %{
+ "type" => "Create",
+ "object" => %{
+ "inReplyTo" => %Activity{object: %Object{data: %{"summary" => "summary"}}}
+ }
+ }
+
+ assert {:ok, res} = EnsureRePrepended.filter(message)
+ assert res == message
+ end
+
+ test "it skip if inReplyTo is empty" do
+ message = %{"type" => "Create", "object" => %{"summary" => "summary"}}
+ assert {:ok, res} = EnsureRePrepended.filter(message)
+ assert res == message
+ end
+
+ test "it skip if parent and child summary isn't equal" do
+ message = %{
+ "type" => "Create",
+ "object" => %{
+ "summary" => "object-summary",
+ "inReplyTo" => %Activity{object: %Object{data: %{"summary" => "summary"}}}
+ }
+ }
+
+ assert {:ok, res} = EnsureRePrepended.filter(message)
+ assert res == message
+ end
+ end
+end
diff --git a/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs b/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs
new file mode 100644
index 000000000..372e789be
--- /dev/null
+++ b/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs
@@ -0,0 +1,45 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicyTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.HTTP
+ alias Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy
+
+ import Mock
+
+ @message %{
+ "type" => "Create",
+ "object" => %{
+ "type" => "Note",
+ "content" => "content",
+ "attachment" => [
+ %{"url" => [%{"href" => "http://example.com/image.jpg"}]}
+ ]
+ }
+ }
+
+ test "it prefetches media proxy URIs" do
+ with_mock HTTP, get: fn _, _, _ -> {:ok, []} end do
+ MediaProxyWarmingPolicy.filter(@message)
+ assert called(HTTP.get(:_, :_, :_))
+ end
+ end
+
+ test "it does nothing when no attachments are present" do
+ object =
+ @message["object"]
+ |> Map.delete("attachment")
+
+ message =
+ @message
+ |> Map.put("object", object)
+
+ with_mock HTTP, get: fn _, _, _ -> {:ok, []} end do
+ MediaProxyWarmingPolicy.filter(message)
+ refute called(HTTP.get(:_, :_, :_))
+ end
+ end
+end
diff --git a/test/web/activity_pub/mrf/mention_policy_test.exs b/test/web/activity_pub/mrf/mention_policy_test.exs
new file mode 100644
index 000000000..9fd9c31df
--- /dev/null
+++ b/test/web/activity_pub/mrf/mention_policy_test.exs
@@ -0,0 +1,92 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Web.ActivityPub.MRF.MentionPolicy
+
+ test "pass filter if allow list is empty" do
+ Pleroma.Config.delete([:mrf_mention])
+
+ message = %{
+ "type" => "Create",
+ "to" => ["https://example.com/ok"],
+ "cc" => ["https://example.com/blocked"]
+ }
+
+ assert MentionPolicy.filter(message) == {:ok, message}
+ end
+
+ describe "allow" do
+ test "empty" do
+ Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
+
+ message = %{
+ "type" => "Create"
+ }
+
+ assert MentionPolicy.filter(message) == {:ok, message}
+ end
+
+ test "to" do
+ Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
+
+ message = %{
+ "type" => "Create",
+ "to" => ["https://example.com/ok"]
+ }
+
+ assert MentionPolicy.filter(message) == {:ok, message}
+ end
+
+ test "cc" do
+ Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
+
+ message = %{
+ "type" => "Create",
+ "cc" => ["https://example.com/ok"]
+ }
+
+ assert MentionPolicy.filter(message) == {:ok, message}
+ end
+
+ test "both" do
+ Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
+
+ message = %{
+ "type" => "Create",
+ "to" => ["https://example.com/ok"],
+ "cc" => ["https://example.com/ok2"]
+ }
+
+ assert MentionPolicy.filter(message) == {:ok, message}
+ end
+ end
+
+ describe "deny" do
+ test "to" do
+ Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
+
+ message = %{
+ "type" => "Create",
+ "to" => ["https://example.com/blocked"]
+ }
+
+ assert MentionPolicy.filter(message) == {:reject, nil}
+ end
+
+ test "cc" do
+ Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
+
+ message = %{
+ "type" => "Create",
+ "to" => ["https://example.com/ok"],
+ "cc" => ["https://example.com/blocked"]
+ }
+
+ assert MentionPolicy.filter(message) == {:reject, nil}
+ end
+ end
+end
diff --git a/test/web/activity_pub/mrf/mrf_test.exs b/test/web/activity_pub/mrf/mrf_test.exs
new file mode 100644
index 000000000..04709df17
--- /dev/null
+++ b/test/web/activity_pub/mrf/mrf_test.exs
@@ -0,0 +1,86 @@
+defmodule Pleroma.Web.ActivityPub.MRFTest do
+ use ExUnit.Case, async: true
+ use Pleroma.Tests.Helpers
+ alias Pleroma.Web.ActivityPub.MRF
+
+ test "subdomains_regex/1" do
+ assert MRF.subdomains_regex(["unsafe.tld", "*.unsafe.tld"]) == [
+ ~r/^unsafe.tld$/i,
+ ~r/^(.*\.)*unsafe.tld$/i
+ ]
+ end
+
+ describe "subdomain_match/2" do
+ test "common domains" do
+ regexes = MRF.subdomains_regex(["unsafe.tld", "unsafe2.tld"])
+
+ assert regexes == [~r/^unsafe.tld$/i, ~r/^unsafe2.tld$/i]
+
+ assert MRF.subdomain_match?(regexes, "unsafe.tld")
+ assert MRF.subdomain_match?(regexes, "unsafe2.tld")
+
+ refute MRF.subdomain_match?(regexes, "example.com")
+ end
+
+ test "wildcard domains with one subdomain" do
+ regexes = MRF.subdomains_regex(["*.unsafe.tld"])
+
+ assert regexes == [~r/^(.*\.)*unsafe.tld$/i]
+
+ assert MRF.subdomain_match?(regexes, "unsafe.tld")
+ assert MRF.subdomain_match?(regexes, "sub.unsafe.tld")
+ refute MRF.subdomain_match?(regexes, "anotherunsafe.tld")
+ refute MRF.subdomain_match?(regexes, "unsafe.tldanother")
+ end
+
+ test "wildcard domains with two subdomains" do
+ regexes = MRF.subdomains_regex(["*.unsafe.tld"])
+
+ assert regexes == [~r/^(.*\.)*unsafe.tld$/i]
+
+ assert MRF.subdomain_match?(regexes, "unsafe.tld")
+ assert MRF.subdomain_match?(regexes, "sub.sub.unsafe.tld")
+ refute MRF.subdomain_match?(regexes, "sub.anotherunsafe.tld")
+ refute MRF.subdomain_match?(regexes, "sub.unsafe.tldanother")
+ end
+
+ test "matches are case-insensitive" do
+ regexes = MRF.subdomains_regex(["UnSafe.TLD", "UnSAFE2.Tld"])
+
+ assert regexes == [~r/^UnSafe.TLD$/i, ~r/^UnSAFE2.Tld$/i]
+
+ assert MRF.subdomain_match?(regexes, "UNSAFE.TLD")
+ assert MRF.subdomain_match?(regexes, "UNSAFE2.TLD")
+ assert MRF.subdomain_match?(regexes, "unsafe.tld")
+ assert MRF.subdomain_match?(regexes, "unsafe2.tld")
+
+ refute MRF.subdomain_match?(regexes, "EXAMPLE.COM")
+ refute MRF.subdomain_match?(regexes, "example.com")
+ end
+ end
+
+ describe "describe/0" do
+ clear_config([:instance, :rewrite_policy])
+
+ test "it works as expected with noop policy" do
+ expected = %{
+ mrf_policies: ["NoOpPolicy"],
+ exclusions: false
+ }
+
+ {:ok, ^expected} = MRF.describe()
+ end
+
+ test "it works as expected with mock policy" do
+ Pleroma.Config.put([:instance, :rewrite_policy], [MRFModuleMock])
+
+ expected = %{
+ mrf_policies: ["MRFModuleMock"],
+ mrf_module_mock: "some config data",
+ exclusions: false
+ }
+
+ {:ok, ^expected} = MRF.describe()
+ end
+ end
+end
diff --git a/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs b/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs
new file mode 100644
index 000000000..63ed71129
--- /dev/null
+++ b/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs
@@ -0,0 +1,37 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.NoPlaceholderTextPolicyTest do
+ use Pleroma.DataCase
+ alias Pleroma.Web.ActivityPub.MRF.NoPlaceholderTextPolicy
+
+ test "it clears content object" do
+ message = %{
+ "type" => "Create",
+ "object" => %{"content" => ".", "attachment" => "image"}
+ }
+
+ assert {:ok, res} = NoPlaceholderTextPolicy.filter(message)
+ assert res["object"]["content"] == ""
+
+ message = put_in(message, ["object", "content"], "<p>.</p>")
+ assert {:ok, res} = NoPlaceholderTextPolicy.filter(message)
+ assert res["object"]["content"] == ""
+ end
+
+ @messages [
+ %{
+ "type" => "Create",
+ "object" => %{"content" => "test", "attachment" => "image"}
+ },
+ %{"type" => "Create", "object" => %{"content" => "."}},
+ %{"type" => "Create", "object" => %{"content" => "<p>.</p>"}}
+ ]
+ test "it skips filter" do
+ Enum.each(@messages, fn message ->
+ assert {:ok, res} = NoPlaceholderTextPolicy.filter(message)
+ assert res == message
+ end)
+ end
+end
diff --git a/test/web/activity_pub/mrf/normalize_markup_test.exs b/test/web/activity_pub/mrf/normalize_markup_test.exs
new file mode 100644
index 000000000..3916a1f35
--- /dev/null
+++ b/test/web/activity_pub/mrf/normalize_markup_test.exs
@@ -0,0 +1,42 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.NormalizeMarkupTest do
+ use Pleroma.DataCase
+ alias Pleroma.Web.ActivityPub.MRF.NormalizeMarkup
+
+ @html_sample """
+ <b>this is in bold</b>
+ <p>this is a paragraph</p>
+ this is a linebreak<br />
+ this is a link with allowed "rel" attribute: <a href="http://example.com/" rel="tag">example.com</a>
+ this is a link with not allowed "rel" attribute: <a href="http://example.com/" rel="tag noallowed">example.com</a>
+ this is an image: <img src="http://example.com/image.jpg"><br />
+ <script>alert('hacked')</script>
+ """
+
+ test "it filter html tags" do
+ expected = """
+ <b>this is in bold</b>
+ <p>this is a paragraph</p>
+ this is a linebreak<br />
+ this is a link with allowed "rel" attribute: <a href="http://example.com/" rel="tag">example.com</a>
+ this is a link with not allowed "rel" attribute: <a href="http://example.com/">example.com</a>
+ this is an image: <img src="http://example.com/image.jpg" /><br />
+ alert('hacked')
+ """
+
+ message = %{"type" => "Create", "object" => %{"content" => @html_sample}}
+
+ assert {:ok, res} = NormalizeMarkup.filter(message)
+ assert res["object"]["content"] == expected
+ end
+
+ test "it skips filter if type isn't `Create`" do
+ message = %{"type" => "Note", "object" => %{}}
+
+ assert {:ok, res} = NormalizeMarkup.filter(message)
+ assert res == message
+ end
+end
diff --git a/test/web/activity_pub/mrf/reject_non_public_test.exs b/test/web/activity_pub/mrf/reject_non_public_test.exs
new file mode 100644
index 000000000..fc1d190bb
--- /dev/null
+++ b/test/web/activity_pub/mrf/reject_non_public_test.exs
@@ -0,0 +1,100 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublicTest do
+ use Pleroma.DataCase
+ import Pleroma.Factory
+
+ alias Pleroma.Web.ActivityPub.MRF.RejectNonPublic
+
+ clear_config([:mrf_rejectnonpublic])
+
+ describe "public message" do
+ test "it's allowed when address is public" do
+ actor = insert(:user, follower_address: "test-address")
+
+ message = %{
+ "actor" => actor.ap_id,
+ "to" => ["https://www.w3.org/ns/activitystreams#Public"],
+ "cc" => ["https://www.w3.org/ns/activitystreams#Publid"],
+ "type" => "Create"
+ }
+
+ assert {:ok, message} = RejectNonPublic.filter(message)
+ end
+
+ test "it's allowed when cc address contain public address" do
+ actor = insert(:user, follower_address: "test-address")
+
+ message = %{
+ "actor" => actor.ap_id,
+ "to" => ["https://www.w3.org/ns/activitystreams#Public"],
+ "cc" => ["https://www.w3.org/ns/activitystreams#Publid"],
+ "type" => "Create"
+ }
+
+ assert {:ok, message} = RejectNonPublic.filter(message)
+ end
+ end
+
+ describe "followers message" do
+ test "it's allowed when addrer of message in the follower addresses of user and it enabled in config" do
+ actor = insert(:user, follower_address: "test-address")
+
+ message = %{
+ "actor" => actor.ap_id,
+ "to" => ["test-address"],
+ "cc" => ["https://www.w3.org/ns/activitystreams#Publid"],
+ "type" => "Create"
+ }
+
+ Pleroma.Config.put([:mrf_rejectnonpublic, :allow_followersonly], true)
+ assert {:ok, message} = RejectNonPublic.filter(message)
+ end
+
+ test "it's rejected when addrer of message in the follower addresses of user and it disabled in config" do
+ actor = insert(:user, follower_address: "test-address")
+
+ message = %{
+ "actor" => actor.ap_id,
+ "to" => ["test-address"],
+ "cc" => ["https://www.w3.org/ns/activitystreams#Publid"],
+ "type" => "Create"
+ }
+
+ Pleroma.Config.put([:mrf_rejectnonpublic, :allow_followersonly], false)
+ assert {:reject, nil} = RejectNonPublic.filter(message)
+ end
+ end
+
+ describe "direct message" do
+ test "it's allows when direct messages are allow" do
+ actor = insert(:user)
+
+ message = %{
+ "actor" => actor.ap_id,
+ "to" => ["https://www.w3.org/ns/activitystreams#Publid"],
+ "cc" => ["https://www.w3.org/ns/activitystreams#Publid"],
+ "type" => "Create"
+ }
+
+ Pleroma.Config.put([:mrf_rejectnonpublic, :allow_direct], true)
+ assert {:ok, message} = RejectNonPublic.filter(message)
+ end
+
+ test "it's reject when direct messages aren't allow" do
+ actor = insert(:user)
+
+ message = %{
+ "actor" => actor.ap_id,
+ "to" => ["https://www.w3.org/ns/activitystreams#Publid~~~"],
+ "cc" => ["https://www.w3.org/ns/activitystreams#Publid"],
+ "type" => "Create"
+ }
+
+ Pleroma.Config.put([:mrf_rejectnonpublic, :allow_direct], false)
+ assert {:reject, nil} = RejectNonPublic.filter(message)
+ end
+ end
+end
diff --git a/test/web/activity_pub/mrf/simple_policy_test.exs b/test/web/activity_pub/mrf/simple_policy_test.exs
index 0fd68e103..7203b27da 100644
--- a/test/web/activity_pub/mrf/simple_policy_test.exs
+++ b/test/web/activity_pub/mrf/simple_policy_test.exs
@@ -8,9 +8,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
alias Pleroma.Config
alias Pleroma.Web.ActivityPub.MRF.SimplePolicy
- setup do
- orig = Config.get!(:mrf_simple)
-
+ clear_config([:mrf_simple]) do
Config.put(:mrf_simple,
media_removal: [],
media_nsfw: [],
@@ -21,10 +19,6 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
avatar_removal: [],
banner_removal: []
)
-
- on_exit(fn ->
- Config.put(:mrf_simple, orig)
- end)
end
describe "when :media_removal" do
@@ -49,6 +43,19 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
assert SimplePolicy.filter(local_message) == {:ok, local_message}
end
+
+ test "match with wildcard domain" do
+ Config.put([:mrf_simple, :media_removal], ["*.remote.instance"])
+ media_message = build_media_message()
+ local_message = build_local_message()
+
+ assert SimplePolicy.filter(media_message) ==
+ {:ok,
+ media_message
+ |> Map.put("object", Map.delete(media_message["object"], "attachment"))}
+
+ assert SimplePolicy.filter(local_message) == {:ok, local_message}
+ end
end
describe "when :media_nsfw" do
@@ -74,6 +81,20 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
assert SimplePolicy.filter(local_message) == {:ok, local_message}
end
+
+ test "match with wildcard domain" do
+ Config.put([:mrf_simple, :media_nsfw], ["*.remote.instance"])
+ media_message = build_media_message()
+ local_message = build_local_message()
+
+ assert SimplePolicy.filter(media_message) ==
+ {:ok,
+ media_message
+ |> put_in(["object", "tag"], ["foo", "nsfw"])
+ |> put_in(["object", "sensitive"], true)}
+
+ assert SimplePolicy.filter(local_message) == {:ok, local_message}
+ end
end
defp build_media_message do
@@ -106,6 +127,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
assert SimplePolicy.filter(report_message) == {:reject, nil}
assert SimplePolicy.filter(local_message) == {:ok, local_message}
end
+
+ test "match with wildcard domain" do
+ Config.put([:mrf_simple, :report_removal], ["*.remote.instance"])
+ report_message = build_report_message()
+ local_message = build_local_message()
+
+ assert SimplePolicy.filter(report_message) == {:reject, nil}
+ assert SimplePolicy.filter(local_message) == {:ok, local_message}
+ end
end
defp build_report_message do
@@ -146,6 +176,27 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
assert SimplePolicy.filter(local_message) == {:ok, local_message}
end
+ test "match with wildcard domain" do
+ {actor, ftl_message} = build_ftl_actor_and_message()
+
+ ftl_message_actor_host =
+ ftl_message
+ |> Map.fetch!("actor")
+ |> URI.parse()
+ |> Map.fetch!(:host)
+
+ Config.put([:mrf_simple, :federated_timeline_removal], ["*." <> ftl_message_actor_host])
+ local_message = build_local_message()
+
+ assert {:ok, ftl_message} = SimplePolicy.filter(ftl_message)
+ assert actor.follower_address in ftl_message["to"]
+ refute actor.follower_address in ftl_message["cc"]
+ refute "https://www.w3.org/ns/activitystreams#Public" in ftl_message["to"]
+ assert "https://www.w3.org/ns/activitystreams#Public" in ftl_message["cc"]
+
+ assert SimplePolicy.filter(local_message) == {:ok, local_message}
+ end
+
test "has a matching host but only as:Public in to" do
{_actor, ftl_message} = build_ftl_actor_and_message()
@@ -192,6 +243,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
assert SimplePolicy.filter(remote_message) == {:reject, nil}
end
+
+ test "match with wildcard domain" do
+ Config.put([:mrf_simple, :reject], ["*.remote.instance"])
+
+ remote_message = build_remote_message()
+
+ assert SimplePolicy.filter(remote_message) == {:reject, nil}
+ end
end
describe "when :accept" do
@@ -224,6 +283,16 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
assert SimplePolicy.filter(local_message) == {:ok, local_message}
assert SimplePolicy.filter(remote_message) == {:ok, remote_message}
end
+
+ test "match with wildcard domain" do
+ Config.put([:mrf_simple, :accept], ["*.remote.instance"])
+
+ local_message = build_local_message()
+ remote_message = build_remote_message()
+
+ assert SimplePolicy.filter(local_message) == {:ok, local_message}
+ assert SimplePolicy.filter(remote_message) == {:ok, remote_message}
+ end
end
describe "when :avatar_removal" do
@@ -251,6 +320,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
refute filtered["icon"]
end
+
+ test "match with wildcard domain" do
+ Config.put([:mrf_simple, :avatar_removal], ["*.remote.instance"])
+
+ remote_user = build_remote_user()
+ {:ok, filtered} = SimplePolicy.filter(remote_user)
+
+ refute filtered["icon"]
+ end
end
describe "when :banner_removal" do
@@ -278,6 +356,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do
refute filtered["image"]
end
+
+ test "match with wildcard domain" do
+ Config.put([:mrf_simple, :banner_removal], ["*.remote.instance"])
+
+ remote_user = build_remote_user()
+ {:ok, filtered} = SimplePolicy.filter(remote_user)
+
+ refute filtered["image"]
+ end
end
defp build_local_message do
diff --git a/test/web/activity_pub/mrf/subchain_policy_test.exs b/test/web/activity_pub/mrf/subchain_policy_test.exs
new file mode 100644
index 000000000..f7cbcad48
--- /dev/null
+++ b/test/web/activity_pub/mrf/subchain_policy_test.exs
@@ -0,0 +1,32 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.SubchainPolicyTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Web.ActivityPub.MRF.DropPolicy
+ alias Pleroma.Web.ActivityPub.MRF.SubchainPolicy
+
+ @message %{
+ "actor" => "https://banned.com",
+ "type" => "Create",
+ "object" => %{"content" => "hi"}
+ }
+
+ test "it matches and processes subchains when the actor matches a configured target" do
+ Pleroma.Config.put([:mrf_subchain, :match_actor], %{
+ ~r/^https:\/\/banned.com/s => [DropPolicy]
+ })
+
+ {:reject, _} = SubchainPolicy.filter(@message)
+ end
+
+ test "it doesn't match and process subchains when the actor doesn't match a configured target" do
+ Pleroma.Config.put([:mrf_subchain, :match_actor], %{
+ ~r/^https:\/\/borked.com/s => [DropPolicy]
+ })
+
+ {:ok, _message} = SubchainPolicy.filter(@message)
+ end
+end
diff --git a/test/web/activity_pub/mrf/tag_policy_test.exs b/test/web/activity_pub/mrf/tag_policy_test.exs
new file mode 100644
index 000000000..4aa35311e
--- /dev/null
+++ b/test/web/activity_pub/mrf/tag_policy_test.exs
@@ -0,0 +1,123 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.TagPolicyTest do
+ use Pleroma.DataCase
+ import Pleroma.Factory
+
+ alias Pleroma.Web.ActivityPub.MRF.TagPolicy
+ @public "https://www.w3.org/ns/activitystreams#Public"
+
+ describe "mrf_tag:disable-any-subscription" do
+ test "rejects message" do
+ actor = insert(:user, tags: ["mrf_tag:disable-any-subscription"])
+ message = %{"object" => actor.ap_id, "type" => "Follow"}
+ assert {:reject, nil} = TagPolicy.filter(message)
+ end
+ end
+
+ describe "mrf_tag:disable-remote-subscription" do
+ test "rejects non-local follow requests" do
+ actor = insert(:user, tags: ["mrf_tag:disable-remote-subscription"])
+ follower = insert(:user, tags: ["mrf_tag:disable-remote-subscription"], local: false)
+ message = %{"object" => actor.ap_id, "type" => "Follow", "actor" => follower.ap_id}
+ assert {:reject, nil} = TagPolicy.filter(message)
+ end
+
+ test "allows non-local follow requests" do
+ actor = insert(:user, tags: ["mrf_tag:disable-remote-subscription"])
+ follower = insert(:user, tags: ["mrf_tag:disable-remote-subscription"], local: true)
+ message = %{"object" => actor.ap_id, "type" => "Follow", "actor" => follower.ap_id}
+ assert {:ok, message} = TagPolicy.filter(message)
+ end
+ end
+
+ describe "mrf_tag:sandbox" do
+ test "removes from public timelines" do
+ actor = insert(:user, tags: ["mrf_tag:sandbox"])
+
+ message = %{
+ "actor" => actor.ap_id,
+ "type" => "Create",
+ "object" => %{},
+ "to" => [@public, "f"],
+ "cc" => [@public, "d"]
+ }
+
+ except_message = %{
+ "actor" => actor.ap_id,
+ "type" => "Create",
+ "object" => %{"to" => ["f", actor.follower_address], "cc" => ["d"]},
+ "to" => ["f", actor.follower_address],
+ "cc" => ["d"]
+ }
+
+ assert TagPolicy.filter(message) == {:ok, except_message}
+ end
+ end
+
+ describe "mrf_tag:force-unlisted" do
+ test "removes from the federated timeline" do
+ actor = insert(:user, tags: ["mrf_tag:force-unlisted"])
+
+ message = %{
+ "actor" => actor.ap_id,
+ "type" => "Create",
+ "object" => %{},
+ "to" => [@public, "f"],
+ "cc" => [actor.follower_address, "d"]
+ }
+
+ except_message = %{
+ "actor" => actor.ap_id,
+ "type" => "Create",
+ "object" => %{"to" => ["f", actor.follower_address], "cc" => ["d", @public]},
+ "to" => ["f", actor.follower_address],
+ "cc" => ["d", @public]
+ }
+
+ assert TagPolicy.filter(message) == {:ok, except_message}
+ end
+ end
+
+ describe "mrf_tag:media-strip" do
+ test "removes attachments" do
+ actor = insert(:user, tags: ["mrf_tag:media-strip"])
+
+ message = %{
+ "actor" => actor.ap_id,
+ "type" => "Create",
+ "object" => %{"attachment" => ["file1"]}
+ }
+
+ except_message = %{
+ "actor" => actor.ap_id,
+ "type" => "Create",
+ "object" => %{}
+ }
+
+ assert TagPolicy.filter(message) == {:ok, except_message}
+ end
+ end
+
+ describe "mrf_tag:media-force-nsfw" do
+ test "Mark as sensitive on presence of attachments" do
+ actor = insert(:user, tags: ["mrf_tag:media-force-nsfw"])
+
+ message = %{
+ "actor" => actor.ap_id,
+ "type" => "Create",
+ "object" => %{"tag" => ["test"], "attachment" => ["file1"]}
+ }
+
+ except_message = %{
+ "actor" => actor.ap_id,
+ "type" => "Create",
+ "object" => %{"tag" => ["test", "nsfw"], "attachment" => ["file1"], "sensitive" => true}
+ }
+
+ assert TagPolicy.filter(message) == {:ok, except_message}
+ end
+ end
+end
diff --git a/test/web/activity_pub/mrf/user_allowlist_policy_test.exs b/test/web/activity_pub/mrf/user_allowlist_policy_test.exs
new file mode 100644
index 000000000..72084c0fd
--- /dev/null
+++ b/test/web/activity_pub/mrf/user_allowlist_policy_test.exs
@@ -0,0 +1,31 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+defmodule Pleroma.Web.ActivityPub.MRF.UserAllowListPolicyTest do
+ use Pleroma.DataCase
+ import Pleroma.Factory
+
+ alias Pleroma.Web.ActivityPub.MRF.UserAllowListPolicy
+
+ clear_config([:mrf_user_allowlist, :localhost])
+
+ test "pass filter if allow list is empty" do
+ actor = insert(:user)
+ message = %{"actor" => actor.ap_id}
+ assert UserAllowListPolicy.filter(message) == {:ok, message}
+ end
+
+ test "pass filter if allow list isn't empty and user in allow list" do
+ actor = insert(:user)
+ Pleroma.Config.put([:mrf_user_allowlist, :localhost], [actor.ap_id, "test-ap-id"])
+ message = %{"actor" => actor.ap_id}
+ assert UserAllowListPolicy.filter(message) == {:ok, message}
+ end
+
+ test "rejected if allow list isn't empty and user not in allow list" do
+ actor = insert(:user)
+ Pleroma.Config.put([:mrf_user_allowlist, :localhost], ["test-ap-id"])
+ message = %{"actor" => actor.ap_id}
+ assert UserAllowListPolicy.filter(message) == {:reject, nil}
+ end
+end
diff --git a/test/web/activity_pub/mrf/vocabulary_policy_test.exs b/test/web/activity_pub/mrf/vocabulary_policy_test.exs
new file mode 100644
index 000000000..38309f9f1
--- /dev/null
+++ b/test/web/activity_pub/mrf/vocabulary_policy_test.exs
@@ -0,0 +1,106 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.VocabularyPolicyTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Web.ActivityPub.MRF.VocabularyPolicy
+
+ describe "accept" do
+ clear_config([:mrf_vocabulary, :accept])
+
+ test "it accepts based on parent activity type" do
+ Pleroma.Config.put([:mrf_vocabulary, :accept], ["Like"])
+
+ message = %{
+ "type" => "Like",
+ "object" => "whatever"
+ }
+
+ {:ok, ^message} = VocabularyPolicy.filter(message)
+ end
+
+ test "it accepts based on child object type" do
+ Pleroma.Config.put([:mrf_vocabulary, :accept], ["Create", "Note"])
+
+ message = %{
+ "type" => "Create",
+ "object" => %{
+ "type" => "Note",
+ "content" => "whatever"
+ }
+ }
+
+ {:ok, ^message} = VocabularyPolicy.filter(message)
+ end
+
+ test "it does not accept disallowed child objects" do
+ Pleroma.Config.put([:mrf_vocabulary, :accept], ["Create", "Note"])
+
+ message = %{
+ "type" => "Create",
+ "object" => %{
+ "type" => "Article",
+ "content" => "whatever"
+ }
+ }
+
+ {:reject, nil} = VocabularyPolicy.filter(message)
+ end
+
+ test "it does not accept disallowed parent types" do
+ Pleroma.Config.put([:mrf_vocabulary, :accept], ["Announce", "Note"])
+
+ message = %{
+ "type" => "Create",
+ "object" => %{
+ "type" => "Note",
+ "content" => "whatever"
+ }
+ }
+
+ {:reject, nil} = VocabularyPolicy.filter(message)
+ end
+ end
+
+ describe "reject" do
+ clear_config([:mrf_vocabulary, :reject])
+
+ test "it rejects based on parent activity type" do
+ Pleroma.Config.put([:mrf_vocabulary, :reject], ["Like"])
+
+ message = %{
+ "type" => "Like",
+ "object" => "whatever"
+ }
+
+ {:reject, nil} = VocabularyPolicy.filter(message)
+ end
+
+ test "it rejects based on child object type" do
+ Pleroma.Config.put([:mrf_vocabulary, :reject], ["Note"])
+
+ message = %{
+ "type" => "Create",
+ "object" => %{
+ "type" => "Note",
+ "content" => "whatever"
+ }
+ }
+
+ {:reject, nil} = VocabularyPolicy.filter(message)
+ end
+
+ test "it passes through objects that aren't disallowed" do
+ Pleroma.Config.put([:mrf_vocabulary, :reject], ["Like"])
+
+ message = %{
+ "type" => "Announce",
+ "object" => "whatever"
+ }
+
+ {:ok, ^message} = VocabularyPolicy.filter(message)
+ end
+ end
+end
diff --git a/test/web/activity_pub/publisher_test.exs b/test/web/activity_pub/publisher_test.exs
new file mode 100644
index 000000000..36a39c84c
--- /dev/null
+++ b/test/web/activity_pub/publisher_test.exs
@@ -0,0 +1,266 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.PublisherTest do
+ use Pleroma.DataCase
+
+ import Pleroma.Factory
+ import Tesla.Mock
+ import Mock
+
+ alias Pleroma.Activity
+ alias Pleroma.Instances
+ alias Pleroma.Web.ActivityPub.Publisher
+
+ @as_public "https://www.w3.org/ns/activitystreams#Public"
+
+ setup do
+ mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+ :ok
+ end
+
+ describe "determine_inbox/2" do
+ test "it returns sharedInbox for messages involving as:Public in to" do
+ user =
+ insert(:user, %{
+ info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}}
+ })
+
+ activity = %Activity{
+ data: %{"to" => [@as_public], "cc" => [user.follower_address]}
+ }
+
+ assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox"
+ end
+
+ test "it returns sharedInbox for messages involving as:Public in cc" do
+ user =
+ insert(:user, %{
+ info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}}
+ })
+
+ activity = %Activity{
+ data: %{"cc" => [@as_public], "to" => [user.follower_address]}
+ }
+
+ assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox"
+ end
+
+ test "it returns sharedInbox for messages involving multiple recipients in to" do
+ user =
+ insert(:user, %{
+ info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}}
+ })
+
+ user_two = insert(:user)
+ user_three = insert(:user)
+
+ activity = %Activity{
+ data: %{"cc" => [], "to" => [user.ap_id, user_two.ap_id, user_three.ap_id]}
+ }
+
+ assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox"
+ end
+
+ test "it returns sharedInbox for messages involving multiple recipients in cc" do
+ user =
+ insert(:user, %{
+ info: %{source_data: %{"endpoints" => %{"sharedInbox" => "http://example.com/inbox"}}}
+ })
+
+ user_two = insert(:user)
+ user_three = insert(:user)
+
+ activity = %Activity{
+ data: %{"to" => [], "cc" => [user.ap_id, user_two.ap_id, user_three.ap_id]}
+ }
+
+ assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox"
+ end
+
+ test "it returns sharedInbox for messages involving multiple recipients in total" do
+ user =
+ insert(:user, %{
+ info: %{
+ source_data: %{
+ "inbox" => "http://example.com/personal-inbox",
+ "endpoints" => %{"sharedInbox" => "http://example.com/inbox"}
+ }
+ }
+ })
+
+ user_two = insert(:user)
+
+ activity = %Activity{
+ data: %{"to" => [user_two.ap_id], "cc" => [user.ap_id]}
+ }
+
+ assert Publisher.determine_inbox(activity, user) == "http://example.com/inbox"
+ end
+
+ test "it returns inbox for messages involving single recipients in total" do
+ user =
+ insert(:user, %{
+ info: %{
+ source_data: %{
+ "inbox" => "http://example.com/personal-inbox",
+ "endpoints" => %{"sharedInbox" => "http://example.com/inbox"}
+ }
+ }
+ })
+
+ activity = %Activity{
+ data: %{"to" => [user.ap_id], "cc" => []}
+ }
+
+ assert Publisher.determine_inbox(activity, user) == "http://example.com/personal-inbox"
+ end
+ end
+
+ describe "publish_one/1" do
+ test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is not specified",
+ Instances,
+ [:passthrough],
+ [] do
+ actor = insert(:user)
+ inbox = "http://200.site/users/nick1/inbox"
+
+ assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
+
+ assert called(Instances.set_reachable(inbox))
+ end
+
+ test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is set",
+ Instances,
+ [:passthrough],
+ [] do
+ actor = insert(:user)
+ inbox = "http://200.site/users/nick1/inbox"
+
+ assert {:ok, _} =
+ Publisher.publish_one(%{
+ inbox: inbox,
+ json: "{}",
+ actor: actor,
+ id: 1,
+ unreachable_since: NaiveDateTime.utc_now()
+ })
+
+ assert called(Instances.set_reachable(inbox))
+ end
+
+ test_with_mock "does NOT call `Instances.set_reachable` on successful federation if `unreachable_since` is nil",
+ Instances,
+ [:passthrough],
+ [] do
+ actor = insert(:user)
+ inbox = "http://200.site/users/nick1/inbox"
+
+ assert {:ok, _} =
+ Publisher.publish_one(%{
+ inbox: inbox,
+ json: "{}",
+ actor: actor,
+ id: 1,
+ unreachable_since: nil
+ })
+
+ refute called(Instances.set_reachable(inbox))
+ end
+
+ test_with_mock "calls `Instances.set_unreachable` on target inbox on non-2xx HTTP response code",
+ Instances,
+ [:passthrough],
+ [] do
+ actor = insert(:user)
+ inbox = "http://404.site/users/nick1/inbox"
+
+ assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
+
+ assert called(Instances.set_unreachable(inbox))
+ end
+
+ test_with_mock "it calls `Instances.set_unreachable` on target inbox on request error of any kind",
+ Instances,
+ [:passthrough],
+ [] do
+ actor = insert(:user)
+ inbox = "http://connrefused.site/users/nick1/inbox"
+
+ assert {:error, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
+
+ assert called(Instances.set_unreachable(inbox))
+ end
+
+ test_with_mock "does NOT call `Instances.set_unreachable` if target is reachable",
+ Instances,
+ [:passthrough],
+ [] do
+ actor = insert(:user)
+ inbox = "http://200.site/users/nick1/inbox"
+
+ assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
+
+ refute called(Instances.set_unreachable(inbox))
+ end
+
+ test_with_mock "does NOT call `Instances.set_unreachable` if target instance has non-nil `unreachable_since`",
+ Instances,
+ [:passthrough],
+ [] do
+ actor = insert(:user)
+ inbox = "http://connrefused.site/users/nick1/inbox"
+
+ assert {:error, _} =
+ Publisher.publish_one(%{
+ inbox: inbox,
+ json: "{}",
+ actor: actor,
+ id: 1,
+ unreachable_since: NaiveDateTime.utc_now()
+ })
+
+ refute called(Instances.set_unreachable(inbox))
+ end
+ end
+
+ describe "publish/2" do
+ test_with_mock "publishes an activity with BCC to all relevant peers.",
+ Pleroma.Web.Federator.Publisher,
+ [:passthrough],
+ [] do
+ follower =
+ insert(:user,
+ local: false,
+ info: %{
+ ap_enabled: true,
+ source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}
+ }
+ )
+
+ actor = insert(:user, follower_address: follower.ap_id)
+ user = insert(:user)
+
+ {:ok, _follower_one} = Pleroma.User.follow(follower, actor)
+ actor = refresh_record(actor)
+
+ note_activity =
+ insert(:note_activity,
+ recipients: [follower.ap_id],
+ data_attrs: %{"bcc" => [user.ap_id]}
+ )
+
+ res = Publisher.publish(actor, note_activity)
+ assert res == :ok
+
+ assert called(
+ Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
+ inbox: "https://domain.com/users/nick1/inbox",
+ actor: actor,
+ id: note_activity.data["id"]
+ })
+ )
+ end
+ end
+end
diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs
index 21a63c493..e10b808f7 100644
--- a/test/web/activity_pub/relay_test.exs
+++ b/test/web/activity_pub/relay_test.exs
@@ -5,11 +5,71 @@
defmodule Pleroma.Web.ActivityPub.RelayTest do
use Pleroma.DataCase
+ alias Pleroma.Activity
+ alias Pleroma.Object
+ alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Relay
+ import Pleroma.Factory
+
test "gets an actor for the relay" do
user = Relay.get_actor()
+ assert user.ap_id == "#{Pleroma.Web.Endpoint.url()}/relay"
+ end
+
+ describe "follow/1" do
+ test "returns errors when user not found" do
+ assert Relay.follow("test-ap-id") == {:error, "Could not fetch by AP id"}
+ end
+
+ test "returns activity" do
+ user = insert(:user)
+ service_actor = Relay.get_actor()
+ assert {:ok, %Activity{} = activity} = Relay.follow(user.ap_id)
+ assert activity.actor == "#{Pleroma.Web.Endpoint.url()}/relay"
+ assert user.ap_id in activity.recipients
+ assert activity.data["type"] == "Follow"
+ assert activity.data["actor"] == service_actor.ap_id
+ assert activity.data["object"] == user.ap_id
+ end
+ end
+
+ describe "unfollow/1" do
+ test "returns errors when user not found" do
+ assert Relay.unfollow("test-ap-id") == {:error, "Could not fetch by AP id"}
+ end
+
+ test "returns activity" do
+ user = insert(:user)
+ service_actor = Relay.get_actor()
+ ActivityPub.follow(service_actor, user)
+ assert {:ok, %Activity{} = activity} = Relay.unfollow(user.ap_id)
+ assert activity.actor == "#{Pleroma.Web.Endpoint.url()}/relay"
+ assert user.ap_id in activity.recipients
+ assert activity.data["type"] == "Undo"
+ assert activity.data["actor"] == service_actor.ap_id
+ assert activity.data["to"] == [user.ap_id]
+ end
+ end
+
+ describe "publish/1" do
+ test "returns error when activity not `Create` type" do
+ activity = insert(:like_activity)
+ assert Relay.publish(activity) == {:error, "Not implemented"}
+ end
+
+ test "returns error when activity not public" do
+ activity = insert(:direct_note_activity)
+ assert Relay.publish(activity) == {:error, false}
+ end
- assert user.ap_id =~ "/relay"
+ test "returns announce activity" do
+ service_actor = Relay.get_actor()
+ note = insert(:note_activity)
+ assert {:ok, %Activity{} = activity, %Object{} = obj} = Relay.publish(note)
+ assert activity.data["type"] == "Announce"
+ assert activity.data["actor"] == service_actor.ap_id
+ assert activity.data["object"] == obj.data["id"]
+ end
end
end
diff --git a/test/web/activity_pub/transmogrifier/follow_handling_test.exs b/test/web/activity_pub/transmogrifier/follow_handling_test.exs
new file mode 100644
index 000000000..857d65564
--- /dev/null
+++ b/test/web/activity_pub/transmogrifier/follow_handling_test.exs
@@ -0,0 +1,143 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do
+ use Pleroma.DataCase
+ alias Pleroma.Activity
+ alias Pleroma.Repo
+ alias Pleroma.User
+ alias Pleroma.Web.ActivityPub.Transmogrifier
+ alias Pleroma.Web.ActivityPub.Utils
+
+ import Pleroma.Factory
+ import Ecto.Query
+
+ setup_all do
+ Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+ :ok
+ end
+
+ describe "handle_incoming" do
+ test "it works for incoming follow requests" do
+ user = insert(:user)
+
+ data =
+ File.read!("test/fixtures/mastodon-follow-activity.json")
+ |> Poison.decode!()
+ |> Map.put("object", user.ap_id)
+
+ {:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data)
+
+ assert data["actor"] == "http://mastodon.example.org/users/admin"
+ assert data["type"] == "Follow"
+ assert data["id"] == "http://mastodon.example.org/users/admin#follows/2"
+
+ activity = Repo.get(Activity, activity.id)
+ assert activity.data["state"] == "accept"
+ assert User.following?(User.get_cached_by_ap_id(data["actor"]), user)
+ end
+
+ test "with locked accounts, it does not create a follow or an accept" do
+ user = insert(:user, info: %{locked: true})
+
+ data =
+ File.read!("test/fixtures/mastodon-follow-activity.json")
+ |> Poison.decode!()
+ |> Map.put("object", user.ap_id)
+
+ {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
+
+ assert data["state"] == "pending"
+
+ refute User.following?(User.get_cached_by_ap_id(data["actor"]), user)
+
+ accepts =
+ from(
+ a in Activity,
+ where: fragment("?->>'type' = ?", a.data, "Accept")
+ )
+ |> Repo.all()
+
+ assert length(accepts) == 0
+ end
+
+ test "it works for follow requests when you are already followed, creating a new accept activity" do
+ # This is important because the remote might have the wrong idea about the
+ # current follow status. This can lead to instance A thinking that x@A is
+ # followed by y@B, but B thinks they are not. In this case, the follow can
+ # never go through again because it will never get an Accept.
+ user = insert(:user)
+
+ data =
+ File.read!("test/fixtures/mastodon-follow-activity.json")
+ |> Poison.decode!()
+ |> Map.put("object", user.ap_id)
+
+ {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(data)
+
+ accepts =
+ from(
+ a in Activity,
+ where: fragment("?->>'type' = ?", a.data, "Accept")
+ )
+ |> Repo.all()
+
+ assert length(accepts) == 1
+
+ data =
+ File.read!("test/fixtures/mastodon-follow-activity.json")
+ |> Poison.decode!()
+ |> Map.put("id", String.replace(data["id"], "2", "3"))
+ |> Map.put("object", user.ap_id)
+
+ {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(data)
+
+ accepts =
+ from(
+ a in Activity,
+ where: fragment("?->>'type' = ?", a.data, "Accept")
+ )
+ |> Repo.all()
+
+ assert length(accepts) == 2
+ end
+
+ test "it rejects incoming follow requests from blocked users when deny_follow_blocked is enabled" do
+ Pleroma.Config.put([:user, :deny_follow_blocked], true)
+
+ user = insert(:user)
+ {:ok, target} = User.get_or_fetch("http://mastodon.example.org/users/admin")
+
+ {:ok, user} = User.block(user, target)
+
+ data =
+ File.read!("test/fixtures/mastodon-follow-activity.json")
+ |> Poison.decode!()
+ |> Map.put("object", user.ap_id)
+
+ {:ok, %Activity{data: %{"id" => id}}} = Transmogrifier.handle_incoming(data)
+
+ %Activity{} = activity = Activity.get_by_ap_id(id)
+
+ assert activity.data["state"] == "reject"
+ end
+
+ test "it works for incoming follow requests from hubzilla" do
+ user = insert(:user)
+
+ data =
+ File.read!("test/fixtures/hubzilla-follow-activity.json")
+ |> Poison.decode!()
+ |> Map.put("object", user.ap_id)
+ |> Utils.normalize_params()
+
+ {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
+
+ assert data["actor"] == "https://hubzilla.example.org/channel/kaniini"
+ assert data["type"] == "Follow"
+ assert data["id"] == "https://hubzilla.example.org/channel/kaniini#follows/2"
+ assert User.following?(User.get_cached_by_ap_id(data["actor"]), user)
+ end
+ end
+end
diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs
index ee71de8d0..629c76c97 100644
--- a/test/web/activity_pub/transmogrifier_test.exs
+++ b/test/web/activity_pub/transmogrifier_test.exs
@@ -11,18 +11,21 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Transmogrifier
- alias Pleroma.Web.ActivityPub.Utils
+ alias Pleroma.Web.CommonAPI
alias Pleroma.Web.OStatus
alias Pleroma.Web.Websub.WebsubClientSubscription
+ import Mock
import Pleroma.Factory
- alias Pleroma.Web.CommonAPI
+ import ExUnit.CaptureLog
setup_all do
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
:ok
end
+ clear_config([:instance, :max_remote_account_fields])
+
describe "handle_incoming" do
test "it ignores an incoming notice if we already have it" do
activity = insert(:note_activity)
@@ -30,7 +33,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
data =
File.read!("test/fixtures/mastodon-post-activity.json")
|> Poison.decode!()
- |> Map.put("object", activity.data["object"])
+ |> Map.put("object", Object.normalize(activity).data)
{:ok, returned_activity} = Transmogrifier.handle_incoming(data)
@@ -46,12 +49,9 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
data["object"]
|> Map.put("inReplyTo", "https://shitposter.club/notice/2827873")
- data =
- data
- |> Map.put("object", object)
-
+ data = Map.put(data, "object", object)
{:ok, returned_activity} = Transmogrifier.handle_incoming(data)
- returned_object = Object.normalize(returned_activity.data["object"])
+ returned_object = Object.normalize(returned_activity, false)
assert activity =
Activity.get_create_by_object_ap_id(
@@ -61,6 +61,50 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert returned_object.data["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873"
end
+ test "it does not fetch replied-to activities beyond max_replies_depth" do
+ data =
+ File.read!("test/fixtures/mastodon-post-activity.json")
+ |> Poison.decode!()
+
+ object =
+ data["object"]
+ |> Map.put("inReplyTo", "https://shitposter.club/notice/2827873")
+
+ data = Map.put(data, "object", object)
+
+ with_mock Pleroma.Web.Federator,
+ allowed_incoming_reply_depth?: fn _ -> false end do
+ {:ok, returned_activity} = Transmogrifier.handle_incoming(data)
+
+ returned_object = Object.normalize(returned_activity, false)
+
+ refute Activity.get_create_by_object_ap_id(
+ "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
+ )
+
+ assert returned_object.data["inReplyToAtomUri"] ==
+ "https://shitposter.club/notice/2827873"
+ end
+ end
+
+ test "it does not crash if the object in inReplyTo can't be fetched" do
+ data =
+ File.read!("test/fixtures/mastodon-post-activity.json")
+ |> Poison.decode!()
+
+ object =
+ data["object"]
+ |> Map.put("inReplyTo", "https://404.site/whatever")
+
+ data =
+ data
+ |> Map.put("object", object)
+
+ assert capture_log(fn ->
+ {:ok, _returned_activity} = Transmogrifier.handle_incoming(data)
+ end) =~ "[error] Couldn't fetch \"\"https://404.site/whatever\"\", error: nil"
+ end
+
test "it works for incoming notices" do
data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!()
@@ -81,25 +125,27 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert data["actor"] == "http://mastodon.example.org/users/admin"
- object = Object.normalize(data["object"]).data
- assert object["id"] == "http://mastodon.example.org/users/admin/statuses/99512778738411822"
+ object_data = Object.normalize(data["object"]).data
+
+ assert object_data["id"] ==
+ "http://mastodon.example.org/users/admin/statuses/99512778738411822"
- assert object["to"] == ["https://www.w3.org/ns/activitystreams#Public"]
+ assert object_data["to"] == ["https://www.w3.org/ns/activitystreams#Public"]
- assert object["cc"] == [
+ assert object_data["cc"] == [
"http://mastodon.example.org/users/admin/followers",
"http://localtesting.pleroma.lol/users/lain"
]
- assert object["actor"] == "http://mastodon.example.org/users/admin"
- assert object["attributedTo"] == "http://mastodon.example.org/users/admin"
+ assert object_data["actor"] == "http://mastodon.example.org/users/admin"
+ assert object_data["attributedTo"] == "http://mastodon.example.org/users/admin"
- assert object["context"] ==
+ assert object_data["context"] ==
"tag:mastodon.example.org,2018-02-12:objectId=20:objectType=Conversation"
- assert object["sensitive"] == true
+ assert object_data["sensitive"] == true
- user = User.get_cached_by_ap_id(object["actor"])
+ user = User.get_cached_by_ap_id(object_data["actor"])
assert user.info.note_count == 1
end
@@ -113,6 +159,55 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert Enum.at(object.data["tag"], 2) == "moo"
end
+ test "it works for incoming questions" do
+ data = File.read!("test/fixtures/mastodon-question-activity.json") |> Poison.decode!()
+
+ {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data)
+
+ object = Object.normalize(activity)
+
+ assert Enum.all?(object.data["oneOf"], fn choice ->
+ choice["name"] in [
+ "Dunno",
+ "Everyone knows that!",
+ "25 char limit is dumb",
+ "I can't even fit a funny"
+ ]
+ end)
+ end
+
+ test "it rewrites Note votes to Answers and increments vote counters on question activities" do
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "suya...",
+ "poll" => %{"options" => ["suya", "suya.", "suya.."], "expires_in" => 10}
+ })
+
+ object = Object.normalize(activity)
+
+ data =
+ File.read!("test/fixtures/mastodon-vote.json")
+ |> Poison.decode!()
+ |> Kernel.put_in(["to"], user.ap_id)
+ |> Kernel.put_in(["object", "inReplyTo"], object.data["id"])
+ |> Kernel.put_in(["object", "to"], user.ap_id)
+
+ {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data)
+ answer_object = Object.normalize(activity)
+ assert answer_object.data["type"] == "Answer"
+ object = Object.get_by_ap_id(object.data["id"])
+
+ assert Enum.any?(
+ object.data["oneOf"],
+ fn
+ %{"name" => "suya..", "replies" => %{"totalItems" => 1}} -> true
+ _ -> false
+ end
+ )
+ end
+
test "it works for incoming notices with contentMap" do
data =
File.read!("test/fixtures/mastodon-post-activity-contentmap.json") |> Poison.decode!()
@@ -199,59 +294,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert object_data["cc"] == to
end
- test "it works for incoming follow requests" do
- user = insert(:user)
-
- data =
- File.read!("test/fixtures/mastodon-follow-activity.json")
- |> Poison.decode!()
- |> Map.put("object", user.ap_id)
-
- {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
-
- assert data["actor"] == "http://mastodon.example.org/users/admin"
- assert data["type"] == "Follow"
- assert data["id"] == "http://mastodon.example.org/users/admin#follows/2"
- assert User.following?(User.get_cached_by_ap_id(data["actor"]), user)
- end
-
- test "it rejects incoming follow requests from blocked users when deny_follow_blocked is enabled" do
- Pleroma.Config.put([:user, :deny_follow_blocked], true)
-
- user = insert(:user)
- {:ok, target} = User.get_or_fetch("http://mastodon.example.org/users/admin")
-
- {:ok, user} = User.block(user, target)
-
- data =
- File.read!("test/fixtures/mastodon-follow-activity.json")
- |> Poison.decode!()
- |> Map.put("object", user.ap_id)
-
- {:ok, %Activity{data: %{"id" => id}}} = Transmogrifier.handle_incoming(data)
-
- %Activity{} = activity = Activity.get_by_ap_id(id)
-
- assert activity.data["state"] == "reject"
- end
-
- test "it works for incoming follow requests from hubzilla" do
- user = insert(:user)
-
- data =
- File.read!("test/fixtures/hubzilla-follow-activity.json")
- |> Poison.decode!()
- |> Map.put("object", user.ap_id)
- |> Utils.normalize_params()
-
- {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
-
- assert data["actor"] == "https://hubzilla.example.org/channel/kaniini"
- assert data["type"] == "Follow"
- assert data["id"] == "https://hubzilla.example.org/channel/kaniini#follows/2"
- assert User.following?(User.get_cached_by_ap_id(data["actor"]), user)
- end
-
test "it works for incoming likes" do
user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"status" => "hello"})
@@ -376,6 +418,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|> Map.put("attributedTo", user.ap_id)
|> Map.put("to", ["https://www.w3.org/ns/activitystreams#Public"])
|> Map.put("cc", [])
+ |> Map.put("id", user.ap_id <> "/activities/12345678")
data = Map.put(data, "object", object)
@@ -399,6 +442,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
|> Map.put("attributedTo", user.ap_id)
|> Map.put("to", nil)
|> Map.put("cc", nil)
+ |> Map.put("id", user.ap_id <> "/activities/12345678")
data = Map.put(data, "object", object)
@@ -408,6 +452,27 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert !is_nil(data["cc"])
end
+ test "it strips internal likes" do
+ data =
+ File.read!("test/fixtures/mastodon-post-activity.json")
+ |> Poison.decode!()
+
+ likes = %{
+ "first" =>
+ "http://mastodon.example.org/objects/dbdbc507-52c8-490d-9b7c-1e1d52e5c132/likes?page=1",
+ "id" => "http://mastodon.example.org/objects/dbdbc507-52c8-490d-9b7c-1e1d52e5c132/likes",
+ "totalItems" => 3,
+ "type" => "OrderedCollection"
+ }
+
+ object = Map.put(data["object"], "likes", likes)
+ data = Map.put(data, "object", object)
+
+ {:ok, %Activity{object: object}} = Transmogrifier.handle_incoming(data)
+
+ refute Map.has_key?(object.data, "likes")
+ end
+
test "it works for incoming update activities" do
data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!()
@@ -446,6 +511,60 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert user.bio == "<p>Some bio</p>"
end
+ test "it works with custom profile fields" do
+ {:ok, activity} =
+ "test/fixtures/mastodon-post-activity.json"
+ |> File.read!()
+ |> Poison.decode!()
+ |> Transmogrifier.handle_incoming()
+
+ user = User.get_cached_by_ap_id(activity.actor)
+
+ assert User.Info.fields(user.info) == [
+ %{"name" => "foo", "value" => "bar"},
+ %{"name" => "foo1", "value" => "bar1"}
+ ]
+
+ update_data = File.read!("test/fixtures/mastodon-update.json") |> Poison.decode!()
+
+ object =
+ update_data["object"]
+ |> Map.put("actor", user.ap_id)
+ |> Map.put("id", user.ap_id)
+
+ update_data =
+ update_data
+ |> Map.put("actor", user.ap_id)
+ |> Map.put("object", object)
+
+ {:ok, _update_activity} = Transmogrifier.handle_incoming(update_data)
+
+ user = User.get_cached_by_ap_id(user.ap_id)
+
+ assert User.Info.fields(user.info) == [
+ %{"name" => "foo", "value" => "updated"},
+ %{"name" => "foo1", "value" => "updated"}
+ ]
+
+ Pleroma.Config.put([:instance, :max_remote_account_fields], 2)
+
+ update_data =
+ put_in(update_data, ["object", "attachment"], [
+ %{"name" => "foo", "type" => "PropertyValue", "value" => "bar"},
+ %{"name" => "foo11", "type" => "PropertyValue", "value" => "bar11"},
+ %{"name" => "foo22", "type" => "PropertyValue", "value" => "bar22"}
+ ])
+
+ {:ok, _} = Transmogrifier.handle_incoming(update_data)
+
+ user = User.get_cached_by_ap_id(user.ap_id)
+
+ assert User.Info.fields(user.info) == [
+ %{"name" => "foo", "value" => "updated"},
+ %{"name" => "foo1", "value" => "updated"}
+ ]
+ end
+
test "it works for incoming update activities which lock the account" do
data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!()
@@ -505,11 +624,38 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
data
|> Map.put("object", object)
- :error = Transmogrifier.handle_incoming(data)
+ assert capture_log(fn ->
+ :error = Transmogrifier.handle_incoming(data)
+ end) =~
+ "[error] Could not decode user at fetch http://mastodon.example.org/users/gargron, {:error, {:error, :nxdomain}}"
assert Activity.get_by_id(activity.id)
end
+ test "it works for incoming user deletes" do
+ %{ap_id: ap_id} = insert(:user, ap_id: "http://mastodon.example.org/users/admin")
+
+ data =
+ File.read!("test/fixtures/mastodon-delete-user.json")
+ |> Poison.decode!()
+
+ {:ok, _} = Transmogrifier.handle_incoming(data)
+
+ refute User.get_cached_by_ap_id(ap_id)
+ end
+
+ test "it fails for incoming user deletes with spoofed origin" do
+ %{ap_id: ap_id} = insert(:user)
+
+ data =
+ File.read!("test/fixtures/mastodon-delete-user.json")
+ |> Poison.decode!()
+ |> Map.put("actor", ap_id)
+
+ assert :error == Transmogrifier.handle_incoming(data)
+ assert User.get_cached_by_ap_id(ap_id)
+ end
+
test "it works for incoming unannounces with an existing notice" do
user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"status" => "hey"})
@@ -531,10 +677,11 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
assert data["type"] == "Undo"
- assert data["object"]["type"] == "Announce"
- assert data["object"]["object"] == activity.data["object"]
+ assert object_data = data["object"]
+ assert object_data["type"] == "Announce"
+ assert object_data["object"] == activity.data["object"]
- assert data["object"]["id"] ==
+ assert object_data["id"] ==
"http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
end
@@ -844,7 +991,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
other_user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"status" => "test post"})
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
message = %{
"@context" => "https://www.w3.org/ns/activitystreams",
@@ -991,14 +1138,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert is_nil(modified["object"]["announcements"])
assert is_nil(modified["object"]["announcement_count"])
assert is_nil(modified["object"]["context_id"])
- end
-
- test "it adds like collection to object" do
- activity = insert(:note_activity)
- {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
-
- assert modified["object"]["likes"]["type"] == "OrderedCollection"
- assert modified["object"]["likes"]["totalItems"] == 0
+ assert is_nil(modified["object"]["likes"])
end
test "the directMessage flag is present" do
@@ -1028,6 +1168,18 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert modified["directMessage"] == true
end
+
+ test "it strips BCC field" do
+ user = insert(:user)
+ {:ok, list} = Pleroma.List.create("foo", user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{"status" => "foobar", "visibility" => "list:#{list.id}"})
+
+ {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data)
+
+ assert is_nil(modified["bcc"])
+ end
end
describe "user upgrade" do
@@ -1053,6 +1205,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert user.info.ap_enabled
assert user.info.note_count == 1
assert user.follower_address == "https://niu.moe/users/rye/followers"
+ assert user.following_address == "https://niu.moe/users/rye/following"
user = User.get_cached_by_id(user.id)
assert user.info.note_count == 1
@@ -1210,10 +1363,37 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
end
end
+ test "Rewrites Answers to Notes" do
+ user = insert(:user)
+
+ {:ok, poll_activity} =
+ CommonAPI.post(user, %{
+ "status" => "suya...",
+ "poll" => %{"options" => ["suya", "suya.", "suya.."], "expires_in" => 10}
+ })
+
+ poll_object = Object.normalize(poll_activity)
+ # TODO: Replace with CommonAPI vote creation when implemented
+ data =
+ File.read!("test/fixtures/mastodon-vote.json")
+ |> Poison.decode!()
+ |> Kernel.put_in(["to"], user.ap_id)
+ |> Kernel.put_in(["object", "inReplyTo"], poll_object.data["id"])
+ |> Kernel.put_in(["object", "to"], user.ap_id)
+
+ {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data)
+ {:ok, data} = Transmogrifier.prepare_outgoing(activity.data)
+
+ assert data["object"]["type"] == "Note"
+ end
+
describe "fix_explicit_addressing" do
- test "moves non-explicitly mentioned actors to cc" do
+ setup do
user = insert(:user)
+ [user: user]
+ end
+ test "moves non-explicitly mentioned actors to cc", %{user: user} do
explicitly_mentioned_actors = [
"https://pleroma.gold/users/user1",
"https://pleroma.gold/user2"
@@ -1235,9 +1415,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert "https://social.beepboop.ga/users/dirb" in fixed_object["cc"]
end
- test "does not move actor's follower collection to cc" do
- user = insert(:user)
-
+ test "does not move actor's follower collection to cc", %{user: user} do
object = %{
"actor" => user.ap_id,
"to" => [user.follower_address],
@@ -1248,5 +1426,21 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert user.follower_address in fixed_object["to"]
refute user.follower_address in fixed_object["cc"]
end
+
+ test "removes recipient's follower collection from cc", %{user: user} do
+ recipient = insert(:user)
+
+ object = %{
+ "actor" => user.ap_id,
+ "to" => [recipient.ap_id, "https://www.w3.org/ns/activitystreams#Public"],
+ "cc" => [user.follower_address, recipient.follower_address]
+ }
+
+ fixed_object = Transmogrifier.fix_explicit_addressing(object)
+
+ assert user.follower_address in fixed_object["cc"]
+ refute recipient.follower_address in fixed_object["cc"]
+ refute recipient.follower_address in fixed_object["to"]
+ end
end
end
diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs
index c57fae437..ca5f057a7 100644
--- a/test/web/activity_pub/utils_test.exs
+++ b/test/web/activity_pub/utils_test.exs
@@ -1,6 +1,12 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.ActivityPub.UtilsTest do
use Pleroma.DataCase
alias Pleroma.Activity
+ alias Pleroma.Object
+ alias Pleroma.Repo
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Utils
@@ -204,4 +210,93 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do
]
}
end
+
+ describe "get_existing_votes" do
+ test "fetches existing votes" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "How do I pronounce LaTeX?",
+ "poll" => %{
+ "options" => ["laytekh", "lahtekh", "latex"],
+ "expires_in" => 20,
+ "multiple" => true
+ }
+ })
+
+ object = Object.normalize(activity)
+ {:ok, votes, object} = CommonAPI.vote(other_user, object, [0, 1])
+ assert Enum.sort(Utils.get_existing_votes(other_user.ap_id, object)) == Enum.sort(votes)
+ end
+
+ test "fetches only Create activities" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "Are we living in a society?",
+ "poll" => %{
+ "options" => ["yes", "no"],
+ "expires_in" => 20
+ }
+ })
+
+ object = Object.normalize(activity)
+ {:ok, [vote], object} = CommonAPI.vote(other_user, object, [0])
+ vote_object = Object.normalize(vote)
+ {:ok, _activity, _object} = ActivityPub.like(user, vote_object)
+ [fetched_vote] = Utils.get_existing_votes(other_user.ap_id, object)
+ assert fetched_vote.id == vote.id
+ end
+ end
+
+ describe "update_follow_state_for_all/2" do
+ test "updates the state of all Follow activities with the same actor and object" do
+ user = insert(:user, info: %{locked: true})
+ follower = insert(:user)
+
+ {:ok, follow_activity} = ActivityPub.follow(follower, user)
+ {:ok, follow_activity_two} = ActivityPub.follow(follower, user)
+
+ data =
+ follow_activity_two.data
+ |> Map.put("state", "accept")
+
+ cng = Ecto.Changeset.change(follow_activity_two, data: data)
+
+ {:ok, follow_activity_two} = Repo.update(cng)
+
+ {:ok, follow_activity_two} =
+ Utils.update_follow_state_for_all(follow_activity_two, "accept")
+
+ assert Repo.get(Activity, follow_activity.id).data["state"] == "accept"
+ assert Repo.get(Activity, follow_activity_two.id).data["state"] == "accept"
+ end
+ end
+
+ describe "update_follow_state/2" do
+ test "updates the state of the given follow activity" do
+ user = insert(:user, info: %{locked: true})
+ follower = insert(:user)
+
+ {:ok, follow_activity} = ActivityPub.follow(follower, user)
+ {:ok, follow_activity_two} = ActivityPub.follow(follower, user)
+
+ data =
+ follow_activity_two.data
+ |> Map.put("state", "accept")
+
+ cng = Ecto.Changeset.change(follow_activity_two, data: data)
+
+ {:ok, follow_activity_two} = Repo.update(cng)
+
+ {:ok, follow_activity_two} = Utils.update_follow_state(follow_activity_two, "reject")
+
+ assert Repo.get(Activity, follow_activity.id).data["state"] == "pending"
+ assert Repo.get(Activity, follow_activity_two.id).data["state"] == "reject"
+ end
+ end
end
diff --git a/test/web/activity_pub/views/object_view_test.exs b/test/web/activity_pub/views/object_view_test.exs
index d939fc5a7..13447dc29 100644
--- a/test/web/activity_pub/views/object_view_test.exs
+++ b/test/web/activity_pub/views/object_view_test.exs
@@ -1,7 +1,12 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.ActivityPub.ObjectViewTest do
use Pleroma.DataCase
import Pleroma.Factory
+ alias Pleroma.Object
alias Pleroma.Web.ActivityPub.ObjectView
alias Pleroma.Web.CommonAPI
@@ -19,19 +24,21 @@ defmodule Pleroma.Web.ActivityPub.ObjectViewTest do
test "renders a note activity" do
note = insert(:note_activity)
+ object = Object.normalize(note)
result = ObjectView.render("object.json", %{object: note})
assert result["id"] == note.data["id"]
assert result["to"] == note.data["to"]
assert result["object"]["type"] == "Note"
- assert result["object"]["content"] == note.data["object"]["content"]
+ assert result["object"]["content"] == object.data["content"]
assert result["type"] == "Create"
assert result["@context"]
end
test "renders a like activity" do
note = insert(:note_activity)
+ object = Object.normalize(note)
user = insert(:user)
{:ok, like_activity, _} = CommonAPI.favorite(note.id, user)
@@ -39,12 +46,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectViewTest do
result = ObjectView.render("object.json", %{object: like_activity})
assert result["id"] == like_activity.data["id"]
- assert result["object"] == note.data["object"]["id"]
+ assert result["object"] == object.data["id"]
assert result["type"] == "Like"
end
test "renders an announce activity" do
note = insert(:note_activity)
+ object = Object.normalize(note)
user = insert(:user)
{:ok, announce_activity, _} = CommonAPI.repeat(note.id, user)
@@ -52,7 +60,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectViewTest do
result = ObjectView.render("object.json", %{object: announce_activity})
assert result["id"] == announce_activity.data["id"]
- assert result["object"] == note.data["object"]["id"]
+ assert result["object"] == object.data["id"]
assert result["type"] == "Announce"
end
end
diff --git a/test/web/activity_pub/views/user_view_test.exs b/test/web/activity_pub/views/user_view_test.exs
index e6483db8b..fb7fd9e79 100644
--- a/test/web/activity_pub/views/user_view_test.exs
+++ b/test/web/activity_pub/views/user_view_test.exs
@@ -1,9 +1,14 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.ActivityPub.UserViewTest do
use Pleroma.DataCase
import Pleroma.Factory
alias Pleroma.User
alias Pleroma.Web.ActivityPub.UserView
+ alias Pleroma.Web.CommonAPI
test "Renders a user, including the public key" do
user = insert(:user)
@@ -17,6 +22,21 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do
assert String.contains?(result["publicKey"]["publicKeyPem"], "BEGIN PUBLIC KEY")
end
+ test "Renders profile fields" do
+ fields = [
+ %{"name" => "foo", "value" => "bar"}
+ ]
+
+ {:ok, user} =
+ insert(:user)
+ |> User.upgrade_changeset(%{info: %{fields: fields}})
+ |> User.update_and_set_cache()
+
+ assert %{
+ "attachment" => [%{"name" => "foo", "type" => "PropertyValue", "value" => "bar"}]
+ } = UserView.render("user.json", %{user: user})
+ end
+
test "Does not add an avatar image if the user hasn't set one" do
user = insert(:user)
{:ok, user} = User.ensure_keys_present(user)
@@ -78,4 +98,28 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do
refute result["endpoints"]["oauthTokenEndpoint"]
end
end
+
+ describe "followers" do
+ test "sets totalItems to zero when followers are hidden" do
+ user = insert(:user)
+ other_user = insert(:user)
+ {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user)
+ assert %{"totalItems" => 1} = UserView.render("followers.json", %{user: user})
+ info = Map.put(user.info, :hide_followers, true)
+ user = Map.put(user, :info, info)
+ assert %{"totalItems" => 0} = UserView.render("followers.json", %{user: user})
+ end
+ end
+
+ describe "following" do
+ test "sets totalItems to zero when follows are hidden" do
+ user = insert(:user)
+ other_user = insert(:user)
+ {:ok, user, _other_user, _activity} = CommonAPI.follow(user, other_user)
+ assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user})
+ info = Map.put(user.info, :hide_follows, true)
+ user = Map.put(user, :info, info)
+ assert %{"totalItems" => 0} = UserView.render("following.json", %{user: user})
+ end
+ end
end
diff --git a/test/web/activity_pub/visibilty_test.exs b/test/web/activity_pub/visibilty_test.exs
index e2584f635..b62a89e68 100644
--- a/test/web/activity_pub/visibilty_test.exs
+++ b/test/web/activity_pub/visibilty_test.exs
@@ -1,6 +1,11 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.ActivityPub.VisibilityTest do
use Pleroma.DataCase
+ alias Pleroma.Activity
alias Pleroma.Web.ActivityPub.Visibility
alias Pleroma.Web.CommonAPI
import Pleroma.Factory
@@ -11,6 +16,9 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do
following = insert(:user)
unrelated = insert(:user)
{:ok, following} = Pleroma.User.follow(following, user)
+ {:ok, list} = Pleroma.List.create("foo", user)
+
+ Pleroma.List.follow(list, unrelated)
{:ok, public} =
CommonAPI.post(user, %{"status" => "@#{mentioned.nickname}", "visibility" => "public"})
@@ -24,6 +32,12 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do
{:ok, unlisted} =
CommonAPI.post(user, %{"status" => "@#{mentioned.nickname}", "visibility" => "unlisted"})
+ {:ok, list} =
+ CommonAPI.post(user, %{
+ "status" => "@#{mentioned.nickname}",
+ "visibility" => "list:#{list.id}"
+ })
+
%{
public: public,
private: private,
@@ -32,29 +46,65 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do
user: user,
mentioned: mentioned,
following: following,
- unrelated: unrelated
+ unrelated: unrelated,
+ list: list
}
end
- test "is_direct?", %{public: public, private: private, direct: direct, unlisted: unlisted} do
+ test "is_direct?", %{
+ public: public,
+ private: private,
+ direct: direct,
+ unlisted: unlisted,
+ list: list
+ } do
assert Visibility.is_direct?(direct)
refute Visibility.is_direct?(public)
refute Visibility.is_direct?(private)
refute Visibility.is_direct?(unlisted)
+ assert Visibility.is_direct?(list)
end
- test "is_public?", %{public: public, private: private, direct: direct, unlisted: unlisted} do
+ test "is_public?", %{
+ public: public,
+ private: private,
+ direct: direct,
+ unlisted: unlisted,
+ list: list
+ } do
refute Visibility.is_public?(direct)
assert Visibility.is_public?(public)
refute Visibility.is_public?(private)
assert Visibility.is_public?(unlisted)
+ refute Visibility.is_public?(list)
end
- test "is_private?", %{public: public, private: private, direct: direct, unlisted: unlisted} do
+ test "is_private?", %{
+ public: public,
+ private: private,
+ direct: direct,
+ unlisted: unlisted,
+ list: list
+ } do
refute Visibility.is_private?(direct)
refute Visibility.is_private?(public)
assert Visibility.is_private?(private)
refute Visibility.is_private?(unlisted)
+ refute Visibility.is_private?(list)
+ end
+
+ test "is_list?", %{
+ public: public,
+ private: private,
+ direct: direct,
+ unlisted: unlisted,
+ list: list
+ } do
+ refute Visibility.is_list?(direct)
+ refute Visibility.is_list?(public)
+ refute Visibility.is_list?(private)
+ refute Visibility.is_list?(unlisted)
+ assert Visibility.is_list?(list)
end
test "visible_for_user?", %{
@@ -65,7 +115,8 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do
user: user,
mentioned: mentioned,
following: following,
- unrelated: unrelated
+ unrelated: unrelated,
+ list: list
} do
# All visible to author
@@ -73,6 +124,7 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do
assert Visibility.visible_for_user?(private, user)
assert Visibility.visible_for_user?(unlisted, user)
assert Visibility.visible_for_user?(direct, user)
+ assert Visibility.visible_for_user?(list, user)
# All visible to a mentioned user
@@ -80,6 +132,7 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do
assert Visibility.visible_for_user?(private, mentioned)
assert Visibility.visible_for_user?(unlisted, mentioned)
assert Visibility.visible_for_user?(direct, mentioned)
+ assert Visibility.visible_for_user?(list, mentioned)
# DM not visible for just follower
@@ -87,6 +140,7 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do
assert Visibility.visible_for_user?(private, following)
assert Visibility.visible_for_user?(unlisted, following)
refute Visibility.visible_for_user?(direct, following)
+ refute Visibility.visible_for_user?(list, following)
# Public and unlisted visible for unrelated user
@@ -94,6 +148,9 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do
assert Visibility.visible_for_user?(unlisted, unrelated)
refute Visibility.visible_for_user?(private, unrelated)
refute Visibility.visible_for_user?(direct, unrelated)
+
+ # Visible for a list member
+ assert Visibility.visible_for_user?(list, unrelated)
end
test "doesn't die when the user doesn't exist",
@@ -110,11 +167,63 @@ defmodule Pleroma.Web.ActivityPub.VisibilityTest do
public: public,
private: private,
direct: direct,
- unlisted: unlisted
+ unlisted: unlisted,
+ list: list
} do
assert Visibility.get_visibility(public) == "public"
assert Visibility.get_visibility(private) == "private"
assert Visibility.get_visibility(direct) == "direct"
assert Visibility.get_visibility(unlisted) == "unlisted"
+ assert Visibility.get_visibility(list) == "list"
+ end
+
+ test "get_visibility with directMessage flag" do
+ assert Visibility.get_visibility(%{data: %{"directMessage" => true}}) == "direct"
+ end
+
+ test "get_visibility with listMessage flag" do
+ assert Visibility.get_visibility(%{data: %{"listMessage" => ""}}) == "list"
+ end
+
+ describe "entire_thread_visible_for_user?/2" do
+ test "returns false if not found activity", %{user: user} do
+ refute Visibility.entire_thread_visible_for_user?(%Activity{}, user)
+ end
+
+ test "returns true if activity hasn't 'Create' type", %{user: user} do
+ activity = insert(:like_activity)
+ assert Visibility.entire_thread_visible_for_user?(activity, user)
+ end
+
+ test "returns false when invalid recipients", %{user: user} do
+ author = insert(:user)
+
+ activity =
+ insert(:note_activity,
+ note:
+ insert(:note,
+ user: author,
+ data: %{"to" => ["test-user"]}
+ )
+ )
+
+ refute Visibility.entire_thread_visible_for_user?(activity, user)
+ end
+
+ test "returns true if user following to author" do
+ author = insert(:user)
+ user = insert(:user, following: [author.ap_id])
+
+ activity =
+ insert(:note_activity,
+ note:
+ insert(:note,
+ user: author,
+ data: %{"to" => [user.ap_id]}
+ )
+ )
+
+ assert Visibility.entire_thread_visible_for_user?(activity, user)
+ end
end
end
diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs
index 86b160246..ab829d6bd 100644
--- a/test/web/admin_api/admin_api_controller_test.exs
+++ b/test/web/admin_api/admin_api_controller_test.exs
@@ -6,9 +6,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
use Pleroma.Web.ConnCase
alias Pleroma.Activity
+ alias Pleroma.HTML
alias Pleroma.User
alias Pleroma.UserInviteToken
alias Pleroma.Web.CommonAPI
+ alias Pleroma.Web.MediaProxy
import Pleroma.Factory
describe "/api/pleroma/admin/users" do
@@ -177,7 +179,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"local" => true,
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
assert expected == json_response(conn, 200)
@@ -409,18 +413,15 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
describe "POST /api/pleroma/admin/email_invite, with valid config" do
setup do
- registrations_open = Pleroma.Config.get([:instance, :registrations_open])
- invites_enabled = Pleroma.Config.get([:instance, :invites_enabled])
- Pleroma.Config.put([:instance, :registrations_open], false)
- Pleroma.Config.put([:instance, :invites_enabled], true)
+ [user: insert(:user, info: %{is_admin: true})]
+ end
- on_exit(fn ->
- Pleroma.Config.put([:instance, :registrations_open], registrations_open)
- Pleroma.Config.put([:instance, :invites_enabled], invites_enabled)
- :ok
- end)
+ clear_config([:instance, :registrations_open]) do
+ Pleroma.Config.put([:instance, :registrations_open], false)
+ end
- [user: insert(:user, info: %{is_admin: true})]
+ clear_config([:instance, :invites_enabled]) do
+ Pleroma.Config.put([:instance, :invites_enabled], true)
end
test "sends invitation and returns 204", %{conn: conn, user: user} do
@@ -475,18 +476,13 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
[user: insert(:user, info: %{is_admin: true})]
end
+ clear_config([:instance, :registrations_open])
+ clear_config([:instance, :invites_enabled])
+
test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn, user: user} do
- registrations_open = Pleroma.Config.get([:instance, :registrations_open])
- invites_enabled = Pleroma.Config.get([:instance, :invites_enabled])
Pleroma.Config.put([:instance, :registrations_open], false)
Pleroma.Config.put([:instance, :invites_enabled], false)
- on_exit(fn ->
- Pleroma.Config.put([:instance, :registrations_open], registrations_open)
- Pleroma.Config.put([:instance, :invites_enabled], invites_enabled)
- :ok
- end)
-
conn =
conn
|> assign(:user, user)
@@ -496,17 +492,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
end
test "it returns 500 if `registrations_open` is enabled", %{conn: conn, user: user} do
- registrations_open = Pleroma.Config.get([:instance, :registrations_open])
- invites_enabled = Pleroma.Config.get([:instance, :invites_enabled])
Pleroma.Config.put([:instance, :registrations_open], true)
Pleroma.Config.put([:instance, :invites_enabled], true)
- on_exit(fn ->
- Pleroma.Config.put([:instance, :registrations_open], registrations_open)
- Pleroma.Config.put([:instance, :invites_enabled], invites_enabled)
- :ok
- end)
-
conn =
conn
|> assign(:user, user)
@@ -564,7 +552,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => admin.nickname,
"roles" => %{"admin" => true, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(admin) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(admin.name || admin.nickname)
},
%{
"deactivated" => user.info.deactivated,
@@ -572,7 +562,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => false,
- "tags" => ["foo", "bar"]
+ "tags" => ["foo", "bar"],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
]
|> Enum.sort_by(& &1["nickname"])
@@ -611,7 +603,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
]
}
@@ -633,7 +627,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
]
}
@@ -655,7 +651,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
]
}
@@ -677,7 +675,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
]
}
@@ -699,7 +699,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
]
}
@@ -721,7 +723,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
]
}
@@ -738,7 +742,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user2.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user2) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user2.name || user2.nickname)
}
]
}
@@ -765,7 +771,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
]
}
@@ -790,7 +798,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
},
%{
"deactivated" => admin.info.deactivated,
@@ -798,7 +808,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => admin.nickname,
"roles" => %{"admin" => true, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(admin) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(admin.name || admin.nickname)
},
%{
"deactivated" => false,
@@ -806,7 +818,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"local" => true,
"nickname" => old_admin.nickname,
"roles" => %{"admin" => true, "moderator" => false},
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(old_admin) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(old_admin.name || old_admin.nickname)
}
]
|> Enum.sort_by(& &1["nickname"])
@@ -833,7 +847,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => admin.nickname,
"roles" => %{"admin" => true, "moderator" => false},
"local" => admin.local,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(admin) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(admin.name || admin.nickname)
},
%{
"deactivated" => false,
@@ -841,7 +857,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => second_admin.nickname,
"roles" => %{"admin" => true, "moderator" => false},
"local" => second_admin.local,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(second_admin) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(second_admin.name || second_admin.nickname)
}
]
|> Enum.sort_by(& &1["nickname"])
@@ -870,7 +888,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => moderator.nickname,
"roles" => %{"admin" => false, "moderator" => true},
"local" => moderator.local,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(moderator) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(moderator.name || moderator.nickname)
}
]
}
@@ -892,7 +912,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user1.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => user1.local,
- "tags" => ["first"]
+ "tags" => ["first"],
+ "avatar" => User.avatar_url(user1) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user1.name || user1.nickname)
},
%{
"deactivated" => false,
@@ -900,7 +922,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user2.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => user2.local,
- "tags" => ["second"]
+ "tags" => ["second"],
+ "avatar" => User.avatar_url(user2) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user2.name || user2.nickname)
}
]
|> Enum.sort_by(& &1["nickname"])
@@ -934,7 +958,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => user.local,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
]
}
@@ -957,7 +983,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"nickname" => user.nickname,
"roles" => %{"admin" => false, "moderator" => false},
"local" => true,
- "tags" => []
+ "tags" => [],
+ "avatar" => User.avatar_url(user) |> MediaProxy.url(),
+ "display_name" => HTML.strip_tags(user.name || user.nickname)
}
end
@@ -1085,6 +1113,17 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
"uses" => 0
}
end
+
+ test "with invalid token" do
+ admin = insert(:user, info: %{is_admin: true})
+
+ conn =
+ build_conn()
+ |> assign(:user, admin)
+ |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"})
+
+ assert json_response(conn, :not_found) == "Not found"
+ end
end
describe "GET /api/pleroma/admin/reports/:id" do
@@ -1309,7 +1348,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
recipients = Enum.map(response["mentions"], & &1["username"])
- assert conn.assigns[:user].nickname in recipients
assert reporter.nickname in recipients
assert response["content"] == "I will check it out"
assert response["visibility"] == "direct"
@@ -1411,4 +1449,701 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
assert json_response(conn, :bad_request) == "Could not delete"
end
end
+
+ describe "GET /api/pleroma/admin/config" do
+ setup %{conn: conn} do
+ admin = insert(:user, info: %{is_admin: true})
+
+ %{conn: assign(conn, :user, admin)}
+ end
+
+ test "without any settings in db", %{conn: conn} do
+ conn = get(conn, "/api/pleroma/admin/config")
+
+ assert json_response(conn, 200) == %{"configs" => []}
+ end
+
+ test "with settings in db", %{conn: conn} do
+ config1 = insert(:config)
+ config2 = insert(:config)
+
+ conn = get(conn, "/api/pleroma/admin/config")
+
+ %{
+ "configs" => [
+ %{
+ "key" => key1,
+ "value" => _
+ },
+ %{
+ "key" => key2,
+ "value" => _
+ }
+ ]
+ } = json_response(conn, 200)
+
+ assert key1 == config1.key
+ assert key2 == config2.key
+ end
+ end
+
+ describe "POST /api/pleroma/admin/config" do
+ setup %{conn: conn} do
+ admin = insert(:user, info: %{is_admin: true})
+
+ temp_file = "config/test.exported_from_db.secret.exs"
+
+ on_exit(fn ->
+ Application.delete_env(:pleroma, :key1)
+ Application.delete_env(:pleroma, :key2)
+ Application.delete_env(:pleroma, :key3)
+ Application.delete_env(:pleroma, :key4)
+ Application.delete_env(:pleroma, :keyaa1)
+ Application.delete_env(:pleroma, :keyaa2)
+ Application.delete_env(:pleroma, Pleroma.Web.Endpoint.NotReal)
+ Application.delete_env(:pleroma, Pleroma.Captcha.NotReal)
+ :ok = File.rm(temp_file)
+ end)
+
+ %{conn: assign(conn, :user, admin)}
+ end
+
+ clear_config([:instance, :dynamic_configuration]) do
+ Pleroma.Config.put([:instance, :dynamic_configuration], true)
+ end
+
+ test "create new config setting in db", %{conn: conn} do
+ conn =
+ post(conn, "/api/pleroma/admin/config", %{
+ configs: [
+ %{group: "pleroma", key: "key1", value: "value1"},
+ %{
+ group: "ueberauth",
+ key: "Ueberauth.Strategy.Twitter.OAuth",
+ value: [%{"tuple" => [":consumer_secret", "aaaa"]}]
+ },
+ %{
+ group: "pleroma",
+ key: "key2",
+ value: %{
+ ":nested_1" => "nested_value1",
+ ":nested_2" => [
+ %{":nested_22" => "nested_value222"},
+ %{":nested_33" => %{":nested_44" => "nested_444"}}
+ ]
+ }
+ },
+ %{
+ group: "pleroma",
+ key: "key3",
+ value: [
+ %{"nested_3" => ":nested_3", "nested_33" => "nested_33"},
+ %{"nested_4" => true}
+ ]
+ },
+ %{
+ group: "pleroma",
+ key: "key4",
+ value: %{":nested_5" => ":upload", "endpoint" => "https://example.com"}
+ },
+ %{
+ group: "idna",
+ key: "key5",
+ value: %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}
+ }
+ ]
+ })
+
+ assert json_response(conn, 200) == %{
+ "configs" => [
+ %{
+ "group" => "pleroma",
+ "key" => "key1",
+ "value" => "value1"
+ },
+ %{
+ "group" => "ueberauth",
+ "key" => "Ueberauth.Strategy.Twitter.OAuth",
+ "value" => [%{"tuple" => [":consumer_secret", "aaaa"]}]
+ },
+ %{
+ "group" => "pleroma",
+ "key" => "key2",
+ "value" => %{
+ ":nested_1" => "nested_value1",
+ ":nested_2" => [
+ %{":nested_22" => "nested_value222"},
+ %{":nested_33" => %{":nested_44" => "nested_444"}}
+ ]
+ }
+ },
+ %{
+ "group" => "pleroma",
+ "key" => "key3",
+ "value" => [
+ %{"nested_3" => ":nested_3", "nested_33" => "nested_33"},
+ %{"nested_4" => true}
+ ]
+ },
+ %{
+ "group" => "pleroma",
+ "key" => "key4",
+ "value" => %{"endpoint" => "https://example.com", ":nested_5" => ":upload"}
+ },
+ %{
+ "group" => "idna",
+ "key" => "key5",
+ "value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}
+ }
+ ]
+ }
+
+ assert Application.get_env(:pleroma, :key1) == "value1"
+
+ assert Application.get_env(:pleroma, :key2) == %{
+ nested_1: "nested_value1",
+ nested_2: [
+ %{nested_22: "nested_value222"},
+ %{nested_33: %{nested_44: "nested_444"}}
+ ]
+ }
+
+ assert Application.get_env(:pleroma, :key3) == [
+ %{"nested_3" => :nested_3, "nested_33" => "nested_33"},
+ %{"nested_4" => true}
+ ]
+
+ assert Application.get_env(:pleroma, :key4) == %{
+ "endpoint" => "https://example.com",
+ nested_5: :upload
+ }
+
+ assert Application.get_env(:idna, :key5) == {"string", Pleroma.Captcha.NotReal, []}
+ end
+
+ test "update config setting & delete", %{conn: conn} do
+ config1 = insert(:config, key: "keyaa1")
+ config2 = insert(:config, key: "keyaa2")
+
+ insert(:config,
+ group: "ueberauth",
+ key: "Ueberauth.Strategy.Microsoft.OAuth",
+ value: :erlang.term_to_binary([])
+ )
+
+ conn =
+ post(conn, "/api/pleroma/admin/config", %{
+ configs: [
+ %{group: config1.group, key: config1.key, value: "another_value"},
+ %{group: config2.group, key: config2.key, delete: "true"},
+ %{
+ group: "ueberauth",
+ key: "Ueberauth.Strategy.Microsoft.OAuth",
+ delete: "true"
+ }
+ ]
+ })
+
+ assert json_response(conn, 200) == %{
+ "configs" => [
+ %{
+ "group" => "pleroma",
+ "key" => config1.key,
+ "value" => "another_value"
+ }
+ ]
+ }
+
+ assert Application.get_env(:pleroma, :keyaa1) == "another_value"
+ refute Application.get_env(:pleroma, :keyaa2)
+ end
+
+ test "common config example", %{conn: conn} do
+ conn =
+ post(conn, "/api/pleroma/admin/config", %{
+ configs: [
+ %{
+ "group" => "pleroma",
+ "key" => "Pleroma.Captcha.NotReal",
+ "value" => [
+ %{"tuple" => [":enabled", false]},
+ %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]},
+ %{"tuple" => [":seconds_valid", 60]},
+ %{"tuple" => [":path", ""]},
+ %{"tuple" => [":key1", nil]},
+ %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}
+ ]
+ }
+ ]
+ })
+
+ assert json_response(conn, 200) == %{
+ "configs" => [
+ %{
+ "group" => "pleroma",
+ "key" => "Pleroma.Captcha.NotReal",
+ "value" => [
+ %{"tuple" => [":enabled", false]},
+ %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]},
+ %{"tuple" => [":seconds_valid", 60]},
+ %{"tuple" => [":path", ""]},
+ %{"tuple" => [":key1", nil]},
+ %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}
+ ]
+ }
+ ]
+ }
+ end
+
+ test "tuples with more than two values", %{conn: conn} do
+ conn =
+ post(conn, "/api/pleroma/admin/config", %{
+ configs: [
+ %{
+ "group" => "pleroma",
+ "key" => "Pleroma.Web.Endpoint.NotReal",
+ "value" => [
+ %{
+ "tuple" => [
+ ":http",
+ [
+ %{
+ "tuple" => [
+ ":key2",
+ [
+ %{
+ "tuple" => [
+ ":_",
+ [
+ %{
+ "tuple" => [
+ "/api/v1/streaming",
+ "Pleroma.Web.MastodonAPI.WebsocketHandler",
+ []
+ ]
+ },
+ %{
+ "tuple" => [
+ "/websocket",
+ "Phoenix.Endpoint.CowboyWebSocket",
+ %{
+ "tuple" => [
+ "Phoenix.Transports.WebSocket",
+ %{
+ "tuple" => [
+ "Pleroma.Web.Endpoint",
+ "Pleroma.Web.UserSocket",
+ []
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ %{
+ "tuple" => [
+ ":_",
+ "Phoenix.Endpoint.Cowboy2Handler",
+ %{"tuple" => ["Pleroma.Web.Endpoint", []]}
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ }
+ ]
+ })
+
+ assert json_response(conn, 200) == %{
+ "configs" => [
+ %{
+ "group" => "pleroma",
+ "key" => "Pleroma.Web.Endpoint.NotReal",
+ "value" => [
+ %{
+ "tuple" => [
+ ":http",
+ [
+ %{
+ "tuple" => [
+ ":key2",
+ [
+ %{
+ "tuple" => [
+ ":_",
+ [
+ %{
+ "tuple" => [
+ "/api/v1/streaming",
+ "Pleroma.Web.MastodonAPI.WebsocketHandler",
+ []
+ ]
+ },
+ %{
+ "tuple" => [
+ "/websocket",
+ "Phoenix.Endpoint.CowboyWebSocket",
+ %{
+ "tuple" => [
+ "Phoenix.Transports.WebSocket",
+ %{
+ "tuple" => [
+ "Pleroma.Web.Endpoint",
+ "Pleroma.Web.UserSocket",
+ []
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ %{
+ "tuple" => [
+ ":_",
+ "Phoenix.Endpoint.Cowboy2Handler",
+ %{"tuple" => ["Pleroma.Web.Endpoint", []]}
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ end
+
+ test "settings with nesting map", %{conn: conn} do
+ conn =
+ post(conn, "/api/pleroma/admin/config", %{
+ configs: [
+ %{
+ "group" => "pleroma",
+ "key" => ":key1",
+ "value" => [
+ %{"tuple" => [":key2", "some_val"]},
+ %{
+ "tuple" => [
+ ":key3",
+ %{
+ ":max_options" => 20,
+ ":max_option_chars" => 200,
+ ":min_expiration" => 0,
+ ":max_expiration" => 31_536_000,
+ "nested" => %{
+ ":max_options" => 20,
+ ":max_option_chars" => 200,
+ ":min_expiration" => 0,
+ ":max_expiration" => 31_536_000
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ })
+
+ assert json_response(conn, 200) ==
+ %{
+ "configs" => [
+ %{
+ "group" => "pleroma",
+ "key" => ":key1",
+ "value" => [
+ %{"tuple" => [":key2", "some_val"]},
+ %{
+ "tuple" => [
+ ":key3",
+ %{
+ ":max_expiration" => 31_536_000,
+ ":max_option_chars" => 200,
+ ":max_options" => 20,
+ ":min_expiration" => 0,
+ "nested" => %{
+ ":max_expiration" => 31_536_000,
+ ":max_option_chars" => 200,
+ ":max_options" => 20,
+ ":min_expiration" => 0
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ end
+
+ test "value as map", %{conn: conn} do
+ conn =
+ post(conn, "/api/pleroma/admin/config", %{
+ configs: [
+ %{
+ "group" => "pleroma",
+ "key" => ":key1",
+ "value" => %{"key" => "some_val"}
+ }
+ ]
+ })
+
+ assert json_response(conn, 200) ==
+ %{
+ "configs" => [
+ %{
+ "group" => "pleroma",
+ "key" => ":key1",
+ "value" => %{"key" => "some_val"}
+ }
+ ]
+ }
+ end
+
+ test "dispatch setting", %{conn: conn} do
+ conn =
+ post(conn, "/api/pleroma/admin/config", %{
+ configs: [
+ %{
+ "group" => "pleroma",
+ "key" => "Pleroma.Web.Endpoint.NotReal",
+ "value" => [
+ %{
+ "tuple" => [
+ ":http",
+ [
+ %{"tuple" => [":ip", %{"tuple" => [127, 0, 0, 1]}]},
+ %{"tuple" => [":dispatch", ["{:_,
+ [
+ {\"/api/v1/streaming\", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
+ {\"/websocket\", Phoenix.Endpoint.CowboyWebSocket,
+ {Phoenix.Transports.WebSocket,
+ {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: \"/websocket\"]}}},
+ {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
+ ]}"]]}
+ ]
+ ]
+ }
+ ]
+ }
+ ]
+ })
+
+ dispatch_string =
+ "{:_, [{\"/api/v1/streaming\", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, " <>
+ "{\"/websocket\", Phoenix.Endpoint.CowboyWebSocket, {Phoenix.Transports.WebSocket, " <>
+ "{Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: \"/websocket\"]}}}, " <>
+ "{:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}]}"
+
+ assert json_response(conn, 200) == %{
+ "configs" => [
+ %{
+ "group" => "pleroma",
+ "key" => "Pleroma.Web.Endpoint.NotReal",
+ "value" => [
+ %{
+ "tuple" => [
+ ":http",
+ [
+ %{"tuple" => [":ip", %{"tuple" => [127, 0, 0, 1]}]},
+ %{
+ "tuple" => [
+ ":dispatch",
+ [
+ dispatch_string
+ ]
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ end
+
+ test "queues key as atom", %{conn: conn} do
+ conn =
+ post(conn, "/api/pleroma/admin/config", %{
+ configs: [
+ %{
+ "group" => "pleroma_job_queue",
+ "key" => ":queues",
+ "value" => [
+ %{"tuple" => [":federator_incoming", 50]},
+ %{"tuple" => [":federator_outgoing", 50]},
+ %{"tuple" => [":web_push", 50]},
+ %{"tuple" => [":mailer", 10]},
+ %{"tuple" => [":transmogrifier", 20]},
+ %{"tuple" => [":scheduled_activities", 10]},
+ %{"tuple" => [":background", 5]}
+ ]
+ }
+ ]
+ })
+
+ assert json_response(conn, 200) == %{
+ "configs" => [
+ %{
+ "group" => "pleroma_job_queue",
+ "key" => ":queues",
+ "value" => [
+ %{"tuple" => [":federator_incoming", 50]},
+ %{"tuple" => [":federator_outgoing", 50]},
+ %{"tuple" => [":web_push", 50]},
+ %{"tuple" => [":mailer", 10]},
+ %{"tuple" => [":transmogrifier", 20]},
+ %{"tuple" => [":scheduled_activities", 10]},
+ %{"tuple" => [":background", 5]}
+ ]
+ }
+ ]
+ }
+ end
+
+ test "delete part of settings by atom subkeys", %{conn: conn} do
+ config =
+ insert(:config,
+ key: "keyaa1",
+ value: :erlang.term_to_binary(subkey1: "val1", subkey2: "val2", subkey3: "val3")
+ )
+
+ conn =
+ post(conn, "/api/pleroma/admin/config", %{
+ configs: [
+ %{
+ group: config.group,
+ key: config.key,
+ subkeys: [":subkey1", ":subkey3"],
+ delete: "true"
+ }
+ ]
+ })
+
+ assert(
+ json_response(conn, 200) == %{
+ "configs" => [
+ %{
+ "group" => "pleroma",
+ "key" => "keyaa1",
+ "value" => [%{"tuple" => [":subkey2", "val2"]}]
+ }
+ ]
+ }
+ )
+ end
+ end
+
+ describe "config mix tasks run" do
+ setup %{conn: conn} do
+ admin = insert(:user, info: %{is_admin: true})
+
+ temp_file = "config/test.exported_from_db.secret.exs"
+
+ Mix.shell(Mix.Shell.Quiet)
+
+ on_exit(fn ->
+ Mix.shell(Mix.Shell.IO)
+ :ok = File.rm(temp_file)
+ end)
+
+ %{conn: assign(conn, :user, admin), admin: admin}
+ end
+
+ clear_config([:instance, :dynamic_configuration]) do
+ Pleroma.Config.put([:instance, :dynamic_configuration], true)
+ end
+
+ test "transfer settings to DB and to file", %{conn: conn, admin: admin} do
+ assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) == []
+ conn = get(conn, "/api/pleroma/admin/config/migrate_to_db")
+ assert json_response(conn, 200) == %{}
+ assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) > 0
+
+ conn =
+ build_conn()
+ |> assign(:user, admin)
+ |> get("/api/pleroma/admin/config/migrate_from_db")
+
+ assert json_response(conn, 200) == %{}
+ assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) == []
+ end
+ end
+
+ describe "GET /api/pleroma/admin/users/:nickname/statuses" do
+ setup do
+ admin = insert(:user, info: %{is_admin: true})
+ user = insert(:user)
+
+ date1 = (DateTime.to_unix(DateTime.utc_now()) + 2000) |> DateTime.from_unix!()
+ date2 = (DateTime.to_unix(DateTime.utc_now()) + 1000) |> DateTime.from_unix!()
+ date3 = (DateTime.to_unix(DateTime.utc_now()) + 3000) |> DateTime.from_unix!()
+
+ insert(:note_activity, user: user, published: date1)
+ insert(:note_activity, user: user, published: date2)
+ insert(:note_activity, user: user, published: date3)
+
+ conn =
+ build_conn()
+ |> assign(:user, admin)
+
+ {:ok, conn: conn, user: user}
+ end
+
+ test "renders user's statuses", %{conn: conn, user: user} do
+ conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses")
+
+ assert json_response(conn, 200) |> length() == 3
+ end
+
+ test "renders user's statuses with a limit", %{conn: conn, user: user} do
+ conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?page_size=2")
+
+ assert json_response(conn, 200) |> length() == 2
+ end
+
+ test "doesn't return private statuses by default", %{conn: conn, user: user} do
+ {:ok, _private_status} =
+ CommonAPI.post(user, %{"status" => "private", "visibility" => "private"})
+
+ {:ok, _public_status} =
+ CommonAPI.post(user, %{"status" => "public", "visibility" => "public"})
+
+ conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses")
+
+ assert json_response(conn, 200) |> length() == 4
+ end
+
+ test "returns private statuses with godmode on", %{conn: conn, user: user} do
+ {:ok, _private_status} =
+ CommonAPI.post(user, %{"status" => "private", "visibility" => "private"})
+
+ {:ok, _public_status} =
+ CommonAPI.post(user, %{"status" => "public", "visibility" => "public"})
+
+ conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?godmode=true")
+
+ assert json_response(conn, 200) |> length() == 5
+ end
+ end
+end
+
+# Needed for testing
+defmodule Pleroma.Web.Endpoint.NotReal do
+end
+
+defmodule Pleroma.Captcha.NotReal do
end
diff --git a/test/web/admin_api/config_test.exs b/test/web/admin_api/config_test.exs
new file mode 100644
index 000000000..3190dc1c8
--- /dev/null
+++ b/test/web/admin_api/config_test.exs
@@ -0,0 +1,473 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.AdminAPI.ConfigTest do
+ use Pleroma.DataCase, async: true
+ import Pleroma.Factory
+ alias Pleroma.Web.AdminAPI.Config
+
+ test "get_by_key/1" do
+ config = insert(:config)
+ insert(:config)
+
+ assert config == Config.get_by_params(%{group: config.group, key: config.key})
+ end
+
+ test "create/1" do
+ {:ok, config} = Config.create(%{group: "pleroma", key: "some_key", value: "some_value"})
+ assert config == Config.get_by_params(%{group: "pleroma", key: "some_key"})
+ end
+
+ test "update/1" do
+ config = insert(:config)
+ {:ok, updated} = Config.update(config, %{value: "some_value"})
+ loaded = Config.get_by_params(%{group: config.group, key: config.key})
+ assert loaded == updated
+ end
+
+ test "update_or_create/1" do
+ config = insert(:config)
+ key2 = "another_key"
+
+ params = [
+ %{group: "pleroma", key: key2, value: "another_value"},
+ %{group: config.group, key: config.key, value: "new_value"}
+ ]
+
+ assert Repo.all(Config) |> length() == 1
+
+ Enum.each(params, &Config.update_or_create(&1))
+
+ assert Repo.all(Config) |> length() == 2
+
+ config1 = Config.get_by_params(%{group: config.group, key: config.key})
+ config2 = Config.get_by_params(%{group: "pleroma", key: key2})
+
+ assert config1.value == Config.transform("new_value")
+ assert config2.value == Config.transform("another_value")
+ end
+
+ test "delete/1" do
+ config = insert(:config)
+ {:ok, _} = Config.delete(%{key: config.key, group: config.group})
+ refute Config.get_by_params(%{key: config.key, group: config.group})
+ end
+
+ describe "transform/1" do
+ test "string" do
+ binary = Config.transform("value as string")
+ assert binary == :erlang.term_to_binary("value as string")
+ assert Config.from_binary(binary) == "value as string"
+ end
+
+ test "boolean" do
+ binary = Config.transform(false)
+ assert binary == :erlang.term_to_binary(false)
+ assert Config.from_binary(binary) == false
+ end
+
+ test "nil" do
+ binary = Config.transform(nil)
+ assert binary == :erlang.term_to_binary(nil)
+ assert Config.from_binary(binary) == nil
+ end
+
+ test "integer" do
+ binary = Config.transform(150)
+ assert binary == :erlang.term_to_binary(150)
+ assert Config.from_binary(binary) == 150
+ end
+
+ test "atom" do
+ binary = Config.transform(":atom")
+ assert binary == :erlang.term_to_binary(:atom)
+ assert Config.from_binary(binary) == :atom
+ end
+
+ test "pleroma module" do
+ binary = Config.transform("Pleroma.Bookmark")
+ assert binary == :erlang.term_to_binary(Pleroma.Bookmark)
+ assert Config.from_binary(binary) == Pleroma.Bookmark
+ end
+
+ test "phoenix module" do
+ binary = Config.transform("Phoenix.Socket.V1.JSONSerializer")
+ assert binary == :erlang.term_to_binary(Phoenix.Socket.V1.JSONSerializer)
+ assert Config.from_binary(binary) == Phoenix.Socket.V1.JSONSerializer
+ end
+
+ test "sigil" do
+ binary = Config.transform("~r/comp[lL][aA][iI][nN]er/")
+ assert binary == :erlang.term_to_binary(~r/comp[lL][aA][iI][nN]er/)
+ assert Config.from_binary(binary) == ~r/comp[lL][aA][iI][nN]er/
+ end
+
+ test "2 child tuple" do
+ binary = Config.transform(%{"tuple" => ["v1", ":v2"]})
+ assert binary == :erlang.term_to_binary({"v1", :v2})
+ assert Config.from_binary(binary) == {"v1", :v2}
+ end
+
+ test "tuple with n childs" do
+ binary =
+ Config.transform(%{
+ "tuple" => [
+ "v1",
+ ":v2",
+ "Pleroma.Bookmark",
+ 150,
+ false,
+ "Phoenix.Socket.V1.JSONSerializer"
+ ]
+ })
+
+ assert binary ==
+ :erlang.term_to_binary(
+ {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer}
+ )
+
+ assert Config.from_binary(binary) ==
+ {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer}
+ end
+
+ test "tuple with dispatch key" do
+ binary = Config.transform(%{"tuple" => [":dispatch", ["{:_,
+ [
+ {\"/api/v1/streaming\", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
+ {\"/websocket\", Phoenix.Endpoint.CowboyWebSocket,
+ {Phoenix.Transports.WebSocket,
+ {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: \"/websocket\"]}}},
+ {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
+ ]}"]]})
+
+ assert binary ==
+ :erlang.term_to_binary(
+ {:dispatch,
+ [
+ {:_,
+ [
+ {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
+ {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
+ {Phoenix.Transports.WebSocket,
+ {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: "/websocket"]}}},
+ {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
+ ]}
+ ]}
+ )
+
+ assert Config.from_binary(binary) ==
+ {:dispatch,
+ [
+ {:_,
+ [
+ {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
+ {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
+ {Phoenix.Transports.WebSocket,
+ {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, [path: "/websocket"]}}},
+ {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
+ ]}
+ ]}
+ end
+
+ test "map with string key" do
+ binary = Config.transform(%{"key" => "value"})
+ assert binary == :erlang.term_to_binary(%{"key" => "value"})
+ assert Config.from_binary(binary) == %{"key" => "value"}
+ end
+
+ test "map with atom key" do
+ binary = Config.transform(%{":key" => "value"})
+ assert binary == :erlang.term_to_binary(%{key: "value"})
+ assert Config.from_binary(binary) == %{key: "value"}
+ end
+
+ test "list of strings" do
+ binary = Config.transform(["v1", "v2", "v3"])
+ assert binary == :erlang.term_to_binary(["v1", "v2", "v3"])
+ assert Config.from_binary(binary) == ["v1", "v2", "v3"]
+ end
+
+ test "list of modules" do
+ binary = Config.transform(["Pleroma.Repo", "Pleroma.Activity"])
+ assert binary == :erlang.term_to_binary([Pleroma.Repo, Pleroma.Activity])
+ assert Config.from_binary(binary) == [Pleroma.Repo, Pleroma.Activity]
+ end
+
+ test "list of atoms" do
+ binary = Config.transform([":v1", ":v2", ":v3"])
+ assert binary == :erlang.term_to_binary([:v1, :v2, :v3])
+ assert Config.from_binary(binary) == [:v1, :v2, :v3]
+ end
+
+ test "list of mixed values" do
+ binary =
+ Config.transform([
+ "v1",
+ ":v2",
+ "Pleroma.Repo",
+ "Phoenix.Socket.V1.JSONSerializer",
+ 15,
+ false
+ ])
+
+ assert binary ==
+ :erlang.term_to_binary([
+ "v1",
+ :v2,
+ Pleroma.Repo,
+ Phoenix.Socket.V1.JSONSerializer,
+ 15,
+ false
+ ])
+
+ assert Config.from_binary(binary) == [
+ "v1",
+ :v2,
+ Pleroma.Repo,
+ Phoenix.Socket.V1.JSONSerializer,
+ 15,
+ false
+ ]
+ end
+
+ test "simple keyword" do
+ binary = Config.transform([%{"tuple" => [":key", "value"]}])
+ assert binary == :erlang.term_to_binary([{:key, "value"}])
+ assert Config.from_binary(binary) == [{:key, "value"}]
+ assert Config.from_binary(binary) == [key: "value"]
+ end
+
+ test "keyword with partial_chain key" do
+ binary =
+ Config.transform([%{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}])
+
+ assert binary == :erlang.term_to_binary(partial_chain: &:hackney_connect.partial_chain/1)
+ assert Config.from_binary(binary) == [partial_chain: &:hackney_connect.partial_chain/1]
+ end
+
+ test "keyword" do
+ binary =
+ Config.transform([
+ %{"tuple" => [":types", "Pleroma.PostgresTypes"]},
+ %{"tuple" => [":telemetry_event", ["Pleroma.Repo.Instrumenter"]]},
+ %{"tuple" => [":migration_lock", nil]},
+ %{"tuple" => [":key1", 150]},
+ %{"tuple" => [":key2", "string"]}
+ ])
+
+ assert binary ==
+ :erlang.term_to_binary(
+ types: Pleroma.PostgresTypes,
+ telemetry_event: [Pleroma.Repo.Instrumenter],
+ migration_lock: nil,
+ key1: 150,
+ key2: "string"
+ )
+
+ assert Config.from_binary(binary) == [
+ types: Pleroma.PostgresTypes,
+ telemetry_event: [Pleroma.Repo.Instrumenter],
+ migration_lock: nil,
+ key1: 150,
+ key2: "string"
+ ]
+ end
+
+ test "complex keyword with nested mixed childs" do
+ binary =
+ Config.transform([
+ %{"tuple" => [":uploader", "Pleroma.Uploaders.Local"]},
+ %{"tuple" => [":filters", ["Pleroma.Upload.Filter.Dedupe"]]},
+ %{"tuple" => [":link_name", true]},
+ %{"tuple" => [":proxy_remote", false]},
+ %{"tuple" => [":common_map", %{":key" => "value"}]},
+ %{
+ "tuple" => [
+ ":proxy_opts",
+ [
+ %{"tuple" => [":redirect_on_failure", false]},
+ %{"tuple" => [":max_body_length", 1_048_576]},
+ %{
+ "tuple" => [
+ ":http",
+ [%{"tuple" => [":follow_redirect", true]}, %{"tuple" => [":pool", ":upload"]}]
+ ]
+ }
+ ]
+ ]
+ }
+ ])
+
+ assert binary ==
+ :erlang.term_to_binary(
+ uploader: Pleroma.Uploaders.Local,
+ filters: [Pleroma.Upload.Filter.Dedupe],
+ link_name: true,
+ proxy_remote: false,
+ common_map: %{key: "value"},
+ proxy_opts: [
+ redirect_on_failure: false,
+ max_body_length: 1_048_576,
+ http: [
+ follow_redirect: true,
+ pool: :upload
+ ]
+ ]
+ )
+
+ assert Config.from_binary(binary) ==
+ [
+ uploader: Pleroma.Uploaders.Local,
+ filters: [Pleroma.Upload.Filter.Dedupe],
+ link_name: true,
+ proxy_remote: false,
+ common_map: %{key: "value"},
+ proxy_opts: [
+ redirect_on_failure: false,
+ max_body_length: 1_048_576,
+ http: [
+ follow_redirect: true,
+ pool: :upload
+ ]
+ ]
+ ]
+ end
+
+ test "common keyword" do
+ binary =
+ Config.transform([
+ %{"tuple" => [":level", ":warn"]},
+ %{"tuple" => [":meta", [":all"]]},
+ %{"tuple" => [":path", ""]},
+ %{"tuple" => [":val", nil]},
+ %{"tuple" => [":webhook_url", "https://hooks.slack.com/services/YOUR-KEY-HERE"]}
+ ])
+
+ assert binary ==
+ :erlang.term_to_binary(
+ level: :warn,
+ meta: [:all],
+ path: "",
+ val: nil,
+ webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE"
+ )
+
+ assert Config.from_binary(binary) == [
+ level: :warn,
+ meta: [:all],
+ path: "",
+ val: nil,
+ webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE"
+ ]
+ end
+
+ test "complex keyword with sigil" do
+ binary =
+ Config.transform([
+ %{"tuple" => [":federated_timeline_removal", []]},
+ %{"tuple" => [":reject", ["~r/comp[lL][aA][iI][nN]er/"]]},
+ %{"tuple" => [":replace", []]}
+ ])
+
+ assert binary ==
+ :erlang.term_to_binary(
+ federated_timeline_removal: [],
+ reject: [~r/comp[lL][aA][iI][nN]er/],
+ replace: []
+ )
+
+ assert Config.from_binary(binary) ==
+ [federated_timeline_removal: [], reject: [~r/comp[lL][aA][iI][nN]er/], replace: []]
+ end
+
+ test "complex keyword with tuples with more than 2 values" do
+ binary =
+ Config.transform([
+ %{
+ "tuple" => [
+ ":http",
+ [
+ %{
+ "tuple" => [
+ ":key1",
+ [
+ %{
+ "tuple" => [
+ ":_",
+ [
+ %{
+ "tuple" => [
+ "/api/v1/streaming",
+ "Pleroma.Web.MastodonAPI.WebsocketHandler",
+ []
+ ]
+ },
+ %{
+ "tuple" => [
+ "/websocket",
+ "Phoenix.Endpoint.CowboyWebSocket",
+ %{
+ "tuple" => [
+ "Phoenix.Transports.WebSocket",
+ %{
+ "tuple" => [
+ "Pleroma.Web.Endpoint",
+ "Pleroma.Web.UserSocket",
+ []
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ %{
+ "tuple" => [
+ ":_",
+ "Phoenix.Endpoint.Cowboy2Handler",
+ %{"tuple" => ["Pleroma.Web.Endpoint", []]}
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ ]
+ }
+ ])
+
+ assert binary ==
+ :erlang.term_to_binary(
+ http: [
+ key1: [
+ _: [
+ {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
+ {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
+ {Phoenix.Transports.WebSocket,
+ {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}},
+ {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
+ ]
+ ]
+ ]
+ )
+
+ assert Config.from_binary(binary) == [
+ http: [
+ key1: [
+ {:_,
+ [
+ {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
+ {"/websocket", Phoenix.Endpoint.CowboyWebSocket,
+ {Phoenix.Transports.WebSocket,
+ {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}},
+ {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}}
+ ]}
+ ]
+ ]
+ ]
+ end
+ end
+end
diff --git a/test/web/admin_api/views/report_view_test.exs b/test/web/admin_api/views/report_view_test.exs
new file mode 100644
index 000000000..a00c9c579
--- /dev/null
+++ b/test/web/admin_api/views/report_view_test.exs
@@ -0,0 +1,130 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.AdminAPI.ReportViewTest do
+ use Pleroma.DataCase
+ import Pleroma.Factory
+ alias Pleroma.Web.AdminAPI.ReportView
+ alias Pleroma.Web.CommonAPI
+ alias Pleroma.Web.MastodonAPI.AccountView
+ alias Pleroma.Web.MastodonAPI.StatusView
+
+ test "renders a report" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} = CommonAPI.report(user, %{"account_id" => other_user.id})
+
+ expected = %{
+ content: nil,
+ actor:
+ Map.merge(
+ AccountView.render("account.json", %{user: user}),
+ Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: user})
+ ),
+ account:
+ Map.merge(
+ AccountView.render("account.json", %{user: other_user}),
+ Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: other_user})
+ ),
+ statuses: [],
+ state: "open",
+ id: activity.id
+ }
+
+ result =
+ ReportView.render("show.json", %{report: activity})
+ |> Map.delete(:created_at)
+
+ assert result == expected
+ end
+
+ test "includes reported statuses" do
+ user = insert(:user)
+ other_user = insert(:user)
+ {:ok, activity} = CommonAPI.post(other_user, %{"status" => "toot"})
+
+ {:ok, report_activity} =
+ CommonAPI.report(user, %{"account_id" => other_user.id, "status_ids" => [activity.id]})
+
+ expected = %{
+ content: nil,
+ actor:
+ Map.merge(
+ AccountView.render("account.json", %{user: user}),
+ Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: user})
+ ),
+ account:
+ Map.merge(
+ AccountView.render("account.json", %{user: other_user}),
+ Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: other_user})
+ ),
+ statuses: [StatusView.render("status.json", %{activity: activity})],
+ state: "open",
+ id: report_activity.id
+ }
+
+ result =
+ ReportView.render("show.json", %{report: report_activity})
+ |> Map.delete(:created_at)
+
+ assert result == expected
+ end
+
+ test "renders report's state" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} = CommonAPI.report(user, %{"account_id" => other_user.id})
+ {:ok, activity} = CommonAPI.update_report_state(activity.id, "closed")
+ assert %{state: "closed"} = ReportView.render("show.json", %{report: activity})
+ end
+
+ test "renders report description" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.report(user, %{
+ "account_id" => other_user.id,
+ "comment" => "posts are too good for this instance"
+ })
+
+ assert %{content: "posts are too good for this instance"} =
+ ReportView.render("show.json", %{report: activity})
+ end
+
+ test "sanitizes report description" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.report(user, %{
+ "account_id" => other_user.id,
+ "comment" => ""
+ })
+
+ data = Map.put(activity.data, "content", "<script> alert('hecked :D:D:D:D:D:D:D') </script>")
+ activity = Map.put(activity, :data, data)
+
+ refute "<script> alert('hecked :D:D:D:D:D:D:D') </script>" ==
+ ReportView.render("show.json", %{report: activity})[:content]
+ end
+
+ test "doesn't error out when the user doesn't exists" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.report(user, %{
+ "account_id" => other_user.id,
+ "comment" => ""
+ })
+
+ Pleroma.User.delete(other_user)
+ Pleroma.User.invalidate_cache(other_user)
+
+ assert %{} = ReportView.render("show.json", %{report: activity})
+ end
+end
diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs
index 696060fb1..f28a66090 100644
--- a/test/web/common_api/common_api_test.exs
+++ b/test/web/common_api/common_api_test.exs
@@ -5,17 +5,66 @@
defmodule Pleroma.Web.CommonAPITest do
use Pleroma.DataCase
alias Pleroma.Activity
+ alias Pleroma.Conversation.Participation
alias Pleroma.Object
alias Pleroma.User
+ alias Pleroma.Web.ActivityPub.ActivityPub
+ alias Pleroma.Web.ActivityPub.Visibility
alias Pleroma.Web.CommonAPI
import Pleroma.Factory
+ clear_config([:instance, :safe_dm_mentions])
+ clear_config([:instance, :limit])
+ clear_config([:instance, :max_pinned_statuses])
+
+ test "when replying to a conversation / participation, it will set the correct context id even if no explicit reply_to is given" do
+ user = insert(:user)
+ {:ok, activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"})
+
+ [participation] = Participation.for_user(user)
+
+ {:ok, convo_reply} =
+ CommonAPI.post(user, %{"status" => ".", "in_reply_to_conversation_id" => participation.id})
+
+ assert Visibility.is_direct?(convo_reply)
+
+ assert activity.data["context"] == convo_reply.data["context"]
+ end
+
+ test "when replying to a conversation / participation, it only mentions the recipients explicitly declared in the participation" do
+ har = insert(:user)
+ jafnhar = insert(:user)
+ tridi = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(har, %{
+ "status" => "@#{jafnhar.nickname} hey",
+ "visibility" => "direct"
+ })
+
+ assert har.ap_id in activity.recipients
+ assert jafnhar.ap_id in activity.recipients
+
+ [participation] = Participation.for_user(har)
+
+ {:ok, activity} =
+ CommonAPI.post(har, %{
+ "status" => "I don't really like @#{tridi.nickname}",
+ "visibility" => "direct",
+ "in_reply_to_status_id" => activity.id,
+ "in_reply_to_conversation_id" => participation.id
+ })
+
+ assert har.ap_id in activity.recipients
+ assert jafnhar.ap_id in activity.recipients
+ refute tridi.ap_id in activity.recipients
+ end
+
test "with the safe_dm_mention option set, it does not mention people beyond the initial tags" do
har = insert(:user)
jafnhar = insert(:user)
tridi = insert(:user)
- option = Pleroma.Config.get([:instance, :safe_dm_mentions])
Pleroma.Config.put([:instance, :safe_dm_mentions], true)
{:ok, activity} =
@@ -26,14 +75,13 @@ defmodule Pleroma.Web.CommonAPITest do
refute tridi.ap_id in activity.recipients
assert jafnhar.ap_id in activity.recipients
- Pleroma.Config.put([:instance, :safe_dm_mentions], option)
end
test "it de-duplicates tags" do
user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"status" => "#2hu #2HU"})
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
assert object.data["tag"] == ["2hu"]
end
@@ -56,6 +104,25 @@ defmodule Pleroma.Web.CommonAPITest do
end
describe "posting" do
+ test "it supports explicit addressing" do
+ user = insert(:user)
+ user_two = insert(:user)
+ user_three = insert(:user)
+ user_four = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" =>
+ "Hey, I think @#{user_three.nickname} is ugly. @#{user_four.nickname} is alright though.",
+ "to" => [user_two.nickname, user_four.nickname, "nonexistent"]
+ })
+
+ assert user.ap_id in activity.recipients
+ assert user_two.ap_id in activity.recipients
+ assert user_four.ap_id in activity.recipients
+ refute user_three.ap_id in activity.recipients
+ end
+
test "it filters out obviously bad tags when accepting a post as HTML" do
user = insert(:user)
@@ -67,7 +134,7 @@ defmodule Pleroma.Web.CommonAPITest do
"content_type" => "text/html"
})
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
assert object.data["content"] == "<p><b>2hu</b></p>alert('xss')"
end
@@ -83,7 +150,7 @@ defmodule Pleroma.Web.CommonAPITest do
"content_type" => "text/markdown"
})
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
assert object.data["content"] == "<p><b>2hu</b></p>alert('xss')"
end
@@ -101,7 +168,7 @@ defmodule Pleroma.Web.CommonAPITest do
})
Enum.each(["public", "private", "unlisted"], fn visibility ->
- assert {:error, {:private_to_public, _}} =
+ assert {:error, "The message visibility must be direct"} =
CommonAPI.post(user, %{
"status" => "suya..",
"visibility" => visibility,
@@ -109,6 +176,49 @@ defmodule Pleroma.Web.CommonAPITest do
})
end)
end
+
+ test "it allows to address a list" do
+ user = insert(:user)
+ {:ok, list} = Pleroma.List.create("foo", user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{"status" => "foobar", "visibility" => "list:#{list.id}"})
+
+ assert activity.data["bcc"] == [list.ap_id]
+ assert activity.recipients == [list.ap_id, user.ap_id]
+ assert activity.data["listMessage"] == list.ap_id
+ end
+
+ test "it returns error when status is empty and no attachments" do
+ user = insert(:user)
+
+ assert {:error, "Cannot post an empty status without attachments"} =
+ CommonAPI.post(user, %{"status" => ""})
+ end
+
+ test "it returns error when character limit is exceeded" do
+ Pleroma.Config.put([:instance, :limit], 5)
+
+ user = insert(:user)
+
+ assert {:error, "The status is over the character limit"} =
+ CommonAPI.post(user, %{"status" => "foobar"})
+ end
+
+ test "it can handle activities that expire" do
+ user = insert(:user)
+
+ expires_at =
+ NaiveDateTime.utc_now()
+ |> NaiveDateTime.truncate(:second)
+ |> NaiveDateTime.add(1_000_000, :second)
+
+ assert {:ok, activity} =
+ CommonAPI.post(user, %{"status" => "chai", "expires_in" => 1_000_000})
+
+ assert expiration = Pleroma.ActivityExpiration.get_by_activity_id(activity.id)
+ assert expiration.scheduled_at == expires_at
+ end
end
describe "reactions" do
@@ -168,6 +278,11 @@ defmodule Pleroma.Web.CommonAPITest do
assert %User{info: %{pinned_activities: [^id]}} = user
end
+ test "unlisted statuses can be pinned", %{user: user} do
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!", "visibility" => "unlisted"})
+ assert {:ok, ^activity} = CommonAPI.pin(activity.id, user)
+ end
+
test "only self-authored can be pinned", %{activity: activity} do
user = insert(:user)
@@ -320,4 +435,79 @@ defmodule Pleroma.Web.CommonAPITest do
assert User.showing_reblogs?(muter, muted) == true
end
end
+
+ describe "unfollow/2" do
+ test "also unsubscribes a user" do
+ [follower, followed] = insert_pair(:user)
+ {:ok, follower, followed, _} = CommonAPI.follow(follower, followed)
+ {:ok, followed} = User.subscribe(follower, followed)
+
+ assert User.subscribed_to?(follower, followed)
+
+ {:ok, follower} = CommonAPI.unfollow(follower, followed)
+
+ refute User.subscribed_to?(follower, followed)
+ end
+ end
+
+ describe "accept_follow_request/2" do
+ test "after acceptance, it sets all existing pending follow request states to 'accept'" do
+ user = insert(:user, info: %{locked: true})
+ follower = insert(:user)
+ follower_two = insert(:user)
+
+ {:ok, follow_activity} = ActivityPub.follow(follower, user)
+ {:ok, follow_activity_two} = ActivityPub.follow(follower, user)
+ {:ok, follow_activity_three} = ActivityPub.follow(follower_two, user)
+
+ assert follow_activity.data["state"] == "pending"
+ assert follow_activity_two.data["state"] == "pending"
+ assert follow_activity_three.data["state"] == "pending"
+
+ {:ok, _follower} = CommonAPI.accept_follow_request(follower, user)
+
+ assert Repo.get(Activity, follow_activity.id).data["state"] == "accept"
+ assert Repo.get(Activity, follow_activity_two.id).data["state"] == "accept"
+ assert Repo.get(Activity, follow_activity_three.id).data["state"] == "pending"
+ end
+
+ test "after rejection, it sets all existing pending follow request states to 'reject'" do
+ user = insert(:user, info: %{locked: true})
+ follower = insert(:user)
+ follower_two = insert(:user)
+
+ {:ok, follow_activity} = ActivityPub.follow(follower, user)
+ {:ok, follow_activity_two} = ActivityPub.follow(follower, user)
+ {:ok, follow_activity_three} = ActivityPub.follow(follower_two, user)
+
+ assert follow_activity.data["state"] == "pending"
+ assert follow_activity_two.data["state"] == "pending"
+ assert follow_activity_three.data["state"] == "pending"
+
+ {:ok, _follower} = CommonAPI.reject_follow_request(follower, user)
+
+ assert Repo.get(Activity, follow_activity.id).data["state"] == "reject"
+ assert Repo.get(Activity, follow_activity_two.id).data["state"] == "reject"
+ assert Repo.get(Activity, follow_activity_three.id).data["state"] == "pending"
+ end
+ end
+
+ describe "vote/3" do
+ test "does not allow to vote twice" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "Am I cute?",
+ "poll" => %{"options" => ["Yes", "No"], "expires_in" => 20}
+ })
+
+ object = Object.normalize(activity)
+
+ {:ok, _, object} = CommonAPI.vote(other_user, object, [0])
+
+ assert {:error, "Already voted"} == CommonAPI.vote(other_user, object, [1])
+ end
+ end
end
diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs
index ab4c62b35..c281dd1f1 100644
--- a/test/web/common_api/common_api_utils_test.exs
+++ b/test/web/common_api/common_api_utils_test.exs
@@ -5,10 +5,16 @@
defmodule Pleroma.Web.CommonAPI.UtilsTest do
alias Pleroma.Builders.UserBuilder
alias Pleroma.Object
+ alias Pleroma.Web.CommonAPI
alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.Web.Endpoint
use Pleroma.DataCase
+ import ExUnit.CaptureLog
+ import Pleroma.Factory
+
+ @public_address "https://www.w3.org/ns/activitystreams#Public"
+
test "it adds attachment links to a given text and attachment set" do
name =
"Sakura%20Mana%20%E2%80%93%20Turned%20on%20by%20a%20Senior%20OL%20with%20a%20Temptating%20Tight%20Skirt-s%20Full%20Hipline%20and%20Panty%20Shot-%20Beautiful%20Thick%20Thighs-%20and%20Erotic%20Ass-%20-2015-%20--%20Oppaitime%208-28-2017%206-50-33%20PM.png"
@@ -197,7 +203,9 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
expected = ""
- assert Utils.date_to_asctime(date) == expected
+ assert capture_log(fn ->
+ assert Utils.date_to_asctime(date) == expected
+ end) =~ "[warn] Date #{date} in wrong format, must be ISO 8601"
end
test "when date is a Unix timestamp" do
@@ -205,13 +213,388 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
expected = ""
- assert Utils.date_to_asctime(date) == expected
+ assert capture_log(fn ->
+ assert Utils.date_to_asctime(date) == expected
+ end) =~ "[warn] Date #{date} in wrong format, must be ISO 8601"
end
test "when date is nil" do
expected = ""
- assert Utils.date_to_asctime(nil) == expected
+ assert capture_log(fn ->
+ assert Utils.date_to_asctime(nil) == expected
+ end) =~ "[warn] Date in wrong format, must be ISO 8601"
+ end
+
+ test "when date is a random string" do
+ assert capture_log(fn ->
+ assert Utils.date_to_asctime("foo") == ""
+ end) =~ "[warn] Date foo in wrong format, must be ISO 8601"
+ end
+ end
+
+ describe "get_to_and_cc" do
+ test "for public posts, not a reply" do
+ user = insert(:user)
+ mentioned_user = insert(:user)
+ mentions = [mentioned_user.ap_id]
+
+ {to, cc} = Utils.get_to_and_cc(user, mentions, nil, "public", nil)
+
+ assert length(to) == 2
+ assert length(cc) == 1
+
+ assert @public_address in to
+ assert mentioned_user.ap_id in to
+ assert user.follower_address in cc
+ end
+
+ test "for public posts, a reply" do
+ user = insert(:user)
+ mentioned_user = insert(:user)
+ third_user = insert(:user)
+ {:ok, activity} = CommonAPI.post(third_user, %{"status" => "uguu"})
+ mentions = [mentioned_user.ap_id]
+
+ {to, cc} = Utils.get_to_and_cc(user, mentions, activity, "public", nil)
+
+ assert length(to) == 3
+ assert length(cc) == 1
+
+ assert @public_address in to
+ assert mentioned_user.ap_id in to
+ assert third_user.ap_id in to
+ assert user.follower_address in cc
+ end
+
+ test "for unlisted posts, not a reply" do
+ user = insert(:user)
+ mentioned_user = insert(:user)
+ mentions = [mentioned_user.ap_id]
+
+ {to, cc} = Utils.get_to_and_cc(user, mentions, nil, "unlisted", nil)
+
+ assert length(to) == 2
+ assert length(cc) == 1
+
+ assert @public_address in cc
+ assert mentioned_user.ap_id in to
+ assert user.follower_address in to
+ end
+
+ test "for unlisted posts, a reply" do
+ user = insert(:user)
+ mentioned_user = insert(:user)
+ third_user = insert(:user)
+ {:ok, activity} = CommonAPI.post(third_user, %{"status" => "uguu"})
+ mentions = [mentioned_user.ap_id]
+
+ {to, cc} = Utils.get_to_and_cc(user, mentions, activity, "unlisted", nil)
+
+ assert length(to) == 3
+ assert length(cc) == 1
+
+ assert @public_address in cc
+ assert mentioned_user.ap_id in to
+ assert third_user.ap_id in to
+ assert user.follower_address in to
+ end
+
+ test "for private posts, not a reply" do
+ user = insert(:user)
+ mentioned_user = insert(:user)
+ mentions = [mentioned_user.ap_id]
+
+ {to, cc} = Utils.get_to_and_cc(user, mentions, nil, "private", nil)
+ assert length(to) == 2
+ assert length(cc) == 0
+
+ assert mentioned_user.ap_id in to
+ assert user.follower_address in to
+ end
+
+ test "for private posts, a reply" do
+ user = insert(:user)
+ mentioned_user = insert(:user)
+ third_user = insert(:user)
+ {:ok, activity} = CommonAPI.post(third_user, %{"status" => "uguu"})
+ mentions = [mentioned_user.ap_id]
+
+ {to, cc} = Utils.get_to_and_cc(user, mentions, activity, "private", nil)
+
+ assert length(to) == 3
+ assert length(cc) == 0
+
+ assert mentioned_user.ap_id in to
+ assert third_user.ap_id in to
+ assert user.follower_address in to
+ end
+
+ test "for direct posts, not a reply" do
+ user = insert(:user)
+ mentioned_user = insert(:user)
+ mentions = [mentioned_user.ap_id]
+
+ {to, cc} = Utils.get_to_and_cc(user, mentions, nil, "direct", nil)
+
+ assert length(to) == 1
+ assert length(cc) == 0
+
+ assert mentioned_user.ap_id in to
+ end
+
+ test "for direct posts, a reply" do
+ user = insert(:user)
+ mentioned_user = insert(:user)
+ third_user = insert(:user)
+ {:ok, activity} = CommonAPI.post(third_user, %{"status" => "uguu"})
+ mentions = [mentioned_user.ap_id]
+
+ {to, cc} = Utils.get_to_and_cc(user, mentions, activity, "direct", nil)
+
+ assert length(to) == 2
+ assert length(cc) == 0
+
+ assert mentioned_user.ap_id in to
+ assert third_user.ap_id in to
+ end
+ end
+
+ describe "get_by_id_or_ap_id/1" do
+ test "get activity by id" do
+ activity = insert(:note_activity)
+ %Pleroma.Activity{} = note = Utils.get_by_id_or_ap_id(activity.id)
+ assert note.id == activity.id
+ end
+
+ test "get activity by ap_id" do
+ activity = insert(:note_activity)
+ %Pleroma.Activity{} = note = Utils.get_by_id_or_ap_id(activity.data["object"])
+ assert note.id == activity.id
+ end
+
+ test "get activity by object when type isn't `Create` " do
+ activity = insert(:like_activity)
+ %Pleroma.Activity{} = like = Utils.get_by_id_or_ap_id(activity.id)
+ assert like.data["object"] == activity.data["object"]
+ end
+ end
+
+ describe "to_master_date/1" do
+ test "removes microseconds from date (NaiveDateTime)" do
+ assert Utils.to_masto_date(~N[2015-01-23 23:50:07.123]) == "2015-01-23T23:50:07.000Z"
+ end
+
+ test "removes microseconds from date (String)" do
+ assert Utils.to_masto_date("2015-01-23T23:50:07.123Z") == "2015-01-23T23:50:07.000Z"
+ end
+
+ test "returns empty string when date invalid" do
+ assert Utils.to_masto_date("2015-01?23T23:50:07.123Z") == ""
+ end
+ end
+
+ describe "conversation_id_to_context/1" do
+ test "returns id" do
+ object = insert(:note)
+ assert Utils.conversation_id_to_context(object.id) == object.data["id"]
+ end
+
+ test "returns error if object not found" do
+ assert Utils.conversation_id_to_context("123") == {:error, "No such conversation"}
+ end
+ end
+
+ describe "maybe_notify_mentioned_recipients/2" do
+ test "returns recipients when activity is not `Create`" do
+ activity = insert(:like_activity)
+ assert Utils.maybe_notify_mentioned_recipients(["test"], activity) == ["test"]
+ end
+
+ test "returns recipients from tag" do
+ user = insert(:user)
+
+ object =
+ insert(:note,
+ user: user,
+ data: %{
+ "tag" => [
+ %{"type" => "Hashtag"},
+ "",
+ %{"type" => "Mention", "href" => "https://testing.pleroma.lol/users/lain"},
+ %{"type" => "Mention", "href" => "https://shitposter.club/user/5381"},
+ %{"type" => "Mention", "href" => "https://shitposter.club/user/5381"}
+ ]
+ }
+ )
+
+ activity = insert(:note_activity, user: user, note: object)
+
+ assert Utils.maybe_notify_mentioned_recipients(["test"], activity) == [
+ "test",
+ "https://testing.pleroma.lol/users/lain",
+ "https://shitposter.club/user/5381"
+ ]
+ end
+
+ test "returns recipients when object is map" do
+ user = insert(:user)
+ object = insert(:note, user: user)
+
+ activity =
+ insert(:note_activity,
+ user: user,
+ note: object,
+ data_attrs: %{
+ "object" => %{
+ "tag" => [
+ %{"type" => "Hashtag"},
+ "",
+ %{"type" => "Mention", "href" => "https://testing.pleroma.lol/users/lain"},
+ %{"type" => "Mention", "href" => "https://shitposter.club/user/5381"},
+ %{"type" => "Mention", "href" => "https://shitposter.club/user/5381"}
+ ]
+ }
+ }
+ )
+
+ Pleroma.Repo.delete(object)
+
+ assert Utils.maybe_notify_mentioned_recipients(["test"], activity) == [
+ "test",
+ "https://testing.pleroma.lol/users/lain",
+ "https://shitposter.club/user/5381"
+ ]
+ end
+
+ test "returns recipients when object not found" do
+ user = insert(:user)
+ object = insert(:note, user: user)
+
+ activity = insert(:note_activity, user: user, note: object)
+ Pleroma.Repo.delete(object)
+
+ assert Utils.maybe_notify_mentioned_recipients(["test-test"], activity) == [
+ "test-test"
+ ]
+ end
+ end
+
+ describe "attachments_from_ids_descs/2" do
+ test "returns [] when attachment ids is empty" do
+ assert Utils.attachments_from_ids_descs([], "{}") == []
+ end
+
+ test "returns list attachments with desc" do
+ object = insert(:note)
+ desc = Jason.encode!(%{object.id => "test-desc"})
+
+ assert Utils.attachments_from_ids_descs(["#{object.id}", "34"], desc) == [
+ Map.merge(object.data, %{"name" => "test-desc"})
+ ]
+ end
+ end
+
+ describe "attachments_from_ids/1" do
+ test "returns attachments with descs" do
+ object = insert(:note)
+ desc = Jason.encode!(%{object.id => "test-desc"})
+
+ assert Utils.attachments_from_ids(%{
+ "media_ids" => ["#{object.id}"],
+ "descriptions" => desc
+ }) == [
+ Map.merge(object.data, %{"name" => "test-desc"})
+ ]
+ end
+
+ test "returns attachments without descs" do
+ object = insert(:note)
+ assert Utils.attachments_from_ids(%{"media_ids" => ["#{object.id}"]}) == [object.data]
+ end
+
+ test "returns [] when not pass media_ids" do
+ assert Utils.attachments_from_ids(%{}) == []
+ end
+ end
+
+ describe "maybe_add_list_data/3" do
+ test "adds list params when found user list" do
+ user = insert(:user)
+ {:ok, %Pleroma.List{} = list} = Pleroma.List.create("title", user)
+
+ assert Utils.maybe_add_list_data(%{additional: %{}, object: %{}}, user, {:list, list.id}) ==
+ %{
+ additional: %{"bcc" => [list.ap_id], "listMessage" => list.ap_id},
+ object: %{"listMessage" => list.ap_id}
+ }
+ end
+
+ test "returns original params when list not found" do
+ user = insert(:user)
+ {:ok, %Pleroma.List{} = list} = Pleroma.List.create("title", insert(:user))
+
+ assert Utils.maybe_add_list_data(%{additional: %{}, object: %{}}, user, {:list, list.id}) ==
+ %{additional: %{}, object: %{}}
+ end
+ end
+
+ describe "make_note_data/11" do
+ test "returns note data" do
+ user = insert(:user)
+ note = insert(:note)
+ user2 = insert(:user)
+ user3 = insert(:user)
+
+ assert Utils.make_note_data(
+ user.ap_id,
+ [user2.ap_id],
+ "2hu",
+ "<h1>This is :moominmamma: note</h1>",
+ [],
+ note.id,
+ [name: "jimm"],
+ "test summary",
+ [user3.ap_id],
+ false,
+ %{"custom_tag" => "test"}
+ ) == %{
+ "actor" => user.ap_id,
+ "attachment" => [],
+ "cc" => [user3.ap_id],
+ "content" => "<h1>This is :moominmamma: note</h1>",
+ "context" => "2hu",
+ "sensitive" => false,
+ "summary" => "test summary",
+ "tag" => ["jimm"],
+ "to" => [user2.ap_id],
+ "type" => "Note",
+ "custom_tag" => "test"
+ }
+ end
+ end
+
+ describe "maybe_add_attachments/3" do
+ test "returns parsed results when no_links is true" do
+ assert Utils.maybe_add_attachments(
+ {"test", [], ["tags"]},
+ [],
+ true
+ ) == {"test", [], ["tags"]}
+ end
+
+ test "adds attachments to parsed results" do
+ attachment = %{"url" => [%{"href" => "SakuraPM.png"}]}
+
+ assert Utils.maybe_add_attachments(
+ {"test", [], ["tags"]},
+ [attachment],
+ false
+ ) == {
+ "test<br><a href=\"SakuraPM.png\" class='attachment'>SakuraPM.png</a>",
+ [],
+ ["tags"]
+ }
end
end
end
diff --git a/test/web/digest_email_worker_test.exs b/test/web/digest_email_worker_test.exs
new file mode 100644
index 000000000..15002330f
--- /dev/null
+++ b/test/web/digest_email_worker_test.exs
@@ -0,0 +1,31 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.DigestEmailWorkerTest do
+ use Pleroma.DataCase
+ import Pleroma.Factory
+
+ alias Pleroma.DigestEmailWorker
+ alias Pleroma.User
+ alias Pleroma.Web.CommonAPI
+
+ test "it sends digest emails" do
+ user = insert(:user)
+
+ date =
+ Timex.now()
+ |> Timex.shift(days: -10)
+ |> Timex.to_naive_datetime()
+
+ user2 = insert(:user, last_digest_emailed_at: date)
+ User.switch_email_notifications(user2, "digest", true)
+ CommonAPI.post(user, %{"status" => "hey @#{user2.nickname}!"})
+
+ DigestEmailWorker.perform()
+
+ assert_received {:email, email}
+ assert email.to == [{user2.name, user2.email}]
+ assert email.subject == "Your digest from #{Pleroma.Config.get(:instance)[:name]}"
+ end
+end
diff --git a/test/web/fallback_test.exs b/test/web/fallback_test.exs
index cc78b3ae1..c13db9526 100644
--- a/test/web/fallback_test.exs
+++ b/test/web/fallback_test.exs
@@ -30,6 +30,10 @@ defmodule Pleroma.Web.FallbackTest do
|> json_response(404) == %{"error" => "Not implemented"}
end
+ test "GET /pleroma/admin -> /pleroma/admin/", %{conn: conn} do
+ assert redirected_to(get(conn, "/pleroma/admin")) =~ "/pleroma/admin/"
+ end
+
test "GET /*path", %{conn: conn} do
assert conn
|> get("/foo")
diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs
index 0f43bc8f2..09e54533f 100644
--- a/test/web/federator_test.exs
+++ b/test/web/federator_test.exs
@@ -12,9 +12,27 @@ defmodule Pleroma.Web.FederatorTest do
setup_all do
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+
:ok
end
+ clear_config_all([:instance, :federating]) do
+ Pleroma.Config.put([:instance, :federating], true)
+ end
+
+ clear_config([:instance, :allow_relay])
+ clear_config([:instance, :rewrite_policy])
+ clear_config([:mrf_keyword])
+
+ describe "Publisher.perform" do
+ test "call `perform` with unknown task" do
+ assert {
+ :error,
+ "Don't know what to do with this"
+ } = Pleroma.Web.Federator.Publisher.perform("test", :ok, :ok)
+ end
+ end
+
describe "Publish an activity" do
setup do
user = insert(:user)
@@ -51,8 +69,6 @@ defmodule Pleroma.Web.FederatorTest do
end
refute_received :relay_publish
-
- Pleroma.Config.put([:instance, :allow_relay], true)
end
end
@@ -213,5 +229,20 @@ defmodule Pleroma.Web.FederatorTest do
:error = Federator.incoming_ap_doc(params)
end
+
+ test "it does not crash if MRF rejects the post" do
+ Pleroma.Config.put([:mrf_keyword, :reject], ["lain"])
+
+ Pleroma.Config.put(
+ [:instance, :rewrite_policy],
+ Pleroma.Web.ActivityPub.MRF.KeywordPolicy
+ )
+
+ params =
+ File.read!("test/fixtures/mastodon-post-activity.json")
+ |> Poison.decode!()
+
+ assert Federator.incoming_ap_doc(params) == :error
+ end
end
end
diff --git a/test/web/instances/instance_test.exs b/test/web/instances/instance_test.exs
index d28730994..3fd011fd3 100644
--- a/test/web/instances/instance_test.exs
+++ b/test/web/instances/instance_test.exs
@@ -10,14 +10,8 @@ defmodule Pleroma.Instances.InstanceTest do
import Pleroma.Factory
- setup_all do
- config_path = [:instance, :federation_reachability_timeout_days]
- initial_setting = Pleroma.Config.get(config_path)
-
- Pleroma.Config.put(config_path, 1)
- on_exit(fn -> Pleroma.Config.put(config_path, initial_setting) end)
-
- :ok
+ clear_config_all([:instance, :federation_reachability_timeout_days]) do
+ Pleroma.Config.put([:instance, :federation_reachability_timeout_days], 1)
end
describe "set_reachable/1" do
diff --git a/test/web/instances/instances_test.exs b/test/web/instances/instances_test.exs
index f0d84edea..dea8e2aea 100644
--- a/test/web/instances/instances_test.exs
+++ b/test/web/instances/instances_test.exs
@@ -7,14 +7,8 @@ defmodule Pleroma.InstancesTest do
use Pleroma.DataCase
- setup_all do
- config_path = [:instance, :federation_reachability_timeout_days]
- initial_setting = Pleroma.Config.get(config_path)
-
- Pleroma.Config.put(config_path, 1)
- on_exit(fn -> Pleroma.Config.put(config_path, initial_setting) end)
-
- :ok
+ clear_config_all([:instance, :federation_reachability_timeout_days]) do
+ Pleroma.Config.put([:instance, :federation_reachability_timeout_days], 1)
end
describe "reachable?/1" do
diff --git a/test/web/mastodon_api/account_view_test.exs b/test/web/mastodon_api/account_view_test.exs
index aaf2261bb..1d8b28339 100644
--- a/test/web/mastodon_api/account_view_test.exs
+++ b/test/web/mastodon_api/account_view_test.exs
@@ -6,6 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
use Pleroma.DataCase
import Pleroma.Factory
alias Pleroma.User
+ alias Pleroma.Web.CommonAPI
alias Pleroma.Web.MastodonAPI.AccountView
test "Represent a user account" do
@@ -19,9 +20,18 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
]
}
+ background_image = %{
+ "url" => [%{"href" => "https://example.com/images/asuka_hospital.png"}]
+ }
+
user =
insert(:user, %{
- info: %{note_count: 5, follower_count: 3, source_data: source_data},
+ info: %{
+ note_count: 5,
+ follower_count: 3,
+ source_data: source_data,
+ background: background_image
+ },
nickname: "shp@shitposter.club",
name: ":karjalanpiirakka: shp",
bio: "<script src=\"invalid-html\"></script><span>valid html</span>",
@@ -57,9 +67,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
source: %{
note: "valid html",
sensitive: false,
- pleroma: %{}
+ pleroma: %{},
+ fields: []
},
pleroma: %{
+ background_image: "https://example.com/images/asuka_hospital.png",
confirmation_pending: false,
tags: [],
is_admin: false,
@@ -67,7 +79,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
hide_favorites: true,
hide_followers: false,
hide_follows: false,
- relationship: %{}
+ relationship: %{},
+ skip_thread_containment: false
}
}
@@ -78,10 +91,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
user = insert(:user)
notification_settings = %{
- "remote" => true,
- "local" => true,
"followers" => true,
- "follows" => true
+ "follows" => true,
+ "non_follows" => true,
+ "non_followers" => true
}
privacy = user.info.default_scope
@@ -122,9 +135,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
source: %{
note: user.bio,
sensitive: false,
- pleroma: %{}
+ pleroma: %{},
+ fields: []
},
pleroma: %{
+ background_image: nil,
confirmation_pending: false,
tags: [],
is_admin: false,
@@ -132,13 +147,21 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
hide_favorites: true,
hide_followers: false,
hide_follows: false,
- relationship: %{}
+ relationship: %{},
+ skip_thread_containment: false
}
}
assert expected == AccountView.render("account.json", %{user: user})
end
+ test "Represent a deactivated user for an admin" do
+ admin = insert(:user, %{info: %{is_admin: true}})
+ deactivated_user = insert(:user, %{info: %{deactivated: true}})
+ represented = AccountView.render("account.json", %{user: deactivated_user, for: admin})
+ assert represented[:pleroma][:deactivated] == true
+ end
+
test "Represent a smaller mention" do
user = insert(:user)
@@ -152,28 +175,100 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
assert expected == AccountView.render("mention.json", %{user: user})
end
- test "represent a relationship" do
- user = insert(:user)
- other_user = insert(:user)
+ describe "relationship" do
+ test "represent a relationship for the following and followed user" do
+ user = insert(:user)
+ other_user = insert(:user)
- {:ok, user} = User.follow(user, other_user)
- {:ok, user} = User.block(user, other_user)
+ {:ok, user} = User.follow(user, other_user)
+ {:ok, other_user} = User.follow(other_user, user)
+ {:ok, other_user} = User.subscribe(user, other_user)
+ {:ok, user} = User.mute(user, other_user, true)
+ {:ok, user} = CommonAPI.hide_reblogs(user, other_user)
- expected = %{
- id: to_string(other_user.id),
- following: false,
- followed_by: false,
- blocking: true,
- muting: false,
- muting_notifications: false,
- subscribing: false,
- requested: false,
- domain_blocking: false,
- showing_reblogs: true,
- endorsed: false
- }
+ expected = %{
+ id: to_string(other_user.id),
+ following: true,
+ followed_by: true,
+ blocking: false,
+ blocked_by: false,
+ muting: true,
+ muting_notifications: true,
+ subscribing: true,
+ requested: false,
+ domain_blocking: false,
+ showing_reblogs: false,
+ endorsed: false
+ }
+
+ assert expected ==
+ AccountView.render("relationship.json", %{user: user, target: other_user})
+ end
+
+ test "represent a relationship for the blocking and blocked user" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, user} = User.follow(user, other_user)
+ {:ok, other_user} = User.subscribe(user, other_user)
+ {:ok, user} = User.block(user, other_user)
+ {:ok, other_user} = User.block(other_user, user)
+
+ expected = %{
+ id: to_string(other_user.id),
+ following: false,
+ followed_by: false,
+ blocking: true,
+ blocked_by: true,
+ muting: false,
+ muting_notifications: false,
+ subscribing: false,
+ requested: false,
+ domain_blocking: false,
+ showing_reblogs: true,
+ endorsed: false
+ }
+
+ assert expected ==
+ AccountView.render("relationship.json", %{user: user, target: other_user})
+ end
+
+ test "represent a relationship for the user blocking a domain" do
+ user = insert(:user)
+ other_user = insert(:user, ap_id: "https://bad.site/users/other_user")
+
+ {:ok, user} = User.block_domain(user, "bad.site")
+
+ assert %{domain_blocking: true, blocking: false} =
+ AccountView.render("relationship.json", %{user: user, target: other_user})
+ end
- assert expected == AccountView.render("relationship.json", %{user: user, target: other_user})
+ test "represent a relationship for the user with a pending follow request" do
+ user = insert(:user)
+ other_user = insert(:user, %{info: %User.Info{locked: true}})
+
+ {:ok, user, other_user, _} = CommonAPI.follow(user, other_user)
+ user = User.get_cached_by_id(user.id)
+ other_user = User.get_cached_by_id(other_user.id)
+
+ expected = %{
+ id: to_string(other_user.id),
+ following: false,
+ followed_by: false,
+ blocking: false,
+ blocked_by: false,
+ muting: false,
+ muting_notifications: false,
+ subscribing: false,
+ requested: true,
+ domain_blocking: false,
+ showing_reblogs: true,
+ endorsed: false
+ }
+
+ assert expected ==
+ AccountView.render("relationship.json", %{user: user, target: other_user})
+ end
end
test "represent an embedded relationship" do
@@ -211,9 +306,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
source: %{
note: user.bio,
sensitive: false,
- pleroma: %{}
+ pleroma: %{},
+ fields: []
},
pleroma: %{
+ background_image: nil,
confirmation_pending: false,
tags: [],
is_admin: false,
@@ -226,6 +323,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
following: false,
followed_by: false,
blocking: true,
+ blocked_by: false,
subscribing: false,
muting: false,
muting_notifications: false,
@@ -233,10 +331,59 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
domain_blocking: false,
showing_reblogs: true,
endorsed: false
- }
+ },
+ skip_thread_containment: false
}
}
assert expected == AccountView.render("account.json", %{user: user, for: other_user})
end
+
+ test "returns the settings store if the requesting user is the represented user and it's requested specifically" do
+ user = insert(:user, %{info: %User.Info{pleroma_settings_store: %{fe: "test"}}})
+
+ result =
+ AccountView.render("account.json", %{user: user, for: user, with_pleroma_settings: true})
+
+ assert result.pleroma.settings_store == %{:fe => "test"}
+
+ result = AccountView.render("account.json", %{user: user, with_pleroma_settings: true})
+ assert result.pleroma[:settings_store] == nil
+
+ result = AccountView.render("account.json", %{user: user, for: user})
+ assert result.pleroma[:settings_store] == nil
+ end
+
+ test "sanitizes display names" do
+ user = insert(:user, name: "<marquee> username </marquee>")
+ result = AccountView.render("account.json", %{user: user})
+ refute result.display_name == "<marquee> username </marquee>"
+ end
+
+ describe "hiding follows/following" do
+ test "shows when follows/following are hidden and sets follower/following count to 0" do
+ user = insert(:user, info: %{hide_followers: true, hide_follows: true})
+ other_user = insert(:user)
+ {:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user)
+ {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user)
+
+ assert %{
+ followers_count: 0,
+ following_count: 0,
+ pleroma: %{hide_follows: true, hide_followers: true}
+ } = AccountView.render("account.json", %{user: user})
+ end
+
+ test "shows actual follower/following count to the account owner" do
+ user = insert(:user, info: %{hide_followers: true, hide_follows: true})
+ other_user = insert(:user)
+ {:ok, user, other_user, _activity} = CommonAPI.follow(user, other_user)
+ {:ok, _other_user, user, _activity} = CommonAPI.follow(other_user, user)
+
+ assert %{
+ followers_count: 1,
+ following_count: 1
+ } = AccountView.render("account.json", %{user: user, for: user})
+ end
+ end
end
diff --git a/test/web/mastodon_api/conversation_view_test.exs b/test/web/mastodon_api/conversation_view_test.exs
new file mode 100644
index 000000000..a2a880705
--- /dev/null
+++ b/test/web/mastodon_api/conversation_view_test.exs
@@ -0,0 +1,34 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastodonAPI.ConversationViewTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Conversation.Participation
+ alias Pleroma.Web.CommonAPI
+ alias Pleroma.Web.MastodonAPI.ConversationView
+
+ import Pleroma.Factory
+
+ test "represents a Mastodon Conversation entity" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}", "visibility" => "direct"})
+
+ [participation] = Participation.for_user_with_last_activity_id(user)
+
+ assert participation
+
+ conversation =
+ ConversationView.render("participation.json", %{participation: participation, for: user})
+
+ assert conversation.id == participation.id |> to_string()
+ assert conversation.last_status.id == activity.id
+
+ assert [account] = conversation.accounts
+ assert account.id == other_user.id
+ end
+end
diff --git a/test/web/mastodon_api/mastodon_api_controller/update_credentials_test.exs b/test/web/mastodon_api/mastodon_api_controller/update_credentials_test.exs
new file mode 100644
index 000000000..87ee82050
--- /dev/null
+++ b/test/web/mastodon_api/mastodon_api_controller/update_credentials_test.exs
@@ -0,0 +1,369 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do
+ alias Pleroma.Repo
+ alias Pleroma.User
+
+ use Pleroma.Web.ConnCase
+
+ import Pleroma.Factory
+ clear_config([:instance, :max_account_fields])
+
+ describe "updating credentials" do
+ test "sets user settings in a generic way", %{conn: conn} do
+ user = insert(:user)
+
+ res_conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{
+ "pleroma_settings_store" => %{
+ pleroma_fe: %{
+ theme: "bla"
+ }
+ }
+ })
+
+ assert user = json_response(res_conn, 200)
+ assert user["pleroma"]["settings_store"] == %{"pleroma_fe" => %{"theme" => "bla"}}
+
+ user = Repo.get(User, user["id"])
+
+ res_conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{
+ "pleroma_settings_store" => %{
+ masto_fe: %{
+ theme: "bla"
+ }
+ }
+ })
+
+ assert user = json_response(res_conn, 200)
+
+ assert user["pleroma"]["settings_store"] ==
+ %{
+ "pleroma_fe" => %{"theme" => "bla"},
+ "masto_fe" => %{"theme" => "bla"}
+ }
+
+ user = Repo.get(User, user["id"])
+
+ res_conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{
+ "pleroma_settings_store" => %{
+ masto_fe: %{
+ theme: "blub"
+ }
+ }
+ })
+
+ assert user = json_response(res_conn, 200)
+
+ assert user["pleroma"]["settings_store"] ==
+ %{
+ "pleroma_fe" => %{"theme" => "bla"},
+ "masto_fe" => %{"theme" => "blub"}
+ }
+ end
+
+ test "updates the user's bio", %{conn: conn} do
+ user = insert(:user)
+ user2 = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{
+ "note" => "I drink #cofe with @#{user2.nickname}"
+ })
+
+ assert user = json_response(conn, 200)
+
+ assert user["note"] ==
+ ~s(I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe" rel="tag">#cofe</a> with <span class="h-card"><a data-user=") <>
+ user2.id <>
+ ~s(" class="u-url mention" href=") <>
+ user2.ap_id <> ~s(">@<span>) <> user2.nickname <> ~s(</span></a></span>)
+ end
+
+ test "updates the user's locking status", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{locked: "true"})
+
+ assert user = json_response(conn, 200)
+ assert user["locked"] == true
+ end
+
+ test "updates the user's default scope", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{default_scope: "cofe"})
+
+ assert user = json_response(conn, 200)
+ assert user["source"]["privacy"] == "cofe"
+ end
+
+ test "updates the user's hide_followers status", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{hide_followers: "true"})
+
+ assert user = json_response(conn, 200)
+ assert user["pleroma"]["hide_followers"] == true
+ end
+
+ test "updates the user's skip_thread_containment option", %{conn: conn} do
+ user = insert(:user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{skip_thread_containment: "true"})
+ |> json_response(200)
+
+ assert response["pleroma"]["skip_thread_containment"] == true
+ assert refresh_record(user).info.skip_thread_containment
+ end
+
+ test "updates the user's hide_follows status", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{hide_follows: "true"})
+
+ assert user = json_response(conn, 200)
+ assert user["pleroma"]["hide_follows"] == true
+ end
+
+ test "updates the user's hide_favorites status", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{hide_favorites: "true"})
+
+ assert user = json_response(conn, 200)
+ assert user["pleroma"]["hide_favorites"] == true
+ end
+
+ test "updates the user's show_role status", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{show_role: "false"})
+
+ assert user = json_response(conn, 200)
+ assert user["source"]["pleroma"]["show_role"] == false
+ end
+
+ test "updates the user's no_rich_text status", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{no_rich_text: "true"})
+
+ assert user = json_response(conn, 200)
+ assert user["source"]["pleroma"]["no_rich_text"] == true
+ end
+
+ test "updates the user's name", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{"display_name" => "markorepairs"})
+
+ assert user = json_response(conn, 200)
+ assert user["display_name"] == "markorepairs"
+ end
+
+ test "updates the user's avatar", %{conn: conn} do
+ user = insert(:user)
+
+ new_avatar = %Plug.Upload{
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image.jpg"),
+ filename: "an_image.jpg"
+ }
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{"avatar" => new_avatar})
+
+ assert user_response = json_response(conn, 200)
+ assert user_response["avatar"] != User.avatar_url(user)
+ end
+
+ test "updates the user's banner", %{conn: conn} do
+ user = insert(:user)
+
+ new_header = %Plug.Upload{
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image.jpg"),
+ filename: "an_image.jpg"
+ }
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{"header" => new_header})
+
+ assert user_response = json_response(conn, 200)
+ assert user_response["header"] != User.banner_url(user)
+ end
+
+ test "updates the user's background", %{conn: conn} do
+ user = insert(:user)
+
+ new_header = %Plug.Upload{
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image.jpg"),
+ filename: "an_image.jpg"
+ }
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{
+ "pleroma_background_image" => new_header
+ })
+
+ assert user_response = json_response(conn, 200)
+ assert user_response["pleroma"]["background_image"]
+ end
+
+ test "requires 'write' permission", %{conn: conn} do
+ token1 = insert(:oauth_token, scopes: ["read"])
+ token2 = insert(:oauth_token, scopes: ["write", "follow"])
+
+ for token <- [token1, token2] do
+ conn =
+ conn
+ |> put_req_header("authorization", "Bearer #{token.token}")
+ |> patch("/api/v1/accounts/update_credentials", %{})
+
+ if token == token1 do
+ assert %{"error" => "Insufficient permissions: write."} == json_response(conn, 403)
+ else
+ assert json_response(conn, 200)
+ end
+ end
+ end
+
+ test "updates profile emojos", %{conn: conn} do
+ user = insert(:user)
+
+ note = "*sips :blank:*"
+ name = "I am :firefox:"
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{
+ "note" => note,
+ "display_name" => name
+ })
+
+ assert json_response(conn, 200)
+
+ conn =
+ conn
+ |> get("/api/v1/accounts/#{user.id}")
+
+ assert user = json_response(conn, 200)
+
+ assert user["note"] == note
+ assert user["display_name"] == name
+ assert [%{"shortcode" => "blank"}, %{"shortcode" => "firefox"}] = user["emojis"]
+ end
+
+ test "update fields", %{conn: conn} do
+ user = insert(:user)
+
+ fields = [
+ %{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "<script>bar</script>"},
+ %{"name" => "link", "value" => "cofe.io"}
+ ]
+
+ account =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{"fields" => fields})
+ |> json_response(200)
+
+ assert account["fields"] == [
+ %{"name" => "foo", "value" => "bar"},
+ %{"name" => "link", "value" => "<a href=\"http://cofe.io\">cofe.io</a>"}
+ ]
+
+ assert account["source"]["fields"] == [
+ %{
+ "name" => "<a href=\"http://google.com\">foo</a>",
+ "value" => "<script>bar</script>"
+ },
+ %{"name" => "link", "value" => "cofe.io"}
+ ]
+
+ name_limit = Pleroma.Config.get([:instance, :account_field_name_length])
+ value_limit = Pleroma.Config.get([:instance, :account_field_value_length])
+
+ long_value = Enum.map(0..value_limit, fn _ -> "x" end) |> Enum.join()
+
+ fields = [%{"name" => "<b>foo<b>", "value" => long_value}]
+
+ assert %{"error" => "Invalid request"} ==
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{"fields" => fields})
+ |> json_response(403)
+
+ long_name = Enum.map(0..name_limit, fn _ -> "x" end) |> Enum.join()
+
+ fields = [%{"name" => long_name, "value" => "bar"}]
+
+ assert %{"error" => "Invalid request"} ==
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{"fields" => fields})
+ |> json_response(403)
+
+ Pleroma.Config.put([:instance, :max_account_fields], 1)
+
+ fields = [
+ %{"name" => "<b>foo<b>", "value" => "<i>bar</i>"},
+ %{"name" => "link", "value" => "cofe.io"}
+ ]
+
+ assert %{"error" => "Invalid request"} ==
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/accounts/update_credentials", %{"fields" => fields})
+ |> json_response(403)
+ end
+ end
+end
diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs
index 93ef630f2..6fcdc19aa 100644
--- a/test/web/mastodon_api/mastodon_api_controller_test.exs
+++ b/test/web/mastodon_api/mastodon_api_controller_test.exs
@@ -7,6 +7,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
alias Ecto.Changeset
alias Pleroma.Activity
+ alias Pleroma.ActivityExpiration
+ alias Pleroma.Config
alias Pleroma.Notification
alias Pleroma.Object
alias Pleroma.Repo
@@ -23,17 +25,23 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
import Pleroma.Factory
import ExUnit.CaptureLog
import Tesla.Mock
+ import Swoosh.TestAssertions
+
+ @image "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7"
setup do
mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
:ok
end
+ clear_config([:instance, :public])
+ clear_config([:rich_media, :enabled])
+
test "the home timeline", %{conn: conn} do
user = insert(:user)
following = insert(:user)
- {:ok, _activity} = TwitterAPI.create_status(following, %{"status" => "test"})
+ {:ok, _activity} = CommonAPI.post(following, %{"status" => "test"})
conn =
conn
@@ -56,7 +64,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
following = insert(:user)
capture_log(fn ->
- {:ok, _activity} = TwitterAPI.create_status(following, %{"status" => "test"})
+ {:ok, _activity} = CommonAPI.post(following, %{"status" => "test"})
{:ok, [_activity]} =
OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
@@ -82,162 +90,315 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
end
test "the public timeline when public is set to false", %{conn: conn} do
- public = Pleroma.Config.get([:instance, :public])
- Pleroma.Config.put([:instance, :public], false)
-
- on_exit(fn ->
- Pleroma.Config.put([:instance, :public], public)
- end)
+ Config.put([:instance, :public], false)
assert conn
|> get("/api/v1/timelines/public", %{"local" => "False"})
|> json_response(403) == %{"error" => "This resource requires authentication."}
end
- test "posting a status", %{conn: conn} do
- user = insert(:user)
+ describe "posting statuses" do
+ setup do
+ user = insert(:user)
- idempotency_key = "Pikachu rocks!"
+ conn =
+ build_conn()
+ |> assign(:user, user)
- conn_one =
- conn
- |> assign(:user, user)
- |> put_req_header("idempotency-key", idempotency_key)
- |> post("/api/v1/statuses", %{
- "status" => "cofe",
- "spoiler_text" => "2hu",
- "sensitive" => "false"
- })
+ [conn: conn]
+ end
- {:ok, ttl} = Cachex.ttl(:idempotency_cache, idempotency_key)
- # Six hours
- assert ttl > :timer.seconds(6 * 60 * 60 - 1)
+ test "posting a status", %{conn: conn} do
+ idempotency_key = "Pikachu rocks!"
- assert %{"content" => "cofe", "id" => id, "spoiler_text" => "2hu", "sensitive" => false} =
- json_response(conn_one, 200)
+ conn_one =
+ conn
+ |> put_req_header("idempotency-key", idempotency_key)
+ |> post("/api/v1/statuses", %{
+ "status" => "cofe",
+ "spoiler_text" => "2hu",
+ "sensitive" => "false"
+ })
- assert Activity.get_by_id(id)
+ {:ok, ttl} = Cachex.ttl(:idempotency_cache, idempotency_key)
+ # Six hours
+ assert ttl > :timer.seconds(6 * 60 * 60 - 1)
- conn_two =
- conn
- |> assign(:user, user)
- |> put_req_header("idempotency-key", idempotency_key)
- |> post("/api/v1/statuses", %{
- "status" => "cofe",
- "spoiler_text" => "2hu",
- "sensitive" => "false"
- })
+ assert %{"content" => "cofe", "id" => id, "spoiler_text" => "2hu", "sensitive" => false} =
+ json_response(conn_one, 200)
- assert %{"id" => second_id} = json_response(conn_two, 200)
+ assert Activity.get_by_id(id)
- assert id == second_id
+ conn_two =
+ conn
+ |> put_req_header("idempotency-key", idempotency_key)
+ |> post("/api/v1/statuses", %{
+ "status" => "cofe",
+ "spoiler_text" => "2hu",
+ "sensitive" => "false"
+ })
- conn_three =
- conn
- |> assign(:user, user)
- |> post("/api/v1/statuses", %{
- "status" => "cofe",
- "spoiler_text" => "2hu",
- "sensitive" => "false"
- })
+ assert %{"id" => second_id} = json_response(conn_two, 200)
+ assert id == second_id
- assert %{"id" => third_id} = json_response(conn_three, 200)
+ conn_three =
+ conn
+ |> post("/api/v1/statuses", %{
+ "status" => "cofe",
+ "spoiler_text" => "2hu",
+ "sensitive" => "false"
+ })
- refute id == third_id
- end
+ assert %{"id" => third_id} = json_response(conn_three, 200)
+ refute id == third_id
- test "posting a sensitive status", %{conn: conn} do
- user = insert(:user)
+ # An activity that will expire:
+ # 2 hours
+ expires_in = 120 * 60
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/v1/statuses", %{"status" => "cofe", "sensitive" => true})
+ conn_four =
+ conn
+ |> post("api/v1/statuses", %{
+ "status" => "oolong",
+ "expires_in" => expires_in
+ })
- assert %{"content" => "cofe", "id" => id, "sensitive" => true} = json_response(conn, 200)
- assert Activity.get_by_id(id)
- end
+ assert fourth_response = %{"id" => fourth_id} = json_response(conn_four, 200)
+ assert activity = Activity.get_by_id(fourth_id)
+ assert expiration = ActivityExpiration.get_by_activity_id(fourth_id)
- test "posting a fake status", %{conn: conn} do
- user = insert(:user)
+ estimated_expires_at =
+ NaiveDateTime.utc_now()
+ |> NaiveDateTime.add(expires_in)
+ |> NaiveDateTime.truncate(:second)
- real_conn =
- conn
- |> assign(:user, user)
- |> post("/api/v1/statuses", %{
- "status" =>
- "\"Tenshi Eating a Corndog\" is a much discussed concept on /jp/. The significance of it is disputed, so I will focus on one core concept: the symbolism behind it"
- })
+ # This assert will fail if the test takes longer than a minute. I sure hope it never does:
+ assert abs(NaiveDateTime.diff(expiration.scheduled_at, estimated_expires_at, :second)) < 60
- real_status = json_response(real_conn, 200)
+ assert fourth_response["pleroma"]["expires_at"] ==
+ NaiveDateTime.to_iso8601(expiration.scheduled_at)
+ end
- assert real_status
- assert Object.get_by_ap_id(real_status["uri"])
+ test "replying to a status", %{conn: conn} do
+ user = insert(:user)
+ {:ok, replied_to} = CommonAPI.post(user, %{"status" => "cofe"})
- real_status =
- real_status
- |> Map.put("id", nil)
- |> Map.put("url", nil)
- |> Map.put("uri", nil)
- |> Map.put("created_at", nil)
- |> Kernel.put_in(["pleroma", "conversation_id"], nil)
+ conn =
+ conn
+ |> post("/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => replied_to.id})
- fake_conn =
- conn
- |> assign(:user, user)
- |> post("/api/v1/statuses", %{
- "status" =>
- "\"Tenshi Eating a Corndog\" is a much discussed concept on /jp/. The significance of it is disputed, so I will focus on one core concept: the symbolism behind it",
- "preview" => true
- })
+ assert %{"content" => "xD", "id" => id} = json_response(conn, 200)
- fake_status = json_response(fake_conn, 200)
+ activity = Activity.get_by_id(id)
- assert fake_status
- refute Object.get_by_ap_id(fake_status["uri"])
+ assert activity.data["context"] == replied_to.data["context"]
+ assert Activity.get_in_reply_to_activity(activity).id == replied_to.id
+ end
- fake_status =
- fake_status
- |> Map.put("id", nil)
- |> Map.put("url", nil)
- |> Map.put("uri", nil)
- |> Map.put("created_at", nil)
- |> Kernel.put_in(["pleroma", "conversation_id"], nil)
+ test "replying to a direct message with visibility other than direct", %{conn: conn} do
+ user = insert(:user)
+ {:ok, replied_to} = CommonAPI.post(user, %{"status" => "suya..", "visibility" => "direct"})
- assert real_status == fake_status
- end
+ Enum.each(["public", "private", "unlisted"], fn visibility ->
+ conn =
+ conn
+ |> post("/api/v1/statuses", %{
+ "status" => "@#{user.nickname} hey",
+ "in_reply_to_id" => replied_to.id,
+ "visibility" => visibility
+ })
- test "posting a status with OGP link preview", %{conn: conn} do
- Pleroma.Config.put([:rich_media, :enabled], true)
- user = insert(:user)
+ assert json_response(conn, 422) == %{"error" => "The message visibility must be direct"}
+ end)
+ end
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/v1/statuses", %{
- "status" => "http://example.com/ogp"
- })
+ test "posting a status with an invalid in_reply_to_id", %{conn: conn} do
+ conn =
+ conn
+ |> post("/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => ""})
+
+ assert %{"content" => "xD", "id" => id} = json_response(conn, 200)
+ assert Activity.get_by_id(id)
+ end
+
+ test "posting a sensitive status", %{conn: conn} do
+ conn =
+ conn
+ |> post("/api/v1/statuses", %{"status" => "cofe", "sensitive" => true})
+
+ assert %{"content" => "cofe", "id" => id, "sensitive" => true} = json_response(conn, 200)
+ assert Activity.get_by_id(id)
+ end
+
+ test "posting a fake status", %{conn: conn} do
+ real_conn =
+ conn
+ |> post("/api/v1/statuses", %{
+ "status" =>
+ "\"Tenshi Eating a Corndog\" is a much discussed concept on /jp/. The significance of it is disputed, so I will focus on one core concept: the symbolism behind it"
+ })
+
+ real_status = json_response(real_conn, 200)
+
+ assert real_status
+ assert Object.get_by_ap_id(real_status["uri"])
+
+ real_status =
+ real_status
+ |> Map.put("id", nil)
+ |> Map.put("url", nil)
+ |> Map.put("uri", nil)
+ |> Map.put("created_at", nil)
+ |> Kernel.put_in(["pleroma", "conversation_id"], nil)
+
+ fake_conn =
+ conn
+ |> post("/api/v1/statuses", %{
+ "status" =>
+ "\"Tenshi Eating a Corndog\" is a much discussed concept on /jp/. The significance of it is disputed, so I will focus on one core concept: the symbolism behind it",
+ "preview" => true
+ })
+
+ fake_status = json_response(fake_conn, 200)
+
+ assert fake_status
+ refute Object.get_by_ap_id(fake_status["uri"])
- assert %{"id" => id, "card" => %{"title" => "The Rock"}} = json_response(conn, 200)
- assert Activity.get_by_id(id)
- Pleroma.Config.put([:rich_media, :enabled], false)
+ fake_status =
+ fake_status
+ |> Map.put("id", nil)
+ |> Map.put("url", nil)
+ |> Map.put("uri", nil)
+ |> Map.put("created_at", nil)
+ |> Kernel.put_in(["pleroma", "conversation_id"], nil)
+
+ assert real_status == fake_status
+ end
+
+ test "posting a status with OGP link preview", %{conn: conn} do
+ Config.put([:rich_media, :enabled], true)
+
+ conn =
+ conn
+ |> post("/api/v1/statuses", %{
+ "status" => "https://example.com/ogp"
+ })
+
+ assert %{"id" => id, "card" => %{"title" => "The Rock"}} = json_response(conn, 200)
+ assert Activity.get_by_id(id)
+ end
+
+ test "posting a direct status", %{conn: conn} do
+ user2 = insert(:user)
+ content = "direct cofe @#{user2.nickname}"
+
+ conn =
+ conn
+ |> post("api/v1/statuses", %{"status" => content, "visibility" => "direct"})
+
+ assert %{"id" => id, "visibility" => "direct"} = json_response(conn, 200)
+ assert activity = Activity.get_by_id(id)
+ assert activity.recipients == [user2.ap_id, conn.assigns[:user].ap_id]
+ assert activity.data["to"] == [user2.ap_id]
+ assert activity.data["cc"] == []
+ end
end
- test "posting a direct status", %{conn: conn} do
- user1 = insert(:user)
- user2 = insert(:user)
- content = "direct cofe @#{user2.nickname}"
+ describe "posting polls" do
+ test "posting a poll", %{conn: conn} do
+ user = insert(:user)
+ time = NaiveDateTime.utc_now()
- conn =
- conn
- |> assign(:user, user1)
- |> post("api/v1/statuses", %{"status" => content, "visibility" => "direct"})
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses", %{
+ "status" => "Who is the #bestgrill?",
+ "poll" => %{"options" => ["Rei", "Asuka", "Misato"], "expires_in" => 420}
+ })
+
+ response = json_response(conn, 200)
- assert %{"id" => id, "visibility" => "direct"} = json_response(conn, 200)
- assert activity = Activity.get_by_id(id)
- assert activity.recipients == [user2.ap_id, user1.ap_id]
- assert activity.data["to"] == [user2.ap_id]
- assert activity.data["cc"] == []
+ assert Enum.all?(response["poll"]["options"], fn %{"title" => title} ->
+ title in ["Rei", "Asuka", "Misato"]
+ end)
+
+ assert NaiveDateTime.diff(NaiveDateTime.from_iso8601!(response["poll"]["expires_at"]), time) in 420..430
+ refute response["poll"]["expred"]
+ end
+
+ test "option limit is enforced", %{conn: conn} do
+ user = insert(:user)
+ limit = Config.get([:instance, :poll_limits, :max_options])
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses", %{
+ "status" => "desu~",
+ "poll" => %{"options" => Enum.map(0..limit, fn _ -> "desu" end), "expires_in" => 1}
+ })
+
+ %{"error" => error} = json_response(conn, 422)
+ assert error == "Poll can't contain more than #{limit} options"
+ end
+
+ test "option character limit is enforced", %{conn: conn} do
+ user = insert(:user)
+ limit = Config.get([:instance, :poll_limits, :max_option_chars])
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses", %{
+ "status" => "...",
+ "poll" => %{
+ "options" => [Enum.reduce(0..limit, "", fn _, acc -> acc <> "." end)],
+ "expires_in" => 1
+ }
+ })
+
+ %{"error" => error} = json_response(conn, 422)
+ assert error == "Poll options cannot be longer than #{limit} characters each"
+ end
+
+ test "minimal date limit is enforced", %{conn: conn} do
+ user = insert(:user)
+ limit = Config.get([:instance, :poll_limits, :min_expiration])
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses", %{
+ "status" => "imagine arbitrary limits",
+ "poll" => %{
+ "options" => ["this post was made by pleroma gang"],
+ "expires_in" => limit - 1
+ }
+ })
+
+ %{"error" => error} = json_response(conn, 422)
+ assert error == "Expiration date is too soon"
+ end
+
+ test "maximum date limit is enforced", %{conn: conn} do
+ user = insert(:user)
+ limit = Config.get([:instance, :poll_limits, :max_expiration])
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses", %{
+ "status" => "imagine arbitrary limits",
+ "poll" => %{
+ "options" => ["this post was made by pleroma gang"],
+ "expires_in" => limit + 1
+ }
+ })
+
+ %{"error" => error} = json_response(conn, 422)
+ assert error == "Expiration date is too far in the future"
+ end
end
test "direct timeline", %{conn: conn} do
@@ -269,7 +430,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert %{"visibility" => "direct"} = status
assert status["url"] != direct.data["id"]
- # User should be able to see his own direct message
+ # User should be able to see their own direct message
res_conn =
build_conn()
|> assign(:user, user_one)
@@ -317,12 +478,13 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
test "Conversations", %{conn: conn} do
user_one = insert(:user)
user_two = insert(:user)
+ user_three = insert(:user)
{:ok, user_two} = User.follow(user_two, user_one)
{:ok, direct} =
CommonAPI.post(user_one, %{
- "status" => "Hi @#{user_two.nickname}!",
+ "status" => "Hi @#{user_two.nickname}, @#{user_three.nickname}!",
"visibility" => "direct"
})
@@ -348,7 +510,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
}
] = response
+ account_ids = Enum.map(res_accounts, & &1["id"])
assert length(res_accounts) == 2
+ assert user_two.id in account_ids
+ assert user_three.id in account_ids
assert is_binary(res_id)
assert unread == true
assert res_last_status["id"] == direct.id
@@ -400,81 +565,146 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert status["id"] == direct.id
end
- test "replying to a status", %{conn: conn} do
+ test "verify_credentials", %{conn: conn} do
user = insert(:user)
- {:ok, replied_to} = TwitterAPI.create_status(user, %{"status" => "cofe"})
+ conn =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/accounts/verify_credentials")
+
+ response = json_response(conn, 200)
+
+ assert %{"id" => id, "source" => %{"privacy" => "public"}} = response
+ assert response["pleroma"]["chat_token"]
+ assert id == to_string(user.id)
+ end
+
+ test "verify_credentials default scope unlisted", %{conn: conn} do
+ user = insert(:user, %{info: %User.Info{default_scope: "unlisted"}})
conn =
conn
|> assign(:user, user)
- |> post("/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => replied_to.id})
+ |> get("/api/v1/accounts/verify_credentials")
- assert %{"content" => "xD", "id" => id} = json_response(conn, 200)
+ assert %{"id" => id, "source" => %{"privacy" => "unlisted"}} = json_response(conn, 200)
+ assert id == to_string(user.id)
+ end
- activity = Activity.get_by_id(id)
+ test "apps/verify_credentials", %{conn: conn} do
+ token = insert(:oauth_token)
- assert activity.data["context"] == replied_to.data["context"]
- assert Activity.get_in_reply_to_activity(activity).id == replied_to.id
+ conn =
+ conn
+ |> assign(:user, token.user)
+ |> assign(:token, token)
+ |> get("/api/v1/apps/verify_credentials")
+
+ app = Repo.preload(token, :app).app
+
+ expected = %{
+ "name" => app.client_name,
+ "website" => app.website,
+ "vapid_key" => Push.vapid_config() |> Keyword.get(:public_key)
+ }
+
+ assert expected == json_response(conn, 200)
end
- test "posting a status with an invalid in_reply_to_id", %{conn: conn} do
+ test "user avatar can be set", %{conn: conn} do
user = insert(:user)
+ avatar_image = File.read!("test/fixtures/avatar_data_uri")
conn =
conn
|> assign(:user, user)
- |> post("/api/v1/statuses", %{"status" => "xD", "in_reply_to_id" => ""})
+ |> patch("/api/v1/pleroma/accounts/update_avatar", %{img: avatar_image})
- assert %{"content" => "xD", "id" => id} = json_response(conn, 200)
+ user = refresh_record(user)
- activity = Activity.get_by_id(id)
+ assert %{
+ "name" => _,
+ "type" => _,
+ "url" => [
+ %{
+ "href" => _,
+ "mediaType" => _,
+ "type" => _
+ }
+ ]
+ } = user.avatar
- assert activity
+ assert %{"url" => _} = json_response(conn, 200)
end
- test "verify_credentials", %{conn: conn} do
+ test "user avatar can be reset", %{conn: conn} do
user = insert(:user)
conn =
conn
|> assign(:user, user)
- |> get("/api/v1/accounts/verify_credentials")
+ |> patch("/api/v1/pleroma/accounts/update_avatar", %{img: ""})
- assert %{"id" => id, "source" => %{"privacy" => "public"}} = json_response(conn, 200)
- assert id == to_string(user.id)
+ user = User.get_cached_by_id(user.id)
+
+ assert user.avatar == nil
+
+ assert %{"url" => nil} = json_response(conn, 200)
end
- test "verify_credentials default scope unlisted", %{conn: conn} do
- user = insert(:user, %{info: %User.Info{default_scope: "unlisted"}})
+ test "can set profile banner", %{conn: conn} do
+ user = insert(:user)
conn =
conn
|> assign(:user, user)
- |> get("/api/v1/accounts/verify_credentials")
+ |> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => @image})
- assert %{"id" => id, "source" => %{"privacy" => "unlisted"}} = json_response(conn, 200)
- assert id == to_string(user.id)
+ user = refresh_record(user)
+ assert user.info.banner["type"] == "Image"
+
+ assert %{"url" => _} = json_response(conn, 200)
end
- test "apps/verify_credentials", %{conn: conn} do
- token = insert(:oauth_token)
+ test "can reset profile banner", %{conn: conn} do
+ user = insert(:user)
conn =
conn
- |> assign(:user, token.user)
- |> assign(:token, token)
- |> get("/api/v1/apps/verify_credentials")
+ |> assign(:user, user)
+ |> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => ""})
- app = Repo.preload(token, :app).app
+ user = refresh_record(user)
+ assert user.info.banner == %{}
- expected = %{
- "name" => app.client_name,
- "website" => app.website,
- "vapid_key" => Push.vapid_config() |> Keyword.get(:public_key)
- }
+ assert %{"url" => nil} = json_response(conn, 200)
+ end
- assert expected == json_response(conn, 200)
+ test "background image can be set", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/pleroma/accounts/update_background", %{"img" => @image})
+
+ user = refresh_record(user)
+ assert user.info.background["type"] == "Image"
+ assert %{"url" => _} = json_response(conn, 200)
+ end
+
+ test "background image can be reset", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/pleroma/accounts/update_background", %{"img" => ""})
+
+ user = refresh_record(user)
+ assert user.info.background == %{}
+ assert %{"url" => nil} = json_response(conn, 200)
end
test "creates an oauth app", %{conn: conn} do
@@ -800,8 +1030,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
test "list timeline", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)
- {:ok, _activity_one} = TwitterAPI.create_status(user, %{"status" => "Marisa is cute."})
- {:ok, activity_two} = TwitterAPI.create_status(other_user, %{"status" => "Marisa is cute."})
+ {:ok, _activity_one} = CommonAPI.post(user, %{"status" => "Marisa is cute."})
+ {:ok, activity_two} = CommonAPI.post(other_user, %{"status" => "Marisa is cute."})
{:ok, list} = Pleroma.List.create("name", user)
{:ok, list} = Pleroma.List.follow(list, other_user)
@@ -818,10 +1048,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
test "list timeline does not leak non-public statuses for unfollowed users", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)
- {:ok, activity_one} = TwitterAPI.create_status(other_user, %{"status" => "Marisa is cute."})
+ {:ok, activity_one} = CommonAPI.post(other_user, %{"status" => "Marisa is cute."})
{:ok, _activity_two} =
- TwitterAPI.create_status(other_user, %{
+ CommonAPI.post(other_user, %{
"status" => "Marisa is cute.",
"visibility" => "private"
})
@@ -845,8 +1075,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
user = insert(:user)
other_user = insert(:user)
- {:ok, activity} =
- TwitterAPI.create_status(other_user, %{"status" => "hi @#{user.nickname}"})
+ {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
{:ok, [_notification]} = Notification.create_notifications(activity)
@@ -868,8 +1097,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
user = insert(:user)
other_user = insert(:user)
- {:ok, activity} =
- TwitterAPI.create_status(other_user, %{"status" => "hi @#{user.nickname}"})
+ {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
{:ok, [notification]} = Notification.create_notifications(activity)
@@ -891,8 +1119,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
user = insert(:user)
other_user = insert(:user)
- {:ok, activity} =
- TwitterAPI.create_status(other_user, %{"status" => "hi @#{user.nickname}"})
+ {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
{:ok, [notification]} = Notification.create_notifications(activity)
@@ -908,8 +1135,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
user = insert(:user)
other_user = insert(:user)
- {:ok, activity} =
- TwitterAPI.create_status(other_user, %{"status" => "hi @#{user.nickname}"})
+ {:ok, activity} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
{:ok, [_notification]} = Notification.create_notifications(activity)
@@ -1070,6 +1296,71 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
result = json_response(conn_res, 200)
assert [%{"id" => ^notification4_id}, %{"id" => ^notification3_id}] = result
end
+
+ test "doesn't see notifications after muting user with notifications", %{conn: conn} do
+ user = insert(:user)
+ user2 = insert(:user)
+
+ {:ok, _, _, _} = CommonAPI.follow(user, user2)
+ {:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"})
+
+ conn = assign(conn, :user, user)
+
+ conn = get(conn, "/api/v1/notifications")
+
+ assert length(json_response(conn, 200)) == 1
+
+ {:ok, user} = User.mute(user, user2)
+
+ conn = assign(build_conn(), :user, user)
+ conn = get(conn, "/api/v1/notifications")
+
+ assert json_response(conn, 200) == []
+ end
+
+ test "see notifications after muting user without notifications", %{conn: conn} do
+ user = insert(:user)
+ user2 = insert(:user)
+
+ {:ok, _, _, _} = CommonAPI.follow(user, user2)
+ {:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"})
+
+ conn = assign(conn, :user, user)
+
+ conn = get(conn, "/api/v1/notifications")
+
+ assert length(json_response(conn, 200)) == 1
+
+ {:ok, user} = User.mute(user, user2, false)
+
+ conn = assign(build_conn(), :user, user)
+ conn = get(conn, "/api/v1/notifications")
+
+ assert length(json_response(conn, 200)) == 1
+ end
+
+ test "see notifications after muting user with notifications and with_muted parameter", %{
+ conn: conn
+ } do
+ user = insert(:user)
+ user2 = insert(:user)
+
+ {:ok, _, _, _} = CommonAPI.follow(user, user2)
+ {:ok, _} = CommonAPI.post(user2, %{"status" => "hey @#{user.nickname}"})
+
+ conn = assign(conn, :user, user)
+
+ conn = get(conn, "/api/v1/notifications")
+
+ assert length(json_response(conn, 200)) == 1
+
+ {:ok, user} = User.mute(user, user2)
+
+ conn = assign(build_conn(), :user, user)
+ conn = get(conn, "/api/v1/notifications", %{"with_muted" => "true"})
+
+ assert length(json_response(conn, 200)) == 1
+ end
end
describe "reblogging" do
@@ -1126,6 +1417,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert to_string(activity.id) == id
end
+
+ test "returns 400 error when activity is not exist", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses/foo/reblog")
+
+ assert json_response(conn, 400) == %{"error" => "Could not repeat"}
+ end
end
describe "unreblogging" do
@@ -1144,6 +1446,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert to_string(activity.id) == id
end
+
+ test "returns 400 error when activity is not exist", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses/foo/unreblog")
+
+ assert json_response(conn, 400) == %{"error" => "Could not unrepeat"}
+ end
end
describe "favoriting" do
@@ -1162,16 +1475,15 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert to_string(activity.id) == id
end
- test "returns 500 for a wrong id", %{conn: conn} do
+ test "returns 400 error for a wrong id", %{conn: conn} do
user = insert(:user)
- resp =
+ conn =
conn
|> assign(:user, user)
|> post("/api/v1/statuses/1/favourite")
- |> json_response(500)
- assert resp == "Something went wrong"
+ assert json_response(conn, 400) == %{"error" => "Could not favorite"}
end
end
@@ -1192,6 +1504,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert to_string(activity.id) == id
end
+
+ test "returns 400 error for a wrong id", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses/1/unfavourite")
+
+ assert json_response(conn, 400) == %{"error" => "Could not unfavorite"}
+ end
end
describe "user timelines" do
@@ -1262,10 +1585,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
media =
TwitterAPI.upload(file, user, "json")
- |> Poison.decode!()
+ |> Jason.decode!()
{:ok, image_post} =
- TwitterAPI.create_status(user, %{"status" => "cofe", "media_ids" => [media["media_id"]]})
+ CommonAPI.post(user, %{"status" => "cofe", "media_ids" => [media["media_id"]]})
conn =
conn
@@ -1301,6 +1624,19 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert [%{"id" => id}] = json_response(conn, 200)
assert id == to_string(post.id)
end
+
+ test "filters user's statuses by a hashtag", %{conn: conn} do
+ user = insert(:user)
+ {:ok, post} = CommonAPI.post(user, %{"status" => "#hashtag"})
+ {:ok, _post} = CommonAPI.post(user, %{"status" => "hashtag"})
+
+ conn =
+ conn
+ |> get("/api/v1/accounts/#{user.id}/statuses", %{"tagged" => "hashtag"})
+
+ assert [%{"id" => id}] = json_response(conn, 200)
+ assert id == to_string(post.id)
+ end
end
describe "user relationships" do
@@ -1320,6 +1656,43 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
end
end
+ describe "media upload" do
+ setup do
+ user = insert(:user)
+
+ conn =
+ build_conn()
+ |> assign(:user, user)
+
+ image = %Plug.Upload{
+ content_type: "image/jpg",
+ path: Path.absname("test/fixtures/image.jpg"),
+ filename: "an_image.jpg"
+ }
+
+ [conn: conn, image: image]
+ end
+
+ clear_config([:media_proxy])
+ clear_config([Pleroma.Upload])
+
+ test "returns uploaded image", %{conn: conn, image: image} do
+ desc = "Description of the image"
+
+ media =
+ conn
+ |> post("/api/v1/media", %{"file" => image, "description" => desc})
+ |> json_response(:ok)
+
+ assert media["type"] == "image"
+ assert media["description"] == desc
+ assert media["id"]
+
+ object = Repo.get(Object, media["id"])
+ assert object.data["actor"] == User.ap_id(conn.assigns[:user])
+ end
+ end
+
describe "locked accounts" do
test "/api/v1/follow_requests works" do
user = insert(:user, %{info: %User.Info{locked: true}})
@@ -1429,32 +1802,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert id == user.id
end
- test "media upload", %{conn: conn} do
- file = %Plug.Upload{
- content_type: "image/jpg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- desc = "Description of the image"
-
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/v1/media", %{"file" => file, "description" => desc})
-
- assert media = json_response(conn, 200)
-
- assert media["type"] == "image"
- assert media["description"] == desc
- assert media["id"]
-
- object = Repo.get(Object, media["id"])
- assert object.data["actor"] == User.ap_id(user)
- end
-
test "mascot upload", %{conn: conn} do
user = insert(:user)
@@ -1525,7 +1872,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
following = insert(:user)
capture_log(fn ->
- {:ok, activity} = TwitterAPI.create_status(following, %{"status" => "test #2hu"})
+ {:ok, activity} = CommonAPI.post(following, %{"status" => "test #2hu"})
{:ok, [_activity]} =
OStatus.fetch_activity_from_url("https://shitposter.club/notice/2827873")
@@ -1838,25 +2185,52 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert %{"error" => "Record not found"} = json_response(conn_res, 404)
end
- test "muting / unmuting a user", %{conn: conn} do
- user = insert(:user)
- other_user = insert(:user)
+ describe "mute/unmute" do
+ test "with notifications", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
- conn =
- conn
- |> assign(:user, user)
- |> post("/api/v1/accounts/#{other_user.id}/mute")
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/accounts/#{other_user.id}/mute")
- assert %{"id" => _id, "muting" => true} = json_response(conn, 200)
+ response = json_response(conn, 200)
- user = User.get_cached_by_id(user.id)
+ assert %{"id" => _id, "muting" => true, "muting_notifications" => true} = response
+ user = User.get_cached_by_id(user.id)
- conn =
- build_conn()
- |> assign(:user, user)
- |> post("/api/v1/accounts/#{other_user.id}/unmute")
+ conn =
+ build_conn()
+ |> assign(:user, user)
+ |> post("/api/v1/accounts/#{other_user.id}/unmute")
+
+ response = json_response(conn, 200)
+ assert %{"id" => _id, "muting" => false, "muting_notifications" => false} = response
+ end
+
+ test "without notifications", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/accounts/#{other_user.id}/mute", %{"notifications" => "false"})
+
+ response = json_response(conn, 200)
- assert %{"id" => _id, "muting" => false} = json_response(conn, 200)
+ assert %{"id" => _id, "muting" => true, "muting_notifications" => false} = response
+ user = User.get_cached_by_id(user.id)
+
+ conn =
+ build_conn()
+ |> assign(:user, user)
+ |> post("/api/v1/accounts/#{other_user.id}/unmute")
+
+ response = json_response(conn, 200)
+ assert %{"id" => _id, "muting" => false, "muting_notifications" => false} = response
+ end
end
test "subscribing / unsubscribing to a user", %{conn: conn} do
@@ -1983,104 +2357,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
end)
end
- test "account search", %{conn: conn} do
- user = insert(:user)
- user_two = insert(:user, %{nickname: "shp@shitposter.club"})
- user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
-
- results =
- conn
- |> assign(:user, user)
- |> get("/api/v1/accounts/search", %{"q" => "shp"})
- |> json_response(200)
-
- result_ids = for result <- results, do: result["acct"]
-
- assert user_two.nickname in result_ids
- assert user_three.nickname in result_ids
-
- results =
- conn
- |> assign(:user, user)
- |> get("/api/v1/accounts/search", %{"q" => "2hu"})
- |> json_response(200)
-
- result_ids = for result <- results, do: result["acct"]
-
- assert user_three.nickname in result_ids
- end
-
- test "search", %{conn: conn} do
- user = insert(:user)
- user_two = insert(:user, %{nickname: "shp@shitposter.club"})
- user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
-
- {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
-
- {:ok, _activity} =
- CommonAPI.post(user, %{
- "status" => "This is about 2hu, but private",
- "visibility" => "private"
- })
-
- {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
-
- conn =
- conn
- |> get("/api/v1/search", %{"q" => "2hu"})
-
- assert results = json_response(conn, 200)
-
- [account | _] = results["accounts"]
- assert account["id"] == to_string(user_three.id)
-
- assert results["hashtags"] == []
-
- [status] = results["statuses"]
- assert status["id"] == to_string(activity.id)
- end
-
- test "search fetches remote statuses", %{conn: conn} do
- capture_log(fn ->
- conn =
- conn
- |> get("/api/v1/search", %{"q" => "https://shitposter.club/notice/2827873"})
-
- assert results = json_response(conn, 200)
-
- [status] = results["statuses"]
- assert status["uri"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
- end)
- end
-
- test "search doesn't show statuses that it shouldn't", %{conn: conn} do
- {:ok, activity} =
- CommonAPI.post(insert(:user), %{
- "status" => "This is about 2hu, but private",
- "visibility" => "private"
- })
-
- capture_log(fn ->
- conn =
- conn
- |> get("/api/v1/search", %{"q" => Object.normalize(activity).data["id"]})
-
- assert results = json_response(conn, 200)
-
- [] = results["statuses"]
- end)
- end
-
- test "search fetches remote accounts", %{conn: conn} do
- conn =
- conn
- |> get("/api/v1/search", %{"q" => "shp@social.heldscal.la", "resolve" => "true"})
-
- assert results = json_response(conn, 200)
- [account] = results["accounts"]
- assert account["acct"] == "shp@social.heldscal.la"
- end
-
test "returns the favorites of a user", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)
@@ -2321,210 +2597,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
end
end
- describe "updating credentials" do
- test "updates the user's bio", %{conn: conn} do
- user = insert(:user)
- user2 = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{
- "note" => "I drink #cofe with @#{user2.nickname}"
- })
-
- assert user = json_response(conn, 200)
-
- assert user["note"] ==
- ~s(I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe" rel="tag">#cofe</a> with <span class="h-card"><a data-user=") <>
- user2.id <>
- ~s(" class="u-url mention" href=") <>
- user2.ap_id <> ~s(">@<span>) <> user2.nickname <> ~s(</span></a></span>)
- end
-
- test "updates the user's locking status", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{locked: "true"})
-
- assert user = json_response(conn, 200)
- assert user["locked"] == true
- end
-
- test "updates the user's default scope", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{default_scope: "cofe"})
-
- assert user = json_response(conn, 200)
- assert user["source"]["privacy"] == "cofe"
- end
-
- test "updates the user's hide_followers status", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{hide_followers: "true"})
-
- assert user = json_response(conn, 200)
- assert user["pleroma"]["hide_followers"] == true
- end
-
- test "updates the user's hide_follows status", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{hide_follows: "true"})
-
- assert user = json_response(conn, 200)
- assert user["pleroma"]["hide_follows"] == true
- end
-
- test "updates the user's hide_favorites status", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{hide_favorites: "true"})
-
- assert user = json_response(conn, 200)
- assert user["pleroma"]["hide_favorites"] == true
- end
-
- test "updates the user's show_role status", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{show_role: "false"})
-
- assert user = json_response(conn, 200)
- assert user["source"]["pleroma"]["show_role"] == false
- end
-
- test "updates the user's no_rich_text status", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{no_rich_text: "true"})
-
- assert user = json_response(conn, 200)
- assert user["source"]["pleroma"]["no_rich_text"] == true
- end
-
- test "updates the user's name", %{conn: conn} do
- user = insert(:user)
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{"display_name" => "markorepairs"})
-
- assert user = json_response(conn, 200)
- assert user["display_name"] == "markorepairs"
- end
-
- test "updates the user's avatar", %{conn: conn} do
- user = insert(:user)
-
- new_avatar = %Plug.Upload{
- content_type: "image/jpg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{"avatar" => new_avatar})
-
- assert user_response = json_response(conn, 200)
- assert user_response["avatar"] != User.avatar_url(user)
- end
-
- test "updates the user's banner", %{conn: conn} do
- user = insert(:user)
-
- new_header = %Plug.Upload{
- content_type: "image/jpg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{"header" => new_header})
-
- assert user_response = json_response(conn, 200)
- assert user_response["header"] != User.banner_url(user)
- end
-
- test "requires 'write' permission", %{conn: conn} do
- token1 = insert(:oauth_token, scopes: ["read"])
- token2 = insert(:oauth_token, scopes: ["write", "follow"])
-
- for token <- [token1, token2] do
- conn =
- conn
- |> put_req_header("authorization", "Bearer #{token.token}")
- |> patch("/api/v1/accounts/update_credentials", %{})
-
- if token == token1 do
- assert %{"error" => "Insufficient permissions: write."} == json_response(conn, 403)
- else
- assert json_response(conn, 200)
- end
- end
- end
-
- test "updates profile emojos", %{conn: conn} do
- user = insert(:user)
-
- note = "*sips :blank:*"
- name = "I am :firefox:"
-
- conn =
- conn
- |> assign(:user, user)
- |> patch("/api/v1/accounts/update_credentials", %{
- "note" => note,
- "display_name" => name
- })
-
- assert json_response(conn, 200)
-
- conn =
- conn
- |> get("/api/v1/accounts/#{user.id}")
-
- assert user = json_response(conn, 200)
-
- assert user["note"] == note
- assert user["display_name"] == name
- assert [%{"shortcode" => "blank"}, %{"shortcode" => "firefox"}] = user["emojis"]
- end
- end
-
test "get instance information", %{conn: conn} do
conn = get(conn, "/api/v1/instance")
assert result = json_response(conn, 200)
- email = Pleroma.Config.get([:instance, :email])
+ email = Config.get([:instance, :email])
# Note: not checking for "max_toot_chars" since it's optional
assert %{
"uri" => _,
@@ -2538,7 +2615,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
"stats" => _,
"thumbnail" => _,
"languages" => _,
- "registrations" => _
+ "registrations" => _,
+ "poll_limits" => _
} = result
assert email == from_config_email
@@ -2553,7 +2631,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
insert(:user, %{local: false, nickname: "u@peer1.com"})
insert(:user, %{local: false, nickname: "u@peer2.com"})
- {:ok, _} = TwitterAPI.create_status(user, %{"status" => "cofe"})
+ {:ok, _} = CommonAPI.post(user, %{"status" => "cofe"})
# Stats should count users with missing or nil `info.deactivated` value
user = User.get_cached_by_id(user.id)
@@ -2565,7 +2643,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|> Changeset.put_embed(:info, info_change)
|> User.update_and_set_cache()
- Pleroma.Stats.update_stats()
+ Pleroma.Stats.force_update()
conn = get(conn, "/api/v1/instance")
@@ -2583,7 +2661,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
insert(:user, %{local: false, nickname: "u@peer1.com"})
insert(:user, %{local: false, nickname: "u@peer2.com"})
- Pleroma.Stats.update_stats()
+ Pleroma.Stats.force_update()
conn = get(conn, "/api/v1/instance/peers")
@@ -2608,14 +2686,16 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
describe "pinned statuses" do
setup do
- Pleroma.Config.put([:instance, :max_pinned_statuses], 1)
-
user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!"})
[user: user, activity: activity]
end
+ clear_config([:instance, :max_pinned_statuses]) do
+ Config.put([:instance, :max_pinned_statuses], 1)
+ end
+
test "returns pinned statuses", %{conn: conn, user: user, activity: activity} do
{:ok, _} = CommonAPI.pin(activity.id, user)
@@ -2646,6 +2726,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|> json_response(200)
end
+ test "/pin: returns 400 error when activity is not public", %{conn: conn, user: user} do
+ {:ok, dm} = CommonAPI.post(user, %{"status" => "test", "visibility" => "direct"})
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses/#{dm.id}/pin")
+
+ assert json_response(conn, 400) == %{"error" => "Could not pin"}
+ end
+
test "unpin status", %{conn: conn, user: user, activity: activity} do
{:ok, _} = CommonAPI.pin(activity.id, user)
@@ -2665,6 +2756,15 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|> json_response(200)
end
+ test "/unpin: returns 400 error when activity is not exist", %{conn: conn, user: user} do
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses/1/unpin")
+
+ assert json_response(conn, 400) == %{"error" => "Could not unpin"}
+ end
+
test "max pinned statuses", %{conn: conn, user: user, activity: activity_one} do
{:ok, activity_two} = CommonAPI.post(user, %{"status" => "HI!!!"})
@@ -2688,26 +2788,22 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
describe "cards" do
setup do
- Pleroma.Config.put([:rich_media, :enabled], true)
-
- on_exit(fn ->
- Pleroma.Config.put([:rich_media, :enabled], false)
- end)
+ Config.put([:rich_media, :enabled], true)
user = insert(:user)
%{user: user}
end
test "returns rich-media card", %{conn: conn, user: user} do
- {:ok, activity} = CommonAPI.post(user, %{"status" => "http://example.com/ogp"})
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "https://example.com/ogp"})
card_data = %{
"image" => "http://ia.media-imdb.com/images/rock.jpg",
- "provider_name" => "www.imdb.com",
- "provider_url" => "http://www.imdb.com",
+ "provider_name" => "example.com",
+ "provider_url" => "https://example.com",
"title" => "The Rock",
"type" => "link",
- "url" => "http://www.imdb.com/title/tt0117500/",
+ "url" => "https://example.com/ogp",
"description" =>
"Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.",
"pleroma" => %{
@@ -2715,7 +2811,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
"image" => "http://ia.media-imdb.com/images/rock.jpg",
"title" => "The Rock",
"type" => "video.movie",
- "url" => "http://www.imdb.com/title/tt0117500/",
+ "url" => "https://example.com/ogp",
"description" =>
"Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer."
}
@@ -2731,7 +2827,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
# works with private posts
{:ok, activity} =
- CommonAPI.post(user, %{"status" => "http://example.com/ogp", "visibility" => "direct"})
+ CommonAPI.post(user, %{"status" => "https://example.com/ogp", "visibility" => "direct"})
response_two =
conn
@@ -2743,7 +2839,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
end
test "replaces missing description with an empty string", %{conn: conn, user: user} do
- {:ok, activity} = CommonAPI.post(user, %{"status" => "http://example.com/ogp-missing-data"})
+ {:ok, activity} =
+ CommonAPI.post(user, %{"status" => "https://example.com/ogp-missing-data"})
response =
conn
@@ -2755,14 +2852,14 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
"title" => "Pleroma",
"description" => "",
"image" => nil,
- "provider_name" => "pleroma.social",
- "provider_url" => "https://pleroma.social",
- "url" => "https://pleroma.social/",
+ "provider_name" => "example.com",
+ "provider_url" => "https://example.com",
+ "url" => "https://example.com/ogp-missing-data",
"pleroma" => %{
"opengraph" => %{
"title" => "Pleroma",
"type" => "website",
- "url" => "https://pleroma.social/"
+ "url" => "https://example.com/ogp-missing-data"
}
}
}
@@ -2822,8 +2919,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
describe "conversation muting" do
setup do
+ post_user = insert(:user)
user = insert(:user)
- {:ok, activity} = CommonAPI.post(user, %{"status" => "HIE"})
+
+ {:ok, activity} = CommonAPI.post(post_user, %{"status" => "HIE"})
[user: user, activity: activity]
end
@@ -2838,6 +2937,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|> json_response(200)
end
+ test "cannot mute already muted conversation", %{conn: conn, user: user, activity: activity} do
+ {:ok, _} = CommonAPI.add_mute(user, activity)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/statuses/#{activity.id}/mute")
+
+ assert json_response(conn, 400) == %{"error" => "conversation is already muted"}
+ end
+
test "unmute conversation", %{conn: conn, user: user, activity: activity} do
{:ok, _} = CommonAPI.add_mute(user, activity)
@@ -2852,31 +2962,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
end
end
- test "flavours switching (Pleroma Extension)", %{conn: conn} do
- user = insert(:user)
-
- get_old_flavour =
- conn
- |> assign(:user, user)
- |> get("/api/v1/pleroma/flavour")
-
- assert "glitch" == json_response(get_old_flavour, 200)
-
- set_flavour =
- conn
- |> assign(:user, user)
- |> post("/api/v1/pleroma/flavour/vanilla")
-
- assert "vanilla" == json_response(set_flavour, 200)
-
- get_new_flavour =
- conn
- |> assign(:user, user)
- |> post("/api/v1/pleroma/flavour/vanilla")
-
- assert json_response(set_flavour, 200) == json_response(get_new_flavour, 200)
- end
-
describe "reports" do
setup do
reporter = insert(:user)
@@ -2907,7 +2992,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|> post("/api/v1/reports", %{
"account_id" => target_user.id,
"status_ids" => [activity.id],
- "comment" => "bad status!"
+ "comment" => "bad status!",
+ "forward" => "false"
})
|> json_response(200)
end
@@ -2929,7 +3015,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
reporter: reporter,
target_user: target_user
} do
- max_size = Pleroma.Config.get([:instance, :max_report_comment_size], 1000)
+ max_size = Config.get([:instance, :max_report_comment_size], 1000)
comment = String.pad_trailing("a", max_size + 1, "a")
error = %{"error" => "Comment must be up to #{max_size} characters"}
@@ -2940,6 +3026,19 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|> post("/api/v1/reports", %{"account_id" => target_user.id, "comment" => comment})
|> json_response(400)
end
+
+ test "returns error when account is not exist", %{
+ conn: conn,
+ reporter: reporter,
+ activity: activity
+ } do
+ conn =
+ conn
+ |> assign(:user, reporter)
+ |> post("/api/v1/reports", %{"status_ids" => [activity.id], "account_id" => "foo"})
+
+ assert json_response(conn, 400) == %{"error" => "Account not found"}
+ end
end
describe "link headers" do
@@ -3011,6 +3110,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert Map.has_key?(emoji, "static_url")
assert Map.has_key?(emoji, "tags")
assert is_list(emoji["tags"])
+ assert Map.has_key?(emoji, "category")
assert Map.has_key?(emoji, "url")
assert Map.has_key?(emoji, "visible_in_picker")
end
@@ -3040,6 +3140,18 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert redirected_to(conn) == "/web/login"
end
+ test "redirects not logged-in users to the login page on private instances", %{
+ conn: conn,
+ path: path
+ } do
+ Config.put([:instance, :public], false)
+
+ conn = get(conn, path)
+
+ assert conn.status == 302
+ assert redirected_to(conn) == "/web/login"
+ end
+
test "does not redirect logged in users to the login page", %{conn: conn, path: path} do
token = insert(:oauth_token)
@@ -3298,7 +3410,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
user2 = insert(:user)
user3 = insert(:user)
- {:ok, replied_to} = TwitterAPI.create_status(user1, %{"status" => "cofe"})
+ {:ok, replied_to} = CommonAPI.post(user1, %{"status" => "cofe"})
# Reply to status from another user
conn1 =
@@ -3339,24 +3451,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
end
describe "create account by app" do
- setup do
- enabled = Pleroma.Config.get([:app_account_creation, :enabled])
- max_requests = Pleroma.Config.get([:app_account_creation, :max_requests])
- interval = Pleroma.Config.get([:app_account_creation, :interval])
-
- Pleroma.Config.put([:app_account_creation, :enabled], true)
- Pleroma.Config.put([:app_account_creation, :max_requests], 5)
- Pleroma.Config.put([:app_account_creation, :interval], 1)
-
- on_exit(fn ->
- Pleroma.Config.put([:app_account_creation, :enabled], enabled)
- Pleroma.Config.put([:app_account_creation, :max_requests], max_requests)
- Pleroma.Config.put([:app_account_creation, :interval], interval)
- end)
-
- :ok
- end
-
test "Account registration via Application", %{conn: conn} do
conn =
conn
@@ -3459,7 +3553,489 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
agreement: true
})
- assert json_response(conn, 403) == %{"error" => "Rate limit exceeded."}
+ assert json_response(conn, :too_many_requests) == %{"error" => "Throttled"}
+ end
+ end
+
+ describe "GET /api/v1/polls/:id" do
+ test "returns poll entity for object id", %{conn: conn} do
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "Pleroma does",
+ "poll" => %{"options" => ["what Mastodon't", "n't what Mastodoes"], "expires_in" => 20}
+ })
+
+ object = Object.normalize(activity)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/polls/#{object.id}")
+
+ response = json_response(conn, 200)
+ id = to_string(object.id)
+ assert %{"id" => ^id, "expired" => false, "multiple" => false} = response
+ end
+
+ test "does not expose polls for private statuses", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "Pleroma does",
+ "poll" => %{"options" => ["what Mastodon't", "n't what Mastodoes"], "expires_in" => 20},
+ "visibility" => "private"
+ })
+
+ object = Object.normalize(activity)
+
+ conn =
+ conn
+ |> assign(:user, other_user)
+ |> get("/api/v1/polls/#{object.id}")
+
+ assert json_response(conn, 404)
+ end
+ end
+
+ describe "POST /api/v1/polls/:id/votes" do
+ test "votes are added to the poll", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "A very delicious sandwich",
+ "poll" => %{
+ "options" => ["Lettuce", "Grilled Bacon", "Tomato"],
+ "expires_in" => 20,
+ "multiple" => true
+ }
+ })
+
+ object = Object.normalize(activity)
+
+ conn =
+ conn
+ |> assign(:user, other_user)
+ |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0, 1, 2]})
+
+ assert json_response(conn, 200)
+ object = Object.get_by_id(object.id)
+
+ assert Enum.all?(object.data["anyOf"], fn %{"replies" => %{"totalItems" => total_items}} ->
+ total_items == 1
+ end)
+ end
+
+ test "author can't vote", %{conn: conn} do
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "Am I cute?",
+ "poll" => %{"options" => ["Yes", "No"], "expires_in" => 20}
+ })
+
+ object = Object.normalize(activity)
+
+ assert conn
+ |> assign(:user, user)
+ |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [1]})
+ |> json_response(422) == %{"error" => "Poll's author can't vote"}
+
+ object = Object.get_by_id(object.id)
+
+ refute Enum.at(object.data["oneOf"], 1)["replies"]["totalItems"] == 1
+ end
+
+ test "does not allow multiple choices on a single-choice question", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "The glass is",
+ "poll" => %{"options" => ["half empty", "half full"], "expires_in" => 20}
+ })
+
+ object = Object.normalize(activity)
+
+ assert conn
+ |> assign(:user, other_user)
+ |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0, 1]})
+ |> json_response(422) == %{"error" => "Too many choices"}
+
+ object = Object.get_by_id(object.id)
+
+ refute Enum.any?(object.data["oneOf"], fn %{"replies" => %{"totalItems" => total_items}} ->
+ total_items == 1
+ end)
+ end
+
+ test "does not allow choice index to be greater than options count", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "Am I cute?",
+ "poll" => %{"options" => ["Yes", "No"], "expires_in" => 20}
+ })
+
+ object = Object.normalize(activity)
+
+ conn =
+ conn
+ |> assign(:user, other_user)
+ |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [2]})
+
+ assert json_response(conn, 422) == %{"error" => "Invalid indices"}
+ end
+
+ test "returns 404 error when object is not exist", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/polls/1/votes", %{"choices" => [0]})
+
+ assert json_response(conn, 404) == %{"error" => "Record not found"}
+ end
+
+ test "returns 404 when poll is private and not available for user", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "Am I cute?",
+ "poll" => %{"options" => ["Yes", "No"], "expires_in" => 20},
+ "visibility" => "private"
+ })
+
+ object = Object.normalize(activity)
+
+ conn =
+ conn
+ |> assign(:user, other_user)
+ |> post("/api/v1/polls/#{object.id}/votes", %{"choices" => [0]})
+
+ assert json_response(conn, 404) == %{"error" => "Record not found"}
+ end
+ end
+
+ describe "GET /api/v1/statuses/:id/favourited_by" do
+ setup do
+ user = insert(:user)
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "test"})
+
+ conn =
+ build_conn()
+ |> assign(:user, user)
+
+ [conn: conn, activity: activity]
+ end
+
+ test "returns users who have favorited the status", %{conn: conn, activity: activity} do
+ other_user = insert(:user)
+ {:ok, _, _} = CommonAPI.favorite(activity.id, other_user)
+
+ response =
+ conn
+ |> get("/api/v1/statuses/#{activity.id}/favourited_by")
+ |> json_response(:ok)
+
+ [%{"id" => id}] = response
+
+ assert id == other_user.id
+ end
+
+ test "returns empty array when status has not been favorited yet", %{
+ conn: conn,
+ activity: activity
+ } do
+ response =
+ conn
+ |> get("/api/v1/statuses/#{activity.id}/favourited_by")
+ |> json_response(:ok)
+
+ assert Enum.empty?(response)
+ end
+
+ test "does not return users who have favorited the status but are blocked", %{
+ conn: %{assigns: %{user: user}} = conn,
+ activity: activity
+ } do
+ other_user = insert(:user)
+ {:ok, user} = User.block(user, other_user)
+
+ {:ok, _, _} = CommonAPI.favorite(activity.id, other_user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/statuses/#{activity.id}/favourited_by")
+ |> json_response(:ok)
+
+ assert Enum.empty?(response)
+ end
+
+ test "does not fail on an unauthenticated request", %{conn: conn, activity: activity} do
+ other_user = insert(:user)
+ {:ok, _, _} = CommonAPI.favorite(activity.id, other_user)
+
+ response =
+ conn
+ |> assign(:user, nil)
+ |> get("/api/v1/statuses/#{activity.id}/favourited_by")
+ |> json_response(:ok)
+
+ [%{"id" => id}] = response
+ assert id == other_user.id
+ end
+ end
+
+ describe "GET /api/v1/statuses/:id/reblogged_by" do
+ setup do
+ user = insert(:user)
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "test"})
+
+ conn =
+ build_conn()
+ |> assign(:user, user)
+
+ [conn: conn, activity: activity]
+ end
+
+ test "returns users who have reblogged the status", %{conn: conn, activity: activity} do
+ other_user = insert(:user)
+ {:ok, _, _} = CommonAPI.repeat(activity.id, other_user)
+
+ response =
+ conn
+ |> get("/api/v1/statuses/#{activity.id}/reblogged_by")
+ |> json_response(:ok)
+
+ [%{"id" => id}] = response
+
+ assert id == other_user.id
+ end
+
+ test "returns empty array when status has not been reblogged yet", %{
+ conn: conn,
+ activity: activity
+ } do
+ response =
+ conn
+ |> get("/api/v1/statuses/#{activity.id}/reblogged_by")
+ |> json_response(:ok)
+
+ assert Enum.empty?(response)
+ end
+
+ test "does not return users who have reblogged the status but are blocked", %{
+ conn: %{assigns: %{user: user}} = conn,
+ activity: activity
+ } do
+ other_user = insert(:user)
+ {:ok, user} = User.block(user, other_user)
+
+ {:ok, _, _} = CommonAPI.repeat(activity.id, other_user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/statuses/#{activity.id}/reblogged_by")
+ |> json_response(:ok)
+
+ assert Enum.empty?(response)
+ end
+
+ test "does not fail on an unauthenticated request", %{conn: conn, activity: activity} do
+ other_user = insert(:user)
+ {:ok, _, _} = CommonAPI.repeat(activity.id, other_user)
+
+ response =
+ conn
+ |> assign(:user, nil)
+ |> get("/api/v1/statuses/#{activity.id}/reblogged_by")
+ |> json_response(:ok)
+
+ [%{"id" => id}] = response
+ assert id == other_user.id
+ end
+ end
+
+ describe "POST /auth/password, with valid parameters" do
+ setup %{conn: conn} do
+ user = insert(:user)
+ conn = post(conn, "/auth/password?email=#{user.email}")
+ %{conn: conn, user: user}
+ end
+
+ test "it returns 204", %{conn: conn} do
+ assert json_response(conn, :no_content)
+ end
+
+ test "it creates a PasswordResetToken record for user", %{user: user} do
+ token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id)
+ assert token_record
+ end
+
+ test "it sends an email to user", %{user: user} do
+ token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id)
+
+ email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token)
+ notify_email = Config.get([:instance, :notify_email])
+ instance_name = Config.get([:instance, :name])
+
+ assert_email_sent(
+ from: {instance_name, notify_email},
+ to: {user.name, user.email},
+ html_body: email.html_body
+ )
+ end
+ end
+
+ describe "POST /auth/password, with invalid parameters" do
+ setup do
+ user = insert(:user)
+ {:ok, user: user}
+ end
+
+ test "it returns 404 when user is not found", %{conn: conn, user: user} do
+ conn = post(conn, "/auth/password?email=nonexisting_#{user.email}")
+ assert conn.status == 404
+ assert conn.resp_body == ""
+ end
+
+ test "it returns 400 when user is not local", %{conn: conn, user: user} do
+ {:ok, user} = Repo.update(Changeset.change(user, local: false))
+ conn = post(conn, "/auth/password?email=#{user.email}")
+ assert conn.status == 400
+ assert conn.resp_body == ""
+ end
+ end
+
+ describe "POST /api/v1/pleroma/accounts/confirmation_resend" do
+ setup do
+ user = insert(:user)
+ info_change = User.Info.confirmation_changeset(user.info, need_confirmation: true)
+
+ {:ok, user} =
+ user
+ |> Changeset.change()
+ |> Changeset.put_embed(:info, info_change)
+ |> Repo.update()
+
+ assert user.info.confirmation_pending
+
+ [user: user]
+ end
+
+ clear_config([:instance, :account_activation_required]) do
+ Config.put([:instance, :account_activation_required], true)
+ end
+
+ test "resend account confirmation email", %{conn: conn, user: user} do
+ conn
+ |> assign(:user, user)
+ |> post("/api/v1/pleroma/accounts/confirmation_resend?email=#{user.email}")
+ |> json_response(:no_content)
+
+ email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
+ notify_email = Config.get([:instance, :notify_email])
+ instance_name = Config.get([:instance, :name])
+
+ assert_email_sent(
+ from: {instance_name, notify_email},
+ to: {user.name, user.email},
+ html_body: email.html_body
+ )
+ end
+ end
+
+ describe "GET /api/v1/suggestions" do
+ setup do
+ user = insert(:user)
+ other_user = insert(:user)
+ host = Config.get([Pleroma.Web.Endpoint, :url, :host])
+ url500 = "http://test500?#{host}&#{user.nickname}"
+ url200 = "http://test200?#{host}&#{user.nickname}"
+
+ mock(fn
+ %{method: :get, url: ^url500} ->
+ %Tesla.Env{status: 500, body: "bad request"}
+
+ %{method: :get, url: ^url200} ->
+ %Tesla.Env{
+ status: 200,
+ body:
+ ~s([{"acct":"yj455","avatar":"https://social.heldscal.la/avatar/201.jpeg","avatar_static":"https://social.heldscal.la/avatar/s/201.jpeg"}, {"acct":"#{
+ other_user.ap_id
+ }","avatar":"https://social.heldscal.la/avatar/202.jpeg","avatar_static":"https://social.heldscal.la/avatar/s/202.jpeg"}])
+ }
+ end)
+
+ [user: user, other_user: other_user]
+ end
+
+ clear_config(:suggestions)
+
+ test "returns empty result when suggestions disabled", %{conn: conn, user: user} do
+ Config.put([:suggestions, :enabled], false)
+
+ res =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/suggestions")
+ |> json_response(200)
+
+ assert res == []
+ end
+
+ test "returns error", %{conn: conn, user: user} do
+ Config.put([:suggestions, :enabled], true)
+ Config.put([:suggestions, :third_party_engine], "http://test500?{{host}}&{{user}}")
+
+ res =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/suggestions")
+ |> json_response(500)
+
+ assert res == "Something went wrong"
+ end
+
+ test "returns suggestions", %{conn: conn, user: user, other_user: other_user} do
+ Config.put([:suggestions, :enabled], true)
+ Config.put([:suggestions, :third_party_engine], "http://test200?{{host}}&{{user}}")
+
+ res =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/suggestions")
+ |> json_response(200)
+
+ assert res == [
+ %{
+ "acct" => "yj455",
+ "avatar" => "https://social.heldscal.la/avatar/201.jpeg",
+ "avatar_static" => "https://social.heldscal.la/avatar/s/201.jpeg",
+ "id" => 0
+ },
+ %{
+ "acct" => other_user.ap_id,
+ "avatar" => "https://social.heldscal.la/avatar/202.jpeg",
+ "avatar_static" => "https://social.heldscal.la/avatar/s/202.jpeg",
+ "id" => other_user.id
+ }
+ ]
end
end
end
diff --git a/test/web/mastodon_api/mastodon_api_test.exs b/test/web/mastodon_api/mastodon_api_test.exs
new file mode 100644
index 000000000..b4c0427c9
--- /dev/null
+++ b/test/web/mastodon_api/mastodon_api_test.exs
@@ -0,0 +1,103 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastodonAPI.MastodonAPITest do
+ use Pleroma.Web.ConnCase
+
+ alias Pleroma.Notification
+ alias Pleroma.ScheduledActivity
+ alias Pleroma.User
+ alias Pleroma.Web.MastodonAPI.MastodonAPI
+ alias Pleroma.Web.TwitterAPI.TwitterAPI
+
+ import Pleroma.Factory
+
+ describe "follow/3" do
+ test "returns error when user deactivated" do
+ follower = insert(:user)
+ user = insert(:user, local: true, info: %{deactivated: true})
+ {:error, error} = MastodonAPI.follow(follower, user)
+ assert error == "Could not follow user: You are deactivated."
+ end
+
+ test "following for user" do
+ follower = insert(:user)
+ user = insert(:user)
+ {:ok, follower} = MastodonAPI.follow(follower, user)
+ assert User.following?(follower, user)
+ end
+
+ test "returns ok if user already followed" do
+ follower = insert(:user)
+ user = insert(:user)
+ {:ok, follower} = User.follow(follower, user)
+ {:ok, follower} = MastodonAPI.follow(follower, refresh_record(user))
+ assert User.following?(follower, user)
+ end
+ end
+
+ describe "get_followers/2" do
+ test "returns user followers" do
+ follower1_user = insert(:user)
+ follower2_user = insert(:user)
+ user = insert(:user)
+ {:ok, _follower1_user} = User.follow(follower1_user, user)
+ {:ok, follower2_user} = User.follow(follower2_user, user)
+
+ assert MastodonAPI.get_followers(user, %{"limit" => 1}) == [follower2_user]
+ end
+ end
+
+ describe "get_friends/2" do
+ test "returns user friends" do
+ user = insert(:user)
+ followed_one = insert(:user)
+ followed_two = insert(:user)
+ followed_three = insert(:user)
+
+ {:ok, user} = User.follow(user, followed_one)
+ {:ok, user} = User.follow(user, followed_two)
+ {:ok, user} = User.follow(user, followed_three)
+ res = MastodonAPI.get_friends(user)
+
+ assert length(res) == 3
+ assert Enum.member?(res, refresh_record(followed_three))
+ assert Enum.member?(res, refresh_record(followed_two))
+ assert Enum.member?(res, refresh_record(followed_one))
+ end
+ end
+
+ describe "get_notifications/2" do
+ test "returns notifications for user" do
+ user = insert(:user)
+ subscriber = insert(:user)
+
+ User.subscribe(subscriber, user)
+
+ {:ok, status} = TwitterAPI.create_status(user, %{"status" => "Akariiiin"})
+ {:ok, status1} = TwitterAPI.create_status(user, %{"status" => "Magi"})
+ {:ok, [notification]} = Notification.create_notifications(status)
+ {:ok, [notification1]} = Notification.create_notifications(status1)
+ res = MastodonAPI.get_notifications(subscriber)
+
+ assert Enum.member?(Enum.map(res, & &1.id), notification.id)
+ assert Enum.member?(Enum.map(res, & &1.id), notification1.id)
+ end
+ end
+
+ describe "get_scheduled_activities/2" do
+ test "returns user scheduled activities" do
+ user = insert(:user)
+
+ today =
+ NaiveDateTime.utc_now()
+ |> NaiveDateTime.add(:timer.minutes(6), :millisecond)
+ |> NaiveDateTime.to_iso8601()
+
+ attrs = %{params: %{}, scheduled_at: today}
+ {:ok, schedule} = ScheduledActivity.create(user, attrs)
+ assert MastodonAPI.get_scheduled_activities(user) == [schedule]
+ end
+ end
+end
diff --git a/test/web/mastodon_api/search_controller_test.exs b/test/web/mastodon_api/search_controller_test.exs
new file mode 100644
index 000000000..49c79ff0a
--- /dev/null
+++ b/test/web/mastodon_api/search_controller_test.exs
@@ -0,0 +1,285 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do
+ use Pleroma.Web.ConnCase
+
+ alias Pleroma.Object
+ alias Pleroma.Web
+ alias Pleroma.Web.CommonAPI
+ import Pleroma.Factory
+ import ExUnit.CaptureLog
+ import Tesla.Mock
+ import Mock
+
+ setup do
+ mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+ :ok
+ end
+
+ describe ".search2" do
+ test "it returns empty result if user or status search return undefined error", %{conn: conn} do
+ with_mocks [
+ {Pleroma.User, [], [search: fn _q, _o -> raise "Oops" end]},
+ {Pleroma.Activity, [], [search: fn _u, _q, _o -> raise "Oops" end]}
+ ] do
+ capture_log(fn ->
+ results =
+ conn
+ |> get("/api/v2/search", %{"q" => "2hu"})
+ |> json_response(200)
+
+ assert results["accounts"] == []
+ assert results["statuses"] == []
+ end) =~
+ "[error] Elixir.Pleroma.Web.MastodonAPI.SearchController search error: %RuntimeError{message: \"Oops\"}"
+ end
+ end
+
+ test "search", %{conn: conn} do
+ user = insert(:user)
+ user_two = insert(:user, %{nickname: "shp@shitposter.club"})
+ user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu private"})
+
+ {:ok, _activity} =
+ CommonAPI.post(user, %{
+ "status" => "This is about 2hu, but private",
+ "visibility" => "private"
+ })
+
+ {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
+
+ conn = get(conn, "/api/v2/search", %{"q" => "2hu #private"})
+
+ assert results = json_response(conn, 200)
+
+ [account | _] = results["accounts"]
+ assert account["id"] == to_string(user_three.id)
+
+ assert results["hashtags"] == [
+ %{"name" => "private", "url" => "#{Web.base_url()}/tag/private"}
+ ]
+
+ [status] = results["statuses"]
+ assert status["id"] == to_string(activity.id)
+ end
+ end
+
+ describe ".account_search" do
+ test "account search", %{conn: conn} do
+ user = insert(:user)
+ user_two = insert(:user, %{nickname: "shp@shitposter.club"})
+ user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
+
+ results =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/accounts/search", %{"q" => "shp"})
+ |> json_response(200)
+
+ result_ids = for result <- results, do: result["acct"]
+
+ assert user_two.nickname in result_ids
+ assert user_three.nickname in result_ids
+
+ results =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/accounts/search", %{"q" => "2hu"})
+ |> json_response(200)
+
+ result_ids = for result <- results, do: result["acct"]
+
+ assert user_three.nickname in result_ids
+ end
+
+ test "returns account if query contains a space", %{conn: conn} do
+ user = insert(:user, %{nickname: "shp@shitposter.club"})
+
+ results =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/accounts/search", %{"q" => "shp@shitposter.club xxx "})
+ |> json_response(200)
+
+ assert length(results) == 1
+ end
+ end
+
+ describe ".search" do
+ test "it returns empty result if user or status search return undefined error", %{conn: conn} do
+ with_mocks [
+ {Pleroma.User, [], [search: fn _q, _o -> raise "Oops" end]},
+ {Pleroma.Activity, [], [search: fn _u, _q, _o -> raise "Oops" end]}
+ ] do
+ capture_log(fn ->
+ results =
+ conn
+ |> get("/api/v1/search", %{"q" => "2hu"})
+ |> json_response(200)
+
+ assert results["accounts"] == []
+ assert results["statuses"] == []
+ end) =~
+ "[error] Elixir.Pleroma.Web.MastodonAPI.SearchController search error: %RuntimeError{message: \"Oops\"}"
+ end
+ end
+
+ test "search", %{conn: conn} do
+ user = insert(:user)
+ user_two = insert(:user, %{nickname: "shp@shitposter.club"})
+ user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
+
+ {:ok, _activity} =
+ CommonAPI.post(user, %{
+ "status" => "This is about 2hu, but private",
+ "visibility" => "private"
+ })
+
+ {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"})
+
+ conn =
+ conn
+ |> get("/api/v1/search", %{"q" => "2hu"})
+
+ assert results = json_response(conn, 200)
+
+ [account | _] = results["accounts"]
+ assert account["id"] == to_string(user_three.id)
+
+ assert results["hashtags"] == []
+
+ [status] = results["statuses"]
+ assert status["id"] == to_string(activity.id)
+ end
+
+ test "search fetches remote statuses", %{conn: conn} do
+ capture_log(fn ->
+ conn =
+ conn
+ |> get("/api/v1/search", %{"q" => "https://shitposter.club/notice/2827873"})
+
+ assert results = json_response(conn, 200)
+
+ [status] = results["statuses"]
+
+ assert status["uri"] ==
+ "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
+ end)
+ end
+
+ test "search doesn't show statuses that it shouldn't", %{conn: conn} do
+ {:ok, activity} =
+ CommonAPI.post(insert(:user), %{
+ "status" => "This is about 2hu, but private",
+ "visibility" => "private"
+ })
+
+ capture_log(fn ->
+ conn =
+ conn
+ |> get("/api/v1/search", %{"q" => Object.normalize(activity).data["id"]})
+
+ assert results = json_response(conn, 200)
+
+ [] = results["statuses"]
+ end)
+ end
+
+ test "search fetches remote accounts", %{conn: conn} do
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> get("/api/v1/search", %{"q" => "shp@social.heldscal.la", "resolve" => "true"})
+
+ assert results = json_response(conn, 200)
+ [account] = results["accounts"]
+ assert account["acct"] == "shp@social.heldscal.la"
+ end
+
+ test "search doesn't fetch remote accounts if resolve is false", %{conn: conn} do
+ conn =
+ conn
+ |> get("/api/v1/search", %{"q" => "shp@social.heldscal.la", "resolve" => "false"})
+
+ assert results = json_response(conn, 200)
+ assert [] == results["accounts"]
+ end
+
+ test "search with limit and offset", %{conn: conn} do
+ user = insert(:user)
+ _user_two = insert(:user, %{nickname: "shp@shitposter.club"})
+ _user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
+
+ {:ok, _activity1} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
+ {:ok, _activity2} = CommonAPI.post(user, %{"status" => "This is also about 2hu"})
+
+ result =
+ conn
+ |> get("/api/v1/search", %{"q" => "2hu", "limit" => 1})
+
+ assert results = json_response(result, 200)
+ assert [%{"id" => activity_id1}] = results["statuses"]
+ assert [_] = results["accounts"]
+
+ results =
+ conn
+ |> get("/api/v1/search", %{"q" => "2hu", "limit" => 1, "offset" => 1})
+ |> json_response(200)
+
+ assert [%{"id" => activity_id2}] = results["statuses"]
+ assert [] = results["accounts"]
+
+ assert activity_id1 != activity_id2
+ end
+
+ test "search returns results only for the given type", %{conn: conn} do
+ user = insert(:user)
+ _user_two = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
+
+ {:ok, _activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
+
+ assert %{"statuses" => [_activity], "accounts" => [], "hashtags" => []} =
+ conn
+ |> get("/api/v1/search", %{"q" => "2hu", "type" => "statuses"})
+ |> json_response(200)
+
+ assert %{"statuses" => [], "accounts" => [_user_two], "hashtags" => []} =
+ conn
+ |> get("/api/v1/search", %{"q" => "2hu", "type" => "accounts"})
+ |> json_response(200)
+ end
+
+ test "search uses account_id to filter statuses by the author", %{conn: conn} do
+ user = insert(:user, %{nickname: "shp@shitposter.club"})
+ user_two = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
+
+ {:ok, activity1} = CommonAPI.post(user, %{"status" => "This is about 2hu"})
+ {:ok, activity2} = CommonAPI.post(user_two, %{"status" => "This is also about 2hu"})
+
+ results =
+ conn
+ |> get("/api/v1/search", %{"q" => "2hu", "account_id" => user.id})
+ |> json_response(200)
+
+ assert [%{"id" => activity_id1}] = results["statuses"]
+ assert activity_id1 == activity1.id
+ assert [_] = results["accounts"]
+
+ results =
+ conn
+ |> get("/api/v1/search", %{"q" => "2hu", "account_id" => user_two.id})
+ |> json_response(200)
+
+ assert [%{"id" => activity_id2}] = results["statuses"]
+ assert activity_id2 == activity2.id
+ end
+ end
+end
diff --git a/test/web/mastodon_api/status_view_test.exs b/test/web/mastodon_api/status_view_test.exs
index d7c800e83..1b6beb6d2 100644
--- a/test/web/mastodon_api/status_view_test.exs
+++ b/test/web/mastodon_api/status_view_test.exs
@@ -23,6 +23,21 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
:ok
end
+ test "returns the direct conversation id when given the `with_conversation_id` option" do
+ user = insert(:user)
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"})
+
+ status =
+ StatusView.render("status.json",
+ activity: activity,
+ with_direct_conversation_id: true,
+ for: user
+ )
+
+ assert status[:pleroma][:direct_conversation_id]
+ end
+
test "returns a temporary ap_id based user for activities missing db users" do
user = insert(:user)
@@ -55,7 +70,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
test "a note with null content" do
note = insert(:note_activity)
- note_object = Object.normalize(note.data["object"])
+ note_object = Object.normalize(note)
data =
note_object.data
@@ -73,26 +88,27 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
test "a note activity" do
note = insert(:note_activity)
+ object_data = Object.normalize(note).data
user = User.get_cached_by_ap_id(note.data["actor"])
- convo_id = Utils.context_to_conversation_id(note.data["object"]["context"])
+ convo_id = Utils.context_to_conversation_id(object_data["context"])
status = StatusView.render("status.json", %{activity: note})
created_at =
- (note.data["object"]["published"] || "")
+ (object_data["published"] || "")
|> String.replace(~r/\.\d+Z/, ".000Z")
expected = %{
id: to_string(note.id),
- uri: note.data["object"]["id"],
+ uri: object_data["id"],
url: Pleroma.Web.Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :notice, note),
account: AccountView.render("account.json", %{user: user}),
in_reply_to_id: nil,
in_reply_to_account_id: nil,
card: nil,
reblog: nil,
- content: HtmlSanitizeEx.basic_html(note.data["object"]["content"]),
+ content: HtmlSanitizeEx.basic_html(object_data["content"]),
created_at: created_at,
reblogs_count: 0,
replies_count: 0,
@@ -103,14 +119,15 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
muted: false,
pinned: false,
sensitive: false,
- spoiler_text: HtmlSanitizeEx.basic_html(note.data["object"]["summary"]),
+ poll: nil,
+ spoiler_text: HtmlSanitizeEx.basic_html(object_data["summary"]),
visibility: "public",
media_attachments: [],
mentions: [],
tags: [
%{
- name: "#{note.data["object"]["tag"]}",
- url: "/tag/#{note.data["object"]["tag"]}"
+ name: "#{object_data["tag"]}",
+ url: "/tag/#{object_data["tag"]}"
}
],
application: %{
@@ -130,8 +147,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
local: true,
conversation_id: convo_id,
in_reply_to_account_acct: nil,
- content: %{"text/plain" => HtmlSanitizeEx.strip_tags(note.data["object"]["content"])},
- spoiler_text: %{"text/plain" => HtmlSanitizeEx.strip_tags(note.data["object"]["summary"])}
+ content: %{"text/plain" => HtmlSanitizeEx.strip_tags(object_data["content"])},
+ spoiler_text: %{"text/plain" => HtmlSanitizeEx.strip_tags(object_data["summary"])},
+ expires_at: nil,
+ direct_conversation_id: nil
}
}
@@ -201,10 +220,71 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
status = StatusView.render("status.json", %{activity: activity})
- actor = User.get_cached_by_ap_id(activity.actor)
-
assert status.mentions ==
- Enum.map([user, actor], fn u -> AccountView.render("mention.json", %{user: u}) end)
+ Enum.map([user], fn u -> AccountView.render("mention.json", %{user: u}) end)
+ end
+
+ test "create mentions from the 'to' field" do
+ %User{ap_id: recipient_ap_id} = insert(:user)
+ cc = insert_pair(:user) |> Enum.map(& &1.ap_id)
+
+ object =
+ insert(:note, %{
+ data: %{
+ "to" => [recipient_ap_id],
+ "cc" => cc
+ }
+ })
+
+ activity =
+ insert(:note_activity, %{
+ note: object,
+ recipients: [recipient_ap_id | cc]
+ })
+
+ assert length(activity.recipients) == 3
+
+ %{mentions: [mention] = mentions} = StatusView.render("status.json", %{activity: activity})
+
+ assert length(mentions) == 1
+ assert mention.url == recipient_ap_id
+ end
+
+ test "create mentions from the 'tag' field" do
+ recipient = insert(:user)
+ cc = insert_pair(:user) |> Enum.map(& &1.ap_id)
+
+ object =
+ insert(:note, %{
+ data: %{
+ "cc" => cc,
+ "tag" => [
+ %{
+ "href" => recipient.ap_id,
+ "name" => recipient.nickname,
+ "type" => "Mention"
+ },
+ %{
+ "href" => "https://example.com/search?tag=test",
+ "name" => "#test",
+ "type" => "Hashtag"
+ }
+ ]
+ }
+ })
+
+ activity =
+ insert(:note_activity, %{
+ note: object,
+ recipients: [recipient.ap_id | cc]
+ })
+
+ assert length(activity.recipients) == 3
+
+ %{mentions: [mention] = mentions} = StatusView.render("status.json", %{activity: activity})
+
+ assert length(mentions) == 1
+ assert mention.url == recipient.ap_id
end
test "attachments" do
@@ -237,6 +317,16 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
assert %{id: "2"} = StatusView.render("attachment.json", %{attachment: object})
end
+ test "put the url advertised in the Activity in to the url attribute" do
+ id = "https://wedistribute.org/wp-json/pterotype/v1/object/85810"
+ [activity] = Activity.search(nil, id)
+
+ status = StatusView.render("status.json", %{activity: activity})
+
+ assert status.uri == id
+ assert status.url == "https://wedistribute.org/2019/07/mastodon-drops-ostatus/"
+ end
+
test "a reblog" do
user = insert(:user)
activity = insert(:note_activity)
@@ -341,4 +431,154 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
StatusView.render("card.json", %{page_url: page_url, rich_media: card})
end
end
+
+ describe "poll view" do
+ test "renders a poll" do
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "Is Tenshi eating a corndog cute?",
+ "poll" => %{
+ "options" => ["absolutely!", "sure", "yes", "why are you even asking?"],
+ "expires_in" => 20
+ }
+ })
+
+ object = Object.normalize(activity)
+
+ expected = %{
+ emojis: [],
+ expired: false,
+ id: to_string(object.id),
+ multiple: false,
+ options: [
+ %{title: "absolutely!", votes_count: 0},
+ %{title: "sure", votes_count: 0},
+ %{title: "yes", votes_count: 0},
+ %{title: "why are you even asking?", votes_count: 0}
+ ],
+ voted: false,
+ votes_count: 0
+ }
+
+ result = StatusView.render("poll.json", %{object: object})
+ expires_at = result.expires_at
+ result = Map.delete(result, :expires_at)
+
+ assert result == expected
+
+ expires_at = NaiveDateTime.from_iso8601!(expires_at)
+ assert NaiveDateTime.diff(expires_at, NaiveDateTime.utc_now()) in 15..20
+ end
+
+ test "detects if it is multiple choice" do
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "Which Mastodon developer is your favourite?",
+ "poll" => %{
+ "options" => ["Gargron", "Eugen"],
+ "expires_in" => 20,
+ "multiple" => true
+ }
+ })
+
+ object = Object.normalize(activity)
+
+ assert %{multiple: true} = StatusView.render("poll.json", %{object: object})
+ end
+
+ test "detects emoji" do
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "What's with the smug face?",
+ "poll" => %{
+ "options" => [":blank: sip", ":blank::blank: sip", ":blank::blank::blank: sip"],
+ "expires_in" => 20
+ }
+ })
+
+ object = Object.normalize(activity)
+
+ assert %{emojis: [%{shortcode: "blank"}]} =
+ StatusView.render("poll.json", %{object: object})
+ end
+
+ test "detects vote status" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "Which input devices do you use?",
+ "poll" => %{
+ "options" => ["mouse", "trackball", "trackpoint"],
+ "multiple" => true,
+ "expires_in" => 20
+ }
+ })
+
+ object = Object.normalize(activity)
+
+ {:ok, _, object} = CommonAPI.vote(other_user, object, [1, 2])
+
+ result = StatusView.render("poll.json", %{object: object, for: other_user})
+
+ assert result[:voted] == true
+ assert Enum.at(result[:options], 1)[:votes_count] == 1
+ assert Enum.at(result[:options], 2)[:votes_count] == 1
+ end
+ end
+
+ test "embeds a relationship in the account" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "drink more water"
+ })
+
+ result = StatusView.render("status.json", %{activity: activity, for: other_user})
+
+ assert result[:account][:pleroma][:relationship] ==
+ AccountView.render("relationship.json", %{user: other_user, target: user})
+ end
+
+ test "embeds a relationship in the account in reposts" do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{
+ "status" => "˙˙ɐʎns"
+ })
+
+ {:ok, activity, _object} = CommonAPI.repeat(activity.id, other_user)
+
+ result = StatusView.render("status.json", %{activity: activity, for: user})
+
+ assert result[:account][:pleroma][:relationship] ==
+ AccountView.render("relationship.json", %{user: user, target: other_user})
+
+ assert result[:reblog][:account][:pleroma][:relationship] ==
+ AccountView.render("relationship.json", %{user: user, target: user})
+ end
+
+ test "visibility/list" do
+ user = insert(:user)
+
+ {:ok, list} = Pleroma.List.create("foo", user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{"status" => "foobar", "visibility" => "list:#{list.id}"})
+
+ status = StatusView.render("status.json", activity: activity)
+
+ assert status.visibility == "list"
+ end
end
diff --git a/test/web/media_proxy/media_proxy_controller_test.exs b/test/web/media_proxy/media_proxy_controller_test.exs
new file mode 100644
index 000000000..53b8f556b
--- /dev/null
+++ b/test/web/media_proxy/media_proxy_controller_test.exs
@@ -0,0 +1,73 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do
+ use Pleroma.Web.ConnCase
+ import Mock
+ alias Pleroma.Config
+
+ setup do
+ media_proxy_config = Config.get([:media_proxy]) || []
+ on_exit(fn -> Config.put([:media_proxy], media_proxy_config) end)
+ :ok
+ end
+
+ test "it returns 404 when MediaProxy disabled", %{conn: conn} do
+ Config.put([:media_proxy, :enabled], false)
+
+ assert %Plug.Conn{
+ status: 404,
+ resp_body: "Not Found"
+ } = get(conn, "/proxy/hhgfh/eeeee")
+
+ assert %Plug.Conn{
+ status: 404,
+ resp_body: "Not Found"
+ } = get(conn, "/proxy/hhgfh/eeee/fff")
+ end
+
+ test "it returns 403 when signature invalidated", %{conn: conn} do
+ Config.put([:media_proxy, :enabled], true)
+ Config.put([Pleroma.Web.Endpoint, :secret_key_base], "00000000000")
+ path = URI.parse(Pleroma.Web.MediaProxy.encode_url("https://google.fn")).path
+ Config.put([Pleroma.Web.Endpoint, :secret_key_base], "000")
+
+ assert %Plug.Conn{
+ status: 403,
+ resp_body: "Forbidden"
+ } = get(conn, path)
+
+ assert %Plug.Conn{
+ status: 403,
+ resp_body: "Forbidden"
+ } = get(conn, "/proxy/hhgfh/eeee")
+
+ assert %Plug.Conn{
+ status: 403,
+ resp_body: "Forbidden"
+ } = get(conn, "/proxy/hhgfh/eeee/fff")
+ end
+
+ test "redirects on valid url when filename invalidated", %{conn: conn} do
+ Config.put([:media_proxy, :enabled], true)
+ Config.put([Pleroma.Web.Endpoint, :secret_key_base], "00000000000")
+ url = Pleroma.Web.MediaProxy.encode_url("https://google.fn/test.png")
+ invalid_url = String.replace(url, "test.png", "test-file.png")
+ response = get(conn, invalid_url)
+ html = "<html><body>You are being <a href=\"#{url}\">redirected</a>.</body></html>"
+ assert response.status == 302
+ assert response.resp_body == html
+ end
+
+ test "it performs ReverseProxy.call when signature valid", %{conn: conn} do
+ Config.put([:media_proxy, :enabled], true)
+ Config.put([Pleroma.Web.Endpoint, :secret_key_base], "00000000000")
+ url = Pleroma.Web.MediaProxy.encode_url("https://google.fn/test.png")
+
+ with_mock Pleroma.ReverseProxy,
+ call: fn _conn, _url, _opts -> %Plug.Conn{status: :success} end do
+ assert %Plug.Conn{status: :success} = get(conn, url)
+ end
+ end
+end
diff --git a/test/media_proxy_test.exs b/test/web/media_proxy/media_proxy_test.exs
index 0a02039a6..79699cac5 100644
--- a/test/media_proxy_test.exs
+++ b/test/web/media_proxy/media_proxy_test.exs
@@ -2,16 +2,13 @@
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
-defmodule Pleroma.MediaProxyTest do
+defmodule Pleroma.Web.MediaProxyTest do
use ExUnit.Case
+ use Pleroma.Tests.Helpers
import Pleroma.Web.MediaProxy
alias Pleroma.Web.MediaProxy.MediaProxyController
- setup do
- enabled = Pleroma.Config.get([:media_proxy, :enabled])
- on_exit(fn -> Pleroma.Config.put([:media_proxy, :enabled], enabled) end)
- :ok
- end
+ clear_config([:media_proxy, :enabled])
describe "when enabled" do
setup do
@@ -70,14 +67,6 @@ defmodule Pleroma.MediaProxyTest do
assert decode_result(encoded) == url
end
- test "ensures urls are url-encoded" do
- assert decode_result(url("https://pleroma.social/Hello world.jpg")) ==
- "https://pleroma.social/Hello%20world.jpg"
-
- assert decode_result(url("https://pleroma.social/Hello%20world.jpg")) ==
- "https://pleroma.social/Hello%20world.jpg"
- end
-
test "validates signature" do
secret_key_base = Pleroma.Config.get([Pleroma.Web.Endpoint, :secret_key_base])
@@ -96,31 +85,40 @@ defmodule Pleroma.MediaProxyTest do
assert decode_url(sig, base64) == {:error, :invalid_signature}
end
- test "filename_matches matches url encoded paths" do
+ test "filename_matches preserves the encoded or decoded path" do
assert MediaProxyController.filename_matches(
- true,
- "/Hello%20world.jpg",
+ %{"filename" => "/Hello world.jpg"},
+ "/Hello world.jpg",
"http://pleroma.social/Hello world.jpg"
) == :ok
assert MediaProxyController.filename_matches(
- true,
+ %{"filename" => "/Hello%20world.jpg"},
"/Hello%20world.jpg",
"http://pleroma.social/Hello%20world.jpg"
) == :ok
- end
- test "filename_matches matches non-url encoded paths" do
assert MediaProxyController.filename_matches(
- true,
- "/Hello world.jpg",
- "http://pleroma.social/Hello%20world.jpg"
+ %{"filename" => "/my%2Flong%2Furl%2F2019%2F07%2FS.jpg"},
+ "/my%2Flong%2Furl%2F2019%2F07%2FS.jpg",
+ "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg"
) == :ok
assert MediaProxyController.filename_matches(
+ %{"filename" => "/my%2Flong%2Furl%2F2019%2F07%2FS.jp"},
+ "/my%2Flong%2Furl%2F2019%2F07%2FS.jp",
+ "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg"
+ ) == {:wrong_filename, "my%2Flong%2Furl%2F2019%2F07%2FS.jpg"}
+ end
+
+ test "encoded url are tried to match for proxy as `conn.request_path` encodes the url" do
+ # conn.request_path will return encoded url
+ request_path = "/ANALYSE-DAI-_-LE-STABLECOIN-100-D%C3%89CENTRALIS%C3%89-BQ.jpg"
+
+ assert MediaProxyController.filename_matches(
true,
- "/Hello world.jpg",
- "http://pleroma.social/Hello world.jpg"
+ request_path,
+ "https://mydomain.com/uploads/2019/07/ANALYSE-DAI-_-LE-STABLECOIN-100-DÉCENTRALISÉ-BQ.jpg"
) == :ok
end
@@ -141,10 +139,31 @@ defmodule Pleroma.MediaProxyTest do
assert String.starts_with?(encoded, Pleroma.Config.get([:media_proxy, :base_url]))
end
- # https://git.pleroma.social/pleroma/pleroma/issues/580
- test "encoding S3 links (must preserve `%2F`)" do
+ # Some sites expect ASCII encoded characters in the URL to be preserved even if
+ # unnecessary.
+ # Issues: https://git.pleroma.social/pleroma/pleroma/issues/580
+ # https://git.pleroma.social/pleroma/pleroma/issues/1055
+ test "preserve ASCII encoding" do
+ url =
+ "https://pleroma.com/%20/%21/%22/%23/%24/%25/%26/%27/%28/%29/%2A/%2B/%2C/%2D/%2E/%2F/%30/%31/%32/%33/%34/%35/%36/%37/%38/%39/%3A/%3B/%3C/%3D/%3E/%3F/%40/%41/%42/%43/%44/%45/%46/%47/%48/%49/%4A/%4B/%4C/%4D/%4E/%4F/%50/%51/%52/%53/%54/%55/%56/%57/%58/%59/%5A/%5B/%5C/%5D/%5E/%5F/%60/%61/%62/%63/%64/%65/%66/%67/%68/%69/%6A/%6B/%6C/%6D/%6E/%6F/%70/%71/%72/%73/%74/%75/%76/%77/%78/%79/%7A/%7B/%7C/%7D/%7E/%7F/%80/%81/%82/%83/%84/%85/%86/%87/%88/%89/%8A/%8B/%8C/%8D/%8E/%8F/%90/%91/%92/%93/%94/%95/%96/%97/%98/%99/%9A/%9B/%9C/%9D/%9E/%9F/%C2%A0/%A1/%A2/%A3/%A4/%A5/%A6/%A7/%A8/%A9/%AA/%AB/%AC/%C2%AD/%AE/%AF/%B0/%B1/%B2/%B3/%B4/%B5/%B6/%B7/%B8/%B9/%BA/%BB/%BC/%BD/%BE/%BF/%C0/%C1/%C2/%C3/%C4/%C5/%C6/%C7/%C8/%C9/%CA/%CB/%CC/%CD/%CE/%CF/%D0/%D1/%D2/%D3/%D4/%D5/%D6/%D7/%D8/%D9/%DA/%DB/%DC/%DD/%DE/%DF/%E0/%E1/%E2/%E3/%E4/%E5/%E6/%E7/%E8/%E9/%EA/%EB/%EC/%ED/%EE/%EF/%F0/%F1/%F2/%F3/%F4/%F5/%F6/%F7/%F8/%F9/%FA/%FB/%FC/%FD/%FE/%FF"
+
+ encoded = url(url)
+ assert decode_result(encoded) == url
+ end
+
+ # This includes unsafe/reserved characters which are not interpreted as part of the URL
+ # and would otherwise have to be ASCII encoded. It is our role to ensure the proxied URL
+ # is unmodified, so we are testing these characters anyway.
+ test "preserve non-unicode characters per RFC3986" do
url =
- "https://s3.amazonaws.com/example/test.png?X-Amz-Credential=your-access-key-id%2F20130721%2Fus-east-1%2Fs3%2Faws4_request"
+ "https://pleroma.com/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-._~:/?#[]@!$&'()*+,;=|^`{}"
+
+ encoded = url(url)
+ assert decode_result(encoded) == url
+ end
+
+ test "preserve unicode characters" do
+ url = "https://ko.wikipedia.org/wiki/위키백과:대문"
encoded = url(url)
assert decode_result(encoded) == url
@@ -178,12 +197,43 @@ defmodule Pleroma.MediaProxyTest do
decoded
end
- test "mediaproxy whitelist" do
- Pleroma.Config.put([:media_proxy, :enabled], true)
- Pleroma.Config.put([:media_proxy, :whitelist], ["google.com", "feld.me"])
- url = "https://feld.me/foo.png"
+ describe "whitelist" do
+ setup do
+ Pleroma.Config.put([:media_proxy, :enabled], true)
+ :ok
+ end
+
+ test "mediaproxy whitelist" do
+ Pleroma.Config.put([:media_proxy, :whitelist], ["google.com", "feld.me"])
+ url = "https://feld.me/foo.png"
+
+ unencoded = url(url)
+ assert unencoded == url
+ end
+
+ test "does not change whitelisted urls" do
+ Pleroma.Config.put([:media_proxy, :whitelist], ["mycdn.akamai.com"])
+ Pleroma.Config.put([:media_proxy, :base_url], "https://cache.pleroma.social")
+
+ media_url = "https://mycdn.akamai.com"
+
+ url = "#{media_url}/static/logo.png"
+ encoded = url(url)
+
+ assert String.starts_with?(encoded, media_url)
+ end
+
+ test "ensure Pleroma.Upload base_url is always whitelisted" do
+ upload_config = Pleroma.Config.get([Pleroma.Upload])
+ media_url = "https://media.pleroma.social"
+ Pleroma.Config.put([Pleroma.Upload, :base_url], media_url)
+
+ url = "#{media_url}/static/logo.png"
+ encoded = url(url)
+
+ assert String.starts_with?(encoded, media_url)
- unencoded = url(url)
- assert unencoded == url
+ Pleroma.Config.put([Pleroma.Upload], upload_config)
+ end
end
end
diff --git a/test/web/metadata/player_view_test.exs b/test/web/metadata/player_view_test.exs
new file mode 100644
index 000000000..742b0ed8b
--- /dev/null
+++ b/test/web/metadata/player_view_test.exs
@@ -0,0 +1,33 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.Metadata.PlayerViewTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Web.Metadata.PlayerView
+
+ test "it renders audio tag" do
+ res =
+ PlayerView.render(
+ "player.html",
+ %{"mediaType" => "audio", "href" => "test-href"}
+ )
+ |> Phoenix.HTML.safe_to_string()
+
+ assert res ==
+ "<audio controls><source src=\"test-href\" type=\"audio\">Your browser does not support audio playback.</audio>"
+ end
+
+ test "it renders videos tag" do
+ res =
+ PlayerView.render(
+ "player.html",
+ %{"mediaType" => "video", "href" => "test-href"}
+ )
+ |> Phoenix.HTML.safe_to_string()
+
+ assert res ==
+ "<video controls loop><source src=\"test-href\" type=\"video\">Your browser does not support video playback.</video>"
+ end
+end
diff --git a/test/web/metadata/rel_me_test.exs b/test/web/metadata/rel_me_test.exs
index f66bf7834..3874e077b 100644
--- a/test/web/metadata/rel_me_test.exs
+++ b/test/web/metadata/rel_me_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.Metadata.Providers.RelMeTest do
use Pleroma.DataCase
import Pleroma.Factory
diff --git a/test/web/metadata/twitter_card_test.exs b/test/web/metadata/twitter_card_test.exs
new file mode 100644
index 000000000..0814006d2
--- /dev/null
+++ b/test/web/metadata/twitter_card_test.exs
@@ -0,0 +1,123 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do
+ use Pleroma.DataCase
+ import Pleroma.Factory
+
+ alias Pleroma.User
+ alias Pleroma.Web.CommonAPI
+ alias Pleroma.Web.Endpoint
+ alias Pleroma.Web.Metadata.Providers.TwitterCard
+ alias Pleroma.Web.Metadata.Utils
+ alias Pleroma.Web.Router
+
+ test "it renders twitter card for user info" do
+ user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
+ avatar_url = Utils.attachment_url(User.avatar_url(user))
+ res = TwitterCard.build_tags(%{user: user})
+
+ assert res == [
+ {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []},
+ {:meta, [property: "twitter:description", content: "born 19 March 1994"], []},
+ {:meta, [property: "twitter:image", content: avatar_url], []},
+ {:meta, [property: "twitter:card", content: "summary"], []}
+ ]
+ end
+
+ test "it does not render attachments if post is nsfw" do
+ Pleroma.Config.put([Pleroma.Web.Metadata, :unfurl_nsfw], false)
+ user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "HI"})
+
+ note =
+ insert(:note, %{
+ data: %{
+ "actor" => user.ap_id,
+ "tag" => [],
+ "id" => "https://pleroma.gov/objects/whatever",
+ "content" => "pleroma in a nutshell",
+ "sensitive" => true,
+ "attachment" => [
+ %{
+ "url" => [%{"mediaType" => "image/png", "href" => "https://pleroma.gov/tenshi.png"}]
+ },
+ %{
+ "url" => [
+ %{
+ "mediaType" => "application/octet-stream",
+ "href" => "https://pleroma.gov/fqa/badapple.sfc"
+ }
+ ]
+ },
+ %{
+ "url" => [
+ %{"mediaType" => "video/webm", "href" => "https://pleroma.gov/about/juche.webm"}
+ ]
+ }
+ ]
+ }
+ })
+
+ result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})
+
+ assert [
+ {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []},
+ {:meta, [property: "twitter:description", content: "“pleroma in a nutshell”"], []},
+ {:meta, [property: "twitter:image", content: "http://localhost:4001/images/avi.png"],
+ []},
+ {:meta, [property: "twitter:card", content: "summary_large_image"], []}
+ ] == result
+ end
+
+ test "it renders supported types of attachments and skips unknown types" do
+ user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994")
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "HI"})
+
+ note =
+ insert(:note, %{
+ data: %{
+ "actor" => user.ap_id,
+ "tag" => [],
+ "id" => "https://pleroma.gov/objects/whatever",
+ "content" => "pleroma in a nutshell",
+ "attachment" => [
+ %{
+ "url" => [%{"mediaType" => "image/png", "href" => "https://pleroma.gov/tenshi.png"}]
+ },
+ %{
+ "url" => [
+ %{
+ "mediaType" => "application/octet-stream",
+ "href" => "https://pleroma.gov/fqa/badapple.sfc"
+ }
+ ]
+ },
+ %{
+ "url" => [
+ %{"mediaType" => "video/webm", "href" => "https://pleroma.gov/about/juche.webm"}
+ ]
+ }
+ ]
+ }
+ })
+
+ result = TwitterCard.build_tags(%{object: note, user: user, activity_id: activity.id})
+
+ assert [
+ {:meta, [property: "twitter:title", content: Utils.user_name_string(user)], []},
+ {:meta, [property: "twitter:description", content: "“pleroma in a nutshell”"], []},
+ {:meta, [property: "twitter:card", content: "summary_large_image"], []},
+ {:meta, [property: "twitter:player", content: "https://pleroma.gov/tenshi.png"], []},
+ {:meta, [property: "twitter:card", content: "player"], []},
+ {:meta,
+ [
+ property: "twitter:player",
+ content: Router.Helpers.o_status_url(Endpoint, :notice_player, activity.id)
+ ], []},
+ {:meta, [property: "twitter:player:width", content: "480"], []},
+ {:meta, [property: "twitter:player:height", content: "480"], []}
+ ] == result
+ end
+end
diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs
index be1173513..f6147c286 100644
--- a/test/web/node_info_test.exs
+++ b/test/web/node_info_test.exs
@@ -83,4 +83,55 @@ defmodule Pleroma.Web.NodeInfoTest do
Pleroma.Config.put([:instance, :safe_dm_mentions], option)
end
+
+ test "it shows MRF transparency data if enabled", %{conn: conn} do
+ config = Pleroma.Config.get([:instance, :rewrite_policy])
+ Pleroma.Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy])
+
+ option = Pleroma.Config.get([:instance, :mrf_transparency])
+ Pleroma.Config.put([:instance, :mrf_transparency], true)
+
+ simple_config = %{"reject" => ["example.com"]}
+ Pleroma.Config.put(:mrf_simple, simple_config)
+
+ response =
+ conn
+ |> get("/nodeinfo/2.1.json")
+ |> json_response(:ok)
+
+ assert response["metadata"]["federation"]["mrf_simple"] == simple_config
+
+ Pleroma.Config.put([:instance, :rewrite_policy], config)
+ Pleroma.Config.put([:instance, :mrf_transparency], option)
+ Pleroma.Config.put(:mrf_simple, %{})
+ end
+
+ test "it performs exclusions from MRF transparency data if configured", %{conn: conn} do
+ config = Pleroma.Config.get([:instance, :rewrite_policy])
+ Pleroma.Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy])
+
+ option = Pleroma.Config.get([:instance, :mrf_transparency])
+ Pleroma.Config.put([:instance, :mrf_transparency], true)
+
+ exclusions = Pleroma.Config.get([:instance, :mrf_transparency_exclusions])
+ Pleroma.Config.put([:instance, :mrf_transparency_exclusions], ["other.site"])
+
+ simple_config = %{"reject" => ["example.com", "other.site"]}
+ expected_config = %{"reject" => ["example.com"]}
+
+ Pleroma.Config.put(:mrf_simple, simple_config)
+
+ response =
+ conn
+ |> get("/nodeinfo/2.1.json")
+ |> json_response(:ok)
+
+ assert response["metadata"]["federation"]["mrf_simple"] == expected_config
+ assert response["metadata"]["federation"]["exclusions"] == true
+
+ Pleroma.Config.put([:instance, :rewrite_policy], config)
+ Pleroma.Config.put([:instance, :mrf_transparency], option)
+ Pleroma.Config.put([:instance, :mrf_transparency_exclusions], exclusions)
+ Pleroma.Config.put(:mrf_simple, %{})
+ end
end
diff --git a/test/web/oauth/ldap_authorization_test.exs b/test/web/oauth/ldap_authorization_test.exs
index 0eb191c76..1cbe133b7 100644
--- a/test/web/oauth/ldap_authorization_test.exs
+++ b/test/web/oauth/ldap_authorization_test.exs
@@ -12,21 +12,12 @@ defmodule Pleroma.Web.OAuth.LDAPAuthorizationTest do
@skip if !Code.ensure_loaded?(:eldap), do: :skip
- setup_all do
- ldap_authenticator =
- Pleroma.Config.get(Pleroma.Web.Auth.Authenticator, Pleroma.Web.Auth.PleromaAuthenticator)
-
- ldap_enabled = Pleroma.Config.get([:ldap, :enabled])
-
- on_exit(fn ->
- Pleroma.Config.put(Pleroma.Web.Auth.Authenticator, ldap_authenticator)
- Pleroma.Config.put([:ldap, :enabled], ldap_enabled)
- end)
-
- Pleroma.Config.put(Pleroma.Web.Auth.Authenticator, Pleroma.Web.Auth.LDAPAuthenticator)
+ clear_config_all([:ldap, :enabled]) do
Pleroma.Config.put([:ldap, :enabled], true)
+ end
- :ok
+ clear_config_all(Pleroma.Web.Auth.Authenticator) do
+ Pleroma.Config.put(Pleroma.Web.Auth.Authenticator, Pleroma.Web.Auth.LDAPAuthenticator)
end
@tag @skip
diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs
index 1c04ac9ad..b492c7794 100644
--- a/test/web/oauth/oauth_controller_test.exs
+++ b/test/web/oauth/oauth_controller_test.exs
@@ -5,30 +5,21 @@
defmodule Pleroma.Web.OAuth.OAuthControllerTest do
use Pleroma.Web.ConnCase
import Pleroma.Factory
- import Mock
- alias Pleroma.Registration
alias Pleroma.Repo
alias Pleroma.Web.OAuth.Authorization
+ alias Pleroma.Web.OAuth.OAuthController
alias Pleroma.Web.OAuth.Token
- @oauth_config_path [:oauth2, :issue_new_refresh_token]
@session_opts [
store: :cookie,
key: "_test",
signing_salt: "cooldude"
]
+ clear_config_all([:instance, :account_activation_required])
describe "in OAuth consumer mode, " do
setup do
- oauth_consumer_strategies_path = [:auth, :oauth_consumer_strategies]
- oauth_consumer_strategies = Pleroma.Config.get(oauth_consumer_strategies_path)
- Pleroma.Config.put(oauth_consumer_strategies_path, ~w(twitter facebook))
-
- on_exit(fn ->
- Pleroma.Config.put(oauth_consumer_strategies_path, oauth_consumer_strategies)
- end)
-
[
app: insert(:oauth_app),
conn:
@@ -38,6 +29,13 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
]
end
+ clear_config([:auth, :oauth_consumer_strategies]) do
+ Pleroma.Config.put(
+ [:auth, :oauth_consumer_strategies],
+ ~w(twitter facebook)
+ )
+ end
+
test "GET /oauth/authorize renders auth forms, including OAuth consumer form", %{
app: app,
conn: conn
@@ -49,7 +47,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
%{
"response_type" => "code",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"scope" => "read"
}
)
@@ -72,7 +70,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"authorization" => %{
"scope" => "read follow",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"state" => "a_state"
}
}
@@ -98,64 +96,65 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
test "with user-bound registration, GET /oauth/<provider>/callback redirects to `redirect_uri` with `code`",
%{app: app, conn: conn} do
registration = insert(:registration)
+ redirect_uri = OAuthController.default_redirect_uri(app)
state_params = %{
"scope" => Enum.join(app.scopes, " "),
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => redirect_uri,
"state" => ""
}
- with_mock Pleroma.Web.Auth.Authenticator,
- get_registration: fn _ -> {:ok, registration} end do
- conn =
- get(
- conn,
- "/oauth/twitter/callback",
- %{
- "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM",
- "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs",
- "provider" => "twitter",
- "state" => Poison.encode!(state_params)
- }
- )
+ conn =
+ conn
+ |> assign(:ueberauth_auth, %{provider: registration.provider, uid: registration.uid})
+ |> get(
+ "/oauth/twitter/callback",
+ %{
+ "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM",
+ "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs",
+ "provider" => "twitter",
+ "state" => Poison.encode!(state_params)
+ }
+ )
- assert response = html_response(conn, 302)
- assert redirected_to(conn) =~ ~r/#{app.redirect_uris}\?code=.+/
- end
+ assert response = html_response(conn, 302)
+ assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/
end
test "with user-unbound registration, GET /oauth/<provider>/callback renders registration_details page",
%{app: app, conn: conn} do
- registration = insert(:registration, user: nil)
+ user = insert(:user)
state_params = %{
"scope" => "read write",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"state" => "a_state"
}
- with_mock Pleroma.Web.Auth.Authenticator,
- get_registration: fn _ -> {:ok, registration} end do
- conn =
- get(
- conn,
- "/oauth/twitter/callback",
- %{
- "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM",
- "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs",
- "provider" => "twitter",
- "state" => Poison.encode!(state_params)
- }
- )
+ conn =
+ conn
+ |> assign(:ueberauth_auth, %{
+ provider: "twitter",
+ uid: "171799000",
+ info: %{nickname: user.nickname, email: user.email, name: user.name, description: nil}
+ })
+ |> get(
+ "/oauth/twitter/callback",
+ %{
+ "oauth_token" => "G-5a3AAAAAAAwMH9AAABaektfSM",
+ "oauth_verifier" => "QZl8vUqNvXMTKpdmUnGejJxuHG75WWWs",
+ "provider" => "twitter",
+ "state" => Poison.encode!(state_params)
+ }
+ )
- assert response = html_response(conn, 200)
- assert response =~ ~r/name="op" type="submit" value="register"/
- assert response =~ ~r/name="op" type="submit" value="connect"/
- assert response =~ Registration.email(registration)
- assert response =~ Registration.nickname(registration)
- end
+ assert response = html_response(conn, 200)
+ assert response =~ ~r/name="op" type="submit" value="register"/
+ assert response =~ ~r/name="op" type="submit" value="connect"/
+ assert response =~ user.email
+ assert response =~ user.nickname
end
test "on authentication error, GET /oauth/<provider>/callback redirects to `redirect_uri`", %{
@@ -165,7 +164,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
state_params = %{
"scope" => Enum.join(app.scopes, " "),
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"state" => ""
}
@@ -199,7 +198,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"authorization" => %{
"scopes" => app.scopes,
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"state" => "a_state",
"nickname" => nil,
"email" => "john@doe.com"
@@ -218,6 +217,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
conn: conn
} do
registration = insert(:registration, user: nil, info: %{"nickname" => nil, "email" => nil})
+ redirect_uri = OAuthController.default_redirect_uri(app)
conn =
conn
@@ -229,7 +229,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"authorization" => %{
"scopes" => app.scopes,
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => redirect_uri,
"state" => "a_state",
"nickname" => "availablenick",
"email" => "available@email.com"
@@ -238,7 +238,36 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
)
assert response = html_response(conn, 302)
- assert redirected_to(conn) =~ ~r/#{app.redirect_uris}\?code=.+/
+ assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/
+ end
+
+ test "with unlisted `redirect_uri`, POST /oauth/register?op=register results in HTTP 401",
+ %{
+ app: app,
+ conn: conn
+ } do
+ registration = insert(:registration, user: nil, info: %{"nickname" => nil, "email" => nil})
+ unlisted_redirect_uri = "http://cross-site-request.com"
+
+ conn =
+ conn
+ |> put_session(:registration_id, registration.id)
+ |> post(
+ "/oauth/register",
+ %{
+ "op" => "register",
+ "authorization" => %{
+ "scopes" => app.scopes,
+ "client_id" => app.client_id,
+ "redirect_uri" => unlisted_redirect_uri,
+ "state" => "a_state",
+ "nickname" => "availablenick",
+ "email" => "available@email.com"
+ }
+ }
+ )
+
+ assert response = html_response(conn, 401)
end
test "with invalid params, POST /oauth/register?op=register renders registration_details page",
@@ -254,7 +283,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"authorization" => %{
"scopes" => app.scopes,
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"state" => "a_state",
"nickname" => "availablenickname",
"email" => "available@email.com"
@@ -286,6 +315,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
} do
user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt("testpassword"))
registration = insert(:registration, user: nil)
+ redirect_uri = OAuthController.default_redirect_uri(app)
conn =
conn
@@ -297,7 +327,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"authorization" => %{
"scopes" => app.scopes,
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => redirect_uri,
"state" => "a_state",
"name" => user.nickname,
"password" => "testpassword"
@@ -306,7 +336,37 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
)
assert response = html_response(conn, 302)
- assert redirected_to(conn) =~ ~r/#{app.redirect_uris}\?code=.+/
+ assert redirected_to(conn) =~ ~r/#{redirect_uri}\?code=.+/
+ end
+
+ test "with unlisted `redirect_uri`, POST /oauth/register?op=connect results in HTTP 401`",
+ %{
+ app: app,
+ conn: conn
+ } do
+ user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt("testpassword"))
+ registration = insert(:registration, user: nil)
+ unlisted_redirect_uri = "http://cross-site-request.com"
+
+ conn =
+ conn
+ |> put_session(:registration_id, registration.id)
+ |> post(
+ "/oauth/register",
+ %{
+ "op" => "connect",
+ "authorization" => %{
+ "scopes" => app.scopes,
+ "client_id" => app.client_id,
+ "redirect_uri" => unlisted_redirect_uri,
+ "state" => "a_state",
+ "name" => user.nickname,
+ "password" => "testpassword"
+ }
+ }
+ )
+
+ assert response = html_response(conn, 401)
end
test "with invalid params, POST /oauth/register?op=connect renders registration_details page",
@@ -322,7 +382,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"authorization" => %{
"scopes" => app.scopes,
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"state" => "a_state",
"name" => user.nickname,
"password" => "wrong password"
@@ -358,7 +418,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
%{
"response_type" => "code",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"scope" => "read"
}
)
@@ -378,7 +438,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"authorization" => %{
"response_type" => "code",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"scope" => "read"
}
}
@@ -399,7 +459,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
%{
"response_type" => "code",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"scope" => "read",
"force_login" => "true"
}
@@ -408,7 +468,11 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
assert html_response(conn, 200) =~ ~s(type="submit")
end
- test "redirects to app if user is already authenticated", %{app: app, conn: conn} do
+ test "with existing authentication and non-OOB `redirect_uri`, redirects to app with `token` and `state` params",
+ %{
+ app: app,
+ conn: conn
+ } do
token = insert(:oauth_token, app_id: app.id)
conn =
@@ -419,12 +483,62 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
%{
"response_type" => "code",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
+ "state" => "specific_client_state",
"scope" => "read"
}
)
- assert redirected_to(conn) == "https://redirect.url"
+ assert URI.decode(redirected_to(conn)) ==
+ "https://redirect.url?access_token=#{token.token}&state=specific_client_state"
+ end
+
+ test "with existing authentication and unlisted non-OOB `redirect_uri`, redirects without credentials",
+ %{
+ app: app,
+ conn: conn
+ } do
+ unlisted_redirect_uri = "http://cross-site-request.com"
+ token = insert(:oauth_token, app_id: app.id)
+
+ conn =
+ conn
+ |> put_session(:oauth_token, token.token)
+ |> get(
+ "/oauth/authorize",
+ %{
+ "response_type" => "code",
+ "client_id" => app.client_id,
+ "redirect_uri" => unlisted_redirect_uri,
+ "state" => "specific_client_state",
+ "scope" => "read"
+ }
+ )
+
+ assert redirected_to(conn) == unlisted_redirect_uri
+ end
+
+ test "with existing authentication and OOB `redirect_uri`, redirects to app with `token` and `state` params",
+ %{
+ app: app,
+ conn: conn
+ } do
+ token = insert(:oauth_token, app_id: app.id)
+
+ conn =
+ conn
+ |> put_session(:oauth_token, token.token)
+ |> get(
+ "/oauth/authorize",
+ %{
+ "response_type" => "code",
+ "client_id" => app.client_id,
+ "redirect_uri" => "urn:ietf:wg:oauth:2.0:oob",
+ "scope" => "read"
+ }
+ )
+
+ assert html_response(conn, 200) =~ "Authorization exists"
end
end
@@ -432,6 +546,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
test "redirects with oauth authorization" do
user = insert(:user)
app = insert(:oauth_app, scopes: ["read", "write", "follow"])
+ redirect_uri = OAuthController.default_redirect_uri(app)
conn =
build_conn()
@@ -440,14 +555,14 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"name" => user.nickname,
"password" => "test",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => redirect_uri,
"scope" => "read write",
"state" => "statepassed"
}
})
target = redirected_to(conn)
- assert target =~ app.redirect_uris
+ assert target =~ redirect_uri
query = URI.parse(target).query |> URI.query_decoder() |> Map.new()
@@ -460,6 +575,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
test "returns 401 for wrong credentials", %{conn: conn} do
user = insert(:user)
app = insert(:oauth_app)
+ redirect_uri = OAuthController.default_redirect_uri(app)
result =
conn
@@ -468,7 +584,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"name" => user.nickname,
"password" => "wrong",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => redirect_uri,
"state" => "statepassed",
"scope" => Enum.join(app.scopes, " ")
}
@@ -477,7 +593,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
# Keep the details
assert result =~ app.client_id
- assert result =~ app.redirect_uris
+ assert result =~ redirect_uri
# Error message
assert result =~ "Invalid Username/Password"
@@ -486,6 +602,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
test "returns 401 for missing scopes", %{conn: conn} do
user = insert(:user)
app = insert(:oauth_app)
+ redirect_uri = OAuthController.default_redirect_uri(app)
result =
conn
@@ -494,7 +611,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"name" => user.nickname,
"password" => "test",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => redirect_uri,
"state" => "statepassed",
"scope" => ""
}
@@ -503,7 +620,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
# Keep the details
assert result =~ app.client_id
- assert result =~ app.redirect_uris
+ assert result =~ redirect_uri
# Error message
assert result =~ "This action is outside the authorized scopes"
@@ -512,6 +629,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
test "returns 401 for scopes beyond app scopes", %{conn: conn} do
user = insert(:user)
app = insert(:oauth_app, scopes: ["read", "write"])
+ redirect_uri = OAuthController.default_redirect_uri(app)
result =
conn
@@ -520,7 +638,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
"name" => user.nickname,
"password" => "test",
"client_id" => app.client_id,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => redirect_uri,
"state" => "statepassed",
"scope" => "read write follow"
}
@@ -529,7 +647,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
# Keep the details
assert result =~ app.client_id
- assert result =~ app.redirect_uris
+ assert result =~ redirect_uri
# Error message
assert result =~ "This action is outside the authorized scopes"
@@ -548,7 +666,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
|> post("/oauth/token", %{
"grant_type" => "authorization_code",
"code" => auth.token,
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"client_id" => app.client_id,
"client_secret" => app.client_secret
})
@@ -602,7 +720,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
|> post("/oauth/token", %{
"grant_type" => "authorization_code",
"code" => auth.token,
- "redirect_uri" => app.redirect_uris
+ "redirect_uri" => OAuthController.default_redirect_uri(app)
})
assert %{"access_token" => token, "scope" => scope} = json_response(conn, 200)
@@ -647,7 +765,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
|> post("/oauth/token", %{
"grant_type" => "authorization_code",
"code" => auth.token,
- "redirect_uri" => app.redirect_uris
+ "redirect_uri" => OAuthController.default_redirect_uri(app)
})
assert resp = json_response(conn, 400)
@@ -656,12 +774,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
end
test "rejects token exchange for valid credentials belonging to unconfirmed user and confirmation is required" do
- setting = Pleroma.Config.get([:instance, :account_activation_required])
-
- unless setting do
- Pleroma.Config.put([:instance, :account_activation_required], true)
- on_exit(fn -> Pleroma.Config.put([:instance, :account_activation_required], setting) end)
- end
+ Pleroma.Config.put([:instance, :account_activation_required], true)
password = "testpassword"
user = insert(:user, password_hash: Comeonin.Pbkdf2.hashpwsalt(password))
@@ -726,7 +839,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
|> post("/oauth/token", %{
"grant_type" => "authorization_code",
"code" => "Imobviouslyinvalid",
- "redirect_uri" => app.redirect_uris,
+ "redirect_uri" => OAuthController.default_redirect_uri(app),
"client_id" => app.client_id,
"client_secret" => app.client_secret
})
@@ -738,16 +851,10 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
end
describe "POST /oauth/token - refresh token" do
- setup do
- oauth_token_config = Pleroma.Config.get(@oauth_config_path)
-
- on_exit(fn ->
- Pleroma.Config.get(@oauth_config_path, oauth_token_config)
- end)
- end
+ clear_config([:oauth2, :issue_new_refresh_token])
test "issues a new access token with keep fresh token" do
- Pleroma.Config.put(@oauth_config_path, true)
+ Pleroma.Config.put([:oauth2, :issue_new_refresh_token], true)
user = insert(:user)
app = insert(:oauth_app, scopes: ["read", "write"])
@@ -787,7 +894,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
end
test "issues a new access token with new fresh token" do
- Pleroma.Config.put(@oauth_config_path, false)
+ Pleroma.Config.put([:oauth2, :issue_new_refresh_token], false)
user = insert(:user)
app = insert(:oauth_app, scopes: ["read", "write"])
diff --git a/test/web/ostatus/activity_representer_test.exs b/test/web/ostatus/activity_representer_test.exs
index 16ee02abb..a3a92ce5b 100644
--- a/test/web/ostatus/activity_representer_test.exs
+++ b/test/web/ostatus/activity_representer_test.exs
@@ -38,22 +38,23 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do
test "a note activity" do
note_activity = insert(:note_activity)
+ object_data = Object.normalize(note_activity).data
user = User.get_cached_by_ap_id(note_activity.data["actor"])
expected = """
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
- <id>#{note_activity.data["object"]["id"]}</id>
+ <id>#{object_data["id"]}</id>
<title>New note by #{user.nickname}</title>
- <content type="html">#{note_activity.data["object"]["content"]}</content>
- <published>#{note_activity.data["object"]["published"]}</published>
- <updated>#{note_activity.data["object"]["published"]}</updated>
+ <content type="html">#{object_data["content"]}</content>
+ <published>#{object_data["published"]}</published>
+ <updated>#{object_data["published"]}</updated>
<ostatus:conversation ref="#{note_activity.data["context"]}">#{note_activity.data["context"]}</ostatus:conversation>
<link ref="#{note_activity.data["context"]}" rel="ostatus:conversation" />
- <summary>#{note_activity.data["object"]["summary"]}</summary>
- <link type="application/atom+xml" href="#{note_activity.data["object"]["id"]}" rel="self" />
- <link type="text/html" href="#{note_activity.data["object"]["id"]}" rel="alternate" />
+ <summary>#{object_data["summary"]}</summary>
+ <link type="application/atom+xml" href="#{object_data["id"]}" rel="self" />
+ <link type="text/html" href="#{object_data["id"]}" rel="alternate" />
<category term="2hu"/>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<link name="2hu" rel="emoji" href="corndog.png" />
@@ -106,7 +107,7 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do
test "an announce activity" do
note = insert(:note_activity)
user = insert(:user)
- object = Object.get_cached_by_ap_id(note.data["object"]["id"])
+ object = Object.normalize(note)
{:ok, announce, _object} = ActivityPub.announce(user, object)
@@ -125,7 +126,7 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<id>#{announce.data["id"]}</id>
<title>#{user.nickname} repeated a notice</title>
- <content type="html">RT #{note.data["object"]["content"]}</content>
+ <content type="html">RT #{object.data["content"]}</content>
<published>#{announce.data["published"]}</published>
<updated>#{announce.data["published"]}</updated>
<ostatus:conversation ref="#{announce.data["context"]}">#{announce.data["context"]}</ostatus:conversation>
diff --git a/test/web/ostatus/incoming_documents/delete_handling_test.exs b/test/web/ostatus/incoming_documents/delete_handling_test.exs
index ca6e61339..cd0447af7 100644
--- a/test/web/ostatus/incoming_documents/delete_handling_test.exs
+++ b/test/web/ostatus/incoming_documents/delete_handling_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.OStatus.DeleteHandlingTest do
use Pleroma.DataCase
@@ -17,8 +21,9 @@ defmodule Pleroma.Web.OStatus.DeleteHandlingTest do
test "it removes the mentioned activity" do
note = insert(:note_activity)
second_note = insert(:note_activity)
+ object = Object.normalize(note)
+ second_object = Object.normalize(second_note)
user = insert(:user)
- object = Object.get_by_ap_id(note.data["object"]["id"])
{:ok, like, _object} = Pleroma.Web.ActivityPub.ActivityPub.like(user, object)
@@ -26,16 +31,16 @@ defmodule Pleroma.Web.OStatus.DeleteHandlingTest do
File.read!("test/fixtures/delete.xml")
|> String.replace(
"tag:mastodon.sdf.org,2017-06-10:objectId=310513:objectType=Status",
- note.data["object"]["id"]
+ object.data["id"]
)
{:ok, [delete]} = OStatus.handle_incoming(incoming)
refute Activity.get_by_id(note.id)
refute Activity.get_by_id(like.id)
- assert Object.get_by_ap_id(note.data["object"]["id"]).data["type"] == "Tombstone"
+ assert Object.get_by_ap_id(object.data["id"]).data["type"] == "Tombstone"
assert Activity.get_by_id(second_note.id)
- assert Object.get_by_ap_id(second_note.data["object"]["id"])
+ assert Object.get_by_ap_id(second_object.data["id"])
assert delete.data["type"] == "Delete"
end
diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs
index 7441e5fce..095ae7041 100644
--- a/test/web/ostatus/ostatus_controller_test.exs
+++ b/test/web/ostatus/ostatus_controller_test.exs
@@ -4,7 +4,10 @@
defmodule Pleroma.Web.OStatus.OStatusControllerTest do
use Pleroma.Web.ConnCase
+
+ import ExUnit.CaptureLog
import Pleroma.Factory
+
alias Pleroma.Object
alias Pleroma.User
alias Pleroma.Web.CommonAPI
@@ -15,29 +18,37 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
:ok
end
+ clear_config_all([:instance, :federating]) do
+ Pleroma.Config.put([:instance, :federating], true)
+ end
+
describe "salmon_incoming" do
test "decodes a salmon", %{conn: conn} do
user = insert(:user)
salmon = File.read!("test/fixtures/salmon.xml")
- conn =
- conn
- |> put_req_header("content-type", "application/atom+xml")
- |> post("/users/#{user.nickname}/salmon", salmon)
+ assert capture_log(fn ->
+ conn =
+ conn
+ |> put_req_header("content-type", "application/atom+xml")
+ |> post("/users/#{user.nickname}/salmon", salmon)
- assert response(conn, 200)
+ assert response(conn, 200)
+ end) =~ "[error]"
end
test "decodes a salmon with a changed magic key", %{conn: conn} do
user = insert(:user)
salmon = File.read!("test/fixtures/salmon.xml")
- conn =
- conn
- |> put_req_header("content-type", "application/atom+xml")
- |> post("/users/#{user.nickname}/salmon", salmon)
+ assert capture_log(fn ->
+ conn =
+ conn
+ |> put_req_header("content-type", "application/atom+xml")
+ |> post("/users/#{user.nickname}/salmon", salmon)
- assert response(conn, 200)
+ assert response(conn, 200)
+ end) =~ "[error]"
# Set a wrong magic-key for a user so it has to refetch
salmon_user = User.get_cached_by_ap_id("http://gs.example.org:4040/index.php/user/1")
@@ -54,17 +65,20 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
|> Ecto.Changeset.put_embed(:info, info_cng)
|> User.update_and_set_cache()
- conn =
- build_conn()
- |> put_req_header("content-type", "application/atom+xml")
- |> post("/users/#{user.nickname}/salmon", salmon)
+ assert capture_log(fn ->
+ conn =
+ build_conn()
+ |> put_req_header("content-type", "application/atom+xml")
+ |> post("/users/#{user.nickname}/salmon", salmon)
- assert response(conn, 200)
+ assert response(conn, 200)
+ end) =~ "[error]"
end
end
test "gets a feed", %{conn: conn} do
note_activity = insert(:note_activity)
+ object = Object.normalize(note_activity)
user = User.get_cached_by_ap_id(note_activity.data["actor"])
conn =
@@ -72,7 +86,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
|> put_req_header("content-type", "application/atom+xml")
|> get("/users/#{user.nickname}/feed.atom")
- assert response(conn, 200) =~ note_activity.data["object"]["content"]
+ assert response(conn, 200) =~ object.data["content"]
end
test "returns 404 for a missing feed", %{conn: conn} do
@@ -84,158 +98,538 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
assert response(conn, 404)
end
- test "gets an object", %{conn: conn} do
- note_activity = insert(:note_activity)
- user = User.get_cached_by_ap_id(note_activity.data["actor"])
- [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["object"]["id"]))
- url = "/objects/#{uuid}"
+ describe "GET object/2" do
+ test "gets an object", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ object = Object.normalize(note_activity)
+ user = User.get_cached_by_ap_id(note_activity.data["actor"])
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, object.data["id"]))
+ url = "/objects/#{uuid}"
- conn =
- conn
- |> put_req_header("accept", "application/xml")
- |> get(url)
+ conn =
+ conn
+ |> put_req_header("accept", "application/xml")
+ |> get(url)
- expected =
- ActivityRepresenter.to_simple_form(note_activity, user, true)
- |> ActivityRepresenter.wrap_with_entry()
- |> :xmerl.export_simple(:xmerl_xml)
- |> to_string
+ expected =
+ ActivityRepresenter.to_simple_form(note_activity, user, true)
+ |> ActivityRepresenter.wrap_with_entry()
+ |> :xmerl.export_simple(:xmerl_xml)
+ |> to_string
- assert response(conn, 200) == expected
- end
+ assert response(conn, 200) == expected
+ end
- test "404s on private objects", %{conn: conn} do
- note_activity = insert(:direct_note_activity)
- [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["object"]["id"]))
+ test "redirects to /notice/id for html format", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ object = Object.normalize(note_activity)
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, object.data["id"]))
+ url = "/objects/#{uuid}"
- conn
- |> get("/objects/#{uuid}")
- |> response(404)
- end
+ conn =
+ conn
+ |> put_req_header("accept", "text/html")
+ |> get(url)
- test "404s on nonexisting objects", %{conn: conn} do
- conn
- |> get("/objects/123")
- |> response(404)
- end
+ assert redirected_to(conn) == "/notice/#{note_activity.id}"
+ end
- test "gets an activity in xml format", %{conn: conn} do
- note_activity = insert(:note_activity)
- [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"]))
+ test "500s when user not found", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ object = Object.normalize(note_activity)
+ user = User.get_cached_by_ap_id(note_activity.data["actor"])
+ User.invalidate_cache(user)
+ Pleroma.Repo.delete(user)
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, object.data["id"]))
+ url = "/objects/#{uuid}"
- conn
- |> put_req_header("accept", "application/xml")
- |> get("/activities/#{uuid}")
- |> response(200)
- end
+ conn =
+ conn
+ |> put_req_header("accept", "application/xml")
+ |> get(url)
- test "404s on deleted objects", %{conn: conn} do
- note_activity = insert(:note_activity)
- [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["object"]["id"]))
- object = Object.get_by_ap_id(note_activity.data["object"]["id"])
+ assert response(conn, 500) == ~S({"error":"Something went wrong"})
+ end
- conn
- |> put_req_header("accept", "application/xml")
- |> get("/objects/#{uuid}")
- |> response(200)
+ test "404s on private objects", %{conn: conn} do
+ note_activity = insert(:direct_note_activity)
+ object = Object.normalize(note_activity)
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, object.data["id"]))
- Object.delete(object)
+ conn
+ |> get("/objects/#{uuid}")
+ |> response(404)
+ end
- conn
- |> put_req_header("accept", "application/xml")
- |> get("/objects/#{uuid}")
- |> response(404)
+ test "404s on nonexisting objects", %{conn: conn} do
+ conn
+ |> get("/objects/123")
+ |> response(404)
+ end
end
- test "404s on private activities", %{conn: conn} do
- note_activity = insert(:direct_note_activity)
- [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"]))
+ describe "GET activity/2" do
+ test "gets an activity in xml format", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"]))
- conn
- |> get("/activities/#{uuid}")
- |> response(404)
- end
+ conn
+ |> put_req_header("accept", "application/xml")
+ |> get("/activities/#{uuid}")
+ |> response(200)
+ end
- test "404s on nonexistent activities", %{conn: conn} do
- conn
- |> get("/activities/123")
- |> response(404)
- end
+ test "redirects to /notice/id for html format", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"]))
- test "gets a notice in xml format", %{conn: conn} do
- note_activity = insert(:note_activity)
+ conn =
+ conn
+ |> put_req_header("accept", "text/html")
+ |> get("/activities/#{uuid}")
- conn
- |> get("/notice/#{note_activity.id}")
- |> response(200)
- end
+ assert redirected_to(conn) == "/notice/#{note_activity.id}"
+ end
- test "gets a notice in AS2 format", %{conn: conn} do
- note_activity = insert(:note_activity)
+ test "505s when user not found", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"]))
+ user = User.get_cached_by_ap_id(note_activity.data["actor"])
+ User.invalidate_cache(user)
+ Pleroma.Repo.delete(user)
- conn
- |> put_req_header("accept", "application/activity+json")
- |> get("/notice/#{note_activity.id}")
- |> json_response(200)
- end
+ conn =
+ conn
+ |> put_req_header("accept", "text/html")
+ |> get("/activities/#{uuid}")
- test "only gets a notice in AS2 format for Create messages", %{conn: conn} do
- note_activity = insert(:note_activity)
- url = "/notice/#{note_activity.id}"
+ assert response(conn, 500) == ~S({"error":"Something went wrong"})
+ end
+
+ test "404s on deleted objects", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ object = Object.normalize(note_activity)
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, object.data["id"]))
- conn =
conn
- |> put_req_header("accept", "application/activity+json")
- |> get(url)
+ |> put_req_header("accept", "application/xml")
+ |> get("/objects/#{uuid}")
+ |> response(200)
- assert json_response(conn, 200)
+ Object.delete(object)
- user = insert(:user)
+ conn
+ |> put_req_header("accept", "application/xml")
+ |> get("/objects/#{uuid}")
+ |> response(404)
+ end
- {:ok, like_activity, _} = CommonAPI.favorite(note_activity.id, user)
- url = "/notice/#{like_activity.id}"
+ test "404s on private activities", %{conn: conn} do
+ note_activity = insert(:direct_note_activity)
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"]))
- assert like_activity.data["type"] == "Like"
+ conn
+ |> get("/activities/#{uuid}")
+ |> response(404)
+ end
- conn =
- build_conn()
- |> put_req_header("accept", "application/activity+json")
- |> get(url)
+ test "404s on nonexistent activities", %{conn: conn} do
+ conn
+ |> get("/activities/123")
+ |> response(404)
+ end
- assert response(conn, 404)
+ test "gets an activity in AS2 format", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"]))
+ url = "/activities/#{uuid}"
+
+ conn =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get(url)
+
+ assert json_response(conn, 200)
+ end
end
- test "gets an activity in AS2 format", %{conn: conn} do
- note_activity = insert(:note_activity)
- [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"]))
- url = "/activities/#{uuid}"
+ describe "GET notice/2" do
+ test "gets a notice in xml format", %{conn: conn} do
+ note_activity = insert(:note_activity)
+
+ conn
+ |> get("/notice/#{note_activity.id}")
+ |> response(200)
+ end
+
+ test "gets a notice in AS2 format", %{conn: conn} do
+ note_activity = insert(:note_activity)
- conn =
conn
|> put_req_header("accept", "application/activity+json")
- |> get(url)
+ |> get("/notice/#{note_activity.id}")
+ |> json_response(200)
+ end
+
+ test "500s when actor not found", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ user = User.get_cached_by_ap_id(note_activity.data["actor"])
+ User.invalidate_cache(user)
+ Pleroma.Repo.delete(user)
+
+ conn =
+ conn
+ |> get("/notice/#{note_activity.id}")
+
+ assert response(conn, 500) == ~S({"error":"Something went wrong"})
+ end
+
+ test "only gets a notice in AS2 format for Create messages", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ url = "/notice/#{note_activity.id}"
+
+ conn =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get(url)
- assert json_response(conn, 200)
+ assert json_response(conn, 200)
+
+ user = insert(:user)
+
+ {:ok, like_activity, _} = CommonAPI.favorite(note_activity.id, user)
+ url = "/notice/#{like_activity.id}"
+
+ assert like_activity.data["type"] == "Like"
+
+ conn =
+ build_conn()
+ |> put_req_header("accept", "application/activity+json")
+ |> get(url)
+
+ assert response(conn, 404)
+ end
+
+ test "render html for redirect for html format", %{conn: conn} do
+ note_activity = insert(:note_activity)
+
+ resp =
+ conn
+ |> put_req_header("accept", "text/html")
+ |> get("/notice/#{note_activity.id}")
+ |> response(200)
+
+ assert resp =~
+ "<meta content=\"#{Pleroma.Web.base_url()}/notice/#{note_activity.id}\" property=\"og:url\">"
+
+ user = insert(:user)
+
+ {:ok, like_activity, _} = CommonAPI.favorite(note_activity.id, user)
+
+ assert like_activity.data["type"] == "Like"
+
+ resp =
+ conn
+ |> put_req_header("accept", "text/html")
+ |> get("/notice/#{like_activity.id}")
+ |> response(200)
+
+ assert resp =~ "<!--server-generated-meta-->"
+ end
+
+ test "404s a private notice", %{conn: conn} do
+ note_activity = insert(:direct_note_activity)
+ url = "/notice/#{note_activity.id}"
+
+ conn =
+ conn
+ |> get(url)
+
+ assert response(conn, 404)
+ end
+
+ test "404s a nonexisting notice", %{conn: conn} do
+ url = "/notice/123"
+
+ conn =
+ conn
+ |> get(url)
+
+ assert response(conn, 404)
+ end
end
- test "404s a private notice", %{conn: conn} do
- note_activity = insert(:direct_note_activity)
- url = "/notice/#{note_activity.id}"
+ describe "feed_redirect" do
+ test "undefined format. it redirects to feed", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ user = User.get_cached_by_ap_id(note_activity.data["actor"])
- conn =
- conn
- |> get(url)
+ response =
+ conn
+ |> put_req_header("accept", "application/xml")
+ |> get("/users/#{user.nickname}")
+ |> response(302)
+
+ assert response ==
+ "<html><body>You are being <a href=\"#{Pleroma.Web.base_url()}/users/#{
+ user.nickname
+ }/feed.atom\">redirected</a>.</body></html>"
+ end
- assert response(conn, 404)
+ test "undefined format. it returns error when user not found", %{conn: conn} do
+ response =
+ conn
+ |> put_req_header("accept", "application/xml")
+ |> get("/users/jimm")
+ |> response(404)
+
+ assert response == ~S({"error":"Not found"})
+ end
+
+ test "activity+json format. it redirects on actual feed of user", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ user = User.get_cached_by_ap_id(note_activity.data["actor"])
+
+ response =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/users/#{user.nickname}")
+ |> json_response(200)
+
+ assert response["endpoints"] == %{
+ "oauthAuthorizationEndpoint" => "#{Pleroma.Web.base_url()}/oauth/authorize",
+ "oauthRegistrationEndpoint" => "#{Pleroma.Web.base_url()}/api/v1/apps",
+ "oauthTokenEndpoint" => "#{Pleroma.Web.base_url()}/oauth/token",
+ "sharedInbox" => "#{Pleroma.Web.base_url()}/inbox"
+ }
+
+ assert response["@context"] == [
+ "https://www.w3.org/ns/activitystreams",
+ "http://localhost:4001/schemas/litepub-0.1.jsonld",
+ %{"@language" => "und"}
+ ]
+
+ assert Map.take(response, [
+ "followers",
+ "following",
+ "id",
+ "inbox",
+ "manuallyApprovesFollowers",
+ "name",
+ "outbox",
+ "preferredUsername",
+ "summary",
+ "tag",
+ "type",
+ "url"
+ ]) == %{
+ "followers" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/followers",
+ "following" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/following",
+ "id" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}",
+ "inbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/inbox",
+ "manuallyApprovesFollowers" => false,
+ "name" => user.name,
+ "outbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/outbox",
+ "preferredUsername" => user.nickname,
+ "summary" => user.bio,
+ "tag" => [],
+ "type" => "Person",
+ "url" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}"
+ }
+ end
+
+ test "activity+json format. it returns error whe use not found", %{conn: conn} do
+ response =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/users/jimm")
+ |> json_response(404)
+
+ assert response == "Not found"
+ end
+
+ test "json format. it redirects on actual feed of user", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ user = User.get_cached_by_ap_id(note_activity.data["actor"])
+
+ response =
+ conn
+ |> put_req_header("accept", "application/json")
+ |> get("/users/#{user.nickname}")
+ |> json_response(200)
+
+ assert response["endpoints"] == %{
+ "oauthAuthorizationEndpoint" => "#{Pleroma.Web.base_url()}/oauth/authorize",
+ "oauthRegistrationEndpoint" => "#{Pleroma.Web.base_url()}/api/v1/apps",
+ "oauthTokenEndpoint" => "#{Pleroma.Web.base_url()}/oauth/token",
+ "sharedInbox" => "#{Pleroma.Web.base_url()}/inbox"
+ }
+
+ assert response["@context"] == [
+ "https://www.w3.org/ns/activitystreams",
+ "http://localhost:4001/schemas/litepub-0.1.jsonld",
+ %{"@language" => "und"}
+ ]
+
+ assert Map.take(response, [
+ "followers",
+ "following",
+ "id",
+ "inbox",
+ "manuallyApprovesFollowers",
+ "name",
+ "outbox",
+ "preferredUsername",
+ "summary",
+ "tag",
+ "type",
+ "url"
+ ]) == %{
+ "followers" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/followers",
+ "following" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/following",
+ "id" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}",
+ "inbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/inbox",
+ "manuallyApprovesFollowers" => false,
+ "name" => user.name,
+ "outbox" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}/outbox",
+ "preferredUsername" => user.nickname,
+ "summary" => user.bio,
+ "tag" => [],
+ "type" => "Person",
+ "url" => "#{Pleroma.Web.base_url()}/users/#{user.nickname}"
+ }
+ end
+
+ test "json format. it returns error whe use not found", %{conn: conn} do
+ response =
+ conn
+ |> put_req_header("accept", "application/json")
+ |> get("/users/jimm")
+ |> json_response(404)
+
+ assert response == "Not found"
+ end
+
+ test "html format. it redirects on actual feed of user", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ user = User.get_cached_by_ap_id(note_activity.data["actor"])
+
+ response =
+ conn
+ |> get("/users/#{user.nickname}")
+ |> response(200)
+
+ assert response ==
+ Fallback.RedirectController.redirector_with_meta(
+ conn,
+ %{user: user}
+ ).resp_body
+ end
+
+ test "html format. it returns error when user not found", %{conn: conn} do
+ response =
+ conn
+ |> get("/users/jimm")
+ |> json_response(404)
+
+ assert response == %{"error" => "Not found"}
+ end
end
- test "404s a nonexisting notice", %{conn: conn} do
- url = "/notice/123"
+ describe "GET /notice/:id/embed_player" do
+ test "render embed player", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ object = Pleroma.Object.normalize(note_activity)
+
+ object_data =
+ Map.put(object.data, "attachment", [
+ %{
+ "url" => [
+ %{
+ "href" =>
+ "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4",
+ "mediaType" => "video/mp4",
+ "type" => "Link"
+ }
+ ]
+ }
+ ])
+
+ object
+ |> Ecto.Changeset.change(data: object_data)
+ |> Pleroma.Repo.update()
- conn =
- conn
- |> get(url)
+ conn =
+ conn
+ |> get("/notice/#{note_activity.id}/embed_player")
- assert response(conn, 404)
+ assert Plug.Conn.get_resp_header(conn, "x-frame-options") == ["ALLOW"]
+
+ assert Plug.Conn.get_resp_header(
+ conn,
+ "content-security-policy"
+ ) == [
+ "default-src 'none';style-src 'self' 'unsafe-inline';img-src 'self' data: https:; media-src 'self' https:;"
+ ]
+
+ assert response(conn, 200) =~
+ "<video controls loop><source src=\"https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4\" type=\"video/mp4\">Your browser does not support video/mp4 playback.</video>"
+ end
+
+ test "404s when activity isn't create", %{conn: conn} do
+ note_activity = insert(:note_activity, data_attrs: %{"type" => "Like"})
+
+ assert conn
+ |> get("/notice/#{note_activity.id}/embed_player")
+ |> response(404)
+ end
+
+ test "404s when activity is direct message", %{conn: conn} do
+ note_activity = insert(:note_activity, data_attrs: %{"directMessage" => true})
+
+ assert conn
+ |> get("/notice/#{note_activity.id}/embed_player")
+ |> response(404)
+ end
+
+ test "404s when attachment is empty", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ object = Pleroma.Object.normalize(note_activity)
+ object_data = Map.put(object.data, "attachment", [])
+
+ object
+ |> Ecto.Changeset.change(data: object_data)
+ |> Pleroma.Repo.update()
+
+ assert conn
+ |> get("/notice/#{note_activity.id}/embed_player")
+ |> response(404)
+ end
+
+ test "404s when attachment isn't audio or video", %{conn: conn} do
+ note_activity = insert(:note_activity)
+ object = Pleroma.Object.normalize(note_activity)
+
+ object_data =
+ Map.put(object.data, "attachment", [
+ %{
+ "url" => [
+ %{
+ "href" => "https://peertube.moe/static/webseed/480.jpg",
+ "mediaType" => "image/jpg",
+ "type" => "Link"
+ }
+ ]
+ }
+ ])
+
+ object
+ |> Ecto.Changeset.change(data: object_data)
+ |> Pleroma.Repo.update()
+
+ assert conn
+ |> get("/notice/#{note_activity.id}/embed_player")
+ |> response(404)
+ end
end
end
diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs
index f6be16862..803a97695 100644
--- a/test/web/ostatus/ostatus_test.exs
+++ b/test/web/ostatus/ostatus_test.exs
@@ -11,8 +11,10 @@ defmodule Pleroma.Web.OStatusTest do
alias Pleroma.User
alias Pleroma.Web.OStatus
alias Pleroma.Web.XML
- import Pleroma.Factory
+
import ExUnit.CaptureLog
+ import Mock
+ import Pleroma.Factory
setup_all do
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
@@ -28,7 +30,7 @@ defmodule Pleroma.Web.OStatusTest do
test "handle incoming note - GS, Salmon" do
incoming = File.read!("test/fixtures/incoming_note_activity.xml")
{:ok, [activity]} = OStatus.handle_incoming(incoming)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
user = User.get_cached_by_ap_id(activity.data["actor"])
assert user.info.note_count == 1
@@ -51,7 +53,7 @@ defmodule Pleroma.Web.OStatusTest do
test "handle incoming notes - GS, subscription" do
incoming = File.read!("test/fixtures/ostatus_incoming_post.xml")
{:ok, [activity]} = OStatus.handle_incoming(incoming)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
assert activity.data["type"] == "Create"
assert object.data["type"] == "Note"
@@ -65,7 +67,7 @@ defmodule Pleroma.Web.OStatusTest do
test "handle incoming notes with attachments - GS, subscription" do
incoming = File.read!("test/fixtures/incoming_websub_gnusocial_attachments.xml")
{:ok, [activity]} = OStatus.handle_incoming(incoming)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
assert activity.data["type"] == "Create"
assert object.data["type"] == "Note"
@@ -78,7 +80,7 @@ defmodule Pleroma.Web.OStatusTest do
test "handle incoming notes with tags" do
incoming = File.read!("test/fixtures/ostatus_incoming_post_tag.xml")
{:ok, [activity]} = OStatus.handle_incoming(incoming)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
assert object.data["tag"] == ["nsfw"]
assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]
@@ -95,7 +97,7 @@ defmodule Pleroma.Web.OStatusTest do
incoming = File.read!("test/fixtures/incoming_reply_mastodon.xml")
{:ok, [activity]} = OStatus.handle_incoming(incoming)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
assert activity.data["type"] == "Create"
assert object.data["type"] == "Note"
@@ -107,7 +109,7 @@ defmodule Pleroma.Web.OStatusTest do
test "handle incoming notes - Mastodon, with CW" do
incoming = File.read!("test/fixtures/mastodon-note-cw.xml")
{:ok, [activity]} = OStatus.handle_incoming(incoming)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
assert activity.data["type"] == "Create"
assert object.data["type"] == "Note"
@@ -119,7 +121,7 @@ defmodule Pleroma.Web.OStatusTest do
test "handle incoming unlisted messages, put public into cc" do
incoming = File.read!("test/fixtures/mastodon-note-unlisted.xml")
{:ok, [activity]} = OStatus.handle_incoming(incoming)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
refute "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]
assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["cc"]
@@ -130,7 +132,7 @@ defmodule Pleroma.Web.OStatusTest do
test "handle incoming retweets - Mastodon, with CW" do
incoming = File.read!("test/fixtures/cw_retweet.xml")
{:ok, [[_activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)
- retweeted_object = Object.normalize(retweeted_activity.data["object"])
+ retweeted_object = Object.normalize(retweeted_activity)
assert retweeted_object.data["summary"] == "Hey."
end
@@ -138,7 +140,7 @@ defmodule Pleroma.Web.OStatusTest do
test "handle incoming notes - GS, subscription, reply" do
incoming = File.read!("test/fixtures/ostatus_incoming_reply.xml")
{:ok, [activity]} = OStatus.handle_incoming(incoming)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
assert activity.data["type"] == "Create"
assert object.data["type"] == "Note"
@@ -164,7 +166,7 @@ defmodule Pleroma.Web.OStatusTest do
refute activity.local
retweeted_activity = Activity.get_by_id(retweeted_activity.id)
- retweeted_object = Object.normalize(retweeted_activity.data["object"])
+ retweeted_object = Object.normalize(retweeted_activity)
assert retweeted_activity.data["type"] == "Create"
assert retweeted_activity.data["actor"] == "https://pleroma.soykaf.com/users/lain"
refute retweeted_activity.local
@@ -176,18 +178,19 @@ defmodule Pleroma.Web.OStatusTest do
test "handle incoming retweets - GS, subscription - local message" do
incoming = File.read!("test/fixtures/share-gs-local.xml")
note_activity = insert(:note_activity)
+ object = Object.normalize(note_activity)
user = User.get_cached_by_ap_id(note_activity.data["actor"])
incoming =
incoming
- |> String.replace("LOCAL_ID", note_activity.data["object"]["id"])
+ |> String.replace("LOCAL_ID", object.data["id"])
|> String.replace("LOCAL_USER", user.ap_id)
{:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)
assert activity.data["type"] == "Announce"
assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
- assert activity.data["object"] == retweeted_activity.data["object"]["id"]
+ assert activity.data["object"] == object.data["id"]
assert user.ap_id in activity.data["to"]
refute activity.local
@@ -196,13 +199,13 @@ defmodule Pleroma.Web.OStatusTest do
assert retweeted_activity.data["type"] == "Create"
assert retweeted_activity.data["actor"] == user.ap_id
assert retweeted_activity.local
- assert retweeted_activity.data["object"]["announcement_count"] == 1
+ assert Object.normalize(retweeted_activity).data["announcement_count"] == 1
end
test "handle incoming retweets - Mastodon, salmon" do
incoming = File.read!("test/fixtures/share.xml")
{:ok, [[activity, retweeted_activity]]} = OStatus.handle_incoming(incoming)
- retweeted_object = Object.normalize(retweeted_activity.data["object"])
+ retweeted_object = Object.normalize(retweeted_activity)
assert activity.data["type"] == "Announce"
assert activity.data["actor"] == "https://mastodon.social/users/lambadalambda"
@@ -251,25 +254,29 @@ defmodule Pleroma.Web.OStatusTest do
test "handle incoming favorites with locally available object - GS, websub" do
note_activity = insert(:note_activity)
+ object = Object.normalize(note_activity)
incoming =
File.read!("test/fixtures/favorite_with_local_note.xml")
- |> String.replace("localid", note_activity.data["object"]["id"])
+ |> String.replace("localid", object.data["id"])
{:ok, [[activity, favorited_activity]]} = OStatus.handle_incoming(incoming)
assert activity.data["type"] == "Like"
assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
- assert activity.data["object"] == favorited_activity.data["object"]["id"]
+ assert activity.data["object"] == object.data["id"]
refute activity.local
assert note_activity.id == favorited_activity.id
assert favorited_activity.local
end
- test "handle incoming replies" do
+ test_with_mock "handle incoming replies, fetching replied-to activities if we don't have them",
+ OStatus,
+ [:passthrough],
+ [] do
incoming = File.read!("test/fixtures/incoming_note_activity_answer.xml")
{:ok, [activity]} = OStatus.handle_incoming(incoming)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity, false)
assert activity.data["type"] == "Create"
assert object.data["type"] == "Note"
@@ -282,6 +289,23 @@ defmodule Pleroma.Web.OStatusTest do
assert object.data["id"] == "tag:gs.example.org:4040,2017-04-25:noticeId=55:objectType=note"
assert "https://www.w3.org/ns/activitystreams#Public" in activity.data["to"]
+
+ assert called(OStatus.fetch_activity_from_url(object.data["inReplyTo"], :_))
+ end
+
+ test_with_mock "handle incoming replies, not fetching replied-to activities beyond max_replies_depth",
+ OStatus,
+ [:passthrough],
+ [] do
+ incoming = File.read!("test/fixtures/incoming_note_activity_answer.xml")
+
+ with_mock Pleroma.Web.Federator,
+ allowed_incoming_reply_depth?: fn _ -> false end do
+ {:ok, [activity]} = OStatus.handle_incoming(incoming)
+ object = Object.normalize(activity, false)
+
+ refute called(OStatus.fetch_activity_from_url(object.data["inReplyTo"], :_))
+ end
end
test "handle incoming follows" do
@@ -302,6 +326,14 @@ defmodule Pleroma.Web.OStatusTest do
assert User.following?(follower, followed)
end
+ test "refuse following over OStatus if the followed's account is locked" do
+ incoming = File.read!("test/fixtures/follow.xml")
+ _user = insert(:user, info: %{locked: true}, ap_id: "https://pawoo.net/users/pekorino")
+
+ {:ok, [{:error, "It's not possible to follow locked accounts over OStatus"}]} =
+ OStatus.handle_incoming(incoming)
+ end
+
test "handle incoming unfollows with existing follow" do
incoming_follow = File.read!("test/fixtures/follow.xml")
{:ok, [_activity]} = OStatus.handle_incoming(incoming_follow)
@@ -315,13 +347,14 @@ defmodule Pleroma.Web.OStatusTest do
"undo:tag:social.heldscal.la,2017-05-07:subscription:23211:person:44803:2017-05-07T09:54:48+00:00"
assert activity.data["actor"] == "https://social.heldscal.la/user/23211"
- assert is_map(activity.data["object"])
- assert activity.data["object"]["type"] == "Follow"
- assert activity.data["object"]["object"] == "https://pawoo.net/users/pekorino"
+ embedded_object = activity.data["object"]
+ assert is_map(embedded_object)
+ assert embedded_object["type"] == "Follow"
+ assert embedded_object["object"] == "https://pawoo.net/users/pekorino"
refute activity.local
follower = User.get_cached_by_ap_id(activity.data["actor"])
- followed = User.get_cached_by_ap_id(activity.data["object"]["object"])
+ followed = User.get_cached_by_ap_id(embedded_object["object"])
refute User.following?(follower, followed)
end
@@ -401,7 +434,7 @@ defmodule Pleroma.Web.OStatusTest do
}
end
- test "find_make_or_update_user takes an author element and returns an updated user" do
+ test "find_make_or_update_actor takes an author element and returns an updated user" do
uri = "https://social.heldscal.la/user/23211"
{:ok, user} = OStatus.find_or_make_user(uri)
@@ -414,14 +447,56 @@ defmodule Pleroma.Web.OStatusTest do
doc = XML.parse_document(File.read!("test/fixtures/23211.atom"))
[author] = :xmerl_xpath.string('//author[1]', doc)
- {:ok, user} = OStatus.find_make_or_update_user(author)
+ {:ok, user} = OStatus.find_make_or_update_actor(author)
assert user.avatar["type"] == "Image"
assert user.name == old_name
assert user.bio == old_bio
- {:ok, user_again} = OStatus.find_make_or_update_user(author)
+ {:ok, user_again} = OStatus.find_make_or_update_actor(author)
assert user_again == user
end
+
+ test "find_or_make_user disallows protocol downgrade" do
+ user = insert(:user, %{local: true})
+ {:ok, user} = OStatus.find_or_make_user(user.ap_id)
+
+ assert User.ap_enabled?(user)
+
+ user =
+ insert(:user, %{
+ ap_id: "https://social.heldscal.la/user/23211",
+ info: %{ap_enabled: true},
+ local: false
+ })
+
+ assert User.ap_enabled?(user)
+
+ {:ok, user} = OStatus.find_or_make_user(user.ap_id)
+ assert User.ap_enabled?(user)
+ end
+
+ test "find_make_or_update_actor disallows protocol downgrade" do
+ user = insert(:user, %{local: true})
+ {:ok, user} = OStatus.find_or_make_user(user.ap_id)
+
+ assert User.ap_enabled?(user)
+
+ user =
+ insert(:user, %{
+ ap_id: "https://social.heldscal.la/user/23211",
+ info: %{ap_enabled: true},
+ local: false
+ })
+
+ assert User.ap_enabled?(user)
+
+ {:ok, user} = OStatus.find_or_make_user(user.ap_id)
+ assert User.ap_enabled?(user)
+
+ doc = XML.parse_document(File.read!("test/fixtures/23211.atom"))
+ [author] = :xmerl_xpath.string('//author[1]', doc)
+ {:error, :invalid_protocol} = OStatus.find_make_or_update_actor(author)
+ end
end
describe "gathering user info from a user id" do
@@ -538,8 +613,7 @@ defmodule Pleroma.Web.OStatusTest do
test "Article objects are not representable" do
note_activity = insert(:note_activity)
-
- note_object = Object.normalize(note_activity.data["object"])
+ note_object = Object.normalize(note_activity)
note_data =
note_object.data
diff --git a/test/web/pleroma_api/pleroma_api_controller_test.exs b/test/web/pleroma_api/pleroma_api_controller_test.exs
new file mode 100644
index 000000000..ed6b79727
--- /dev/null
+++ b/test/web/pleroma_api/pleroma_api_controller_test.exs
@@ -0,0 +1,94 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do
+ use Pleroma.Web.ConnCase
+
+ alias Pleroma.Conversation.Participation
+ alias Pleroma.Repo
+ alias Pleroma.Web.CommonAPI
+
+ import Pleroma.Factory
+
+ test "/api/v1/pleroma/conversations/:id", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, _activity} =
+ CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}!", "visibility" => "direct"})
+
+ [participation] = Participation.for_user(other_user)
+
+ result =
+ conn
+ |> assign(:user, other_user)
+ |> get("/api/v1/pleroma/conversations/#{participation.id}")
+ |> json_response(200)
+
+ assert result["id"] == participation.id |> to_string()
+ end
+
+ test "/api/v1/pleroma/conversations/:id/statuses", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+ third_user = insert(:user)
+
+ {:ok, _activity} =
+ CommonAPI.post(user, %{"status" => "Hi @#{third_user.nickname}!", "visibility" => "direct"})
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{"status" => "Hi @#{other_user.nickname}!", "visibility" => "direct"})
+
+ [participation] = Participation.for_user(other_user)
+
+ {:ok, activity_two} =
+ CommonAPI.post(other_user, %{
+ "status" => "Hi!",
+ "in_reply_to_status_id" => activity.id,
+ "in_reply_to_conversation_id" => participation.id
+ })
+
+ result =
+ conn
+ |> assign(:user, other_user)
+ |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses")
+ |> json_response(200)
+
+ assert length(result) == 2
+
+ id_one = activity.id
+ id_two = activity_two.id
+ assert [%{"id" => ^id_one}, %{"id" => ^id_two}] = result
+ end
+
+ test "PATCH /api/v1/pleroma/conversations/:id", %{conn: conn} do
+ user = insert(:user)
+ other_user = insert(:user)
+
+ {:ok, _activity} = CommonAPI.post(user, %{"status" => "Hi", "visibility" => "direct"})
+
+ [participation] = Participation.for_user(user)
+
+ participation = Repo.preload(participation, :recipients)
+
+ assert [user] == participation.recipients
+ assert other_user not in participation.recipients
+
+ result =
+ conn
+ |> assign(:user, user)
+ |> patch("/api/v1/pleroma/conversations/#{participation.id}", %{
+ "recipients" => [user.id, other_user.id]
+ })
+ |> json_response(200)
+
+ assert result["id"] == participation.id |> to_string
+
+ [participation] = Participation.for_user(user)
+ participation = Repo.preload(participation, :recipients)
+
+ assert user in participation.recipients
+ assert other_user in participation.recipients
+ end
+end
diff --git a/test/web/plugs/federating_plug_test.exs b/test/web/plugs/federating_plug_test.exs
index 530562325..bb2e1687a 100644
--- a/test/web/plugs/federating_plug_test.exs
+++ b/test/web/plugs/federating_plug_test.exs
@@ -4,6 +4,7 @@
defmodule Pleroma.Web.FederatingPlugTest do
use Pleroma.Web.ConnCase
+ clear_config_all([:instance, :federating])
test "returns and halt the conn when federating is disabled" do
Pleroma.Config.put([:instance, :federating], false)
@@ -14,11 +15,11 @@ defmodule Pleroma.Web.FederatingPlugTest do
assert conn.status == 404
assert conn.halted
-
- Pleroma.Config.put([:instance, :federating], true)
end
test "does nothing when federating is enabled" do
+ Pleroma.Config.put([:instance, :federating], true)
+
conn =
build_conn()
|> Pleroma.Web.FederatingPlug.call(%{})
diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs
index 1e948086a..e2f89f40a 100644
--- a/test/web/push/impl_test.exs
+++ b/test/web/push/impl_test.exs
@@ -124,8 +124,7 @@ defmodule Pleroma.Web.Push.ImplTest do
{:ok, _, _, activity} = CommonAPI.follow(user, other_user)
object = Object.normalize(activity)
- assert Impl.format_body(%{activity: activity}, user, object) ==
- "@Bob has followed you"
+ assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has followed you"
end
test "renders body for announce activity" do
@@ -156,7 +155,6 @@ defmodule Pleroma.Web.Push.ImplTest do
{:ok, activity, _} = CommonAPI.favorite(activity.id, user)
object = Object.normalize(activity)
- assert Impl.format_body(%{activity: activity}, user, object) ==
- "@Bob has favorited your post"
+ assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has favorited your post"
end
end
diff --git a/test/web/rel_me_test.exs b/test/web/rel_me_test.exs
index 5188f4de1..85515c432 100644
--- a/test/web/rel_me_test.exs
+++ b/test/web/rel_me_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.RelMeTest do
use ExUnit.Case, async: true
diff --git a/test/web/rich_media/aws_signed_url_test.exs b/test/web/rich_media/aws_signed_url_test.exs
new file mode 100644
index 000000000..a3a50cbb1
--- /dev/null
+++ b/test/web/rich_media/aws_signed_url_test.exs
@@ -0,0 +1,82 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.RichMedia.TTL.AwsSignedUrlTest do
+ use ExUnit.Case, async: true
+
+ test "s3 signed url is parsed correct for expiration time" do
+ url = "https://pleroma.social/amz"
+
+ {:ok, timestamp} =
+ Timex.now()
+ |> DateTime.truncate(:second)
+ |> Timex.format("{ISO:Basic:Z}")
+
+ # in seconds
+ valid_till = 30
+
+ metadata = construct_metadata(timestamp, valid_till, url)
+
+ expire_time =
+ Timex.parse!(timestamp, "{ISO:Basic:Z}") |> Timex.to_unix() |> Kernel.+(valid_till)
+
+ assert expire_time == Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl.ttl(metadata, url)
+ end
+
+ test "s3 signed url is parsed and correct ttl is set for rich media" do
+ url = "https://pleroma.social/amz"
+
+ {:ok, timestamp} =
+ Timex.now()
+ |> DateTime.truncate(:second)
+ |> Timex.format("{ISO:Basic:Z}")
+
+ # in seconds
+ valid_till = 30
+
+ metadata = construct_metadata(timestamp, valid_till, url)
+
+ body = """
+ <meta name="twitter:card" content="Pleroma" />
+ <meta name="twitter:site" content="Pleroma" />
+ <meta name="twitter:title" content="Pleroma" />
+ <meta name="twitter:description" content="Pleroma" />
+ <meta name="twitter:image" content="#{Map.get(metadata, :image)}" />
+ """
+
+ Tesla.Mock.mock(fn
+ %{
+ method: :get,
+ url: "https://pleroma.social/amz"
+ } ->
+ %Tesla.Env{status: 200, body: body}
+ end)
+
+ Cachex.put(:rich_media_cache, url, metadata)
+
+ Pleroma.Web.RichMedia.Parser.set_ttl_based_on_image({:ok, metadata}, url)
+
+ {:ok, cache_ttl} = Cachex.ttl(:rich_media_cache, url)
+
+ # as there is delay in setting and pulling the data from cache we ignore 1 second
+ # make it 2 seconds for flakyness
+ assert_in_delta(valid_till * 1000, cache_ttl, 2000)
+ end
+
+ defp construct_s3_url(timestamp, valid_till) do
+ "https://pleroma.s3.ap-southeast-1.amazonaws.com/sachin%20%281%29%20_a%20-%25%2Aasdasd%20BNN%20bnnn%20.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIBLWWK6RGDQXDLJQ%2F20190716%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=#{
+ timestamp
+ }&X-Amz-Expires=#{valid_till}&X-Amz-Signature=04ffd6b98634f4b1bbabc62e0fac4879093cd54a6eed24fe8eb38e8369526bbf&X-Amz-SignedHeaders=host"
+ end
+
+ defp construct_metadata(timestamp, valid_till, url) do
+ %{
+ image: construct_s3_url(timestamp, valid_till),
+ site: "Pleroma",
+ title: "Pleroma",
+ description: "Pleroma",
+ url: url
+ }
+ end
+end
diff --git a/test/web/rich_media/helpers_test.exs b/test/web/rich_media/helpers_test.exs
index 53b0596f5..48884319d 100644
--- a/test/web/rich_media/helpers_test.exs
+++ b/test/web/rich_media/helpers_test.exs
@@ -1,17 +1,26 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.RichMedia.HelpersTest do
use Pleroma.DataCase
+ alias Pleroma.Config
alias Pleroma.Object
alias Pleroma.Web.CommonAPI
+ alias Pleroma.Web.RichMedia.Helpers
import Pleroma.Factory
import Tesla.Mock
setup do
mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+
:ok
end
+ clear_config([:rich_media, :enabled])
+
test "refuses to crawl incomplete URLs" do
user = insert(:user)
@@ -21,11 +30,9 @@ defmodule Pleroma.Web.RichMedia.HelpersTest do
"content_type" => "text/markdown"
})
- Pleroma.Config.put([:rich_media, :enabled], true)
+ Config.put([:rich_media, :enabled], true)
assert %{} == Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
-
- Pleroma.Config.put([:rich_media, :enabled], false)
end
test "refuses to crawl malformed URLs" do
@@ -37,11 +44,9 @@ defmodule Pleroma.Web.RichMedia.HelpersTest do
"content_type" => "text/markdown"
})
- Pleroma.Config.put([:rich_media, :enabled], true)
+ Config.put([:rich_media, :enabled], true)
assert %{} == Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
-
- Pleroma.Config.put([:rich_media, :enabled], false)
end
test "crawls valid, complete URLs" do
@@ -49,16 +54,14 @@ defmodule Pleroma.Web.RichMedia.HelpersTest do
{:ok, activity} =
CommonAPI.post(user, %{
- "status" => "[test](http://example.com/ogp)",
+ "status" => "[test](https://example.com/ogp)",
"content_type" => "text/markdown"
})
- Pleroma.Config.put([:rich_media, :enabled], true)
+ Config.put([:rich_media, :enabled], true)
- assert %{page_url: "http://example.com/ogp", rich_media: _} =
+ assert %{page_url: "https://example.com/ogp", rich_media: _} =
Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
-
- Pleroma.Config.put([:rich_media, :enabled], false)
end
test "refuses to crawl URLs from posts marked sensitive" do
@@ -74,11 +77,9 @@ defmodule Pleroma.Web.RichMedia.HelpersTest do
assert object.data["sensitive"]
- Pleroma.Config.put([:rich_media, :enabled], true)
+ Config.put([:rich_media, :enabled], true)
assert %{} = Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
-
- Pleroma.Config.put([:rich_media, :enabled], false)
end
test "refuses to crawl URLs from posts tagged NSFW" do
@@ -93,10 +94,28 @@ defmodule Pleroma.Web.RichMedia.HelpersTest do
assert object.data["sensitive"]
- Pleroma.Config.put([:rich_media, :enabled], true)
+ Config.put([:rich_media, :enabled], true)
assert %{} = Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
+ end
+
+ test "refuses to crawl URLs of private network from posts" do
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{"status" => "http://127.0.0.1:4000/notice/9kCP7VNyPJXFOXDrgO"})
+
+ {:ok, activity2} = CommonAPI.post(user, %{"status" => "https://10.111.10.1/notice/9kCP7V"})
+ {:ok, activity3} = CommonAPI.post(user, %{"status" => "https://172.16.32.40/notice/9kCP7V"})
+ {:ok, activity4} = CommonAPI.post(user, %{"status" => "https://192.168.10.40/notice/9kCP7V"})
+ {:ok, activity5} = CommonAPI.post(user, %{"status" => "https://pleroma.local/notice/9kCP7V"})
+
+ Config.put([:rich_media, :enabled], true)
- Pleroma.Config.put([:rich_media, :enabled], false)
+ assert %{} = Helpers.fetch_data_for_activity(activity)
+ assert %{} = Helpers.fetch_data_for_activity(activity2)
+ assert %{} = Helpers.fetch_data_for_activity(activity3)
+ assert %{} = Helpers.fetch_data_for_activity(activity4)
+ assert %{} = Helpers.fetch_data_for_activity(activity5)
end
end
diff --git a/test/web/rich_media/parser_test.exs b/test/web/rich_media/parser_test.exs
index 3a9cc1854..b75bdf96f 100644
--- a/test/web/rich_media/parser_test.exs
+++ b/test/web/rich_media/parser_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.RichMedia.ParserTest do
use ExUnit.Case, async: true
@@ -11,6 +15,21 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
%{
method: :get,
+ url: "http://example.com/non-ogp"
+ } ->
+ %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/non_ogp_embed.html")}
+
+ %{
+ method: :get,
+ url: "http://example.com/ogp-missing-title"
+ } ->
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/rich_media/ogp-missing-title.html")
+ }
+
+ %{
+ method: :get,
url: "http://example.com/twitter-card"
} ->
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/twitter_card.html")}
@@ -38,6 +57,12 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
assert {:error, _} = Pleroma.Web.RichMedia.Parser.parse("http://example.com/empty")
end
+ test "doesn't just add a title" do
+ assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/non-ogp") ==
+ {:error,
+ "Found metadata was invalid or incomplete: %{url: \"http://example.com/non-ogp\"}"}
+ end
+
test "parses ogp" do
assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/ogp") ==
{:ok,
@@ -47,7 +72,20 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
description:
"Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.",
type: "video.movie",
- url: "http://www.imdb.com/title/tt0117500/"
+ url: "http://example.com/ogp"
+ }}
+ end
+
+ test "falls back to <title> when ogp:title is missing" do
+ assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/ogp-missing-title") ==
+ {:ok,
+ %{
+ image: "http://ia.media-imdb.com/images/rock.jpg",
+ title: "The Rock (1996)",
+ description:
+ "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.",
+ type: "video.movie",
+ url: "http://example.com/ogp-missing-title"
}}
end
@@ -59,7 +97,8 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
site: "@flickr",
image: "https://farm6.staticflickr.com/5510/14338202952_93595258ff_z.jpg",
title: "Small Island Developing States Photo Submission",
- description: "View the album on Flickr."
+ description: "View the album on Flickr.",
+ url: "http://example.com/twitter-card"
}}
end
@@ -83,7 +122,7 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
thumbnail_width: 150,
title: "Bacon Lollys",
type: "photo",
- url: "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_b.jpg",
+ url: "http://example.com/oembed",
version: "1.0",
web_page: "https://www.flickr.com/photos/bees/2362225867/",
web_page_short_url: "https://flic.kr/p/4AK2sc",
diff --git a/test/web/rich_media/parsers/twitter_card_test.exs b/test/web/rich_media/parsers/twitter_card_test.exs
new file mode 100644
index 000000000..f8e1c9b40
--- /dev/null
+++ b/test/web/rich_media/parsers/twitter_card_test.exs
@@ -0,0 +1,69 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do
+ use ExUnit.Case, async: true
+ alias Pleroma.Web.RichMedia.Parsers.TwitterCard
+
+ test "returns error when html not contains twitter card" do
+ assert TwitterCard.parse("", %{}) == {:error, "No twitter card metadata found"}
+ end
+
+ test "parses twitter card with only name attributes" do
+ html = File.read!("test/fixtures/nypd-facial-recognition-children-teenagers3.html")
+
+ assert TwitterCard.parse(html, %{}) ==
+ {:ok,
+ %{
+ "app:id:googleplay": "com.nytimes.android",
+ "app:name:googleplay": "NYTimes",
+ "app:url:googleplay": "nytimes://reader/id/100000006583622",
+ site: nil,
+ title:
+ "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database. - The New York Times"
+ }}
+ end
+
+ test "parses twitter card with only property attributes" do
+ html = File.read!("test/fixtures/nypd-facial-recognition-children-teenagers2.html")
+
+ assert TwitterCard.parse(html, %{}) ==
+ {:ok,
+ %{
+ card: "summary_large_image",
+ description:
+ "With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.",
+ image:
+ "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg",
+ "image:alt": "",
+ title:
+ "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.",
+ url:
+ "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"
+ }}
+ end
+
+ test "parses twitter card with name & property attributes" do
+ html = File.read!("test/fixtures/nypd-facial-recognition-children-teenagers.html")
+
+ assert TwitterCard.parse(html, %{}) ==
+ {:ok,
+ %{
+ "app:id:googleplay": "com.nytimes.android",
+ "app:name:googleplay": "NYTimes",
+ "app:url:googleplay": "nytimes://reader/id/100000006583622",
+ card: "summary_large_image",
+ description:
+ "With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.",
+ image:
+ "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg",
+ "image:alt": "",
+ site: nil,
+ title:
+ "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.",
+ url:
+ "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"
+ }}
+ end
+end
diff --git a/test/web/streamer_test.exs b/test/web/streamer_test.exs
index bfe18cb7f..96fa7645f 100644
--- a/test/web/streamer_test.exs
+++ b/test/web/streamer_test.exs
@@ -11,6 +11,111 @@ defmodule Pleroma.Web.StreamerTest do
alias Pleroma.Web.Streamer
import Pleroma.Factory
+ clear_config_all([:instance, :skip_thread_containment])
+
+ describe "user streams" do
+ setup do
+ GenServer.start(Streamer, %{}, name: Streamer)
+
+ on_exit(fn ->
+ if pid = Process.whereis(Streamer) do
+ Process.exit(pid, :kill)
+ end
+ end)
+
+ user = insert(:user)
+ notify = insert(:notification, user: user, activity: build(:note_activity))
+ {:ok, %{user: user, notify: notify}}
+ end
+
+ test "it sends notify to in the 'user' stream", %{user: user, notify: notify} do
+ task =
+ Task.async(fn ->
+ assert_receive {:text, _}, 4_000
+ end)
+
+ Streamer.add_socket(
+ "user",
+ %{transport_pid: task.pid, assigns: %{user: user}}
+ )
+
+ Streamer.stream("user", notify)
+ Task.await(task)
+ end
+
+ test "it sends notify to in the 'user:notification' stream", %{user: user, notify: notify} do
+ task =
+ Task.async(fn ->
+ assert_receive {:text, _}, 4_000
+ end)
+
+ Streamer.add_socket(
+ "user:notification",
+ %{transport_pid: task.pid, assigns: %{user: user}}
+ )
+
+ Streamer.stream("user:notification", notify)
+ Task.await(task)
+ end
+
+ test "it doesn't send notify to the 'user:notification' stream when a user is blocked", %{
+ user: user
+ } do
+ blocked = insert(:user)
+ {:ok, user} = User.block(user, blocked)
+
+ task = Task.async(fn -> refute_receive {:text, _}, 4_000 end)
+
+ Streamer.add_socket(
+ "user:notification",
+ %{transport_pid: task.pid, assigns: %{user: user}}
+ )
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => ":("})
+ {:ok, notif, _} = CommonAPI.favorite(activity.id, blocked)
+
+ Streamer.stream("user:notification", notif)
+ Task.await(task)
+ end
+
+ test "it doesn't send notify to the 'user:notification' stream when a thread is muted", %{
+ user: user
+ } do
+ user2 = insert(:user)
+ task = Task.async(fn -> refute_receive {:text, _}, 4_000 end)
+
+ Streamer.add_socket(
+ "user:notification",
+ %{transport_pid: task.pid, assigns: %{user: user}}
+ )
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"})
+ {:ok, activity} = CommonAPI.add_mute(user, activity)
+ {:ok, notif, _} = CommonAPI.favorite(activity.id, user2)
+ Streamer.stream("user:notification", notif)
+ Task.await(task)
+ end
+
+ test "it doesn't send notify to the 'user:notification' stream' when a domain is blocked", %{
+ user: user
+ } do
+ user2 = insert(:user, %{ap_id: "https://hecking-lewd-place.com/user/meanie"})
+ task = Task.async(fn -> refute_receive {:text, _}, 4_000 end)
+
+ Streamer.add_socket(
+ "user:notification",
+ %{transport_pid: task.pid, assigns: %{user: user}}
+ )
+
+ {:ok, user} = User.block_domain(user, "hecking-lewd-place.com")
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"})
+ {:ok, notif, _} = CommonAPI.favorite(activity.id, user2)
+
+ Streamer.stream("user:notification", notif)
+ Task.await(task)
+ end
+ end
+
test "it sends to public" do
user = insert(:user)
other_user = insert(:user)
@@ -68,6 +173,74 @@ defmodule Pleroma.Web.StreamerTest do
Task.await(task)
end
+ describe "thread_containment" do
+ test "it doesn't send to user if recipients invalid and thread containment is enabled" do
+ Pleroma.Config.put([:instance, :skip_thread_containment], false)
+ author = insert(:user)
+ user = insert(:user, following: [author.ap_id])
+
+ activity =
+ insert(:note_activity,
+ note:
+ insert(:note,
+ user: author,
+ data: %{"to" => ["TEST-FFF"]}
+ )
+ )
+
+ task = Task.async(fn -> refute_receive {:text, _}, 1_000 end)
+ fake_socket = %{transport_pid: task.pid, assigns: %{user: user}}
+ topics = %{"public" => [fake_socket]}
+ Streamer.push_to_socket(topics, "public", activity)
+
+ Task.await(task)
+ end
+
+ test "it sends message if recipients invalid and thread containment is disabled" do
+ Pleroma.Config.put([:instance, :skip_thread_containment], true)
+ author = insert(:user)
+ user = insert(:user, following: [author.ap_id])
+
+ activity =
+ insert(:note_activity,
+ note:
+ insert(:note,
+ user: author,
+ data: %{"to" => ["TEST-FFF"]}
+ )
+ )
+
+ task = Task.async(fn -> assert_receive {:text, _}, 1_000 end)
+ fake_socket = %{transport_pid: task.pid, assigns: %{user: user}}
+ topics = %{"public" => [fake_socket]}
+ Streamer.push_to_socket(topics, "public", activity)
+
+ Task.await(task)
+ end
+
+ test "it sends message if recipients invalid and thread containment is enabled but user's thread containment is disabled" do
+ Pleroma.Config.put([:instance, :skip_thread_containment], false)
+ author = insert(:user)
+ user = insert(:user, following: [author.ap_id], info: %{skip_thread_containment: true})
+
+ activity =
+ insert(:note_activity,
+ note:
+ insert(:note,
+ user: author,
+ data: %{"to" => ["TEST-FFF"]}
+ )
+ )
+
+ task = Task.async(fn -> assert_receive {:text, _}, 1_000 end)
+ fake_socket = %{transport_pid: task.pid, assigns: %{user: user}}
+ topics = %{"public" => [fake_socket]}
+ Streamer.push_to_socket(topics, "public", activity)
+
+ Task.await(task)
+ end
+ end
+
test "it doesn't send to blocked users" do
user = insert(:user)
blocked_user = insert(:user)
@@ -232,4 +405,130 @@ defmodule Pleroma.Web.StreamerTest do
Task.await(task)
end
+
+ test "it doesn't send posts from muted threads" do
+ user = insert(:user)
+ user2 = insert(:user)
+ {:ok, user2, user, _activity} = CommonAPI.follow(user2, user)
+
+ {:ok, activity} = CommonAPI.post(user, %{"status" => "super hot take"})
+
+ {:ok, activity} = CommonAPI.add_mute(user2, activity)
+
+ task = Task.async(fn -> refute_receive {:text, _}, 4_000 end)
+
+ Streamer.add_socket(
+ "user",
+ %{transport_pid: task.pid, assigns: %{user: user2}}
+ )
+
+ Streamer.stream("user", activity)
+ Task.await(task)
+ end
+
+ describe "direct streams" do
+ setup do
+ GenServer.start(Streamer, %{}, name: Streamer)
+
+ on_exit(fn ->
+ if pid = Process.whereis(Streamer) do
+ Process.exit(pid, :kill)
+ end
+ end)
+
+ :ok
+ end
+
+ test "it sends conversation update to the 'direct' stream", %{} do
+ user = insert(:user)
+ another_user = insert(:user)
+
+ task =
+ Task.async(fn ->
+ assert_receive {:text, _received_event}, 4_000
+ end)
+
+ Streamer.add_socket(
+ "direct",
+ %{transport_pid: task.pid, assigns: %{user: user}}
+ )
+
+ {:ok, _create_activity} =
+ CommonAPI.post(another_user, %{
+ "status" => "hey @#{user.nickname}",
+ "visibility" => "direct"
+ })
+
+ Task.await(task)
+ end
+
+ test "it doesn't send conversation update to the 'direct' streamj when the last message in the conversation is deleted" do
+ user = insert(:user)
+ another_user = insert(:user)
+
+ {:ok, create_activity} =
+ CommonAPI.post(another_user, %{
+ "status" => "hi @#{user.nickname}",
+ "visibility" => "direct"
+ })
+
+ task =
+ Task.async(fn ->
+ assert_receive {:text, received_event}, 4_000
+ assert %{"event" => "delete", "payload" => _} = Jason.decode!(received_event)
+
+ refute_receive {:text, _}, 4_000
+ end)
+
+ Streamer.add_socket(
+ "direct",
+ %{transport_pid: task.pid, assigns: %{user: user}}
+ )
+
+ {:ok, _} = CommonAPI.delete(create_activity.id, another_user)
+
+ Task.await(task)
+ end
+
+ test "it sends conversation update to the 'direct' stream when a message is deleted" do
+ user = insert(:user)
+ another_user = insert(:user)
+
+ {:ok, create_activity} =
+ CommonAPI.post(another_user, %{
+ "status" => "hi @#{user.nickname}",
+ "visibility" => "direct"
+ })
+
+ {:ok, create_activity2} =
+ CommonAPI.post(another_user, %{
+ "status" => "hi @#{user.nickname}",
+ "in_reply_to_status_id" => create_activity.id,
+ "visibility" => "direct"
+ })
+
+ task =
+ Task.async(fn ->
+ assert_receive {:text, received_event}, 4_000
+ assert %{"event" => "delete", "payload" => _} = Jason.decode!(received_event)
+
+ assert_receive {:text, received_event}, 4_000
+
+ assert %{"event" => "conversation", "payload" => received_payload} =
+ Jason.decode!(received_event)
+
+ assert %{"last_status" => last_status} = Jason.decode!(received_payload)
+ assert last_status["id"] == to_string(create_activity.id)
+ end)
+
+ Streamer.add_socket(
+ "direct",
+ %{transport_pid: task.pid, assigns: %{user: user}}
+ )
+
+ {:ok, _} = CommonAPI.delete(create_activity2.id, another_user)
+
+ Task.await(task)
+ end
+ end
end
diff --git a/test/web/twitter_api/password_controller_test.exs b/test/web/twitter_api/password_controller_test.exs
new file mode 100644
index 000000000..3a7246ea8
--- /dev/null
+++ b/test/web/twitter_api/password_controller_test.exs
@@ -0,0 +1,60 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do
+ use Pleroma.Web.ConnCase
+
+ alias Pleroma.PasswordResetToken
+ alias Pleroma.Web.OAuth.Token
+ import Pleroma.Factory
+
+ describe "GET /api/pleroma/password_reset/token" do
+ test "it returns error when token invalid", %{conn: conn} do
+ response =
+ conn
+ |> get("/api/pleroma/password_reset/token")
+ |> html_response(:ok)
+
+ assert response =~ "<h2>Invalid Token</h2>"
+ end
+
+ test "it shows password reset form", %{conn: conn} do
+ user = insert(:user)
+ {:ok, token} = PasswordResetToken.create_token(user)
+
+ response =
+ conn
+ |> get("/api/pleroma/password_reset/#{token.token}")
+ |> html_response(:ok)
+
+ assert response =~ "<h2>Password Reset for #{user.nickname}</h2>"
+ end
+ end
+
+ describe "POST /api/pleroma/password_reset" do
+ test "it returns HTTP 200", %{conn: conn} do
+ user = insert(:user)
+ {:ok, token} = PasswordResetToken.create_token(user)
+ {:ok, _access_token} = Token.create_token(insert(:oauth_app), user, %{})
+
+ params = %{
+ "password" => "test",
+ password_confirmation: "test",
+ token: token.token
+ }
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> post("/api/pleroma/password_reset", %{data: params})
+ |> html_response(:ok)
+
+ assert response =~ "<h2>Password changed!</h2>"
+
+ user = refresh_record(user)
+ assert Comeonin.Pbkdf2.checkpw("test", user.password_hash)
+ assert length(Token.get_user_tokens(user)) == 0
+ end
+ end
+end
diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs
index bcd0f522d..8ef14b4c5 100644
--- a/test/web/twitter_api/twitter_api_controller_test.exs
+++ b/test/web/twitter_api/twitter_api_controller_test.exs
@@ -40,6 +40,18 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
user = refresh_record(user)
assert user.info.banner["type"] == "Image"
end
+
+ test "profile banner can be reset", %{conn: conn} do
+ user = insert(:user)
+
+ conn
+ |> assign(:user, user)
+ |> post(authenticated_twitter_api__path(conn, :update_banner), %{"banner" => ""})
+ |> json_response(200)
+
+ user = refresh_record(user)
+ assert user.info.banner == %{}
+ end
end
describe "POST /api/qvitter/update_background_image" do
@@ -54,6 +66,18 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
user = refresh_record(user)
assert user.info.background["type"] == "Image"
end
+
+ test "background can be reset", %{conn: conn} do
+ user = insert(:user)
+
+ conn
+ |> assign(:user, user)
+ |> post(authenticated_twitter_api__path(conn, :update_background), %{"img" => ""})
+ |> json_response(200)
+
+ user = refresh_record(user)
+ assert user.info.background == %{}
+ end
end
describe "POST /api/account/verify_credentials" do
@@ -127,6 +151,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
describe "GET /statuses/public_timeline.json" do
setup [:valid_user]
+ clear_config([:instance, :public])
test "returns statuses", %{conn: conn} do
user = insert(:user)
@@ -149,8 +174,6 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
conn
|> get("/api/statuses/public_timeline.json")
|> json_response(403)
-
- Pleroma.Config.put([:instance, :public], true)
end
test "returns 200 to authenticated request when the instance is not public",
@@ -161,8 +184,6 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
|> with_credentials(user.nickname, "test")
|> get("/api/statuses/public_timeline.json")
|> json_response(200)
-
- Pleroma.Config.put([:instance, :public], true)
end
test "returns 200 to unauthenticated request when the instance is public", %{conn: conn} do
@@ -196,6 +217,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
describe "GET /statuses/public_and_external_timeline.json" do
setup [:valid_user]
+ clear_config([:instance, :public])
test "returns 403 to unauthenticated request when the instance is not public", %{conn: conn} do
Pleroma.Config.put([:instance, :public], false)
@@ -203,8 +225,6 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
conn
|> get("/api/statuses/public_and_external_timeline.json")
|> json_response(403)
-
- Pleroma.Config.put([:instance, :public], true)
end
test "returns 200 to authenticated request when the instance is not public",
@@ -215,8 +235,6 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
|> with_credentials(user.nickname, "test")
|> get("/api/statuses/public_and_external_timeline.json")
|> json_response(200)
-
- Pleroma.Config.put([:instance, :public], true)
end
test "returns 200 to unauthenticated request when the instance is public", %{conn: conn} do
@@ -497,6 +515,38 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
for: current_user
})
end
+
+ test "muted user", %{conn: conn, user: current_user} do
+ other_user = insert(:user)
+
+ {:ok, current_user} = User.mute(current_user, other_user)
+
+ {:ok, _activity} =
+ ActivityBuilder.insert(%{"to" => [current_user.ap_id]}, %{user: other_user})
+
+ conn =
+ conn
+ |> with_credentials(current_user.nickname, "test")
+ |> get("/api/qvitter/statuses/notifications.json")
+
+ assert json_response(conn, 200) == []
+ end
+
+ test "muted user with with_muted parameter", %{conn: conn, user: current_user} do
+ other_user = insert(:user)
+
+ {:ok, current_user} = User.mute(current_user, other_user)
+
+ {:ok, _activity} =
+ ActivityBuilder.insert(%{"to" => [current_user.ap_id]}, %{user: other_user})
+
+ conn =
+ conn
+ |> with_credentials(current_user.nickname, "test")
+ |> get("/api/qvitter/statuses/notifications.json", %{"with_muted" => "true"})
+
+ assert length(json_response(conn, 200)) == 1
+ end
end
describe "POST /api/qvitter/statuses/notifications/read" do
@@ -821,6 +871,19 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
assert json_response(conn, 200) ==
UserView.render("show.json", %{user: current_user, for: current_user})
end
+
+ test "user avatar can be reset", %{conn: conn, user: current_user} do
+ conn =
+ conn
+ |> with_credentials(current_user.nickname, "test")
+ |> post("/api/qvitter/update_avatar.json", %{img: ""})
+
+ current_user = User.get_cached_by_id(current_user.id)
+ assert current_user.avatar == nil
+
+ assert json_response(conn, 200) ==
+ UserView.render("show.json", %{user: current_user, for: current_user})
+ end
end
describe "GET /api/qvitter/mutes.json" do
@@ -892,7 +955,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
test "with credentials", %{conn: conn, user: current_user} do
note_activity = insert(:note_activity)
- object = Object.get_by_ap_id(note_activity.data["object"]["id"])
+ object = Object.normalize(note_activity)
ActivityPub.like(current_user, object)
conn =
@@ -1047,15 +1110,17 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
describe "POST /api/account/password_reset, with invalid parameters" do
setup [:valid_user]
- test "it returns 500 when user is not found", %{conn: conn, user: user} do
+ test "it returns 404 when user is not found", %{conn: conn, user: user} do
conn = post(conn, "/api/account/password_reset?email=nonexisting_#{user.email}")
- assert json_response(conn, :internal_server_error)
+ assert conn.status == 404
+ assert conn.resp_body == ""
end
- test "it returns 500 when user is not local", %{conn: conn, user: user} do
+ test "it returns 400 when user is not local", %{conn: conn, user: user} do
{:ok, user} = Repo.update(Changeset.change(user, local: false))
conn = post(conn, "/api/account/password_reset?email=#{user.email}")
- assert json_response(conn, :internal_server_error)
+ assert conn.status == 400
+ assert conn.resp_body == ""
end
end
@@ -1105,13 +1170,6 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
describe "POST /api/account/resend_confirmation_email" do
setup do
- setting = Pleroma.Config.get([:instance, :account_activation_required])
-
- unless setting do
- Pleroma.Config.put([:instance, :account_activation_required], true)
- on_exit(fn -> Pleroma.Config.put([:instance, :account_activation_required], setting) end)
- end
-
user = insert(:user)
info_change = User.Info.confirmation_changeset(user.info, need_confirmation: true)
@@ -1126,6 +1184,10 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
[user: user]
end
+ clear_config([:instance, :account_activation_required]) do
+ Pleroma.Config.put([:instance, :account_activation_required], true)
+ end
+
test "it returns 204 No Content", %{conn: conn, user: user} do
conn
|> assign(:user, user)
@@ -1495,7 +1557,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
"hide_follows" => "false"
})
- user = Repo.get!(User, user.id)
+ user = refresh_record(user)
assert user.info.hide_follows == false
assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
end
@@ -1548,6 +1610,29 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
end
+ test "it sets and un-sets skip_thread_containment", %{conn: conn} do
+ user = insert(:user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> post("/api/account/update_profile.json", %{"skip_thread_containment" => "true"})
+ |> json_response(200)
+
+ assert response["pleroma"]["skip_thread_containment"] == true
+ user = refresh_record(user)
+ assert user.info.skip_thread_containment
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> post("/api/account/update_profile.json", %{"skip_thread_containment" => "false"})
+ |> json_response(200)
+
+ assert response["pleroma"]["skip_thread_containment"] == false
+ refute refresh_record(user).info.skip_thread_containment
+ end
+
test "it locks an account", %{conn: conn} do
user = insert(:user)
diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs
index d601c8f1f..cbe83852e 100644
--- a/test/web/twitter_api/twitter_api_test.exs
+++ b/test/web/twitter_api/twitter_api_test.exs
@@ -46,7 +46,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
}
{:ok, activity = %Activity{}} = TwitterAPI.create_status(user, input)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
expected_text =
"Hello again, <span class='h-card'><a data-user='#{mentioned_user.id}' class='u-url mention' href='shp'>@<span>shp</span></a></span>.&lt;script&gt;&lt;/script&gt;<br>This is on another :firefox: line. <a class='hashtag' data-tag='2hu' href='http://localhost:4001/tag/2hu' rel='tag'>#2hu</a> <a class='hashtag' data-tag='epic' href='http://localhost:4001/tag/epic' rel='tag'>#epic</a> <a class='hashtag' data-tag='phantasmagoric' href='http://localhost:4001/tag/phantasmagoric' rel='tag'>#phantasmagoric</a><br><a href=\"http://example.org/image.jpg\" class='attachment'>image.jpg</a>"
@@ -91,7 +91,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
}
{:ok, activity = %Activity{}} = TwitterAPI.create_status(user, input)
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
input = %{
"status" => "Here's your (you).",
@@ -99,7 +99,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
}
{:ok, reply = %Activity{}} = TwitterAPI.create_status(user, input)
- reply_object = Object.normalize(reply.data["object"])
+ reply_object = Object.normalize(reply)
assert get_in(reply.data, ["context"]) == get_in(activity.data, ["context"])
@@ -116,8 +116,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
{:ok, user, followed, _activity} = TwitterAPI.follow(user, %{"user_id" => followed.id})
assert User.ap_followers(followed) in user.following
- {:error, msg} = TwitterAPI.follow(user, %{"user_id" => followed.id})
- assert msg == "Could not follow user: #{followed.nickname} is already on your list."
+ {:ok, _, _, _} = TwitterAPI.follow(user, %{"user_id" => followed.id})
end
test "Follow another user using screen_name" do
@@ -132,8 +131,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
followed = User.get_cached_by_ap_id(followed.ap_id)
assert followed.info.follower_count == 1
- {:error, msg} = TwitterAPI.follow(user, %{"screen_name" => followed.nickname})
- assert msg == "Could not follow user: #{followed.nickname} is already on your list."
+ {:ok, _, _, _} = TwitterAPI.follow(user, %{"screen_name" => followed.nickname})
end
test "Unfollow another user using user_id" do
@@ -218,7 +216,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
updated_activity = Activity.get_by_ap_id(note_activity.data["id"])
assert ActivityView.render("activity.json", %{activity: updated_activity})["fave_num"] == 1
- object = Object.normalize(note_activity.data["object"])
+ object = Object.normalize(note_activity)
assert object.data["like_count"] == 1
@@ -226,7 +224,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
{:ok, _status} = TwitterAPI.fav(other_user, note_activity.id)
- object = Object.normalize(note_activity.data["object"])
+ object = Object.normalize(note_activity)
assert object.data["like_count"] == 2
@@ -237,7 +235,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
test "it unfavorites a status, returns the updated activity" do
user = insert(:user)
note_activity = insert(:note_activity)
- object = Object.get_by_ap_id(note_activity.data["object"]["id"])
+ object = Object.normalize(note_activity)
{:ok, _like_activity, _object} = ActivityPub.like(user, object)
updated_activity = Activity.get_by_ap_id(note_activity.data["id"])
diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs
index 2cd82b3e7..fe4ffdb59 100644
--- a/test/web/twitter_api/util_controller_test.exs
+++ b/test/web/twitter_api/util_controller_test.exs
@@ -1,3 +1,7 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
use Pleroma.Web.ConnCase
@@ -6,12 +10,17 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
alias Pleroma.User
alias Pleroma.Web.CommonAPI
import Pleroma.Factory
+ import Mock
setup do
Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
:ok
end
+ clear_config([:instance])
+ clear_config([:frontend_configurations, :pleroma_fe])
+ clear_config([:user, :deny_follow_blocked])
+
describe "POST /api/pleroma/follow_import" do
test "it returns HTTP 200", %{conn: conn} do
user1 = insert(:user)
@@ -26,6 +35,35 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
assert response == "job started"
end
+ test "it imports follow lists from file", %{conn: conn} do
+ user1 = insert(:user)
+ user2 = insert(:user)
+
+ with_mocks([
+ {File, [],
+ read!: fn "follow_list.txt" ->
+ "Account address,Show boosts\n#{user2.ap_id},true"
+ end},
+ {PleromaJobQueue, [:passthrough], []}
+ ]) do
+ response =
+ conn
+ |> assign(:user, user1)
+ |> post("/api/pleroma/follow_import", %{"list" => %Plug.Upload{path: "follow_list.txt"}})
+ |> json_response(:ok)
+
+ assert called(
+ PleromaJobQueue.enqueue(
+ :background,
+ User,
+ [:follow_import, user1, [user2.ap_id]]
+ )
+ )
+
+ assert response == "job started"
+ end
+ end
+
test "it imports new-style mastodon follow lists", %{conn: conn} do
user1 = insert(:user)
user2 = insert(:user)
@@ -74,6 +112,33 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
assert response == "job started"
end
+
+ test "it imports blocks users from file", %{conn: conn} do
+ user1 = insert(:user)
+ user2 = insert(:user)
+ user3 = insert(:user)
+
+ with_mocks([
+ {File, [], read!: fn "blocks_list.txt" -> "#{user2.ap_id} #{user3.ap_id}" end},
+ {PleromaJobQueue, [:passthrough], []}
+ ]) do
+ response =
+ conn
+ |> assign(:user, user1)
+ |> post("/api/pleroma/blocks_import", %{"list" => %Plug.Upload{path: "blocks_list.txt"}})
+ |> json_response(:ok)
+
+ assert called(
+ PleromaJobQueue.enqueue(
+ :background,
+ User,
+ [:blocks_import, user1, [user2.ap_id, user3.ap_id]]
+ )
+ )
+
+ assert response == "job started"
+ end
+ end
end
describe "POST /api/pleroma/notifications/read" do
@@ -93,6 +158,18 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
assert Repo.get(Notification, notification1.id).seen
refute Repo.get(Notification, notification2.id).seen
end
+
+ test "it returns error when notification not found", %{conn: conn} do
+ user1 = insert(:user)
+
+ response =
+ conn
+ |> assign(:user, user1)
+ |> post("/api/pleroma/notifications/read", %{"id" => "22222222222222"})
+ |> json_response(403)
+
+ assert response == %{"error" => "Cannot get notification"}
+ end
end
describe "PUT /api/pleroma/notification_settings" do
@@ -102,7 +179,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
conn
|> assign(:user, user)
|> put("/api/pleroma/notification_settings", %{
- "remote" => false,
"followers" => false,
"bar" => 1
})
@@ -110,14 +186,73 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
user = Repo.get(User, user.id)
- assert %{"remote" => false, "local" => true, "followers" => false, "follows" => true} ==
- user.info.notification_settings
+ assert %{
+ "followers" => false,
+ "follows" => true,
+ "non_follows" => true,
+ "non_followers" => true
+ } == user.info.notification_settings
end
end
- describe "GET /api/statusnet/config.json" do
+ describe "GET /api/statusnet/config" do
+ test "it returns config in xml format", %{conn: conn} do
+ instance = Pleroma.Config.get(:instance)
+
+ response =
+ conn
+ |> put_req_header("accept", "application/xml")
+ |> get("/api/statusnet/config")
+ |> response(:ok)
+
+ assert response ==
+ "<config>\n<site>\n<name>#{Keyword.get(instance, :name)}</name>\n<site>#{
+ Pleroma.Web.base_url()
+ }</site>\n<textlimit>#{Keyword.get(instance, :limit)}</textlimit>\n<closed>#{
+ !Keyword.get(instance, :registrations_open)
+ }</closed>\n</site>\n</config>\n"
+ end
+
+ test "it returns config in json format", %{conn: conn} do
+ instance = Pleroma.Config.get(:instance)
+ Pleroma.Config.put([:instance, :managed_config], true)
+ Pleroma.Config.put([:instance, :registrations_open], false)
+ Pleroma.Config.put([:instance, :invites_enabled], true)
+ Pleroma.Config.put([:instance, :public], false)
+ Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"})
+
+ response =
+ conn
+ |> put_req_header("accept", "application/json")
+ |> get("/api/statusnet/config")
+ |> json_response(:ok)
+
+ expected_data = %{
+ "site" => %{
+ "accountActivationRequired" => "0",
+ "closed" => "1",
+ "description" => Keyword.get(instance, :description),
+ "invitesEnabled" => "1",
+ "name" => Keyword.get(instance, :name),
+ "pleromafe" => %{"theme" => "asuka-hospital"},
+ "private" => "1",
+ "safeDMMentionsEnabled" => "0",
+ "server" => Pleroma.Web.base_url(),
+ "textlimit" => to_string(Keyword.get(instance, :limit)),
+ "uploadlimit" => %{
+ "avatarlimit" => to_string(Keyword.get(instance, :avatar_upload_limit)),
+ "backgroundlimit" => to_string(Keyword.get(instance, :background_upload_limit)),
+ "bannerlimit" => to_string(Keyword.get(instance, :banner_upload_limit)),
+ "uploadlimit" => to_string(Keyword.get(instance, :upload_limit))
+ },
+ "vapidPublicKey" => Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
+ }
+ }
+
+ assert response == expected_data
+ end
+
test "returns the state of safe_dm_mentions flag", %{conn: conn} do
- option = Pleroma.Config.get([:instance, :safe_dm_mentions])
Pleroma.Config.put([:instance, :safe_dm_mentions], true)
response =
@@ -135,8 +270,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
|> json_response(:ok)
assert response["site"]["safeDMMentionsEnabled"] == "0"
-
- Pleroma.Config.put([:instance, :safe_dm_mentions], option)
end
test "it returns the managed config", %{conn: conn} do
@@ -202,7 +335,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
end
end
- describe "GET /ostatus_subscribe?acct=...." do
+ describe "GET /ostatus_subscribe - remote_follow/2" do
test "adds status to pleroma instance if the `acct` is a status", %{conn: conn} do
conn =
get(
@@ -222,12 +355,227 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
assert html_response(response, 200) =~ "Log in to follow"
end
+
+ test "show follow page if the `acct` is a account link", %{conn: conn} do
+ user = insert(:user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> get("/ostatus_subscribe?acct=https://mastodon.social/users/emelie")
+
+ assert html_response(response, 200) =~ "Remote follow"
+ end
+
+ test "show follow page with error when user cannot fecth by `acct` link", %{conn: conn} do
+ user = insert(:user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> get("/ostatus_subscribe?acct=https://mastodon.social/users/not_found")
+
+ assert html_response(response, 200) =~ "Error fetching user"
+ end
end
- test "GET /api/pleroma/healthcheck", %{conn: conn} do
- conn = get(conn, "/api/pleroma/healthcheck")
+ describe "POST /ostatus_subscribe - do_remote_follow/2 with assigned user " do
+ test "follows user", %{conn: conn} do
+ user = insert(:user)
+ user2 = insert(:user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}})
+ |> response(200)
+
+ assert response =~ "Account followed!"
+ assert user2.follower_address in refresh_record(user).following
+ end
+
+ test "returns error when user is deactivated", %{conn: conn} do
+ user = insert(:user, info: %{deactivated: true})
+ user2 = insert(:user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}})
+ |> response(200)
+
+ assert response =~ "Error following account"
+ end
+
+ test "returns error when user is blocked", %{conn: conn} do
+ Pleroma.Config.put([:user, :deny_follow_blocked], true)
+ user = insert(:user)
+ user2 = insert(:user)
+
+ {:ok, _user} = Pleroma.User.block(user2, user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}})
+ |> response(200)
+
+ assert response =~ "Error following account"
+ end
+
+ test "returns error when followee not found", %{conn: conn} do
+ user = insert(:user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> post("/ostatus_subscribe", %{"user" => %{"id" => "jimm"}})
+ |> response(200)
+
+ assert response =~ "Error following account"
+ end
- assert conn.status in [200, 503]
+ test "returns success result when user already in followers", %{conn: conn} do
+ user = insert(:user)
+ user2 = insert(:user)
+ {:ok, _, _, _} = CommonAPI.follow(user, user2)
+
+ response =
+ conn
+ |> assign(:user, refresh_record(user))
+ |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}})
+ |> response(200)
+
+ assert response =~ "Account followed!"
+ end
+ end
+
+ describe "POST /ostatus_subscribe - do_remote_follow/2 without assigned user " do
+ test "follows", %{conn: conn} do
+ user = insert(:user)
+ user2 = insert(:user)
+
+ response =
+ conn
+ |> post("/ostatus_subscribe", %{
+ "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id}
+ })
+ |> response(200)
+
+ assert response =~ "Account followed!"
+ assert user2.follower_address in refresh_record(user).following
+ end
+
+ test "returns error when followee not found", %{conn: conn} do
+ user = insert(:user)
+
+ response =
+ conn
+ |> post("/ostatus_subscribe", %{
+ "authorization" => %{"name" => user.nickname, "password" => "test", "id" => "jimm"}
+ })
+ |> response(200)
+
+ assert response =~ "Error following account"
+ end
+
+ test "returns error when login invalid", %{conn: conn} do
+ user = insert(:user)
+
+ response =
+ conn
+ |> post("/ostatus_subscribe", %{
+ "authorization" => %{"name" => "jimm", "password" => "test", "id" => user.id}
+ })
+ |> response(200)
+
+ assert response =~ "Wrong username or password"
+ end
+
+ test "returns error when password invalid", %{conn: conn} do
+ user = insert(:user)
+ user2 = insert(:user)
+
+ response =
+ conn
+ |> post("/ostatus_subscribe", %{
+ "authorization" => %{"name" => user.nickname, "password" => "42", "id" => user2.id}
+ })
+ |> response(200)
+
+ assert response =~ "Wrong username or password"
+ end
+
+ test "returns error when user is blocked", %{conn: conn} do
+ Pleroma.Config.put([:user, :deny_follow_blocked], true)
+ user = insert(:user)
+ user2 = insert(:user)
+ {:ok, _user} = Pleroma.User.block(user2, user)
+
+ response =
+ conn
+ |> post("/ostatus_subscribe", %{
+ "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id}
+ })
+ |> response(200)
+
+ assert response =~ "Error following account"
+ end
+ end
+
+ describe "GET /api/pleroma/healthcheck" do
+ clear_config([:instance, :healthcheck])
+
+ test "returns 503 when healthcheck disabled", %{conn: conn} do
+ Pleroma.Config.put([:instance, :healthcheck], false)
+
+ response =
+ conn
+ |> get("/api/pleroma/healthcheck")
+ |> json_response(503)
+
+ assert response == %{}
+ end
+
+ test "returns 200 when healthcheck enabled and all ok", %{conn: conn} do
+ Pleroma.Config.put([:instance, :healthcheck], true)
+
+ with_mock Pleroma.Healthcheck,
+ system_info: fn -> %Pleroma.Healthcheck{healthy: true} end do
+ response =
+ conn
+ |> get("/api/pleroma/healthcheck")
+ |> json_response(200)
+
+ assert %{
+ "active" => _,
+ "healthy" => true,
+ "idle" => _,
+ "memory_used" => _,
+ "pool_size" => _
+ } = response
+ end
+ end
+
+ test "returns 503 when healthcheck enabled and health is false", %{conn: conn} do
+ Pleroma.Config.put([:instance, :healthcheck], true)
+
+ with_mock Pleroma.Healthcheck,
+ system_info: fn -> %Pleroma.Healthcheck{healthy: false} end do
+ response =
+ conn
+ |> get("/api/pleroma/healthcheck")
+ |> json_response(503)
+
+ assert %{
+ "active" => _,
+ "healthy" => false,
+ "idle" => _,
+ "memory_used" => _,
+ "pool_size" => _
+ } = response
+ end
+ end
end
describe "POST /api/pleroma/disable_account" do
@@ -246,5 +594,104 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
assert user.info.deactivated == true
end
+
+ test "it returns returns when password invalid", %{conn: conn} do
+ user = insert(:user)
+
+ response =
+ conn
+ |> assign(:user, user)
+ |> post("/api/pleroma/disable_account", %{"password" => "test1"})
+ |> json_response(:ok)
+
+ assert response == %{"error" => "Invalid password."}
+ user = User.get_cached_by_id(user.id)
+
+ refute user.info.deactivated
+ end
+ end
+
+ describe "GET /api/statusnet/version" do
+ test "it returns version in xml format", %{conn: conn} do
+ response =
+ conn
+ |> put_req_header("accept", "application/xml")
+ |> get("/api/statusnet/version")
+ |> response(:ok)
+
+ assert response == "<version>#{Pleroma.Application.named_version()}</version>"
+ end
+
+ test "it returns version in json format", %{conn: conn} do
+ response =
+ conn
+ |> put_req_header("accept", "application/json")
+ |> get("/api/statusnet/version")
+ |> json_response(:ok)
+
+ assert response == "#{Pleroma.Application.named_version()}"
+ end
+ end
+
+ describe "POST /main/ostatus - remote_subscribe/2" do
+ test "renders subscribe form", %{conn: conn} do
+ user = insert(:user)
+
+ response =
+ conn
+ |> post("/main/ostatus", %{"nickname" => user.nickname, "profile" => ""})
+ |> response(:ok)
+
+ refute response =~ "Could not find user"
+ assert response =~ "Remotely follow #{user.nickname}"
+ end
+
+ test "renders subscribe form with error when user not found", %{conn: conn} do
+ response =
+ conn
+ |> post("/main/ostatus", %{"nickname" => "nickname", "profile" => ""})
+ |> response(:ok)
+
+ assert response =~ "Could not find user"
+ refute response =~ "Remotely follow"
+ end
+
+ test "it redirect to webfinger url", %{conn: conn} do
+ user = insert(:user)
+ user2 = insert(:user, ap_id: "shp@social.heldscal.la")
+
+ conn =
+ conn
+ |> post("/main/ostatus", %{
+ "user" => %{"nickname" => user.nickname, "profile" => user2.ap_id}
+ })
+
+ assert redirected_to(conn) ==
+ "https://social.heldscal.la/main/ostatussub?profile=#{user.ap_id}"
+ end
+
+ test "it renders form with error when use not found", %{conn: conn} do
+ user2 = insert(:user, ap_id: "shp@social.heldscal.la")
+
+ response =
+ conn
+ |> post("/main/ostatus", %{"user" => %{"nickname" => "jimm", "profile" => user2.ap_id}})
+ |> response(:ok)
+
+ assert response =~ "Something went wrong."
+ end
+ end
+
+ test "it returns new captcha", %{conn: conn} do
+ with_mock Pleroma.Captcha,
+ new: fn -> "test_captcha" end do
+ resp =
+ conn
+ |> get("/api/pleroma/captcha")
+ |> response(200)
+
+ assert resp == "\"test_captcha\""
+ assert called(Pleroma.Captcha.new())
+ end
end
end
diff --git a/test/web/twitter_api/views/activity_view_test.exs b/test/web/twitter_api/views/activity_view_test.exs
index 43bd77f78..56d861efb 100644
--- a/test/web/twitter_api/views/activity_view_test.exs
+++ b/test/web/twitter_api/views/activity_view_test.exs
@@ -126,7 +126,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
other_user = insert(:user, %{nickname: "shp"})
{:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!", "visibility" => "direct"})
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
result = ActivityView.render("activity.json", activity: activity)
@@ -177,7 +177,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
user = insert(:user)
other_user = insert(:user, %{nickname: "shp"})
{:ok, activity} = CommonAPI.post(user, %{"status" => "Hey @shp!"})
- object = Object.normalize(activity.data["object"])
+ object = Object.normalize(activity)
convo_id = Utils.context_to_conversation_id(object.data["context"])
@@ -351,7 +351,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
"is_post_verb" => false,
"statusnet_html" => "deleted notice {{tag",
"text" => "deleted notice {{tag",
- "uri" => delete.data["object"],
+ "uri" => Object.normalize(delete).data["id"],
"user" => UserView.render("show.json", user: user)
}
diff --git a/test/web/twitter_api/views/user_view_test.exs b/test/web/twitter_api/views/user_view_test.exs
index 74526673c..70c5a0b7f 100644
--- a/test/web/twitter_api/views/user_view_test.exs
+++ b/test/web/twitter_api/views/user_view_test.exs
@@ -99,7 +99,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
"fields" => [],
"pleroma" => %{
"confirmation_pending" => false,
- "tags" => []
+ "tags" => [],
+ "skip_thread_containment" => false
},
"rights" => %{"admin" => false, "delete_others_notice" => false},
"role" => "member"
@@ -112,9 +113,11 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
as_user = UserView.render("show.json", %{user: user, for: user})
assert as_user["default_scope"] == user.info.default_scope
assert as_user["no_rich_text"] == user.info.no_rich_text
+ assert as_user["pleroma"]["notification_settings"] == user.info.notification_settings
as_stranger = UserView.render("show.json", %{user: user})
refute as_stranger["default_scope"]
refute as_stranger["no_rich_text"]
+ refute as_stranger["pleroma"]["notification_settings"]
end
test "A user for a given other follower", %{user: user} do
@@ -152,7 +155,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
"fields" => [],
"pleroma" => %{
"confirmation_pending" => false,
- "tags" => []
+ "tags" => [],
+ "skip_thread_containment" => false
},
"rights" => %{"admin" => false, "delete_others_notice" => false},
"role" => "member"
@@ -197,7 +201,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
"fields" => [],
"pleroma" => %{
"confirmation_pending" => false,
- "tags" => []
+ "tags" => [],
+ "skip_thread_containment" => false
},
"rights" => %{"admin" => false, "delete_others_notice" => false},
"role" => "member"
@@ -279,7 +284,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
"fields" => [],
"pleroma" => %{
"confirmation_pending" => false,
- "tags" => []
+ "tags" => [],
+ "skip_thread_containment" => false
},
"rights" => %{"admin" => false, "delete_others_notice" => false},
"role" => "member"
diff --git a/test/web/uploader_controller_test.exs b/test/web/uploader_controller_test.exs
new file mode 100644
index 000000000..70028df1c
--- /dev/null
+++ b/test/web/uploader_controller_test.exs
@@ -0,0 +1,43 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.UploaderControllerTest do
+ use Pleroma.Web.ConnCase
+ alias Pleroma.Uploaders.Uploader
+
+ describe "callback/2" do
+ test "it returns 400 response when process callback isn't alive", %{conn: conn} do
+ res =
+ conn
+ |> post(uploader_path(conn, :callback, "test-path"))
+
+ assert res.status == 400
+ assert res.resp_body == "{\"error\":\"bad request\"}"
+ end
+
+ test "it returns success result", %{conn: conn} do
+ task =
+ Task.async(fn ->
+ receive do
+ {Uploader, pid, conn, _params} ->
+ conn =
+ conn
+ |> put_status(:ok)
+ |> Phoenix.Controller.json(%{upload_path: "test-path"})
+
+ send(pid, {Uploader, conn})
+ end
+ end)
+
+ :global.register_name({Uploader, "test-path"}, task.pid)
+
+ res =
+ conn
+ |> post(uploader_path(conn, :callback, "test-path"))
+ |> json_response(200)
+
+ assert res == %{"upload_path" => "test-path"}
+ end
+ end
+end
diff --git a/test/web/web_finger/web_finger_controller_test.exs b/test/web/web_finger/web_finger_controller_test.exs
index 43fccfc7a..e23086b2a 100644
--- a/test/web/web_finger/web_finger_controller_test.exs
+++ b/test/web/web_finger/web_finger_controller_test.exs
@@ -13,6 +13,23 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
:ok
end
+ clear_config_all([:instance, :federating]) do
+ Pleroma.Config.put([:instance, :federating], true)
+ end
+
+ test "GET host-meta" do
+ response =
+ build_conn()
+ |> get("/.well-known/host-meta")
+
+ assert response.status == 200
+
+ assert response.resp_body ==
+ ~s(<?xml version="1.0" encoding="UTF-8"?><XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"><Link rel="lrdd" template="#{
+ Pleroma.Web.base_url()
+ }/.well-known/webfinger?resource={uri}" type="application/xrd+xml" /></XRD>)
+ end
+
test "Webfinger JRD" do
user = insert(:user)
@@ -24,6 +41,16 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
assert json_response(response, 200)["subject"] == "acct:#{user.nickname}@localhost"
end
+ test "it returns 404 when user isn't found (JSON)" do
+ result =
+ build_conn()
+ |> put_req_header("accept", "application/jrd+json")
+ |> get("/.well-known/webfinger?resource=acct:jimm@localhost")
+ |> json_response(404)
+
+ assert result == "Couldn't find user"
+ end
+
test "Webfinger XML" do
user = insert(:user)
@@ -35,6 +62,26 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do
assert response(response, 200)
end
+ test "it returns 404 when user isn't found (XML)" do
+ result =
+ build_conn()
+ |> put_req_header("accept", "application/xrd+xml")
+ |> get("/.well-known/webfinger?resource=acct:jimm@localhost")
+ |> response(404)
+
+ assert result == "Couldn't find user"
+ end
+
+ test "Sends a 404 when invalid format" do
+ user = insert(:user)
+
+ assert_raise Phoenix.NotAcceptableError, fn ->
+ build_conn()
+ |> put_req_header("accept", "text/html")
+ |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")
+ end
+ end
+
test "Sends a 400 when resource param is missing" do
response =
build_conn()
diff --git a/test/web/web_finger/web_finger_test.exs b/test/web/web_finger/web_finger_test.exs
index 335c95b18..8fdb9adea 100644
--- a/test/web/web_finger/web_finger_test.exs
+++ b/test/web/web_finger/web_finger_test.exs
@@ -40,6 +40,11 @@ defmodule Pleroma.Web.WebFingerTest do
end
describe "fingering" do
+ test "returns error when fails parse xml or json" do
+ user = "invalid_content@social.heldscal.la"
+ assert {:error, %Jason.DecodeError{}} = WebFinger.finger(user)
+ end
+
test "returns the info for an OStatus user" do
user = "shp@social.heldscal.la"
@@ -81,6 +86,20 @@ defmodule Pleroma.Web.WebFingerTest do
assert data["subscribe_address"] == "https://gnusocial.de/main/ostatussub?profile={uri}"
end
+ test "it work for AP-only user" do
+ user = "kpherox@mstdn.jp"
+
+ {:ok, data} = WebFinger.finger(user)
+
+ assert data["magic_key"] == nil
+ assert data["salmon"] == nil
+
+ assert data["topic"] == "https://mstdn.jp/users/kPherox.atom"
+ assert data["subject"] == "acct:kPherox@mstdn.jp"
+ assert data["ap_id"] == "https://mstdn.jp/users/kPherox"
+ assert data["subscribe_address"] == "https://mstdn.jp/authorize_interaction?acct={uri}"
+ end
+
test "it works for friendica" do
user = "lain@squeet.me"
@@ -104,5 +123,16 @@ defmodule Pleroma.Web.WebFingerTest do
assert template == "http://status.alpicola.com/main/xrd?uri={uri}"
end
+
+ test "it works with idna domains as nickname" do
+ nickname = "lain@" <> to_string(:idna.encode("zetsubou.みんな"))
+
+ {:ok, _data} = WebFinger.finger(nickname)
+ end
+
+ test "it works with idna domains as link" do
+ ap_id = "https://" <> to_string(:idna.encode("zetsubou.みんな")) <> "/users/lain"
+ {:ok, _data} = WebFinger.finger(ap_id)
+ end
end
end
diff --git a/test/web/websub/websub_controller_test.exs b/test/web/websub/websub_controller_test.exs
index f79745d58..59cacbe68 100644
--- a/test/web/websub/websub_controller_test.exs
+++ b/test/web/websub/websub_controller_test.exs
@@ -9,6 +9,10 @@ defmodule Pleroma.Web.Websub.WebsubControllerTest do
alias Pleroma.Web.Websub
alias Pleroma.Web.Websub.WebsubClientSubscription
+ clear_config_all([:instance, :federating]) do
+ Pleroma.Config.put([:instance, :federating], true)
+ end
+
test "websub subscription request", %{conn: conn} do
user = insert(:user)