Git Product home page Git Product logo

dsc-2-17-10-folium-codealong's Introduction

Folium - Codealong

Introduction

In this codealong, we'll take a look at how to create an interactive map using the Folium package. From there, we'll return to APIs in the final lab for the day where you'll make an interactive map from your requests to the API!

Objectives

You will be able to:

  • Create maps with Folium

Creating a Basemap

Here we'll take a look at creating a basemap over the London region!

import folium

lat = 51.51
long = -0.14

#Create a map of the area
base_map = folium.Map([lat, long], zoom_start=13)
base_map
<iframe src="data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTEuNTEsLTAuMTRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzhiNzI5MzdlODc1NjRhN2ZhMjI1OTM1ZmYwNjA1NjY4ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAKPC9zY3JpcHQ+" style="position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>

Adding Markers to the Map

Great! Now let's take a look at adding little markers to our map!

Note: you may have to zoom out to see all of the markers!

import numpy as np

#Generate some random locations to add to our map
x = [lat + np.random.uniform(-.1,.1) for i in range(20)]
y = [long + np.random.uniform(-.1,.1) for i in range(20)]
points = list(zip(x, y))
for p in points:
    lat = p[0]
    long = p[1]
    marker = folium.Marker(location=[lat, long])
    marker.add_to(base_map)
base_map
<iframe src="data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTEuNTEsLTAuMTRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzhiNzI5MzdlODc1NjRhN2ZhMjI1OTM1ZmYwNjA1NjY4ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83NDg3OTY4YTkzMzI0MWQxYjc1ZDZkMjlmODliNTg1MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUzODYyMjU4NzY5Mzc0NCwtMC4yMjQyNzE3NjAwNDQwMDAwN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTBkMWYzOTZkMGQ3NDhiZGFmNDg2MjMzYmZhOWExZjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41OTg0NjM4OTIxOTQwOCwtMC4yMDAyNzIyNjYyNTg2OTI2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTQwZmJmNzcwOTc3NGVhZWE5MTFjMzAxNzI0ZDYwMTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41ODEwNDc3NDk3NDQ4NiwtMC4xMDI3MDY4NzcwMzA3MDQ5N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzI5N2YxOWFkOGQwNDhkYjg4ZjUxODUwYTdlOGM3YTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NzczNTA5OTg2NjU1OSwtMC4xMTE5ODQ3MTI3MDg5NzE5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDU3YTMwNTExNmZjNDIwNjg4YzBiOGI4ODVkY2UxZWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40MTU5NDkyMjg3ODMxMiwtMC4wNjM4MjE2NDA3NjQzODQ3MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTBiMTgzNGZhYTI0NGMzYWIwOGZlODFhNGFkOTYwMGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40NzM2NDg5Nzg2NDQ4NiwtMC4wODQ5NzQ4MTA3NDcxNjM4N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTU1NmU3MzQ2NjU5NDU3ZmE0NzZlMDVjNDA5ZGM2NTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MzUwMzc1NzU4MjM2OSwtMC4xMjA3Mjc2MDQyMDMwMTQyM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjNiZjM0YTZmMzU4NDc5Zjk0MDRmYTlhYmZkNWYxYTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS42MDMyOTUzNDcyNTA5MzUsLTAuMTIzMDYwNDQyMDE2Njg0NjJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzY3YWNmMDY3ZDE0NjQ4OGU5MTk1MGVkODAwM2NlOGJhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTQ1NTA3NTc4OTg0ODc1LC0wLjA3OTA0NjQ4MDc5MTQwMzU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84MjU0M2U0ZDc4NDU0NWM2OTFkOWNlMzFlZmQ3OTAyZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU1ODg5MDU2MzUwMjYyLC0wLjIzNTY5ODYzODk1OTM2NzYzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZWNhN2IzNjQ3ZDA0ZWM1OGFiNzQ2NTE1ZWYyOWJkZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ1NTgwNDE5NTU5NDAwNiwtMC4yMzAzNDM0MTQ0MDA2ODE5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWRiOGZkODU1OGJjNDYzMzg4MjgzYTc5YmNjZmUwN2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MjI2MDM0Mjg5MjU3NSwtMC4yMjUyNDM1OTY1NTI2NjU5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZjAxMzFmYmMxNzg0NjRhOGE1N2ZmMGZkZjNiNGFkMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQyODk2NTAwNjk1NDc1NSwtMC4yMzAyMDY0MTYxMzk0MzQzOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDRkYzZkNTRjMmYxNDBlOTgyNzI4YWZiNzA3Y2IwZjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NTM2MTE4MDM5Nzk1ODUsLTAuMTAwMzQ1OTE5NjkwMTY2OThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FkMGI1M2JlNGNlMTQxOWRiZWQzOWNlMWE3MTkxYzY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDIxMjQ0ODY5MjE2NDQsLTAuMjAxMDU4Njc4MTQwNTk1MjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZjZTI1YzI1MzA4NjQwY2I4NmU3YjY2NjE2NDM5MmQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDg2NDQ3NjE4NTA1MjgsLTAuMjI0MTQ3MDgyMzA4NjM0MjVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E5ZGY4ZGM5OTAwMjRlYTI4ZmQ4ZGY5ODMyMzUzN2IyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTQxNjgwOTU0MjkzNzI0LC0wLjA5MjA1OTYxMDUyODE0NDIxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZjJhYjEzMzBiZWQ0NzA3ODA3MTEwYmFjZmMwMDM2YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ2NjgwMDQzODcxMTMxLC0wLjE2NjcwMDAzNDM1ODI0OTE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMTBmYzE2OWZiMDI0MTdlOGJkN2FkN2E5NzJhZWJjYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU4MDA1ODM2OTU5OTMzLC0wLjEwMjEwOTE2MTYyMTY3NTg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lZjk3MjE0MzM0NDc0OGZhOTZkMTZmZDViYzMxZWYzMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQzMDM4NTMzNDQzOTA0NSwtMC4yMTQ0MzYxMjc3OTk2MDMwOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCjwvc2NyaXB0Pg==" style="position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>

Adding Pop-up Boxes to Our Markers

Often we may wish to not only place markers on the map, but to create interactive pop-ups which display information to that location. To do this, we can add a popup to our markers when adding them to the map!

for p in points:
    lat = p[0]
    long = p[1]
    popup_text = "Lattitude: {}, Longitude: {}".format(lat,long)
    popup = folium.Popup(popup_text, parse_html=True)
    marker = folium.Marker(location=[lat, long], popup=popup)
    marker.add_to(base_map)
base_map
<iframe src="data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTEuNTEsLTAuMTRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzhiNzI5MzdlODc1NjRhN2ZhMjI1OTM1ZmYwNjA1NjY4ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83NDg3OTY4YTkzMzI0MWQxYjc1ZDZkMjlmODliNTg1MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUzODYyMjU4NzY5Mzc0NCwtMC4yMjQyNzE3NjAwNDQwMDAwN10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTBkMWYzOTZkMGQ3NDhiZGFmNDg2MjMzYmZhOWExZjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41OTg0NjM4OTIxOTQwOCwtMC4yMDAyNzIyNjYyNTg2OTI2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTQwZmJmNzcwOTc3NGVhZWE5MTFjMzAxNzI0ZDYwMTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41ODEwNDc3NDk3NDQ4NiwtMC4xMDI3MDY4NzcwMzA3MDQ5N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzI5N2YxOWFkOGQwNDhkYjg4ZjUxODUwYTdlOGM3YTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NzczNTA5OTg2NjU1OSwtMC4xMTE5ODQ3MTI3MDg5NzE5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDU3YTMwNTExNmZjNDIwNjg4YzBiOGI4ODVkY2UxZWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40MTU5NDkyMjg3ODMxMiwtMC4wNjM4MjE2NDA3NjQzODQ3MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTBiMTgzNGZhYTI0NGMzYWIwOGZlODFhNGFkOTYwMGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40NzM2NDg5Nzg2NDQ4NiwtMC4wODQ5NzQ4MTA3NDcxNjM4N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTU1NmU3MzQ2NjU5NDU3ZmE0NzZlMDVjNDA5ZGM2NTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MzUwMzc1NzU4MjM2OSwtMC4xMjA3Mjc2MDQyMDMwMTQyM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjNiZjM0YTZmMzU4NDc5Zjk0MDRmYTlhYmZkNWYxYTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS42MDMyOTUzNDcyNTA5MzUsLTAuMTIzMDYwNDQyMDE2Njg0NjJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzY3YWNmMDY3ZDE0NjQ4OGU5MTk1MGVkODAwM2NlOGJhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTQ1NTA3NTc4OTg0ODc1LC0wLjA3OTA0NjQ4MDc5MTQwMzU2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84MjU0M2U0ZDc4NDU0NWM2OTFkOWNlMzFlZmQ3OTAyZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU1ODg5MDU2MzUwMjYyLC0wLjIzNTY5ODYzODk1OTM2NzYzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZWNhN2IzNjQ3ZDA0ZWM1OGFiNzQ2NTE1ZWYyOWJkZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ1NTgwNDE5NTU5NDAwNiwtMC4yMzAzNDM0MTQ0MDA2ODE5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWRiOGZkODU1OGJjNDYzMzg4MjgzYTc5YmNjZmUwN2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41MjI2MDM0Mjg5MjU3NSwtMC4yMjUyNDM1OTY1NTI2NjU5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZjAxMzFmYmMxNzg0NjRhOGE1N2ZmMGZkZjNiNGFkMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQyODk2NTAwNjk1NDc1NSwtMC4yMzAyMDY0MTYxMzk0MzQzOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDRkYzZkNTRjMmYxNDBlOTgyNzI4YWZiNzA3Y2IwZjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NTM2MTE4MDM5Nzk1ODUsLTAuMTAwMzQ1OTE5NjkwMTY2OThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FkMGI1M2JlNGNlMTQxOWRiZWQzOWNlMWE3MTkxYzY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDIxMjQ0ODY5MjE2NDQsLTAuMjAxMDU4Njc4MTQwNTk1MjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZjZTI1YzI1MzA4NjQwY2I4NmU3YjY2NjE2NDM5MmQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDg2NDQ3NjE4NTA1MjgsLTAuMjI0MTQ3MDgyMzA4NjM0MjVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E5ZGY4ZGM5OTAwMjRlYTI4ZmQ4ZGY5ODMyMzUzN2IyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTQxNjgwOTU0MjkzNzI0LC0wLjA5MjA1OTYxMDUyODE0NDIxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZjJhYjEzMzBiZWQ0NzA3ODA3MTEwYmFjZmMwMDM2YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ2NjgwMDQzODcxMTMxLC0wLjE2NjcwMDAzNDM1ODI0OTE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMTBmYzE2OWZiMDI0MTdlOGJkN2FkN2E5NzJhZWJjYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU4MDA1ODM2OTU5OTMzLC0wLjEwMjEwOTE2MTYyMTY3NTg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lZjk3MjE0MzM0NDc0OGZhOTZkMTZmZDViYzMxZWYzMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQzMDM4NTMzNDQzOTA0NSwtMC4yMTQ0MzYxMjc3OTk2MDMwOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWRkNTJiOTYxZDczNGYwOGJkNGI0YzgwZjlmZDljZWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41Mzg2MjI1ODc2OTM3NDQsLTAuMjI0MjcxNzYwMDQ0MDAwMDddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOGJkYzc5ZmFiNTg0MDIzOGU1ZDczNjk1ZWE2NjVjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMjFlNTMzOGFjYjY0ZmU3OGNkMzVmY2ZhYjM5MTE4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTIxZTUzMzhhY2I2NGZlNzhjZDM1ZmNmYWIzOTExODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhdHRpdHVkZTogNTEuNTM4NjIyNTg3NjkzNzQ0LCBMb25naXR1ZGU6IC0wLjIyNDI3MTc2MDA0NDAwMDA3PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yOGJkYzc5ZmFiNTg0MDIzOGU1ZDczNjk1ZWE2NjVjMC5zZXRDb250ZW50KGh0bWxfYTIxZTUzMzhhY2I2NGZlNzhjZDM1ZmNmYWIzOTExODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ZGQ1MmI5NjFkNzM0ZjA4YmQ0YjRjODBmOWZkOWNlZC5iaW5kUG9wdXAocG9wdXBfMjhiZGM3OWZhYjU4NDAyMzhlNWQ3MzY5NWVhNjY1YzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWY3YWEyY2Q0ODdlNDg3ZGI2MTQ5NTUyYjNmZWRlNjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41OTg0NjM4OTIxOTQwOCwtMC4yMDAyNzIyNjYyNTg2OTI2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBkMTY4OTI4OGJmZTRmYmE4ZmE1MGJlZGY1ZGRhN2Q2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1YzU2NmZlNWYzNTQxMWJiZTc4NzY1MWZmMmVhYmY2ID0gJCgnPGRpdiBpZD0iaHRtbF8wNWM1NjZmZTVmMzU0MTFiYmU3ODc2NTFmZjJlYWJmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF0dGl0dWRlOiA1MS41OTg0NjM4OTIxOTQwOCwgTG9uZ2l0dWRlOiAtMC4yMDAyNzIyNjYyNTg2OTI2ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGQxNjg5Mjg4YmZlNGZiYThmYTUwYmVkZjVkZGE3ZDYuc2V0Q29udGVudChodG1sXzA1YzU2NmZlNWYzNTQxMWJiZTc4NzY1MWZmMmVhYmY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWY3YWEyY2Q0ODdlNDg3ZGI2MTQ5NTUyYjNmZWRlNjkuYmluZFBvcHVwKHBvcHVwXzBkMTY4OTI4OGJmZTRmYmE4ZmE1MGJlZGY1ZGRhN2Q2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2MxNjlhOWJiYTU1ZTQwNzM5NGQwMWMwNDUzN2JiNDdjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTgxMDQ3NzQ5NzQ0ODYsLTAuMTAyNzA2ODc3MDMwNzA0OTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYTJjMzkxNjY0MjA0ZDBhYWFkYjgwOGNkN2I1MGI0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMGQzOWEyYjU5NTA0NmMxYWYwOTM0NDFmNWIwMDc0YSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTBkMzlhMmI1OTUwNDZjMWFmMDkzNDQxZjViMDA3NGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhdHRpdHVkZTogNTEuNTgxMDQ3NzQ5NzQ0ODYsIExvbmdpdHVkZTogLTAuMTAyNzA2ODc3MDMwNzA0OTc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZhMmMzOTE2NjQyMDRkMGFhYWRiODA4Y2Q3YjUwYjRmLnNldENvbnRlbnQoaHRtbF9hMGQzOWEyYjU5NTA0NmMxYWYwOTM0NDFmNWIwMDc0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MxNjlhOWJiYTU1ZTQwNzM5NGQwMWMwNDUzN2JiNDdjLmJpbmRQb3B1cChwb3B1cF9mYTJjMzkxNjY0MjA0ZDBhYWFkYjgwOGNkN2I1MGI0Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83YzRhNDU2OTI1ZTU0NTg5YjE4NzA4NTViZDFlZGM5MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU3NzM1MDk5ODY2NTU5LC0wLjExMTk4NDcxMjcwODk3MTk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWM2N2FjM2U1MTkzNDEwMmJiZTNjYWVhMmVkNmVkODcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQ3Y2U0ZDM0M2ViNDkxNzhkMzYwMmNjMTkwYzBhZWMgPSAkKCc8ZGl2IGlkPSJodG1sXzM0N2NlNGQzNDNlYjQ5MTc4ZDM2MDJjYzE5MGMwYWVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXR0aXR1ZGU6IDUxLjU3NzM1MDk5ODY2NTU5LCBMb25naXR1ZGU6IC0wLjExMTk4NDcxMjcwODk3MTk4PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYzY3YWMzZTUxOTM0MTAyYmJlM2NhZWEyZWQ2ZWQ4Ny5zZXRDb250ZW50KGh0bWxfMzQ3Y2U0ZDM0M2ViNDkxNzhkMzYwMmNjMTkwYzBhZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83YzRhNDU2OTI1ZTU0NTg5YjE4NzA4NTViZDFlZGM5MS5iaW5kUG9wdXAocG9wdXBfMWM2N2FjM2U1MTkzNDEwMmJiZTNjYWVhMmVkNmVkODcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWNhMTk2ODNmYjZjNDk0Y2FiNWZiYjQzNDIzNTA2OTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40MTU5NDkyMjg3ODMxMiwtMC4wNjM4MjE2NDA3NjQzODQ3MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIyYWVkNGI2NDQwODQ2Zjk5MDM0YzFjNDAzMzdkNDU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VjNWUyZmIzMDEzOTRkN2RhZWFmNTc3NzMxZmU5ZGFlID0gJCgnPGRpdiBpZD0iaHRtbF9lYzVlMmZiMzAxMzk0ZDdkYWVhZjU3NzczMWZlOWRhZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF0dGl0dWRlOiA1MS40MTU5NDkyMjg3ODMxMiwgTG9uZ2l0dWRlOiAtMC4wNjM4MjE2NDA3NjQzODQ3MTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjJhZWQ0YjY0NDA4NDZmOTkwMzRjMWM0MDMzN2Q0NTguc2V0Q29udGVudChodG1sX2VjNWUyZmIzMDEzOTRkN2RhZWFmNTc3NzMxZmU5ZGFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWNhMTk2ODNmYjZjNDk0Y2FiNWZiYjQzNDIzNTA2OTMuYmluZFBvcHVwKHBvcHVwXzIyYWVkNGI2NDQwODQ2Zjk5MDM0YzFjNDAzMzdkNDU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJlOWY2NjM4OWZhNzQ3ZGQ5MzJjOGZmNDljY2MzODU3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDczNjQ4OTc4NjQ0ODYsLTAuMDg0OTc0ODEwNzQ3MTYzODddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NWVkNDFiN2NhZjY0NjgwOWE2MWU3YmViMjI3OTliYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYjRkNzE3NDMxYTI0MDMwYjFlMzM1YTVjM2I5YmFlMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmI0ZDcxNzQzMWEyNDAzMGIxZTMzNWE1YzNiOWJhZTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhdHRpdHVkZTogNTEuNDczNjQ4OTc4NjQ0ODYsIExvbmdpdHVkZTogLTAuMDg0OTc0ODEwNzQ3MTYzODc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1ZWQ0MWI3Y2FmNjQ2ODA5YTYxZTdiZWIyMjc5OWJiLnNldENvbnRlbnQoaHRtbF9iYjRkNzE3NDMxYTI0MDMwYjFlMzM1YTVjM2I5YmFlMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJlOWY2NjM4OWZhNzQ3ZGQ5MzJjOGZmNDljY2MzODU3LmJpbmRQb3B1cChwb3B1cF81NWVkNDFiN2NhZjY0NjgwOWE2MWU3YmViMjI3OTliYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zNjdjYzBiNDcwOTg0OGFkYWM0ODVkN2Y3ZjkxYWFiYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjUzNTAzNzU3NTgyMzY5LC0wLjEyMDcyNzYwNDIwMzAxNDIzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjE3YzlkNzU0YWM3NGI4M2EyMWQxMDQyNDFjNTM1MTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmY4ODBiNWExNGFkNDhmNTk2MjJjOTUzOTBkZjBmODIgPSAkKCc8ZGl2IGlkPSJodG1sXzZmODgwYjVhMTRhZDQ4ZjU5NjIyYzk1MzkwZGYwZjgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXR0aXR1ZGU6IDUxLjUzNTAzNzU3NTgyMzY5LCBMb25naXR1ZGU6IC0wLjEyMDcyNzYwNDIwMzAxNDIzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMTdjOWQ3NTRhYzc0YjgzYTIxZDEwNDI0MWM1MzUxNi5zZXRDb250ZW50KGh0bWxfNmY4ODBiNWExNGFkNDhmNTk2MjJjOTUzOTBkZjBmODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zNjdjYzBiNDcwOTg0OGFkYWM0ODVkN2Y3ZjkxYWFiYy5iaW5kUG9wdXAocG9wdXBfMjE3YzlkNzU0YWM3NGI4M2EyMWQxMDQyNDFjNTM1MTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2RhYmU3NTQ4MGU0NDVkZGFlMDQ5YzU2ZTVhMDEyNjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS42MDMyOTUzNDcyNTA5MzUsLTAuMTIzMDYwNDQyMDE2Njg0NjJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOTQyNDEyN2JiZGU0YTllOGE5ZDA4ODFmYmMzZmY1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODcwMDk5ZTgxYTA0OGVlYjQzNjNlNGZmZDUwZGZiNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTg3MDA5OWU4MWEwNDhlZWI0MzYzZTRmZmQ1MGRmYjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhdHRpdHVkZTogNTEuNjAzMjk1MzQ3MjUwOTM1LCBMb25naXR1ZGU6IC0wLjEyMzA2MDQ0MjAxNjY4NDYyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOTQyNDEyN2JiZGU0YTllOGE5ZDA4ODFmYmMzZmY1Yy5zZXRDb250ZW50KGh0bWxfZTg3MDA5OWU4MWEwNDhlZWI0MzYzZTRmZmQ1MGRmYjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83ZGFiZTc1NDgwZTQ0NWRkYWUwNDljNTZlNWEwMTI2Mi5iaW5kUG9wdXAocG9wdXBfZTk0MjQxMjdiYmRlNGE5ZThhOWQwODgxZmJjM2ZmNWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2I0MTk3YjUwM2Q5NDMxYmFjNDkxNDVmN2IxMmFmOTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NDU1MDc1Nzg5ODQ4NzUsLTAuMDc5MDQ2NDgwNzkxNDAzNTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NzIyM2Y2MGU2MTY0MmRkYTVmNzIzZDY4MmUzZjc5ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNzJkMzU2NTYwZDE0ZTRhODZlMjI0YTA1N2MwM2ExMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzcyZDM1NjU2MGQxNGU0YTg2ZTIyNGEwNTdjMDNhMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhdHRpdHVkZTogNTEuNTQ1NTA3NTc4OTg0ODc1LCBMb25naXR1ZGU6IC0wLjA3OTA0NjQ4MDc5MTQwMzU2PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NzIyM2Y2MGU2MTY0MmRkYTVmNzIzZDY4MmUzZjc5ZS5zZXRDb250ZW50KGh0bWxfYzcyZDM1NjU2MGQxNGU0YTg2ZTIyNGEwNTdjMDNhMTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zYjQxOTdiNTAzZDk0MzFiYWM0OTE0NWY3YjEyYWY5Ni5iaW5kUG9wdXAocG9wdXBfNzcyMjNmNjBlNjE2NDJkZGE1ZjcyM2Q2ODJlM2Y3OWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzI2MTVlYWRhNDRmNDdiZTk2MjEyZmQ0NzdkM2UxYmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NTg4OTA1NjM1MDI2MiwtMC4yMzU2OTg2Mzg5NTkzNjc2M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzZjVkOTZhMDg1ZjQxMGM4MzlhZTdkMDRlN2MxZGQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ViYjI2NWQwODBmYzRiNjdiMTc3OWU2M2ExOWY1MTgyID0gJCgnPGRpdiBpZD0iaHRtbF9lYmIyNjVkMDgwZmM0YjY3YjE3NzllNjNhMTlmNTE4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF0dGl0dWRlOiA1MS41NTg4OTA1NjM1MDI2MiwgTG9uZ2l0dWRlOiAtMC4yMzU2OTg2Mzg5NTkzNjc2MzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDNmNWQ5NmEwODVmNDEwYzgzOWFlN2QwNGU3YzFkZDMuc2V0Q29udGVudChodG1sX2ViYjI2NWQwODBmYzRiNjdiMTc3OWU2M2ExOWY1MTgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzI2MTVlYWRhNDRmNDdiZTk2MjEyZmQ0NzdkM2UxYmEuYmluZFBvcHVwKHBvcHVwXzQzZjVkOTZhMDg1ZjQxMGM4MzlhZTdkMDRlN2MxZGQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZlNjg2MDU5ZmFjODQ1MTliYjcxYTc3MzFiODBkOWNhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDU1ODA0MTk1NTk0MDA2LC0wLjIzMDM0MzQxNDQwMDY4MTk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWM3NzFkMmQyMmIyNGFkOGI4ODg1OWQ5OWI4NmU5MmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjdiN2UyOTFhYWM0NDFmNzk4NzljYzQ4OGQzZDJiMTcgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3YjdlMjkxYWFjNDQxZjc5ODc5Y2M0ODhkM2QyYjE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXR0aXR1ZGU6IDUxLjQ1NTgwNDE5NTU5NDAwNiwgTG9uZ2l0dWRlOiAtMC4yMzAzNDM0MTQ0MDA2ODE5ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWM3NzFkMmQyMmIyNGFkOGI4ODg1OWQ5OWI4NmU5MmYuc2V0Q29udGVudChodG1sX2Y3YjdlMjkxYWFjNDQxZjc5ODc5Y2M0ODhkM2QyYjE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmU2ODYwNTlmYWM4NDUxOWJiNzFhNzczMWI4MGQ5Y2EuYmluZFBvcHVwKHBvcHVwXzVjNzcxZDJkMjJiMjRhZDhiODg4NTlkOTliODZlOTJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2MwMGJmYWRkMmE2YTQ2NmZhMWE5NmVlZTkxNzEyM2M4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNTIyNjAzNDI4OTI1NzUsLTAuMjI1MjQzNTk2NTUyNjY1OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyN2ZiMzkyMTdjZjQ0OWNhNWExYmRhNmNlZjIwMjA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzNTdhZDRkNjM2OTRjNzFhNTE3NWQ0ZTNmYWQxYzE4ID0gJCgnPGRpdiBpZD0iaHRtbF8wMzU3YWQ0ZDYzNjk0YzcxYTUxNzVkNGUzZmFkMWMxOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF0dGl0dWRlOiA1MS41MjI2MDM0Mjg5MjU3NSwgTG9uZ2l0dWRlOiAtMC4yMjUyNDM1OTY1NTI2NjU5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMjdmYjM5MjE3Y2Y0NDljYTVhMWJkYTZjZWYyMDIwOS5zZXRDb250ZW50KGh0bWxfMDM1N2FkNGQ2MzY5NGM3MWE1MTc1ZDRlM2ZhZDFjMTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jMDBiZmFkZDJhNmE0NjZmYTFhOTZlZWU5MTcxMjNjOC5iaW5kUG9wdXAocG9wdXBfMzI3ZmIzOTIxN2NmNDQ5Y2E1YTFiZGE2Y2VmMjAyMDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTNiNDYyZDQ4ZmI0NDkzNThiZjhmODNjMjRhMzdkYTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40Mjg5NjUwMDY5NTQ3NTUsLTAuMjMwMjA2NDE2MTM5NDM0MzhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYjJhNGZhZjQzNjc0NWJiOWM2NzMzNjNiODMwODhjYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMDVlMjNhMjFkNmQ0MjM4ODZlOWNiYmU4OWRmMzk4OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTA1ZTIzYTIxZDZkNDIzODg2ZTljYmJlODlkZjM5ODkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhdHRpdHVkZTogNTEuNDI4OTY1MDA2OTU0NzU1LCBMb25naXR1ZGU6IC0wLjIzMDIwNjQxNjEzOTQzNDM4PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYjJhNGZhZjQzNjc0NWJiOWM2NzMzNjNiODMwODhjYy5zZXRDb250ZW50KGh0bWxfYTA1ZTIzYTIxZDZkNDIzODg2ZTljYmJlODlkZjM5ODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xM2I0NjJkNDhmYjQ0OTM1OGJmOGY4M2MyNGEzN2RhNy5iaW5kUG9wdXAocG9wdXBfYWIyYTRmYWY0MzY3NDViYjljNjczMzYzYjgzMDg4Y2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjhkNTI0NjQ4N2EyNGM2Yzk2ZTYyZDU1ZmU5Y2NjYmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41NTM2MTE4MDM5Nzk1ODUsLTAuMTAwMzQ1OTE5NjkwMTY2OThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NWVlNzNhYjY4YzI0MmQyOWI1MDQ0YjFkMWE0NDcwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NjhiOTQ3NmJkNTQ0ODM5YWY4MGU4ODhmYzkwYjI4MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzY4Yjk0NzZiZDU0NDgzOWFmODBlODg4ZmM5MGIyODAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhdHRpdHVkZTogNTEuNTUzNjExODAzOTc5NTg1LCBMb25naXR1ZGU6IC0wLjEwMDM0NTkxOTY5MDE2Njk4PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NWVlNzNhYjY4YzI0MmQyOWI1MDQ0YjFkMWE0NDcwYS5zZXRDb250ZW50KGh0bWxfNzY4Yjk0NzZiZDU0NDgzOWFmODBlODg4ZmM5MGIyODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mOGQ1MjQ2NDg3YTI0YzZjOTZlNjJkNTVmZTljY2NiYy5iaW5kUG9wdXAocG9wdXBfNjVlZTczYWI2OGMyNDJkMjliNTA0NGIxZDFhNDQ3MGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjM4Yzg5ZWFiMDQ0NDlkZDg5NjRhYWFmMzIxN2JiMmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS40MjEyNDQ4NjkyMTY0NCwtMC4yMDEwNTg2NzgxNDA1OTUyOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZhNWNmYTZhMDBjYjQ4NWY4M2NhYmIxYjE2YTM3NDFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkxOGZiNDIzZTI0ZDQzNTI5ODBiYWU4MzlkMDc5ZTIxID0gJCgnPGRpdiBpZD0iaHRtbF85MThmYjQyM2UyNGQ0MzUyOTgwYmFlODM5ZDA3OWUyMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF0dGl0dWRlOiA1MS40MjEyNDQ4NjkyMTY0NCwgTG9uZ2l0dWRlOiAtMC4yMDEwNTg2NzgxNDA1OTUyODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmE1Y2ZhNmEwMGNiNDg1ZjgzY2FiYjFiMTZhMzc0MWYuc2V0Q29udGVudChodG1sXzkxOGZiNDIzZTI0ZDQzNTI5ODBiYWU4MzlkMDc5ZTIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjM4Yzg5ZWFiMDQ0NDlkZDg5NjRhYWFmMzIxN2JiMmQuYmluZFBvcHVwKHBvcHVwX2ZhNWNmYTZhMDBjYjQ4NWY4M2NhYmIxYjE2YTM3NDFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2IxYWI1NmY1MDk1MDRiODRhM2I4MzI0NTBlYzVmOWZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDg2NDQ3NjE4NTA1MjgsLTAuMjI0MTQ3MDgyMzA4NjM0MjVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF83Y2Q2Mzk4YzljZjA0NGYxYTA3ZmI3ZGNkMGNlMDNiNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NmQ0YmRjN2ZmMjE0MDI5ODRhMzUxYjIwNGY3NDUyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZTBiMTdkYjczMDU0NjcxYmFhMWYwOWRlY2NlYWQzYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYmUwYjE3ZGI3MzA1NDY3MWJhYTFmMDlkZWNjZWFkM2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhdHRpdHVkZTogNTEuNDg2NDQ3NjE4NTA1MjgsIExvbmdpdHVkZTogLTAuMjI0MTQ3MDgyMzA4NjM0MjU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk2ZDRiZGM3ZmYyMTQwMjk4NGEzNTFiMjA0Zjc0NTIyLnNldENvbnRlbnQoaHRtbF9iZTBiMTdkYjczMDU0NjcxYmFhMWYwOWRlY2NlYWQzYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IxYWI1NmY1MDk1MDRiODRhM2I4MzI0NTBlYzVmOWZiLmJpbmRQb3B1cChwb3B1cF85NmQ0YmRjN2ZmMjE0MDI5ODRhMzUxYjIwNGY3NDUyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yYzk1OWJkNDhhZjI0YThmOWVkMjYyZDE2MWI4NmM4NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjU0MTY4MDk1NDI5MzcyNCwtMC4wOTIwNTk2MTA1MjgxNDQyMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhYTc4OWU4NzgwNzQ0Y2VhMTBjYjdiNjk2OWQwZDM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4MzFhMjEwOGE5YTQxNjU5NzBkYzRiOTBiYTJmNjBlID0gJCgnPGRpdiBpZD0iaHRtbF84ODMxYTIxMDhhOWE0MTY1OTcwZGM0YjkwYmEyZjYwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF0dGl0dWRlOiA1MS41NDE2ODA5NTQyOTM3MjQsIExvbmdpdHVkZTogLTAuMDkyMDU5NjEwNTI4MTQ0MjE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RhYTc4OWU4NzgwNzQ0Y2VhMTBjYjdiNjk2OWQwZDM4LnNldENvbnRlbnQoaHRtbF84ODMxYTIxMDhhOWE0MTY1OTcwZGM0YjkwYmEyZjYwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJjOTU5YmQ0OGFmMjRhOGY5ZWQyNjJkMTYxYjg2Yzg2LmJpbmRQb3B1cChwb3B1cF9kYWE3ODllODc4MDc0NGNlYTEwY2I3YjY5NjlkMGQzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNTlmMjJjYzMxYjY0MjZjOTFlNjA3MTQ0ZTkwZGRmNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUxLjQ2NjgwMDQzODcxMTMxLC0wLjE2NjcwMDAzNDM1ODI0OTE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGFhMzIwM2JjNTllNGE4NmJlNjE5MWUyOTg5YjYzZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTE4MDZkZTRiNjQ2NGQ5NWIxNTA4ZWI0OWViZjkwYjEgPSAkKCc8ZGl2IGlkPSJodG1sX2UxODA2ZGU0YjY0NjRkOTViMTUwOGViNDllYmY5MGIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXR0aXR1ZGU6IDUxLjQ2NjgwMDQzODcxMTMxLCBMb25naXR1ZGU6IC0wLjE2NjcwMDAzNDM1ODI0OTE1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYWEzMjAzYmM1OWU0YTg2YmU2MTkxZTI5ODliNjNmNS5zZXRDb250ZW50KGh0bWxfZTE4MDZkZTRiNjQ2NGQ5NWIxNTA4ZWI0OWViZjkwYjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yNTlmMjJjYzMxYjY0MjZjOTFlNjA3MTQ0ZTkwZGRmNy5iaW5kUG9wdXAocG9wdXBfZGFhMzIwM2JjNTllNGE4NmJlNjE5MWUyOTg5YjYzZjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGIxZGRhODhhYjZiNGVkMWI2MzExYmUwODY0ZDdiYTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1MS41ODAwNTgzNjk1OTkzMywtMC4xMDIxMDkxNjE2MjE2NzU4NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzdjZDYzOThjOWNmMDQ0ZjFhMDdmYjdkY2QwY2UwM2I0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiMjQ5ZjcyYTYxMDRmYjU4M2VmOWJiMTJjNDM5ZDViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyZWUwM2FiYjNmODRlNmFhZWQ1Y2I3MDI2MmMyZWVmID0gJCgnPGRpdiBpZD0iaHRtbF80MmVlMDNhYmIzZjg0ZTZhYWVkNWNiNzAyNjJjMmVlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF0dGl0dWRlOiA1MS41ODAwNTgzNjk1OTkzMywgTG9uZ2l0dWRlOiAtMC4xMDIxMDkxNjE2MjE2NzU4NTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGIyNDlmNzJhNjEwNGZiNTgzZWY5YmIxMmM0MzlkNWIuc2V0Q29udGVudChodG1sXzQyZWUwM2FiYjNmODRlNmFhZWQ1Y2I3MDI2MmMyZWVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGIxZGRhODhhYjZiNGVkMWI2MzExYmUwODY0ZDdiYTAuYmluZFBvcHVwKHBvcHVwXzhiMjQ5ZjcyYTYxMDRmYjU4M2VmOWJiMTJjNDM5ZDViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzc2ODRhNzQ4ZjdjYjRkOWFhZWQ3MGYyYjQ0NTY5M2E4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTEuNDMwMzg1MzM0NDM5MDQ1LC0wLjIxNDQzNjEyNzc5OTYwMzA4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfN2NkNjM5OGM5Y2YwNDRmMWEwN2ZiN2RjZDBjZTAzYjQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2FmMTdjZjAxOTg3NDdhOGI1NTNkY2NhZjkwMThlNTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGMyZjU0NDU1MTkyNDdjZGJhNDUwYzdkOTVlY2I0YWUgPSAkKCc8ZGl2IGlkPSJodG1sXzRjMmY1NDQ1NTE5MjQ3Y2RiYTQ1MGM3ZDk1ZWNiNGFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXR0aXR1ZGU6IDUxLjQzMDM4NTMzNDQzOTA0NSwgTG9uZ2l0dWRlOiAtMC4yMTQ0MzYxMjc3OTk2MDMwODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2FmMTdjZjAxOTg3NDdhOGI1NTNkY2NhZjkwMThlNTYuc2V0Q29udGVudChodG1sXzRjMmY1NDQ1NTE5MjQ3Y2RiYTQ1MGM3ZDk1ZWNiNGFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzY4NGE3NDhmN2NiNGQ5YWFlZDcwZjJiNDQ1NjkzYTguYmluZFBvcHVwKHBvcHVwX2NhZjE3Y2YwMTk4NzQ3YThiNTUzZGNjYWY5MDE4ZTU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=" style="position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>

Now, if you click on the map markers, you should see a little information box pop up!

Summary

In this codealong, we learned how to use Folium to create some cool interactive maps with only a few lines of python code! In the next lab, you'll synthesize your skills for the day together and create an interactive visualization map for data you retrieve from the Yelp API!

dsc-2-17-10-folium-codealong's People

Contributors

mathymitchell avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.