Skip to content

Instantly share code, notes, and snippets.

@LowriWilliams
Created May 20, 2020 09:59
Show Gist options
  • Save LowriWilliams/f16354cf8784091c9b93e3749ff2479a to your computer and use it in GitHub Desktop.
Save LowriWilliams/f16354cf8784091c9b93e3749ff2479a to your computer and use it in GitHub Desktop.
corona/map
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 245,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjUuMS9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjUuMS9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF9mOTk0YmI1OWYxZWY0N2YyYWZhOTIzYTEyNDc0ZmYxZSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwX2Y5OTRiYjU5ZjFlZjQ3ZjJhZmE5MjNhMTI0NzRmZjFlID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwX2Y5OTRiYjU5ZjFlZjQ3ZjJhZmE5MjNhMTI0NzRmZjFlIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFszMC42Mjk3NzM4MDg1NzE0MzIsIDYzLjIyMTU5NTIzNzg1NzE0XSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDIsCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl8yYWExMjY5YjA1OTU0OGI5ODNhMzdkZjEzOTAyODRiNSA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8vY2FydG9kYi1iYXNlbWFwcy17c30uZ2xvYmFsLnNzbC5mYXN0bHkubmV0L2RhcmtfYWxsL3t6fS97eH0ve3l9LnBuZyIsCiAgICAgICAgICAgICAgICB7ImF0dHJpYnV0aW9uIjogIlx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCJcdTAwM2VPcGVuU3RyZWV0TWFwXHUwMDNjL2FcdTAwM2UgY29udHJpYnV0b3JzIFx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly9jYXJ0b2RiLmNvbS9hdHRyaWJ1dGlvbnNcIlx1MDAzZUNhcnRvREJcdTAwM2MvYVx1MDAzZSwgQ2FydG9EQiBcdTAwM2NhIGhyZWYgPVwiaHR0cDovL2NhcnRvZGIuY29tL2F0dHJpYnV0aW9uc1wiXHUwMDNlYXR0cmlidXRpb25zXHUwMDNjL2FcdTAwM2UiLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMTgsICJtYXhab29tIjogMTgsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRhNGYwMGQwYzYxYjQ0YjRiZGIxNmUzMGQxOGViMDU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTI3LjAsIDEzMy4wXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjRkZDRTAwIiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNGRkNFMDAiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDMuODgsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzAxZmQ1ZTBmYjZhMjRlNzFiOTM1YWRkOTBiYWZhN2IxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83ZjIyNGNhZmQ1MzY0YTAxOGZmNzkxNzVhOWMyYzI3MCA9ICQoYDxkaXYgaWQ9Imh0bWxfN2YyMjRjYWZkNTM2NGEwMThmZjc5MTc1YTljMmMyNzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAxOTQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMDFmZDVlMGZiNmEyNGU3MWI5MzVhZGQ5MGJhZmE3YjEuc2V0Q29udGVudChodG1sXzdmMjI0Y2FmZDUzNjRhMDE4ZmY3OTE3NWE5YzJjMjcwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80YTRmMDBkMGM2MWI0NGI0YmRiMTZlMzBkMThlYjA1NS5iaW5kUG9wdXAocG9wdXBfMDFmZDVlMGZiNmEyNGU3MWI5MzVhZGQ5MGJhZmE3YjEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEwMWVhMjZkMTNiNjQ3YWNiZjBlMTZiNjNjNDUwMTg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTAuODMzMzMzMzMsIDQuMF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiIzAwNzg0OSIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjMDA3ODQ5IiwgImZpbGxPcGFjaXR5IjogMC4yLCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAwLjE2LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2Y5OTRiYjU5ZjFlZjQ3ZjJhZmE5MjNhMTI0NzRmZjFlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yNmFlMDY3ZGE1NmI0NTljYmU1NTFjZDZiYzNmMDNhMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNDk1MmU1NzJjZTQ3NGJmOGE4ZGRmODllMDZlNTVlZWUgPSAkKGA8ZGl2IGlkPSJodG1sXzQ5NTJlNTcyY2U0NzRiZjhhOGRkZjg5ZTA2ZTU1ZWVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48YnI+IENvbmZpcm1lZCBjYXNlczogODwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8yNmFlMDY3ZGE1NmI0NTljYmU1NTFjZDZiYzNmMDNhMi5zZXRDb250ZW50KGh0bWxfNDk1MmU1NzJjZTQ3NGJmOGE4ZGRmODllMDZlNTVlZWUpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzEwMWVhMjZkMTNiNjQ3YWNiZjBlMTZiNjNjNDUwMTg2LmJpbmRQb3B1cChwb3B1cF8yNmFlMDY3ZGE1NmI0NTljYmU1NTFjZDZiYzNmMDNhMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGVhMzBkZTI4Mjc0NDc5YTgwZDJhY2ZjYjVhMjY1YjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsxMy4wLCAxMDUuMF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiIzAwNzg0OSIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjMDA3ODQ5IiwgImZpbGxPcGFjaXR5IjogMC4yLCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAwLjMyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2Y5OTRiYjU5ZjFlZjQ3ZjJhZmE5MjNhMTI0NzRmZjFlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yYjE3MjJlNWE5ZDM0MDQxYjY3OGEyNjg4ZmI2MDgwNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMWRiM2NkODI1ZWNmNDA2M2E2NTZlMjUyNTMyYWU3NTYgPSAkKGA8ZGl2IGlkPSJodG1sXzFkYjNjZDgyNWVjZjQwNjNhNjU2ZTI1MjUzMmFlNzU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48YnI+IENvbmZpcm1lZCBjYXNlczogMTY8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmIxNzIyZTVhOWQzNDA0MWI2NzhhMjY4OGZiNjA4MDcuc2V0Q29udGVudChodG1sXzFkYjNjZDgyNWVjZjQwNjNhNjU2ZTI1MjUzMmFlNzU2KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8wZWEzMGRlMjgyNzQ0NzlhODBkMmFjZmNiNWEyNjViNS5iaW5kUG9wdXAocG9wdXBfMmIxNzIyZTVhOWQzNDA0MWI2NzhhMjY4OGZiNjA4MDcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiZmRjMDA2ZGM2MTQ0OTZiYjlkMWFiYjBlODI3YTA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNjAuMCwgLTk1LjBdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiMwMDc4NDkiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiIzAwNzg0OSIsICJmaWxsT3BhY2l0eSI6IDAuMiwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMS40NiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF9mOTk0YmI1OWYxZWY0N2YyYWZhOTIzYTEyNDc0ZmYxZSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWQzZTBlNWUzZmI0NGFmZmE2YTdlNDViNWRmMmNmYWQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2UwYmVmNDhiNzdkYTQ0MjBhYzFiNTc4ODA2MzFjMTVjID0gJChgPGRpdiBpZD0iaHRtbF9lMGJlZjQ4Yjc3ZGE0NDIwYWMxYjU3ODgwNjMxYzE1YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGJyPiBDb25maXJtZWQgY2FzZXM6IDczPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VkM2UwZTVlM2ZiNDRhZmZhNmE3ZTQ1YjVkZjJjZmFkLnNldENvbnRlbnQoaHRtbF9lMGJlZjQ4Yjc3ZGE0NDIwYWMxYjU3ODgwNjMxYzE1Yyk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfY2JmZGMwMDZkYzYxNDQ5NmJiOWQxYWJiMGU4MjdhMDQuYmluZFBvcHVwKHBvcHVwX2VkM2UwZTVlM2ZiNDRhZmZhNmE3ZTQ1YjVkZjJjZmFkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMGMzNjg2ZWMwZTQ0M2FhOGZhMGI1ZjNmN2IxNTVmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjAsIDEwNS4wXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjRTYzMDI5IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNFNjMwMjkiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDE0Ljg5NjIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzAzYjRiOGNiMTg1NjQxOTJhZGE1ZTAwZDYwOTU3OTgyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF81MmU5OWIyNTdjOWM0ZDA3YTUxMjExYjQyNmNhNGY0ZiA9ICQoYDxkaXYgaWQ9Imh0bWxfNTJlOTliMjU3YzljNGQwN2E1MTIxMWI0MjZjYTRmNGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAzNzI0MDU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMDNiNGI4Y2IxODU2NDE5MmFkYTVlMDBkNjA5NTc5ODIuc2V0Q29udGVudChodG1sXzUyZTk5YjI1N2M5YzRkMDdhNTEyMTFiNDI2Y2E0ZjRmKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9lMGMzNjg2ZWMwZTQ0M2FhOGZhMGI1ZjNmN2IxNTVmMi5iaW5kUG9wdXAocG9wdXBfMDNiNGI4Y2IxODU2NDE5MmFkYTVlMDBkNjA5NTc5ODIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YwNDkwODYwMTU0ZDQ1YTBhOGY3MDQyM2RjZDQ5ODZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNjQuMCwgMjYuMF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiIzAwNzg0OSIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjMDA3ODQ5IiwgImZpbGxPcGFjaXR5IjogMC4yLCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAwLjI4LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2Y5OTRiYjU5ZjFlZjQ3ZjJhZmE5MjNhMTI0NzRmZjFlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kNmRiYjJhOWI0ODQ0NTI1YTg1NWY2YmYxZTNkMDZmNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNjY4NjMxMDJmOWY3NGVmOWJlODg0M2RjYWE0YmM1ZDEgPSAkKGA8ZGl2IGlkPSJodG1sXzY2ODYzMTAyZjlmNzRlZjliZTg4NDNkY2FhNGJjNWQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48YnI+IENvbmZpcm1lZCBjYXNlczogMTQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDZkYmIyYTliNDg0NDUyNWE4NTVmNmJmMWUzZDA2ZjUuc2V0Q29udGVudChodG1sXzY2ODYzMTAyZjlmNzRlZjliZTg4NDNkY2FhNGJjNWQxKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9mMDQ5MDg2MDE1NGQ0NWEwYThmNzA0MjNkY2Q0OTg2Yi5iaW5kUG9wdXAocG9wdXBfZDZkYmIyYTliNDg0NDUyNWE4NTVmNmJmMWUzZDA2ZjUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMyOWEzZGE2ODJjMzQ4ZTY5MTM4ZWVhODhlNjFhYTFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDYuMCwgMi4wXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjRkZDRTAwIiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNGRkNFMDAiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDIuMzQsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2JhODFkZWMxMGMyOTQ1MTRhMmM5MDkyMDUzMTI3M2RlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8yMWRmOGQ4YTczNmM0ZmU5OTY3ZTIzYmZjNzgzNDI4OCA9ICQoYDxkaXYgaWQ9Imh0bWxfMjFkZjhkOGE3MzZjNGZlOTk2N2UyM2JmYzc4MzQyODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAxMTc8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYmE4MWRlYzEwYzI5NDUxNGEyYzkwOTIwNTMxMjczZGUuc2V0Q29udGVudChodG1sXzIxZGY4ZDhhNzM2YzRmZTk5NjdlMjNiZmM3ODM0Mjg4KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8zMjlhM2RhNjgyYzM0OGU2OTEzOGVlYTg4ZTYxYWExZS5iaW5kUG9wdXAocG9wdXBfYmE4MWRlYzEwYzI5NDUxNGEyYzkwOTIwNTMxMjczZGUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzZDhiNTQ4MmNlNDQyMjU5ZGMyMjFmYjFiMTMwMTU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuMCwgOS4wXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjRkZDRTAwIiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNGRkNFMDAiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDMuMTIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzRjZGE3N2U2ZTc4NTRmZGViM2U2NDI5OTAyZTI4ZWY0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF82OTBhNzI3NDA4N2Q0NDUyOGRkM2JhZTA3YmEyYThjNCA9ICQoYDxkaXYgaWQ9Imh0bWxfNjkwYTcyNzQwODdkNDQ1MjhkZDNiYWUwN2JhMmE4YzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAxNTY8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNGNkYTc3ZTZlNzg1NGZkZWIzZTY0Mjk5MDJlMjhlZjQuc2V0Q29udGVudChodG1sXzY5MGE3Mjc0MDg3ZDQ0NTI4ZGQzYmFlMDdiYTJhOGM0KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8yM2Q4YjU0ODJjZTQ0MjI1OWRjMjIxZmIxYjEzMDE1NS5iaW5kUG9wdXAocG9wdXBfNGNkYTc3ZTZlNzg1NGZkZWIzZTY0Mjk5MDJlMjhlZjQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwMjZjZTFhNjIyMjQ3N2M5MzcwNmUyMDkzNTZiMDVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMjIuMjY3LCAxMTQuMTg4XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjRkZDRTAwIiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNGRkNFMDAiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDYuOTgsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFmNTcwYTg2Mjg3ZTQxNTVhNjhiZTA2YTU5YTM0YjYzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mMjhiNTljN2UwM2I0NWRhYmVjMjQxYTc5OWZkNWZlNCA9ICQoYDxkaXYgaWQ9Imh0bWxfZjI4YjU5YzdlMDNiNDVkYWJlYzI0MWE3OTlmZDVmZTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAzNDk8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMWY1NzBhODYyODdlNDE1NWE2OGJlMDZhNTlhMzRiNjMuc2V0Q29udGVudChodG1sX2YyOGI1OWM3ZTAzYjQ1ZGFiZWMyNDFhNzk5ZmQ1ZmU0KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9jMDI2Y2UxYTYyMjI0NzdjOTM3MDZlMjA5MzU2YjA1YS5iaW5kUG9wdXAocG9wdXBfMWY1NzBhODYyODdlNDE1NWE2OGJlMDZhNTlhMzRiNjMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIxN2Y1ZWY1OTY0YTQzMGViYjkyZDU2MmRmMmQ0MzQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMjAuMCwgNzcuMF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiIzAwNzg0OSIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjMDA3ODQ5IiwgImZpbGxPcGFjaXR5IjogMC4yLCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAwLjY0LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2Y5OTRiYjU5ZjFlZjQ3ZjJhZmE5MjNhMTI0NzRmZjFlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mYWUwMjYxNzg5ZWU0OWMwOWJlNGJjN2YwYTMwNjNmNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYTY0NjFmNjc3YjI0NGY5MDgwYzA2NTE2MDIzYmRmZDIgPSAkKGA8ZGl2IGlkPSJodG1sX2E2NDYxZjY3N2IyNDRmOTA4MGMwNjUxNjAyM2JkZmQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48YnI+IENvbmZpcm1lZCBjYXNlczogMzI8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZmFlMDI2MTc4OWVlNDljMDliZTRiYzdmMGEzMDYzZjQuc2V0Q29udGVudChodG1sX2E2NDYxZjY3N2IyNDRmOTA4MGMwNjUxNjAyM2JkZmQyKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8yMTdmNWVmNTk2NGE0MzBlYmI5MmQ1NjJkZjJkNDM0OC5iaW5kUG9wdXAocG9wdXBfZmFlMDI2MTc4OWVlNDljMDliZTRiYzdmMGEzMDYzZjQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiOTBmNGY1NmYxMDRkNjBhYTIxNDUxMTI5MDNiNDQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuODMzMzMzMzMsIDEyLjgzMzMzMzMzXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjMDA3ODQ5IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiMwMDc4NDkiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDAuNjIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzgwNDFmNzdlMTg4NzQzZTlhMWRmN2I2NTE4MjY3ZWNmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8wZDBmZGMzYjlhYjQ0YzA5ODAxYTZkMmFlMDkzYTdlMyA9ICQoYDxkaXYgaWQ9Imh0bWxfMGQwZmRjM2I5YWI0NGMwOTgwMWE2ZDJhZTA5M2E3ZTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAzMTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF84MDQxZjc3ZTE4ODc0M2U5YTFkZjdiNjUxODI2N2VjZi5zZXRDb250ZW50KGh0bWxfMGQwZmRjM2I5YWI0NGMwOTgwMWE2ZDJhZTA5M2E3ZTMpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzZiOTBmNGY1NmYxMDRkNjBhYTIxNDUxMTI5MDNiNDQ3LmJpbmRQb3B1cChwb3B1cF84MDQxZjc3ZTE4ODc0M2U5YTFkZjdiNjUxODI2N2VjZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmUxYzFiYTFkY2YzNGZkOGFhNmI3ZTVjMjdiYTdkMmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4wLCAxMzguMF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI0ZGQ0UwMCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjRkZDRTAwIiwgImZpbGxPcGFjaXR5IjogMC4yLCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiA2Ljc2LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2Y5OTRiYjU5ZjFlZjQ3ZjJhZmE5MjNhMTI0NzRmZjFlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yMDg5OTRlOTA2MjM0NTgwODgxNTZkZDIwNGUwNTBjMCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYTkzYmRiZWYwNmU5NDc1MDhjZWZiOWIxZGQ2NWZjZDMgPSAkKGA8ZGl2IGlkPSJodG1sX2E5M2JkYmVmMDZlOTQ3NTA4Y2VmYjliMWRkNjVmY2QzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48YnI+IENvbmZpcm1lZCBjYXNlczogMzM4PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzIwODk5NGU5MDYyMzQ1ODA4ODE1NmRkMjA0ZTA1MGMwLnNldENvbnRlbnQoaHRtbF9hOTNiZGJlZjA2ZTk0NzUwOGNlZmI5YjFkZDY1ZmNkMyk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMmUxYzFiYTFkY2YzNGZkOGFhNmI3ZTVjMjdiYTdkMmQuYmluZFBvcHVwKHBvcHVwXzIwODk5NGU5MDYyMzQ1ODA4ODE1NmRkMjA0ZTA1MGMwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOWQ4MzUyZWVhOGM0ZTJjOWIwNzdhNzk2ZDdiZTE3YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzIyLjE2NjY2NjY2LCAxMTMuNTVdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNGRkNFMDAiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI0ZGQ0UwMCIsICJmaWxsT3BhY2l0eSI6IDAuMiwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMi45OCwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF9mOTk0YmI1OWYxZWY0N2YyYWZhOTIzYTEyNDc0ZmYxZSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOWY1YWQyNjY0ODA4NDk4YThjZDk5NTQ5OTc5NGI5NzMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2MzMTU1MWRhNzQyMjQwNzZiYzFkZmRhMGEyM2ViYmQ0ID0gJChgPGRpdiBpZD0iaHRtbF9jMzE1NTFkYTc0MjI0MDc2YmMxZGZkYTBhMjNlYmJkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGJyPiBDb25maXJtZWQgY2FzZXM6IDE0OTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85ZjVhZDI2NjQ4MDg0OThhOGNkOTk1NDk5Nzk0Yjk3My5zZXRDb250ZW50KGh0bWxfYzMxNTUxZGE3NDIyNDA3NmJjMWRmZGEwYTIzZWJiZDQpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2Y5ZDgzNTJlZWE4YzRlMmM5YjA3N2E3OTZkN2JlMTdhLmJpbmRQb3B1cChwb3B1cF85ZjVhZDI2NjQ4MDg0OThhOGNkOTk1NDk5Nzk0Yjk3MykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTRkMWRjZGQxNGEyNDA3NmJmNDUyNTBlMzRmYmZiYzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsyLjUsIDExMi41XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjRkZDRTAwIiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNGRkNFMDAiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDMuNjIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzdkY2M3NDEwYTU4NjQyMTZiODNkY2E4ZGZmZGJiMDViID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mODdmNGU5NmFiMjU0ZWNkOTUwN2E5NDBhNTljNzc4ZCA9ICQoYDxkaXYgaWQ9Imh0bWxfZjg3ZjRlOTZhYjI1NGVjZDk1MDdhOTQwYTU5Yzc3OGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAxODE8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfN2RjYzc0MTBhNTg2NDIxNmI4M2RjYThkZmZkYmIwNWIuc2V0Q29udGVudChodG1sX2Y4N2Y0ZTk2YWIyNTRlY2Q5NTA3YTk0MGE1OWM3NzhkKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8xNGQxZGNkZDE0YTI0MDc2YmY0NTI1MGUzNGZiZmJjMC5iaW5kUG9wdXAocG9wdXBfN2RjYzc0MTBhNTg2NDIxNmI4M2RjYThkZmZkYmIwNWIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4M2FjNjE4ZWZkNzQ5Nzg4MWIwMjg4NWU0YmZlODQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMjguMCwgODQuMF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiIzAwNzg0OSIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjMDA3ODQ5IiwgImZpbGxPcGFjaXR5IjogMC4yLCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAwLjM2LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2Y5OTRiYjU5ZjFlZjQ3ZjJhZmE5MjNhMTI0NzRmZjFlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yM2RjMWZmNzY1ZTU0NzYzOWI4MWI3YWFmM2U4ZjU1OSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfODkyMGM5MWIxNDZkNDYwZTgzNTMzM2E5ODE1MmY4ZDUgPSAkKGA8ZGl2IGlkPSJodG1sXzg5MjBjOTFiMTQ2ZDQ2MGU4MzUzMzNhOTgxNTJmOGQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48YnI+IENvbmZpcm1lZCBjYXNlczogMTg8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjNkYzFmZjc2NWU1NDc2MzliODFiN2FhZjNlOGY1NTkuc2V0Q29udGVudChodG1sXzg5MjBjOTFiMTQ2ZDQ2MGU4MzUzMzNhOTgxNTJmOGQ1KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8xODNhYzYxOGVmZDc0OTc4ODFiMDI4ODVlNGJmZTg0NC5iaW5kUG9wdXAocG9wdXBfMjNkYzFmZjc2NWU1NDc2MzliODFiN2FhZjNlOGY1NTkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlNWNjODEzODFmMzQyZTg5NzAwZmExZDI1MjczNmViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMTMuMCwgMTIyLjBdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiMwMDc4NDkiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiIzAwNzg0OSIsICJmaWxsT3BhY2l0eSI6IDAuMiwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMC41OCwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF9mOTk0YmI1OWYxZWY0N2YyYWZhOTIzYTEyNDc0ZmYxZSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjAyNDIzYmQ5ZDFmNGI0NGIxMjNmNjNjNzI4OWJkOWEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzQ1OTRlMGE1ODg3OTQ1N2E4ZDNmZTgxMGU0ODc0YTRhID0gJChgPGRpdiBpZD0iaHRtbF80NTk0ZTBhNTg4Nzk0NTdhOGQzZmU4MTBlNDg3NGE0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGJyPiBDb25maXJtZWQgY2FzZXM6IDI5PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2YwMjQyM2JkOWQxZjRiNDRiMTIzZjYzYzcyODliZDlhLnNldENvbnRlbnQoaHRtbF80NTk0ZTBhNTg4Nzk0NTdhOGQzZmU4MTBlNDg3NGE0YSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYmU1Y2M4MTM4MWYzNDJlODk3MDBmYTFkMjUyNzM2ZWIuYmluZFBvcHVwKHBvcHVwX2YwMjQyM2JkOWQxZjRiNDRiMTIzZjYzYzcyODliZDlhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYmQyZWRiMWI4NWE0OTZmOTA0Y2ZjMTgzNDgyY2IxNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzYwLjAsIDEwMC4wXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjMDA3ODQ5IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiMwMDc4NDkiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDAuNDgsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzhjNWZmNmM4MjlhZjRlNjE4ZTBlYzgwYzY5YjJhMGEzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jNWI0NjViODkyZmY0Yzg3OGI4YjNhNjg0YzJkOWYyNSA9ICQoYDxkaXYgaWQ9Imh0bWxfYzViNDY1Yjg5MmZmNGM4NzhiOGIzYTY4NGMyZDlmMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAyNDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF84YzVmZjZjODI5YWY0ZTYxOGUwZWM4MGM2OWIyYTBhMy5zZXRDb250ZW50KGh0bWxfYzViNDY1Yjg5MmZmNGM4NzhiOGIzYTY4NGMyZDlmMjUpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzJiZDJlZGIxYjg1YTQ5NmY5MDRjZmMxODM0ODJjYjE2LmJpbmRQb3B1cChwb3B1cF84YzVmZjZjODI5YWY0ZTYxOGUwZWM4MGM2OWIyYTBhMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTQ3NTE0OTgxNGJlNDkzZmE2ZjExZGVjZjU0NDAyNmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsxLjM2NjY2NjY2LCAxMDMuOF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI0ZGQ0UwMCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjRkZDRTAwIiwgImZpbGxPcGFjaXR5IjogMC4yLCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiA3Ljk2LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2Y5OTRiYjU5ZjFlZjQ3ZjJhZmE5MjNhMTI0NzRmZjFlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jZWVjNDNlMTQ4MmY0ODlmOTlmMWJhOTgxNDM2MmYyMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZTRlMmMxYzgwODYxNGQ4OWI4ZTRhYjliZjg3ZGMwZTUgPSAkKGA8ZGl2IGlkPSJodG1sX2U0ZTJjMWM4MDg2MTRkODliOGU0YWI5YmY4N2RjMGU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48YnI+IENvbmZpcm1lZCBjYXNlczogMzk4PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2NlZWM0M2UxNDgyZjQ4OWY5OWYxYmE5ODE0MzYyZjIzLnNldENvbnRlbnQoaHRtbF9lNGUyYzFjODA4NjE0ZDg5YjhlNGFiOWJmODdkYzBlNSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfOTQ3NTE0OTgxNGJlNDkzZmE2ZjExZGVjZjU0NDAyNmYuYmluZFBvcHVwKHBvcHVwX2NlZWM0M2UxNDgyZjQ4OWY5OWYxYmE5ODE0MzYyZjIzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNmRlMDZhOGYxNzY0YjQ0OWExYTI3NDRmNjU4ZTViMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjAsIDEyNy41XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjRkZDRTAwIiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNGRkNFMDAiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDUuNDYsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FlNWJjMzI1ZTNiYjQ3NWQ4MTgzZTE3MzNmMTU3ZDczID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83Y2Q5ZTA4YzcxN2I0ODQ2OTFlN2VlMGE4NzU4MjA2OCA9ICQoYDxkaXYgaWQ9Imh0bWxfN2NkOWUwOGM3MTdiNDg0NjkxZTdlZTBhODc1ODIwNjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAyNzM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWU1YmMzMjVlM2JiNDc1ZDgxODNlMTczM2YxNTdkNzMuc2V0Q29udGVudChodG1sXzdjZDllMDhjNzE3YjQ4NDY5MWU3ZWUwYTg3NTgyMDY4KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8xNmRlMDZhOGYxNzY0YjQ0OWExYTI3NDRmNjU4ZTViMC5iaW5kUG9wdXAocG9wdXBfYWU1YmMzMjVlM2JiNDc1ZDgxODNlMTczM2YxNTdkNzMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhNjUyMzhkNjYzNzQ1ZDg5MTRiNGZhN2UxMzBkNjBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuMCwgLTQuMF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiIzAwNzg0OSIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjMDA3ODQ5IiwgImZpbGxPcGFjaXR5IjogMC4yLCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAwLjMsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzc4MjVlYjU0NzhkNzQ1MTY4NzhhYWJkNWZjZDEyMWM5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF84Mzg3ZGRiMjU3MDY0ZjM2OWNjMTQ3NDA1ZWNmNjZjNyA9ICQoYDxkaXYgaWQ9Imh0bWxfODM4N2RkYjI1NzA2NGYzNjljYzE0NzQwNWVjZjY2YzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAxNTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF83ODI1ZWI1NDc4ZDc0NTE2ODc4YWFiZDVmY2QxMjFjOS5zZXRDb250ZW50KGh0bWxfODM4N2RkYjI1NzA2NGYzNjljYzE0NzQwNWVjZjY2YzcpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2JhNjUyMzhkNjYzNzQ1ZDg5MTRiNGZhN2UxMzBkNjBiLmJpbmRQb3B1cChwb3B1cF83ODI1ZWI1NDc4ZDc0NTE2ODc4YWFiZDVmY2QxMjFjOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDFkMGIzZTNiMTg3NDkyMjlkYjc2MWYwMGNkZDI4YTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs3LjAsIDgxLjBdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiMwMDc4NDkiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiIzAwNzg0OSIsICJmaWxsT3BhY2l0eSI6IDAuMiwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMC4zMiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF9mOTk0YmI1OWYxZWY0N2YyYWZhOTIzYTEyNDc0ZmYxZSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjEwMjhhNGUyNmU2NDU0YmJkMDk3N2FiNjYyOWVhMzQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzY2ZTMxMThiMjRjYTRiN2Q5OTQxZGU2MTAwZTgxOGU4ID0gJChgPGRpdiBpZD0iaHRtbF82NmUzMTE4YjI0Y2E0YjdkOTk0MWRlNjEwMGU4MThlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGJyPiBDb25maXJtZWQgY2FzZXM6IDE2PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2YxMDI4YTRlMjZlNjQ1NGJiZDA5NzdhYjY2MjllYTM0LnNldENvbnRlbnQoaHRtbF82NmUzMTE4YjI0Y2E0YjdkOTk0MWRlNjEwMGU4MThlOCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfZDFkMGIzZTNiMTg3NDkyMjlkYjc2MWYwMGNkZDI4YTUuYmluZFBvcHVwKHBvcHVwX2YxMDI4YTRlMjZlNjQ1NGJiZDA5NzdhYjY2MjllYTM0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YTM4MTlmMzViZjU0NjU3OWNhOThjZTU5NjcxZWFhNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzYyLjAsIDE1LjBdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiMwMDc4NDkiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiIzAwNzg0OSIsICJmaWxsT3BhY2l0eSI6IDAuMiwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMC4yNCwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF9mOTk0YmI1OWYxZWY0N2YyYWZhOTIzYTEyNDc0ZmYxZSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZmJlYTIzNmRhYjQwNGQ5NjlmOTM4NmQ2ZDBjZDZmMzAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzQxYTVjZjJjOGUxNDQ0MjQ4ZmQ5M2UwNDNjYWM2YzE5ID0gJChgPGRpdiBpZD0iaHRtbF80MWE1Y2YyYzhlMTQ0NDI0OGZkOTNlMDQzY2FjNmMxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGJyPiBDb25maXJtZWQgY2FzZXM6IDEyPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2ZiZWEyMzZkYWI0MDRkOTY5ZjkzODZkNmQwY2Q2ZjMwLnNldENvbnRlbnQoaHRtbF80MWE1Y2YyYzhlMTQ0NDI0OGZkOTNlMDQzY2FjNmMxOSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfOGEzODE5ZjM1YmY1NDY1NzljYTk4Y2U1OTY3MWVhYTQuYmluZFBvcHVwKHBvcHVwX2ZiZWEyMzZkYWI0MDRkOTY5ZjkzODZkNmQwY2Q2ZjMwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZTgyOWYzNzNjZmY0ZDg3YmZmOTA4YmNhZTRiZDAwZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzIzLjUsIDEyMS4wXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjRkZDRTAwIiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNGRkNFMDAiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDQuMTIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzljZDQwNmViNjQ0MzQ2YzFiZGU1NDMyOWUxOGY4NjczID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83ZjUwNjI0ZDZiMzk0YmU5YmI3ZjQ1ZDM4YmNkMzlhNiA9ICQoYDxkaXYgaWQ9Imh0bWxfN2Y1MDYyNGQ2YjM5NGJlOWJiN2Y0NWQzOGJjZDM5YTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAyMDY8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOWNkNDA2ZWI2NDQzNDZjMWJkZTU0MzI5ZTE4Zjg2NzMuc2V0Q29udGVudChodG1sXzdmNTA2MjRkNmIzOTRiZTliYjdmNDVkMzhiY2QzOWE2KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9iZTgyOWYzNzNjZmY0ZDg3YmZmOTA4YmNhZTRiZDAwZi5iaW5kUG9wdXAocG9wdXBfOWNkNDA2ZWI2NDQzNDZjMWJkZTU0MzI5ZTE4Zjg2NzMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZlOGEyOTAwODdhMTQzODk4MGEzM2Y3ZmI4MzUyZGY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMTUuMCwgMTAwLjBdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNGRkNFMDAiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI0ZGQ0UwMCIsICJmaWxsT3BhY2l0eSI6IDAuMiwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogNy42LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2Y5OTRiYjU5ZjFlZjQ3ZjJhZmE5MjNhMTI0NzRmZjFlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zMzgxMjI3YTNiMGE0YWY2ODk3NGRjYzljODk1NThlMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYTQ0ZDRlYzc4NWYxNDIzZWJmYjFhNTliMzc0ODUxOTcgPSAkKGA8ZGl2IGlkPSJodG1sX2E0NGQ0ZWM3ODVmMTQyM2ViZmIxYTU5YjM3NDg1MTk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij48YnI+IENvbmZpcm1lZCBjYXNlczogMzgwPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzMzODEyMjdhM2IwYTRhZjY4OTc0ZGNjOWM4OTU1OGUzLnNldENvbnRlbnQoaHRtbF9hNDRkNGVjNzg1ZjE0MjNlYmZiMWE1OWIzNzQ4NTE5Nyk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfZmU4YTI5MDA4N2ExNDM4OTgwYTMzZjdmYjgzNTJkZjguYmluZFBvcHVwKHBvcHVwXzMzODEyMjdhM2IwYTRhZjY4OTc0ZGNjOWM4OTU1OGUzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMmViODYzMTFlMGE0Y2RmOGE2MTZhNGYwMTNmYzY5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzI0LjAsIDU0LjBdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiMwMDc4NDkiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiIzAwNzg0OSIsICJmaWxsT3BhY2l0eSI6IDAuMiwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMS41MiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF9mOTk0YmI1OWYxZWY0N2YyYWZhOTIzYTEyNDc0ZmYxZSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTAyNjk5MDUxNGFiNDBkYWJhNDhlYmUwMzlhNDMyMjQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2U1NmM0NDM5ODhkMDRkYjZiNGY2MzhiMjczZTM0MDE2ID0gJChgPGRpdiBpZD0iaHRtbF9lNTZjNDQzOTg4ZDA0ZGI2YjRmNjM4YjI3M2UzNDAxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGJyPiBDb25maXJtZWQgY2FzZXM6IDc2PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2EwMjY5OTA1MTRhYjQwZGFiYTQ4ZWJlMDM5YTQzMjI0LnNldENvbnRlbnQoaHRtbF9lNTZjNDQzOTg4ZDA0ZGI2YjRmNjM4YjI3M2UzNDAxNik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMTJlYjg2MzExZTBhNGNkZjhhNjE2YTRmMDEzZmM2OTkuYmluZFBvcHVwKHBvcHVwX2EwMjY5OTA1MTRhYjQwZGFiYTQ4ZWJlMDM5YTQzMjI0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83Y2JiZjg4ZDIxMjc0YjdlYWUyMjc1NWE5OTE3MzAyNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzU0LjAsIC0yLjBdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiMwMDc4NDkiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiIzAwNzg0OSIsICJmaWxsT3BhY2l0eSI6IDAuMiwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMC43OCwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF9mOTk0YmI1OWYxZWY0N2YyYWZhOTIzYTEyNDc0ZmYxZSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYmRhMWViYzM3MzI1NDY1N2FhOTZhNjg0NTliNzE3MmIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzNlNGZhMDNhYWFjNzQ1YzA5MGM0YmIyNTRmNmIxNjI5ID0gJChgPGRpdiBpZD0iaHRtbF8zZTRmYTAzYWFhYzc0NWMwOTBjNGJiMjU0ZjZiMTYyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+PGJyPiBDb25maXJtZWQgY2FzZXM6IDM5PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2JkYTFlYmMzNzMyNTQ2NTdhYTk2YTY4NDU5YjcxNzJiLnNldENvbnRlbnQoaHRtbF8zZTRmYTAzYWFhYzc0NWMwOTBjNGJiMjU0ZjZiMTYyOSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfN2NiYmY4OGQyMTI3NGI3ZWFlMjI3NTVhOTkxNzMwMjUuYmluZFBvcHVwKHBvcHVwX2JkYTFlYmMzNzMyNTQ2NTdhYTk2YTY4NDU5YjcxNzJiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzkxMjZlOWQwYmE0ZTM1ODEyNzdkZjhkYzExY2NjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjAsIC05Ny4wXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjRkZDRTAwIiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNGRkNFMDAiLCAiZmlsbE9wYWNpdHkiOiAwLjIsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDMuMjQsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2E2MjlmYzUxZjY2YzQ3ZjA5NTc2MzBhY2JjNDg4MThhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8wZjFkM2Y1M2Q5NGY0YzBjYWExYzg2ODYwY2Q3M2Q2MSA9ICQoYDxkaXYgaWQ9Imh0bWxfMGYxZDNmNTNkOTRmNGMwY2FhMWM4Njg2MGNkNzNkNjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAxNjI8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTYyOWZjNTFmNjZjNDdmMDk1NzYzMGFjYmM0ODgxOGEuc2V0Q29udGVudChodG1sXzBmMWQzZjUzZDk0ZjRjMGNhYTFjODY4NjBjZDczZDYxKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl81YzkxMjZlOWQwYmE0ZTM1ODEyNzdkZjhkYzExY2NjOC5iaW5kUG9wdXAocG9wdXBfYTYyOWZjNTFmNjZjNDdmMDk1NzYzMGFjYmM0ODgxOGEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1MGIzYjgxMzA2ZTRhODNiNmZmMjAxYjBmMDAxMDc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMTYuMTY2NjY2NjYsIDEwNy44MzMzMzMzM10sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI0ZGQ0UwMCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjRkZDRTAwIiwgImZpbGxPcGFjaXR5IjogMC4yLCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLjYsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjk5NGJiNTlmMWVmNDdmMmFmYTkyM2ExMjQ3NGZmMWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFjZmRiMTBjYTYwZDRmZjZhYTBmZDFlNjZiY2YwNjc5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83NjgwMGFhOTBhMDY0OGQzYjZmM2YxOTcwY2NhODQzZiA9ICQoYDxkaXYgaWQ9Imh0bWxfNzY4MDBhYTkwYTA2NDhkM2I2ZjNmMTk3MGNjYTg0M2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjxicj4gQ29uZmlybWVkIGNhc2VzOiAxMzA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMWNmZGIxMGNhNjBkNGZmNmFhMGZkMWU2NmJjZjA2Nzkuc2V0Q29udGVudChodG1sXzc2ODAwYWE5MGEwNjQ4ZDNiNmYzZjE5NzBjY2E4NDNmKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80NTBiM2I4MTMwNmU0YTgzYjZmZjIwMWIwZjAwMTA3NS5iaW5kUG9wdXAocG9wdXBfMWNmZGIxMGNhNjBkNGZmNmFhMGZkMWU2NmJjZjA2NzkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x123068ef0>"
]
},
"execution_count": 245,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import folium\n",
"\n",
"# Select only countries with more than 0 cases\n",
"\n",
"df_country = df_country[df_country.Confirmed != 0]\n",
"\n",
"# Normalise data by dividing total number of cases in China with 25k and 50 for the remaining countries\n",
"\n",
"df_country['Normalise'] = np.where(df_country['Country'] == 'China', \n",
" df_country['Confirmed']/25000, \n",
" df_country['Confirmed']/50)\n",
"\n",
"# Creat folium map\n",
"\n",
"folium_map = folium.Map(location=[df_country['Lat'].mean(), df_country['Long'].mean()], \n",
" zoom_start = 2, \n",
" tiles = \"CartoDB dark_matter\")\n",
"\n",
"# Iterate over rows in dataframe\n",
"for index, row in df_country.iterrows():\n",
" popup_text = \"<br> Confirmed cases: {}\"\n",
" popup_text = popup_text.format(row[\"Confirmed\"])\n",
" \n",
" # Assign different colours to different numbers of confirmed cases\n",
" \n",
" if 1 <= row['Confirmed'] <= 100:\n",
" color = \"#007849\" # green\n",
" elif 101 <= row['Confirmed'] <= 500:\n",
" color = \"#FFCE00\" # yellow \n",
" else:\n",
" color = \"#E63029\" # red\n",
" \n",
" # Add marker to the map\n",
" folium.CircleMarker(location=(row[\"Lat\"], row[\"Long\"]),\n",
" radius=row[\"Normalise\"],\n",
" color= color,\n",
" popup=popup_text,\n",
" fill=True).add_to(folium_map)\n",
" \n",
"folium_map"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment