Skip to content

Instantly share code, notes, and snippets.

@karussell
Created July 28, 2020 13:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save karussell/19f43e0bdd920b4e97ac57196d5ca038 to your computer and use it in GitHub Desktop.
Save karussell/19f43e0bdd920b4e97ac57196d5ca038 to your computer and use it in GitHub Desktop.
routing api via jupyter
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Jupyter Notebook for the Routing API\n",
"\n",
"This is an example usage for python using the [Routing API](https://docs.graphhopper.com/#tag/Routing-API).\n",
"\n",
"You can install the open source GraphHopper routing engine [locally](https://github.com/graphhopper/graphhopper) and replace the route_url with\n",
"```\n",
"route_url = 'http://localhost:8989/route?\n",
"```\n",
"\n",
"or set your own API key (get it [here](https://graphhopper.com/dashboard)):"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"key=\"YOUR-KEY\"\n",
"route_url = 'https://graphhopper.com/api/1/route?key=' + key"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"import folium # https://python-visualization.github.io/folium/\n",
"\n",
"def latlon ( point_arr ): return [point_arr[1],point_arr[0]]\n",
"def plot_route ( map, start, end, geojson, name, color ): \n",
" def style_function(feature):\n",
" return { 'opacity': 0.5, 'weight': 5, 'color': color }\n",
" m = folium.Map(location=start, zoom_start=12)\n",
" folium.Marker(location=latlon(start), popup='start', icon=folium.Icon(color='green')).add_to(map)\n",
" folium.Marker(location=latlon(end), popup='end', icon=folium.Icon(color='red')).add_to(map)\n",
" folium.GeoJson(geojson, name=name, style_function=style_function).add_to(map)\n",
" # folium.Choropleth(geo_data=geojson, name=name, line_color=color).add_to(m)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot simple route with a green start marker and a red destination marker"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF81OGE5ZjE2YTEyYWM0NWRlYTNlMmY0MDkxMTUwNGQzZSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfNThhOWYxNmExMmFjNDVkZWEzZTJmNDA5MTE1MDRkM2UiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwXzU4YTlmMTZhMTJhYzQ1ZGVhM2UyZjQwOTExNTA0ZDNlID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwXzU4YTlmMTZhMTJhYzQ1ZGVhM2UyZjQwOTExNTA0ZDNlIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFs1Mi40OTUzMjMsIDEzLjM4NDA5NF0sCiAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBwcmVmZXJDYW52YXM6IGZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgCgogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2EzNDRmZWIzY2Y2OTQ3YTk4NzhjYTFhOGI0MmFmNzczID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJEYXRhIGJ5IFx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly9vcGVuc3RyZWV0bWFwLm9yZ1wiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlLCB1bmRlciBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT0RiTFx1MDAzYy9hXHUwMDNlLiIsICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwgIm1heE5hdGl2ZVpvb20iOiAxOCwgIm1heFpvb20iOiAxOCwgIm1pblpvb20iOiAwLCAibm9XcmFwIjogZmFsc2UsICJvcGFjaXR5IjogMSwgInN1YmRvbWFpbnMiOiAiYWJjIiwgInRtcyI6IGZhbHNlfQogICAgICAgICAgICApLmFkZFRvKG1hcF81OGE5ZjE2YTEyYWM0NWRlYTNlMmY0MDkxMTUwNGQzZSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hZDc0YzAwNGYzMDQ0YWM1OTUzM2IwNGIzNGJjMDZhNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjQ5NTMyMywgMTMuMzg0MDk0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzU4YTlmMTZhMTJhYzQ1ZGVhM2UyZjQwOTExNTA0ZDNlKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9hOWNkYjRmZWJiZDI0NWIwYTliNjQ0YTBhODgzMTM1NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiaW5mby1zaWduIiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJncmVlbiIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2FkNzRjMDA0ZjMwNDRhYzU5NTMzYjA0YjM0YmMwNmE3LnNldEljb24oaWNvbl9hOWNkYjRmZWJiZDI0NWIwYTliNjQ0YTBhODgzMTM1NCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjJhYmY5YTAwMDI1NDJmZmJjNTExZmExODE0YjM1ZjMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzg5NzBkOTdiNDY0NjQ2ZjU4MWFjNGJkMzc5NmRjMWI3ID0gJChgPGRpdiBpZD0iaHRtbF84OTcwZDk3YjQ2NDY0NmY1ODFhYzRiZDM3OTZkYzFiNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c3RhcnQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYjJhYmY5YTAwMDI1NDJmZmJjNTExZmExODE0YjM1ZjMuc2V0Q29udGVudChodG1sXzg5NzBkOTdiNDY0NjQ2ZjU4MWFjNGJkMzc5NmRjMWI3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2FkNzRjMDA0ZjMwNDRhYzU5NTMzYjA0YjM0YmMwNmE3LmJpbmRQb3B1cChwb3B1cF9iMmFiZjlhMDAwMjU0MmZmYmM1MTFmYTE4MTRiMzVmMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZTM0OWFhY2Q3ZDY0ZDU1OTZhODVmM2Q0NmNkN2NmYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjUyMTIzNSwgMTMuNDQ3OTUyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzU4YTlmMTZhMTJhYzQ1ZGVhM2UyZjQwOTExNTA0ZDNlKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8yZmNiNDc3YjI0ZDc0ZjFjYjAzY2Y1NzAwMjc3YmJlZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiaW5mby1zaWduIiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl8zZTM0OWFhY2Q3ZDY0ZDU1OTZhODVmM2Q0NmNkN2NmYS5zZXRJY29uKGljb25fMmZjYjQ3N2IyNGQ3NGYxY2IwM2NmNTcwMDI3N2JiZWQpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzU3MDZjM2E0NmQ2MTQ0MjliMGQzZWI0ZjhlMDIxZjA4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9hMmE4YTRmMjNlM2M0YzQxODJjOWFlZjA2YTZiNDNhMCA9ICQoYDxkaXYgaWQ9Imh0bWxfYTJhOGE0ZjIzZTNjNGM0MTgyYzlhZWYwNmE2YjQzYTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmVuZDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF81NzA2YzNhNDZkNjE0NDI5YjBkM2ViNGY4ZTAyMWYwOC5zZXRDb250ZW50KGh0bWxfYTJhOGE0ZjIzZTNjNGM0MTgyYzlhZWYwNmE2YjQzYTApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfM2UzNDlhYWNkN2Q2NGQ1NTk2YTg1ZjNkNDZjZDdjZmEuYmluZFBvcHVwKHBvcHVwXzU3MDZjM2E0NmQ2MTQ0MjliMGQzZWI0ZjhlMDIxZjA4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgIGZ1bmN0aW9uIGdlb19qc29uX2YyZjY3YTFlZWZiYzQwMzFiNDg1NmM5ZTYzZGQ0MWJlX3N0eWxlcihmZWF0dXJlKSB7CiAgICAgICAgICAgIHN3aXRjaChmZWF0dXJlLmlkKSB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiB7ImNvbG9yIjogImdyZWVuIiwgIm9wYWNpdHkiOiAwLjUsICJ3ZWlnaHQiOiA1fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZW9fanNvbl9mMmY2N2ExZWVmYmM0MDMxYjQ4NTZjOWU2M2RkNDFiZV9vbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgbWFwXzU4YTlmMTZhMTJhYzQ1ZGVhM2UyZjQwOTExNTA0ZDNlLmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uX2YyZjY3YTFlZWZiYzQwMzFiNDg1NmM5ZTYzZGQ0MWJlID0gTC5nZW9Kc29uKG51bGwsIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uX2YyZjY3YTFlZWZiYzQwMzFiNDg1NmM5ZTYzZGQ0MWJlX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3R5bGU6IGdlb19qc29uX2YyZjY3YTFlZWZiYzQwMzFiNDg1NmM5ZTYzZGQ0MWJlX3N0eWxlciwKICAgICAgICB9KS5hZGRUbyhtYXBfNThhOWYxNmExMmFjNDVkZWEzZTJmNDA5MTE1MDRkM2UpOwoKICAgICAgICBmdW5jdGlvbiBnZW9fanNvbl9mMmY2N2ExZWVmYmM0MDMxYjQ4NTZjOWU2M2RkNDFiZV9hZGQgKGRhdGEpIHsKICAgICAgICAgICAgZ2VvX2pzb25fZjJmNjdhMWVlZmJjNDAzMWI0ODU2YzllNjNkZDQxYmUuYWRkRGF0YShkYXRhKTsKICAgICAgICB9CiAgICAgICAgICAgIGdlb19qc29uX2YyZjY3YTFlZWZiYzQwMzFiNDg1NmM5ZTYzZGQ0MWJlX2FkZCh7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1sxMy4zODQwOTEsIDUyLjQ5NTMyM10sIFsxMy4zODUxOCwgNTIuNDk4NDldLCBbMTMuMzg4MzU3LCA1Mi40OTc3MjZdLCBbMTMuMzg5MjE1LCA1Mi40OTc1NjldLCBbMTMuMzg5NzM2LCA1Mi40OTc0ODVdLCBbMTMuMzkwNTUyLCA1Mi40OTc0MDddLCBbMTMuMzkwOTU4LCA1Mi40OTczNzhdLCBbMTMuMzkxODA5LCA1Mi40OTczNzddLCBbMTMuMzkyOTQ1LCA1Mi40OTc0MzVdLCBbMTMuMzk0ODE2LCA1Mi40OTc2MTZdLCBbMTMuMzk1MDE3LCA1Mi40OTc2NTNdLCBbMTMuMzk1ODU2LCA1Mi40OTc4ODRdLCBbMTMuMzk2MDQ4LCA1Mi40OTc5NjVdLCBbMTMuMzk2NTUsIDUyLjQ5ODExNV0sIFsxMy4zOTcyNDUsIDUyLjQ5ODI0XSwgWzEzLjM5NzcyNCwgNTIuNDk4MjY1XSwgWzEzLjQwNjU2NCwgNTIuNDk4MzE1XSwgWzEzLjQwNjk5NywgNTIuNDk4OTRdLCBbMTMuNDA5MjIsIDUyLjUwMTc1NF0sIFsxMy40MDk5MTYsIDUyLjUwMjY2Nl0sIFsxMy40MTA1NDgsIDUyLjUwMzQzMl0sIFsxMy40MTA2NjcsIDUyLjUwMzQwNl0sIFsxMy40MTA4MjksIDUyLjUwMzQwN10sIFsxMy40MTA5NjUsIDUyLjUwMzQ0M10sIFsxMy40MTExLCA1Mi41MDM1MzRdLCBbMTMuNDExMTE3LCA1Mi41MDM2NTJdLCBbMTMuNDExMDkxLCA1Mi41MDM3MTVdLCBbMTMuNDExMDIyLCA1Mi41MDM3OTNdLCBbMTMuNDExMDQ2LCA1Mi41MDQwMzNdLCBbMTMuNDExMzQsIDUyLjUwNDQ0Ml0sIFsxMy40MTQxNDksIDUyLjUwNzk5Ml0sIFsxMy40MTY0NTQsIDUyLjUxMTAwNl0sIFsxMy40MTY3MjQsIDUyLjUxMDkxN10sIFsxMy40MjExNywgNTIuNTA5Nzc1XSwgWzEzLjQyMjU0MywgNTIuNTExNjk1XSwgWzEzLjQyMjg5MywgNTIuNTEyMTM0XSwgWzEzLjQyNDA2NSwgNTIuNTEzNDA4XSwgWzEzLjQyNDI2MiwgNTIuNTEzNDk1XSwgWzEzLjQyNTIwNiwgNTIuNTE0MTkzXSwgWzEzLjQyNTU0NSwgNTIuNTE0NV0sIFsxMy40MjY3MzQsIDUyLjUxNTgwM10sIFsxMy40MjcyNzksIDUyLjUxNjUxNl0sIFsxMy40Mjc2NjksIDUyLjUxNzEyN10sIFsxMy40Mjc5NTcsIDUyLjUxNzY2M10sIFsxMy40MjgxNDQsIDUyLjUxNzk0Nl0sIFsxMy40MjgzMzYsIDUyLjUxODA2NV0sIFsxMy40Mjg0NDIsIDUyLjUxODExMV0sIFsxMy40Mjg1NzYsIDUyLjUxODE0Ml0sIFsxMy40MjkxMDYsIDUyLjUxODIwM10sIFsxMy40Mjk0MjEsIDUyLjUxODIxM10sIFsxMy40Mjk3MiwgNTIuNTE4MjAyXSwgWzEzLjQ0MDczNCwgNTIuNTE3MDY0XSwgWzEzLjQ0MTAwOSwgNTIuNTE4MTk1XSwgWzEzLjQ0MjM5OSwgNTIuNTE4MDQ2XSwgWzEzLjQ0MjgxNSwgNTIuNTE4MDE2XSwgWzEzLjQ0NDI2LCA1Mi41MTkyNzhdLCBbMTMuNDQ2NDM4LCA1Mi41MjEyN10sIFsxMy40NDY1NzgsIDUyLjUyMTM2M10sIFsxMy40NDc2NzksIDUyLjUyMTYzOV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSk7CiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fd11879b358>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"start=[13.384094,52.495323]\n",
"end=[13.447952,52.521235]\n",
"r = requests.post(url=route_url, json={'points':[start,end], 'points_encoded':False})\n",
"route = r.json()\n",
"if 'message' in route: raise Exception(route[\"message\"])\n",
"\n",
"m = folium.Map(location=latlon(start), zoom_start=12)\n",
"plot_route(m, start, end, route[\"paths\"][0][\"points\"], \"route\", \"green\")\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now lets try the alternative route feature and plot both routes, the alternate route is red"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF8xYmI5YWJjZWVjNWE0NDgxYmRiNDQ5OTNmNWFiOTMzOCB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfMWJiOWFiY2VlYzVhNDQ4MWJkYjQ0OTkzZjVhYjkzMzgiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwXzFiYjlhYmNlZWM1YTQ0ODFiZGI0NDk5M2Y1YWI5MzM4ID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwXzFiYjlhYmNlZWM1YTQ0ODFiZGI0NDk5M2Y1YWI5MzM4IiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFs1Mi40OTUzMjMsIDEzLjMyODEzM10sCiAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBwcmVmZXJDYW52YXM6IGZhbHNlLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgCgogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2FjYzkyZmMwN2M3NTRlZjdiZTQ3MjkwYjYwY2E4M2I5ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciLAogICAgICAgICAgICAgICAgeyJhdHRyaWJ1dGlvbiI6ICJEYXRhIGJ5IFx1MDAyNmNvcHk7IFx1MDAzY2EgaHJlZj1cImh0dHA6Ly9vcGVuc3RyZWV0bWFwLm9yZ1wiXHUwMDNlT3BlblN0cmVldE1hcFx1MDAzYy9hXHUwMDNlLCB1bmRlciBcdTAwM2NhIGhyZWY9XCJodHRwOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiXHUwMDNlT0RiTFx1MDAzYy9hXHUwMDNlLiIsICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwgIm1heE5hdGl2ZVpvb20iOiAxOCwgIm1heFpvb20iOiAxOCwgIm1pblpvb20iOiAwLCAibm9XcmFwIjogZmFsc2UsICJvcGFjaXR5IjogMSwgInN1YmRvbWFpbnMiOiAiYWJjIiwgInRtcyI6IGZhbHNlfQogICAgICAgICAgICApLmFkZFRvKG1hcF8xYmI5YWJjZWVjNWE0NDgxYmRiNDQ5OTNmNWFiOTMzOCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84NDExYTZlZTRkMjM0OGNlYWVjYWY5ZWI1NWJlZWMwNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjQ5NTMyMywgMTMuMzI4MTMzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzFiYjlhYmNlZWM1YTQ0ODFiZGI0NDk5M2Y1YWI5MzM4KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9kZTY5YmQ5YzM1MTU0ZmQwOGJiZGY3ODk1Mjk3NzJjYiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiaW5mby1zaWduIiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJncmVlbiIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzg0MTFhNmVlNGQyMzQ4Y2VhZWNhZjllYjU1YmVlYzA1LnNldEljb24oaWNvbl9kZTY5YmQ5YzM1MTU0ZmQwOGJiZGY3ODk1Mjk3NzJjYik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzY5MGZlMDIwYTUwNDJhMzhjYmZjOWNhMmEwZjY0MWEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2Y2NDlkNTMxOTQxYTQxMWM4NjBjYjg0YTJmNzhlYjBiID0gJChgPGRpdiBpZD0iaHRtbF9mNjQ5ZDUzMTk0MWE0MTFjODYwY2I4NGEyZjc4ZWIwYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c3RhcnQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzY5MGZlMDIwYTUwNDJhMzhjYmZjOWNhMmEwZjY0MWEuc2V0Q29udGVudChodG1sX2Y2NDlkNTMxOTQxYTQxMWM4NjBjYjg0YTJmNzhlYjBiKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzg0MTFhNmVlNGQyMzQ4Y2VhZWNhZjllYjU1YmVlYzA1LmJpbmRQb3B1cChwb3B1cF83NjkwZmUwMjBhNTA0MmEzOGNiZmM5Y2EyYTBmNjQxYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yZWE5MDViYzYxNWI0OWM2OTg5YzA1NWJhODU2ZWU4YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzUyLjU4MTE0OCwgMTMuNDc2NzkxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzFiYjlhYmNlZWM1YTQ0ODFiZGI0NDk5M2Y1YWI5MzM4KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9lZGVmNDdkZTY2ODc0ZGFmYmU5Y2QyNDEyMDliODI0OSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiaW5mby1zaWduIiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl8yZWE5MDViYzYxNWI0OWM2OTg5YzA1NWJhODU2ZWU4Yy5zZXRJY29uKGljb25fZWRlZjQ3ZGU2Njg3NGRhZmJlOWNkMjQxMjA5YjgyNDkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2ExYmE1NDlmZWZmMDQ3OGNiMzVmNjkzODUwZGU2YmMwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF85MDYyNjdiN2ZlMWE0OTIyYWU0MTU4MDg0NmM1OGMzMCA9ICQoYDxkaXYgaWQ9Imh0bWxfOTA2MjY3YjdmZTFhNDkyMmFlNDE1ODA4NDZjNThjMzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmVuZDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9hMWJhNTQ5ZmVmZjA0NzhjYjM1ZjY5Mzg1MGRlNmJjMC5zZXRDb250ZW50KGh0bWxfOTA2MjY3YjdmZTFhNDkyMmFlNDE1ODA4NDZjNThjMzApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMmVhOTA1YmM2MTViNDljNjk4OWMwNTViYTg1NmVlOGMuYmluZFBvcHVwKHBvcHVwX2ExYmE1NDlmZWZmMDQ3OGNiMzVmNjkzODUwZGU2YmMwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgIGZ1bmN0aW9uIGdlb19qc29uXzhlZTRhYTJmYTRjYjQyZTY4ZWVhZjVkZjY1Yjg1NzM1X3N0eWxlcihmZWF0dXJlKSB7CiAgICAgICAgICAgIHN3aXRjaChmZWF0dXJlLmlkKSB7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiB7ImNvbG9yIjogImdyZWVuIiwgIm9wYWNpdHkiOiAwLjUsICJ3ZWlnaHQiOiA1fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZW9fanNvbl84ZWU0YWEyZmE0Y2I0MmU2OGVlYWY1ZGY2NWI4NTczNV9vbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgbWFwXzFiYjlhYmNlZWM1YTQ0ODFiZGI0NDk5M2Y1YWI5MzM4LmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzhlZTRhYTJmYTRjYjQyZTY4ZWVhZjVkZjY1Yjg1NzM1ID0gTC5nZW9Kc29uKG51bGwsIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzhlZTRhYTJmYTRjYjQyZTY4ZWVhZjVkZjY1Yjg1NzM1X29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3R5bGU6IGdlb19qc29uXzhlZTRhYTJmYTRjYjQyZTY4ZWVhZjVkZjY1Yjg1NzM1X3N0eWxlciwKICAgICAgICB9KS5hZGRUbyhtYXBfMWJiOWFiY2VlYzVhNDQ4MWJkYjQ0OTkzZjVhYjkzMzgpOwoKICAgICAgICBmdW5jdGlvbiBnZW9fanNvbl84ZWU0YWEyZmE0Y2I0MmU2OGVlYWY1ZGY2NWI4NTczNV9hZGQgKGRhdGEpIHsKICAgICAgICAgICAgZ2VvX2pzb25fOGVlNGFhMmZhNGNiNDJlNjhlZWFmNWRmNjViODU3MzUuYWRkRGF0YShkYXRhKTsKICAgICAgICB9CiAgICAgICAgICAgIGdlb19qc29uXzhlZTRhYTJmYTRjYjQyZTY4ZWVhZjVkZjY1Yjg1NzM1X2FkZCh7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1sxMy4zMjgxODUsIDUyLjQ5NTE1MV0sIFsxMy4zMjc2NzcsIDUyLjQ5NTA5NF0sIFsxMy4zMjcxMDMsIDUyLjQ5NDk3N10sIFsxMy4zMjczMDMsIDUyLjQ5NDcxM10sIFsxMy4zMjgyMTcsIDUyLjQ5NDg0Nl0sIFsxMy4zMzEwMzgsIDUyLjQ5NTEzMV0sIFsxMy4zMzEwOTUsIDUyLjQ5NTQyMl0sIFsxMy4zMzEwODgsIDUyLjQ5NTUyNF0sIFsxMy4zMzExMzEsIDUyLjQ5NTg1Ml0sIFsxMy4zMzExMzksIDUyLjQ5NjIyNF0sIFsxMy4zMzExODksIDUyLjQ5NjM0MV0sIFsxMy4zMzEyNzcsIDUyLjQ5NjQzM10sIFsxMy4zMzMxNzIsIDUyLjQ5NzU1N10sIFsxMy4zMzM4NDUsIDUyLjQ5Nzk5Ml0sIFsxMy4zMzQ0NTQsIDUyLjQ5ODQ2NV0sIFsxMy4zMzU0MjgsIDUyLjQ5OTI2Nl0sIFsxMy4zMzU4NDgsIDUyLjQ5OTIyM10sIFsxMy4zMzYyNywgNTIuNDk5MTk5XSwgWzEzLjMzNzA0NiwgNTIuNDk5MjI3XSwgWzEzLjMzNzYxNywgNTIuNDk5MzAxXSwgWzEzLjMzOTcxMSwgNTIuNDk5NjQyXSwgWzEzLjM0MDk0MiwgNTIuNDk5ODA3XSwgWzEzLjM0MTY4MiwgNTIuNDk5ODUxXSwgWzEzLjM0MjY2NSwgNTIuNDk5ODc2XSwgWzEzLjM0NTY4NywgNTIuNTAwMDY1XSwgWzEzLjM0NjIzMSwgNTIuNTAwMThdLCBbMTMuMzQ2MjQ2LCA1Mi41MDAyM10sIFsxMy4zNDY0ODgsIDUyLjUwMDUzMl0sIFsxMy4zNDY4OTIsIDUyLjUwMDg5Ml0sIFsxMy4zNDc3OTgsIDUyLjUwMTUzM10sIFsxMy4zNDg1NjcsIDUyLjUwMTk4NF0sIFsxMy4zNDkyMjUsIDUyLjUwMjI2NV0sIFsxMy4zNDk0NjMsIDUyLjUwMjQyXSwgWzEzLjM0OTYzMiwgNTIuNTAyNTYzXSwgWzEzLjM1MDUyMywgNTIuNTAzNTExXSwgWzEzLjM1MTIwMywgNTIuNTA0MzY3XSwgWzEzLjM1MTgwMSwgNTIuNTA0OTYyXSwgWzEzLjM1MjAyLCA1Mi41MDUyMjZdLCBbMTMuMzUyMzQ5LCA1Mi41MDUzMjFdLCBbMTMuMzUzMDY0LCA1Mi41MDU0NjNdLCBbMTMuMzU2NDg3LCA1Mi41MDYzMThdLCBbMTMuMzU3MDksIDUyLjUwNjQ0M10sIFsxMy4zNTczMjQsIDUyLjUwNjQ2N10sIFsxMy4zNTc4NDgsIDUyLjUwNjQ1XSwgWzEzLjM1ODA3NSwgNTIuNTA2NDEyXSwgWzEzLjM1ODk0MywgNTIuNTA2MTQ1XSwgWzEzLjM1OTg5NiwgNTIuNTA1ODc4XSwgWzEzLjM2MDQ4OCwgNTIuNTA1NzM0XSwgWzEzLjM2MTE2NSwgNTIuNTA1NTg3XSwgWzEzLjM2MTg5MywgNTIuNTA1NDgxXSwgWzEzLjM2MjM3MiwgNTIuNTA1NDM1XSwgWzEzLjM2MjkzOSwgNTIuNTA1NDM5XSwgWzEzLjM2MzM4NCwgNTIuNTA1NDg4XSwgWzEzLjM2NDQwMiwgNTIuNTA1NzExXSwgWzEzLjM2NDg1NCwgNTIuNTA1NzYxXSwgWzEzLjM2NjE1LCA1Mi41MDU4NF0sIFsxMy4zNjgzNjIsIDUyLjUwNTgyNl0sIFsxMy4zNjg1OTIsIDUyLjUwNTc5M10sIFsxMy4zNjkwNjksIDUyLjUwNTcxNl0sIFsxMy4zNjk2MTUsIDUyLjUwNTU3M10sIFsxMy4zNzAwOCwgNTIuNTA1NDA4XSwgWzEzLjM3MTUzNiwgNTIuNTA0ODA0XSwgWzEzLjM3MjI5NywgNTIuNTA0NDE1XSwgWzEzLjM3MjUxMiwgNTIuNTA0MjY0XSwgWzEzLjM3Mjg3MywgNTIuNTAzOTVdLCBbMTMuMzczNDg5LCA1Mi41MDMyMzNdLCBbMTMuMzczNjMsIDUyLjUwMzExMV0sIFsxMy4zNzQwMjksIDUyLjUwMjg1OV0sIFsxMy4zNzYxNjcsIDUyLjUwMTYwNl0sIFsxMy4zODAxMTgsIDUyLjUwMzQzOF0sIFsxMy4zODIyNTcsIDUyLjUwNDQ2N10sIFsxMy4zODI4MjEsIDUyLjUwNDYyM10sIFsxMy4zODY2MjQsIDUyLjUwNTM2Nl0sIFsxMy4zODYwNzQsIDUyLjUwNjQzM10sIFsxMy4zOTQzNzUsIDUyLjUwNjk1OF0sIFsxMy4zOTc3MTMsIDUyLjUwNzE0N10sIFsxMy4zOTgwMDMsIDUyLjUwNzEyOF0sIFsxMy4zOTgyODIsIDUyLjUwNzA3XSwgWzEzLjM5OTQ5LCA1Mi41MDg3MjhdLCBbMTMuMzk5NjU0LCA1Mi41MDg4ODhdLCBbMTMuMzk5ODEyLCA1Mi41MDkwODZdLCBbMTMuNDAwMTE4LCA1Mi41MDk1MTldLCBbMTMuNDAxMTcsIDUyLjUxMDQyNF0sIFsxMy40MDEzMzYsIDUyLjUxMDU4Nl0sIFsxMy40MDEzODMsIDUyLjUxMDY5MV0sIFsxMy40MDEzMTIsIDUyLjUxMTIwOF0sIFsxMy40MDE3MjEsIDUyLjUxMTMyN10sIFsxMy40MDE5NiwgNTIuNTExNDI2XSwgWzEzLjQwMjI5OCwgNTIuNTExNTk1XSwgWzEzLjQwMzUwOSwgNTIuNTEyMzc1XSwgWzEzLjQwNTI3NywgNTIuNTEzNTddLCBbMTMuNDA2MDU1LCA1Mi41MTQxNTFdLCBbMTMuNDA3NTQ4LCA1Mi41MTU0MjNdLCBbMTMuNDA4NjA0LCA1Mi41MTYyOTJdLCBbMTMuNDA5MzQ1LCA1Mi41MTY4NzVdLCBbMTMuNDExMDM2LCA1Mi41MTgzMDhdLCBbMTMuNDExNTAyLCA1Mi41MTg2NDRdLCBbMTMuNDEyMDk0LCA1Mi41MTkwMjhdLCBbMTMuNDEyMjc1LCA1Mi41MTkxNThdLCBbMTMuNDEzMDYsIDUyLjUxOTUzNF0sIFsxMy40MTQxOTIsIDUyLjUyMDA0N10sIFsxMy40MTQ5MjYsIDUyLjUyMDQ5NF0sIFsxMy40MTUxMzcsIDUyLjUyMDY4XSwgWzEzLjQxNzA3MiwgNTIuNTIyNTddLCBbMTMuNDE4Mjk3LCA1Mi41MjM2MzRdLCBbMTMuNDE4NjY3LCA1Mi41MjM4ODldLCBbMTMuNDE5MzU5LCA1Mi41MjQ0MjNdLCBbMTMuNDE5OTU5LCA1Mi41MjQ5OTNdLCBbMTMuNDIwNjYsIDUyLjUyNTU1XSwgWzEzLjQyMTc4NywgNTIuNTI2NDk4XSwgWzEzLjQyMjg0NCwgNTIuNTI3MzUxXSwgWzEzLjQyMzY4NiwgNTIuNTI3OTddLCBbMTMuNDI1NzUsIDUyLjUyOTddLCBbMTMuNDI5NTU5LCA1Mi41MzI5ODZdLCBbMTMuNDMwOTczLCA1Mi41MzQyM10sIFsxMy40MzI0NDIsIDUyLjUzNTQ2Ml0sIFsxMy40MzMwNjcsIDUyLjUzNjAzMV0sIFsxMy40MzMyOTcsIDUyLjUzNjIwOF0sIFsxMy40MzU2LCA1Mi41MzgxNzddLCBbMTMuNDM3MzcyLCA1Mi41Mzk3MzddLCBbMTMuNDM4MzQ0LCA1Mi41NDA1Ml0sIFsxMy40MzkxMzUsIDUyLjU0MTIyOV0sIFsxMy40NDI2LCA1Mi41NDQyMV0sIFsxMy40NDI5MywgNTIuNTQ0NDY4XSwgWzEzLjQ0Mzg2MSwgNTIuNTQ1MDA3XSwgWzEzLjQ0NDUzNywgNTIuNTQ1MzMzXSwgWzEzLjQ0NDk0OSwgNTIuNTQ1NTA1XSwgWzEzLjQ0OTQxNSwgNTIuNTQ3NTMyXSwgWzEzLjQ1MDczMiwgNTIuNTQ4MTEzXSwgWzEzLjQ1MTAxNiwgNTIuNTQ4MjIxXSwgWzEzLjQ1MTIyNiwgNTIuNTQ4Mjg0XSwgWzEzLjQ1Mjc0NiwgNTIuNTQ4NjA1XSwgWzEzLjQ1Mjk2OSwgNTIuNTQ4NjczXSwgWzEzLjQ1NDIxMywgNTIuNTQ4OTQ2XSwgWzEzLjQ1NDM4OCwgNTIuNTQ4OTYzXSwgWzEzLjQ1NDY2MSwgNTIuNTQ5MDIzXSwgWzEzLjQ1NTA2LCA1Mi41NDkxMjldLCBbMTMuNDU2NzU1LCA1Mi41NDk1XSwgWzEzLjQ1NzIxOCwgNTIuNTQ5NTY5XSwgWzEzLjQ1ODQxNywgNTIuNTQ5ODMzXSwgWzEzLjQ1OTA1NCwgNTIuNTUwMDQ4XSwgWzEzLjQ2MzE0MSwgNTIuNTUwOTI4XSwgWzEzLjQ2MzU5NiwgNTIuNTUxMDU5XSwgWzEzLjQ2Mzk1LCA1Mi41NTExODFdLCBbMTMuNDY2MDIyLCA1Mi41NTIxMTddLCBbMTMuNDY2MzgsIDUyLjU1MjI5NF0sIFsxMy40NjY2NDEsIDUyLjU1MjQ2Nl0sIFsxMy40NjY4MzYsIDUyLjU1MjYyXSwgWzEzLjQ2NzA2LCA1Mi41NTI4NDldLCBbMTMuNDY3MTcyLCA1Mi41NTI5OTZdLCBbMTMuNDY3NjU4LCA1Mi41NTM5NDNdLCBbMTMuNDY3NzU2LCA1Mi41NTQzNTNdLCBbMTMuNDY3NzA2LCA1Mi41NTUwMDNdLCBbMTMuNDY3NTA5LCA1Mi41NTU5MTZdLCBbMTMuNDY3Mzg5LCA1Mi41NTYzMDZdLCBbMTMuNDY3MDk2LCA1Mi41NTY4NTRdLCBbMTMuNDY2NzMzLCA1Mi41NTczMjZdLCBbMTMuNDY2NDM2LCA1Mi41NTc4NDddLCBbMTMuNDY2MzksIDUyLjU1ODAwNV0sIFsxMy40NjYzNjksIDUyLjU1ODQxMV0sIFsxMy40NjY0MzQsIDUyLjU1ODczOV0sIFsxMy40NjY2NTQsIDUyLjU1OTIwMl0sIFsxMy40NjcwODQsIDUyLjU1OTk3MV0sIFsxMy40Njc4NSwgNTIuNTYxMjA2XSwgWzEzLjQ2ODI3OSwgNTIuNTYxODYxXSwgWzEzLjQ3MDg5OCwgNTIuNTY1NjAzXSwgWzEzLjQ3MTAyNywgNTIuNTY1NzM3XSwgWzEzLjQ3MTE5NCwgNTIuNTY1ODI0XSwgWzEzLjQ3NDUwMSwgNTIuNTY3MjE5XSwgWzEzLjQ3NzYzMywgNTIuNTY4Njg5XSwgWzEzLjQ3OTgwNywgNTIuNTcwMDI3XSwgWzEzLjQ4MDIxNCwgNTIuNTcwMjU1XSwgWzEzLjQ4MTUzOSwgNTIuNTcwOTM3XSwgWzEzLjQ4MTg1LCA1Mi41NzExMTZdLCBbMTMuNDgyMTQ1LCA1Mi41NzEzMzZdLCBbMTMuNDgyMywgNTIuNTcxNDgxXSwgWzEzLjQ4MjQ3MSwgNTIuNTcxNzQ2XSwgWzEzLjQ4MjU3NiwgNTIuNTcyMDFdLCBbMTMuNDgyNjAyLCA1Mi41NzIxMzddLCBbMTMuNDgzMDg0LCA1Mi41NzQ5NDddLCBbMTMuNDgzMjg5LCA1Mi41NzYyNjhdLCBbMTMuNDgzMzg0LCA1Mi41NzcxOThdLCBbMTMuNDgzMjY2LCA1Mi41Nzc3MTFdLCBbMTMuNDgyNzIyLCA1Mi41Nzk1NDNdLCBbMTMuNDgyNzYzLCA1Mi41ODAxMTldLCBbMTMuNDgyOTkxLCA1Mi41ODE3MDddLCBbMTMuNDgzMDc3LCA1Mi41ODIyMTJdLCBbMTMuNDgzMjYxLCA1Mi41ODI5NjldLCBbMTMuNDgwMzc2LCA1Mi41ODM1MjFdLCBbMTMuNDgwMzE1LCA1Mi41ODM0NTldLCBbMTMuNDc5NzY4LCA1Mi41ODE5MDRdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjRjN2EwMDQ3ZTZkNDk1Mzk1MjgyNjUwMTFmYzZkN2QgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi40OTUzMjMsIDEzLjMyODEzM10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8xYmI5YWJjZWVjNWE0NDgxYmRiNDQ5OTNmNWFiOTMzOCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fOWE1YjRmY2Y4Mzc4NDM4NmE5NDE2YmYzYTNmMWYzNWUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImluZm8tc2lnbiIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAiZ3JlZW4iLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9iNGM3YTAwNDdlNmQ0OTUzOTUyODI2NTAxMWZjNmQ3ZC5zZXRJY29uKGljb25fOWE1YjRmY2Y4Mzc4NDM4NmE5NDE2YmYzYTNmMWYzNWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFiZTAxODEzZjZhODRmNjRhNzViOTM3NDU1NmUyM2VjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF80YjUzODhhMjE5ZmM0ZWJhYmY1OThhYmFhNDA5OTNmMiA9ICQoYDxkaXYgaWQ9Imh0bWxfNGI1Mzg4YTIxOWZjNGViYWJmNTk4YWJhYTQwOTkzZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnN0YXJ0PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzFiZTAxODEzZjZhODRmNjRhNzViOTM3NDU1NmUyM2VjLnNldENvbnRlbnQoaHRtbF80YjUzODhhMjE5ZmM0ZWJhYmY1OThhYmFhNDA5OTNmMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iNGM3YTAwNDdlNmQ0OTUzOTUyODI2NTAxMWZjNmQ3ZC5iaW5kUG9wdXAocG9wdXBfMWJlMDE4MTNmNmE4NGY2NGE3NWI5Mzc0NTU2ZTIzZWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTQ3OGFhNGUyY2E2NGY5ZDkxMzk3MmQzNDdmYjZhYTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs1Mi41ODExNDgsIDEzLjQ3Njc5MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF8xYmI5YWJjZWVjNWE0NDgxYmRiNDQ5OTNmNWFiOTMzOCk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fNTFmY2ZmYjExZmEzNDVkMWFjNzM2MWJlNWM5M2I1NjggPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImluZm8tc2lnbiIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAicmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfMTQ3OGFhNGUyY2E2NGY5ZDkxMzk3MmQzNDdmYjZhYTcuc2V0SWNvbihpY29uXzUxZmNmZmIxMWZhMzQ1ZDFhYzczNjFiZTVjOTNiNTY4KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kYWRhOTc0ZTJmODk0MWM0OTUwMjM1YjBlZGM4YjQwOSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMWQ3MTMyZmNkMzNmNDUxMjg5OGFiOTcyYjFlZTE0MmEgPSAkKGA8ZGl2IGlkPSJodG1sXzFkNzEzMmZjZDMzZjQ1MTI4OThhYjk3MmIxZWUxNDJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5lbmQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZGFkYTk3NGUyZjg5NDFjNDk1MDIzNWIwZWRjOGI0MDkuc2V0Q29udGVudChodG1sXzFkNzEzMmZjZDMzZjQ1MTI4OThhYjk3MmIxZWUxNDJhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzE0NzhhYTRlMmNhNjRmOWQ5MTM5NzJkMzQ3ZmI2YWE3LmJpbmRQb3B1cChwb3B1cF9kYWRhOTc0ZTJmODk0MWM0OTUwMjM1YjBlZGM4YjQwOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICBmdW5jdGlvbiBnZW9fanNvbl9hZjFiZTY1MmU0ZTc0ZTFlYTFkNjQwNDM3YWM0YTIyY19zdHlsZXIoZmVhdHVyZSkgewogICAgICAgICAgICBzd2l0Y2goZmVhdHVyZS5pZCkgewogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyJjb2xvciI6ICJyZWQiLCAib3BhY2l0eSI6IDAuNSwgIndlaWdodCI6IDV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGdlb19qc29uX2FmMWJlNjUyZTRlNzRlMWVhMWQ2NDA0MzdhYzRhMjJjX29uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgICAgICAgbGF5ZXIub24oewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBtYXBfMWJiOWFiY2VlYzVhNDQ4MWJkYjQ0OTkzZjVhYjkzMzguZml0Qm91bmRzKGUudGFyZ2V0LmdldEJvdW5kcygpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICB2YXIgZ2VvX2pzb25fYWYxYmU2NTJlNGU3NGUxZWExZDY0MDQzN2FjNGEyMmMgPSBMLmdlb0pzb24obnVsbCwgewogICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogZ2VvX2pzb25fYWYxYmU2NTJlNGU3NGUxZWExZDY0MDQzN2FjNGEyMmNfb25FYWNoRmVhdHVyZSwKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzdHlsZTogZ2VvX2pzb25fYWYxYmU2NTJlNGU3NGUxZWExZDY0MDQzN2FjNGEyMmNfc3R5bGVyLAogICAgICAgIH0pLmFkZFRvKG1hcF8xYmI5YWJjZWVjNWE0NDgxYmRiNDQ5OTNmNWFiOTMzOCk7CgogICAgICAgIGZ1bmN0aW9uIGdlb19qc29uX2FmMWJlNjUyZTRlNzRlMWVhMWQ2NDA0MzdhYzRhMjJjX2FkZCAoZGF0YSkgewogICAgICAgICAgICBnZW9fanNvbl9hZjFiZTY1MmU0ZTc0ZTFlYTFkNjQwNDM3YWM0YTIyYy5hZGREYXRhKGRhdGEpOwogICAgICAgIH0KICAgICAgICAgICAgZ2VvX2pzb25fYWYxYmU2NTJlNGU3NGUxZWExZDY0MDQzN2FjNGEyMmNfYWRkKHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWzEzLjMyODE4NSwgNTIuNDk1MTUxXSwgWzEzLjMyNzY3NywgNTIuNDk1MDk0XSwgWzEzLjMyNzEwMywgNTIuNDk0OTc3XSwgWzEzLjMyNzMwMywgNTIuNDk0NzEzXSwgWzEzLjMyODIxNywgNTIuNDk0ODQ2XSwgWzEzLjMzMTAzOCwgNTIuNDk1MTMxXSwgWzEzLjMzMTA5NSwgNTIuNDk1NDIyXSwgWzEzLjMzMTA4OCwgNTIuNDk1NTI0XSwgWzEzLjMzMTEzMSwgNTIuNDk1ODUyXSwgWzEzLjMzMTEzOSwgNTIuNDk2MjI0XSwgWzEzLjMzMTE4OSwgNTIuNDk2MzQxXSwgWzEzLjMzMTI3NywgNTIuNDk2NDMzXSwgWzEzLjMzMzE3MiwgNTIuNDk3NTU3XSwgWzEzLjMzMzg0NSwgNTIuNDk3OTkyXSwgWzEzLjMzNDQ1NCwgNTIuNDk4NDY1XSwgWzEzLjMzNTQyOCwgNTIuNDk5MjY2XSwgWzEzLjMzNTk2NiwgNTIuNDk5OTY5XSwgWzEzLjMzNjkwNiwgNTIuNTAwODY3XSwgWzEzLjMzOTI1MywgNTIuNTAzMDRdLCBbMTMuMzQwODU5LCA1Mi41MDQ1NzhdLCBbMTMuMzQxMDQyLCA1Mi41MDQ2NzldLCBbMTMuMzQxMTc1LCA1Mi41MDQ4MDhdLCBbMTMuMzQxMjc3LCA1Mi41MDUwMjJdLCBbMTMuMzQxMzcyLCA1Mi41MDU0ODVdLCBbMTMuMzQxNDE2LCA1Mi41MDU1NjNdLCBbMTMuMzQxNTU5LCA1Mi41MDU2ODVdLCBbMTMuMzQxNzAyLCA1Mi41MDU3NjRdLCBbMTMuMzQ0NjE2LCA1Mi41MDYzNjNdLCBbMTMuMzQ2OTUsIDUyLjUwNjgyMl0sIFsxMy4zNDc2MTEsIDUyLjUwNjk5OF0sIFsxMy4zNDc4NTgsIDUyLjUwNzA5NV0sIFsxMy4zNDgzNzMsIDUyLjUwNzM2M10sIFsxMy4zNDg2MzUsIDUyLjUwNzUzOF0sIFsxMy4zNDg4OTYsIDUyLjUwNzc1NV0sIFsxMy4zNDkzMzIsIDUyLjUwODIwMl0sIFsxMy4zNDk0NTQsIDUyLjUwODM4OV0sIFsxMy4zNDk1MjcsIDUyLjUwODU1OV0sIFsxMy4zNDk2MTQsIDUyLjUwODg4OF0sIFsxMy4zNDk3MjIsIDUyLjUwOTA1OF0sIFsxMy4zNDk4OTEsIDUyLjUwOTE5Ml0sIFsxMy4zNTAyMiwgNTIuNTA5MzM2XSwgWzEzLjM1MDUxLCA1Mi41MDk0MTddLCBbMTMuMzUwNjg0LCA1Mi41MDk0NTFdLCBbMTMuMzUxNDk2LCA1Mi41MDk1NDFdLCBbMTMuMzUyOTA3LCA1Mi41MDk2MTRdLCBbMTMuMzUzMjIsIDUyLjUwOTU5NF0sIFsxMy4zNTM5MTYsIDUyLjUwOTYxNV0sIFsxMy4zNTY0ODIsIDUyLjUwOTgzOF0sIFsxMy4zNTcyODMsIDUyLjUwOTg5NV0sIFsxMy4zNTgwMDcsIDUyLjUwOTkxMV0sIFsxMy4zNjI4ODEsIDUyLjUwOTc3NV0sIFsxMy4zNjMyNCwgNTIuNTA5ODA1XSwgWzEzLjM3MTI0NiwgNTIuNTExMTQ0XSwgWzEzLjM3NDAyNiwgNTIuNTExNTI2XSwgWzEzLjM3NTc0OCwgNTIuNTExOTMxXSwgWzEzLjM3NTg4NSwgNTIuNTExOTc4XSwgWzEzLjM3NjUwNiwgNTIuNTEyMzQzXSwgWzEzLjM3NzE4NiwgNTIuNTEyMzU3XSwgWzEzLjM3NzIxMywgNTIuNTEzMDNdLCBbMTMuMzc3NDY3LCA1Mi41MTQ1ODRdLCBbMTMuMzc3NzA3LCA1Mi41MTQ1ODRdLCBbMTMuMzc4OTMyLCA1Mi41MTQ2NjZdLCBbMTMuMzc5NDU3LCA1Mi41MTQ3NDNdLCBbMTMuMzgxNDg4LCA1Mi41MTUxNDFdLCBbMTMuMzgyMTE3LCA1Mi41MTUxOTRdLCBbMTMuMzg2MDU3LCA1Mi41MTU0NTFdLCBbMTMuMzg1ODIxLCA1Mi41MTY2NzFdLCBbMTMuMzg4ODI3LCA1Mi41MTY4NDhdLCBbMTMuMzkzMDU0LCA1Mi41MTcxNDldLCBbMTMuMzkzMjg5LCA1Mi41MTcyMjJdLCBbMTMuMzk4OTI0LCA1Mi41MTc2MTRdLCBbMTMuMzk5MzA2LCA1Mi41MTc2NzZdLCBbMTMuMzk5NjQ4LCA1Mi41MTc3NTRdLCBbMTMuNDAwMDk0LCA1Mi41MTc5MTldLCBbMTMuNDAwMzQ2LCA1Mi41MTc5NzddLCBbMTMuNDAyMDMsIDUyLjUxODYxNV0sIFsxMy40MDI2ODksIDUyLjUxODg4Ml0sIFsxMy40MDM3NiwgNTIuNTE5MzddLCBbMTMuNDA2MzAyLCA1Mi41MjA2OThdLCBbMTMuNDEwMTI2LCA1Mi41MjI2MTNdLCBbMTMuNDExNTM1LCA1Mi41MjM0NzldLCBbMTMuNDEyMTUxLCA1Mi41MjM4OTJdLCBbMTMuNDEyMzc2LCA1Mi41MjQwNjldLCBbMTMuNDEyNDY5LCA1Mi41MjQxNzRdLCBbMTMuNDE0NTc0LCA1Mi41MjU4OTVdLCBbMTMuNDE0OTk4LCA1Mi41MjYyMTldLCBbMTMuNDE1NjU3LCA1Mi41MjY3N10sIFsxMy40MTU5NDUsIDUyLjUyNzA0N10sIFsxMy40MTc0OTEsIDUyLjUyODgyMV0sIFsxMy40MTgzMzgsIDUyLjUyOTYzN10sIFsxMy40MTkxNDEsIDUyLjUzMDU1NV0sIFsxMy40MTk1NzgsIDUyLjUzMTExM10sIFsxMy40MjM3NzQsIDUyLjUzODE2XSwgWzEzLjQyNjE1MywgNTIuNTQyMjcyXSwgWzEzLjQyNjUyNCwgNTIuNTQyOTU1XSwgWzEzLjQyNjYxNCwgNTIuNTQzMDQ5XSwgWzEzLjQyNjk4OSwgNTIuNTQzNjcxXSwgWzEzLjQyNzM2NSwgNTIuNTQ0NDIzXSwgWzEzLjQyNzUyNSwgNTIuNTQ0NjcxXSwgWzEzLjQyODIyMiwgNTIuNTQ2NTA3XSwgWzEzLjQyODUxMiwgNTIuNTQ3MTc5XSwgWzEzLjQyODc3NiwgNTIuNTQ3NzY3XSwgWzEzLjQyODk3MSwgNTIuNTQ4MTQyXSwgWzEzLjQzMDM3NSwgNTIuNTUxMjUxXSwgWzEzLjQzMDQ3OCwgNTIuNTUxNTA3XSwgWzEzLjQzMDQ4NCwgNTIuNTUxNzE5XSwgWzEzLjQzMTUwMywgNTIuNTUyMTldLCBbMTMuNDM0NzA3LCA1Mi41NTM2MDRdLCBbMTMuNDM4OSwgNTIuNTU1NDIzXSwgWzEzLjQzOTAzLCA1Mi41NTUzNl0sIFsxMy40MzkyMjgsIDUyLjU1NTM1MV0sIFsxMy40MzkzNDksIDUyLjU1NTM4N10sIFsxMy40Mzk0NDUsIDUyLjU1NTQ2OV0sIFsxMy40Mzk0NjMsIDUyLjU1NTU1MV0sIFsxMy40MzkzOTcsIDUyLjU1NTY1Ml0sIFsxMy40NDU3MTQsIDUyLjU1ODQyOV0sIFsxMy40NDg3ODQsIDUyLjU1OTc1OF0sIFsxMy40NTAxOCwgNTIuNTYwMzkxXSwgWzEzLjQ1MzUxOSwgNTIuNTYxODA5XSwgWzEzLjQ1NDE5NywgNTIuNTYyMTEzXSwgWzEzLjQ1NDI5NCwgNTIuNTYyMTg5XSwgWzEzLjQ1NzExNywgNTIuNTYwOTk5XSwgWzEzLjQ2MTE3NCwgNTIuNTY0MjI4XSwgWzEzLjQ2Mzg3NSwgNTIuNTY2NDExXSwgWzEzLjQ2NDEyNywgNTIuNTY2NjAxXSwgWzEzLjQ2NDMxNCwgNTIuNTY2NzA4XSwgWzEzLjQ2NDgyNCwgNTIuNTY2OTEzXSwgWzEzLjQ2NTM5LCA1Mi41NjcwNjFdLCBbMTMuNDY1OTExLCA1Mi41NjcxMjVdLCBbMTMuNDY3MDM2LCA1Mi41NjcyMzZdLCBbMTMuNDY4MDc0LCA1Mi41NjczMjVdLCBbMTMuNDY4NzA0LCA1Mi41NjczNjZdLCBbMTMuNDY5OTI0LCA1Mi41Njc0MTFdLCBbMTMuNDcxNzcsIDUyLjU2NzQzN10sIFsxMy40NzI2NzksIDUyLjU2NzQxM10sIFsxMy40NzM2ODcsIDUyLjU2NzM1N10sIFsxMy40NzUwMDgsIDUyLjU2NzI0OF0sIFsxMy40NzcwNjksIDUyLjU2Njk3Nl0sIFsxMy40NzcxNTgsIDUyLjU2NzIyOF0sIFsxMy40NzcxNjIsIDUyLjU2NzQxOV0sIFsxMy40NzcxMDksIDUyLjU2NzUwNV0sIFsxMy40NzcwMDIsIDUyLjU2NzYwNV0sIFsxMy40NzYzODYsIDUyLjU2ODA5M10sIFsxMy40Nzc2MzMsIDUyLjU2ODY4OV0sIFsxMy40Nzk4MDcsIDUyLjU3MDAyN10sIFsxMy40ODAyMTQsIDUyLjU3MDI1NV0sIFsxMy40ODE1MzksIDUyLjU3MDkzN10sIFsxMy40ODE4NSwgNTIuNTcxMTE2XSwgWzEzLjQ4MjE0NSwgNTIuNTcxMzM2XSwgWzEzLjQ4MjMsIDUyLjU3MTQ4MV0sIFsxMy40ODI0NzEsIDUyLjU3MTc0Nl0sIFsxMy40ODI1NzYsIDUyLjU3MjAxXSwgWzEzLjQ4MjYwMiwgNTIuNTcyMTM3XSwgWzEzLjQ4MzA4NCwgNTIuNTc0OTQ3XSwgWzEzLjQ4MzI4OSwgNTIuNTc2MjY4XSwgWzEzLjQ4MzM4NCwgNTIuNTc3MTk4XSwgWzEzLjQ4MzI2NiwgNTIuNTc3NzExXSwgWzEzLjQ4MjcyMiwgNTIuNTc5NTQzXSwgWzEzLjQ4Mjc2MywgNTIuNTgwMTE5XSwgWzEzLjQ4Mjk5MSwgNTIuNTgxNzA3XSwgWzEzLjQ4MzA3NywgNTIuNTgyMjEyXSwgWzEzLjQ4MzI2MSwgNTIuNTgyOTY5XSwgWzEzLjQ4MDM3NiwgNTIuNTgzNTIxXSwgWzEzLjQ4MDMxNSwgNTIuNTgzNDU5XSwgWzEzLjQ3OTc2OCwgNTIuNTgxOTA0XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgImlkIjogIjAiLCAidHlwZSI6ICJGZWF0dXJlIn1dLCAidHlwZSI6ICJGZWF0dXJlQ29sbGVjdGlvbiJ9KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzc1MmVjMDk1ZGRiZTQ5ZWU5Y2FjM2I4M2Y0OGE5ZDEyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuNDk1MzIzLCAxMy4zMjgxMzNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMWJiOWFiY2VlYzVhNDQ4MWJkYjQ0OTkzZjVhYjkzMzgpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzQ4MWRhYmVkZGNiZTRiMWJhMWQ0YWI1ODlhNTdjYmVhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJpbmZvLXNpZ24iLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImdyZWVuIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNzUyZWMwOTVkZGJlNDllZTljYWMzYjgzZjQ4YTlkMTIuc2V0SWNvbihpY29uXzQ4MWRhYmVkZGNiZTRiMWJhMWQ0YWI1ODlhNTdjYmVhKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85MzFjYTI5OTMzMDQ0N2UzYjY3NWMxY2MzNmQ5ZjVlNiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOGU3MjgyMGIwNDI5NGFkOWI5MTIwNWM2NjdjY2MyMTggPSAkKGA8ZGl2IGlkPSJodG1sXzhlNzI4MjBiMDQyOTRhZDliOTEyMDVjNjY3Y2NjMjE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zdGFydDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85MzFjYTI5OTMzMDQ0N2UzYjY3NWMxY2MzNmQ5ZjVlNi5zZXRDb250ZW50KGh0bWxfOGU3MjgyMGIwNDI5NGFkOWI5MTIwNWM2NjdjY2MyMTgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNzUyZWMwOTVkZGJlNDllZTljYWMzYjgzZjQ4YTlkMTIuYmluZFBvcHVwKHBvcHVwXzkzMWNhMjk5MzMwNDQ3ZTNiNjc1YzFjYzM2ZDlmNWU2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzkyOTJjYmM5ZTAyZTRjMWNiOTUyMDhhNDgzNTAwMThlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNTIuNTgxMTQ4LCAxMy40NzY3OTFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMWJiOWFiY2VlYzVhNDQ4MWJkYjQ0OTkzZjVhYjkzMzgpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2Q0Yzc2YjMyMzU0ODQ2ZjVhMTE4MTcwZGIwY2VmNTA4ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJpbmZvLXNpZ24iLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogInJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzkyOTJjYmM5ZTAyZTRjMWNiOTUyMDhhNDgzNTAwMThlLnNldEljb24oaWNvbl9kNGM3NmIzMjM1NDg0NmY1YTExODE3MGRiMGNlZjUwOCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjIzOThmMDMyYjJjNDU2MWE5Nzg0MGE4N2Y0Mjc3NGUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzk5YjQyODJjOWVjMzQ3MDdhYmRmODllYTU2YThiYzkwID0gJChgPGRpdiBpZD0iaHRtbF85OWI0MjgyYzllYzM0NzA3YWJkZjg5ZWE1NmE4YmM5MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZW5kPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2YyMzk4ZjAzMmIyYzQ1NjFhOTc4NDBhODdmNDI3NzRlLnNldENvbnRlbnQoaHRtbF85OWI0MjgyYzllYzM0NzA3YWJkZjg5ZWE1NmE4YmM5MCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl85MjkyY2JjOWUwMmU0YzFjYjk1MjA4YTQ4MzUwMDE4ZS5iaW5kUG9wdXAocG9wdXBfZjIzOThmMDMyYjJjNDU2MWE5Nzg0MGE4N2Y0Mjc3NGUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgZnVuY3Rpb24gZ2VvX2pzb25fMDE0YzdlOTY3MTNmNDA0ODgwZTQzZGM4MmRmZDliZWNfc3R5bGVyKGZlYXR1cmUpIHsKICAgICAgICAgICAgc3dpdGNoKGZlYXR1cmUuaWQpIHsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsiY29sb3IiOiAib3JhbmdlIiwgIm9wYWNpdHkiOiAwLjUsICJ3ZWlnaHQiOiA1fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZW9fanNvbl8wMTRjN2U5NjcxM2Y0MDQ4ODBlNDNkYzgyZGZkOWJlY19vbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgICAgICAgIGxheWVyLm9uKHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgbWFwXzFiYjlhYmNlZWM1YTQ0ODFiZGI0NDk5M2Y1YWI5MzM4LmZpdEJvdW5kcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgdmFyIGdlb19qc29uXzAxNGM3ZTk2NzEzZjQwNDg4MGU0M2RjODJkZmQ5YmVjID0gTC5nZW9Kc29uKG51bGwsIHsKICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IGdlb19qc29uXzAxNGM3ZTk2NzEzZjQwNDg4MGU0M2RjODJkZmQ5YmVjX29uRWFjaEZlYXR1cmUsCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3R5bGU6IGdlb19qc29uXzAxNGM3ZTk2NzEzZjQwNDg4MGU0M2RjODJkZmQ5YmVjX3N0eWxlciwKICAgICAgICB9KS5hZGRUbyhtYXBfMWJiOWFiY2VlYzVhNDQ4MWJkYjQ0OTkzZjVhYjkzMzgpOwoKICAgICAgICBmdW5jdGlvbiBnZW9fanNvbl8wMTRjN2U5NjcxM2Y0MDQ4ODBlNDNkYzgyZGZkOWJlY19hZGQgKGRhdGEpIHsKICAgICAgICAgICAgZ2VvX2pzb25fMDE0YzdlOTY3MTNmNDA0ODgwZTQzZGM4MmRmZDliZWMuYWRkRGF0YShkYXRhKTsKICAgICAgICB9CiAgICAgICAgICAgIGdlb19qc29uXzAxNGM3ZTk2NzEzZjQwNDg4MGU0M2RjODJkZmQ5YmVjX2FkZCh7ImZlYXR1cmVzIjogW3siZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1sxMy4zMjgxODUsIDUyLjQ5NTE1MV0sIFsxMy4zMjc2NzcsIDUyLjQ5NTA5NF0sIFsxMy4zMjcxMDMsIDUyLjQ5NDk3N10sIFsxMy4zMjczMDMsIDUyLjQ5NDcxM10sIFsxMy4zMjgyMTcsIDUyLjQ5NDg0Nl0sIFsxMy4zMzEwMzgsIDUyLjQ5NTEzMV0sIFsxMy4zMzEwOTUsIDUyLjQ5NTQyMl0sIFsxMy4zMzEwODgsIDUyLjQ5NTUyNF0sIFsxMy4zMzExMzEsIDUyLjQ5NTg1Ml0sIFsxMy4zMzExMzksIDUyLjQ5NjIyNF0sIFsxMy4zMzExODksIDUyLjQ5NjM0MV0sIFsxMy4zMzEyNzcsIDUyLjQ5NjQzM10sIFsxMy4zMzMxNzIsIDUyLjQ5NzU1N10sIFsxMy4zMzM4NDUsIDUyLjQ5Nzk5Ml0sIFsxMy4zMzQ0NTQsIDUyLjQ5ODQ2NV0sIFsxMy4zMzU0MjgsIDUyLjQ5OTI2Nl0sIFsxMy4zMzU5NjYsIDUyLjQ5OTk2OV0sIFsxMy4zMzY5MDYsIDUyLjUwMDg2N10sIFsxMy4zMzkyNTMsIDUyLjUwMzA0XSwgWzEzLjM0MDg1OSwgNTIuNTA0NTc4XSwgWzEzLjM0MTA0MiwgNTIuNTA0Njc5XSwgWzEzLjM0MTE3NSwgNTIuNTA0ODA4XSwgWzEzLjM0MTI3NywgNTIuNTA1MDIyXSwgWzEzLjM0MTM3MiwgNTIuNTA1NDg1XSwgWzEzLjM0MTQxNiwgNTIuNTA1NTYzXSwgWzEzLjM0MTU1OSwgNTIuNTA1Njg1XSwgWzEzLjM0MTcwMiwgNTIuNTA1NzY0XSwgWzEzLjM0NDYxNiwgNTIuNTA2MzYzXSwgWzEzLjM0Njk1LCA1Mi41MDY4MjJdLCBbMTMuMzQ3NjExLCA1Mi41MDY5OThdLCBbMTMuMzQ3ODU4LCA1Mi41MDcwOTVdLCBbMTMuMzQ4MzczLCA1Mi41MDczNjNdLCBbMTMuMzQ4NjM1LCA1Mi41MDc1MzhdLCBbMTMuMzQ4ODk2LCA1Mi41MDc3NTVdLCBbMTMuMzQ5MzMyLCA1Mi41MDgyMDJdLCBbMTMuMzQ5NDU0LCA1Mi41MDgzODldLCBbMTMuMzQ5NTI3LCA1Mi41MDg1NTldLCBbMTMuMzQ5NjE0LCA1Mi41MDg4ODhdLCBbMTMuMzQ5NzIyLCA1Mi41MDkwNThdLCBbMTMuMzQ5ODkxLCA1Mi41MDkxOTJdLCBbMTMuMzUwMjIsIDUyLjUwOTMzNl0sIFsxMy4zNTA1MSwgNTIuNTA5NDE3XSwgWzEzLjM1MDY4NCwgNTIuNTA5NDUxXSwgWzEzLjM1MTQ5NiwgNTIuNTA5NTQxXSwgWzEzLjM1MjkwNywgNTIuNTA5NjE0XSwgWzEzLjM1MzIyLCA1Mi41MDk1OTRdLCBbMTMuMzUzOTE2LCA1Mi41MDk2MTVdLCBbMTMuMzU2NDgyLCA1Mi41MDk4MzhdLCBbMTMuMzU3MjgzLCA1Mi41MDk4OTVdLCBbMTMuMzU4MDA3LCA1Mi41MDk5MTFdLCBbMTMuMzYyODgxLCA1Mi41MDk3NzVdLCBbMTMuMzYzMjQsIDUyLjUwOTgwNV0sIFsxMy4zNjQzODcsIDUyLjUwOTk5Ml0sIFsxMy4zNzEyNDYsIDUyLjUxMTE0NF0sIFsxMy4zNzA3ODgsIDUyLjUxMjIyN10sIFsxMy4zNzAwOCwgNTIuNTE0MTQ4XSwgWzEzLjM3MDAxLCA1Mi41MTQ1MDZdLCBbMTMuMzY5OTU0LCA1Mi41MTUxNDRdLCBbMTMuMzY5OTc1LCA1Mi41MTU4NTddLCBbMTMuMzcwMDYyLCA1Mi41MTYyNDJdLCBbMTMuMzcwMTgsIDUyLjUxNjYyNl0sIFsxMy4zNzAzODIsIDUyLjUxNzEzM10sIFsxMy4zNzA2MzMsIDUyLjUxNzY1Nl0sIFsxMy4zNzE5MDEsIDUyLjUxOTkzMV0sIFsxMy4zNzE5NjUsIDUyLjUyMDEzXSwgWzEzLjM3MTk3NSwgNTIuNTIwNjIyXSwgWzEzLjM3MTkyNywgNTIuNTIwODAyXSwgWzEzLjM3MTY5OSwgNTIuNTIxMjQ2XSwgWzEzLjM3MTQ0MSwgNTIuNTIxNjIzXSwgWzEzLjM3MDgyMywgNTIuNTIyMzgyXSwgWzEzLjM3MDI0OSwgNTIuNTIzMDE2XSwgWzEzLjM2OTkzNSwgNTIuNTIzMjc3XSwgWzEzLjM2OTU0LCA1Mi41MjM0ODhdLCBbMTMuMzY5MDEzLCA1Mi41MjM2OF0sIFsxMy4zNjg4MzgsIDUyLjUyMzc3XSwgWzEzLjM2ODU0NywgNTIuNTIzOTY3XSwgWzEzLjM2ODI4MSwgNTIuNTI0MjMzXSwgWzEzLjM2ODIxNiwgNTIuNTI0MzRdLCBbMTMuMzY4MTQsIDUyLjUyNDU1Ml0sIFsxMy4zNjgwODUsIDUyLjUyNTI3XSwgWzEzLjM2Nzg1NywgNTIuNTI1NjY1XSwgWzEzLjM2NzcxMiwgNTIuNTI1OThdLCBbMTMuMzY3Njc4LCA1Mi41MjYxNjJdLCBbMTMuMzY3NzMyLCA1Mi41MjcwMTFdLCBbMTMuMzY3ODEzLCA1Mi41Mjc2MzRdLCBbMTMuMzY3OTEsIDUyLjUyNzg2NF0sIFsxMy4zNjgwNDksIDUyLjUyODAzN10sIFsxMy4zNjg0MDIsIDUyLjUyODM1M10sIFsxMy4zNjg3MzcsIDUyLjUyODU1XSwgWzEzLjM2OTI3OSwgNTIuNTI4NzcyXSwgWzEzLjM2OTU5OSwgNTIuNTI4ODY5XSwgWzEzLjM2OTA2MywgNTIuNTI5NjU0XSwgWzEzLjM2OTA1OSwgNTIuNTI5NzcyXSwgWzEzLjM2ODk4MSwgNTIuNTI5ODkzXSwgWzEzLjM2Mzg5OSwgNTIuNTM1MDYzXSwgWzEzLjM2MzE2LCA1Mi41MzU3ODhdLCBbMTMuMzY1NDQxLCA1Mi41MzcwNzZdLCBbMTMuMzY5NjcsIDUyLjUzOTUxNV0sIFsxMy4zNzA2MjcsIDUyLjUzOTkwNV0sIFsxMy4zNzAzNjEsIDUyLjU0MDExM10sIFsxMy4zNjkzMjQsIDUyLjU0MDczM10sIFsxMy4zNjg2NiwgNTIuNTQxMTA5XSwgWzEzLjM2OTI2OCwgNTIuNTQxMzc1XSwgWzEzLjM2OTcwNSwgNTIuNTQxNTk5XSwgWzEzLjM2OTg0NiwgNTIuNTQxNzA0XSwgWzEzLjM2OTk0MiwgNTIuNTQxODI4XSwgWzEzLjM2OTk4LCA1Mi41NDE5MzJdLCBbMTMuMzY5OTg0LCA1Mi41NDIwMjVdLCBbMTMuMzY5Nzk2LCA1Mi41NDMzNjFdLCBbMTMuMzY5ODM1LCA1Mi41NDM3NDFdLCBbMTMuMzcwMDM0LCA1Mi41NDQyMzJdLCBbMTMuMzcwNjQ2LCA1Mi41NDUyNjJdLCBbMTMuMzcwNzk3LCA1Mi41NDU1NTFdLCBbMTMuMzcwOTA1LCA1Mi41NDU2NDNdLCBbMTMuMzc2NTEzLCA1Mi41NDkxMTZdLCBbMTMuMzgxNTY2LCA1Mi41NTIyODNdLCBbMTMuMzgxODQ3LCA1Mi41NTI0OTVdLCBbMTMuMzgyMjcxLCA1Mi41NTI5MjhdLCBbMTMuMzgzMjgzLCA1Mi41NTQzNV0sIFsxMy4zODQyMjIsIDUyLjU1NTc0N10sIFsxMy4zODQ1OTksIDUyLjU1NjI0N10sIFsxMy4zODYxNzcsIDUyLjU1ODQ3Ml0sIFsxMy4zODYzMTYsIDUyLjU1ODY3NV0sIFsxMy4zODY1MzYsIDUyLjU1OTA3NF0sIFsxMy4zODc2MDYsIDUyLjU2MDM2MV0sIFsxMy4zODg0NTcsIDUyLjU2MTIzOF0sIFsxMy4zODk1NCwgNTIuNTYyMjc5XSwgWzEzLjM5MDAyOSwgNTIuNTYyNjYzXSwgWzEzLjM5MDQ2NSwgNTIuNTYyOTY5XSwgWzEzLjM5MTAyMSwgNTIuNTYzMjgyXSwgWzEzLjM5MzIxNSwgNTIuNTY0NDM5XSwgWzEzLjM5NDkwMSwgNTIuNTY1MzU4XSwgWzEzLjM5NTE0NiwgNTIuNTY1NTFdLCBbMTMuMzk2ODM1LCA1Mi41NjY2NjNdLCBbMTMuNDAwMjY5LCA1Mi41NjkwNjZdLCBbMTMuNDAwNDQ0LCA1Mi41NjkxNV0sIFsxMy40MDA1MTYsIDUyLjU2OTE2OF0sIFsxMy40MDA4ODEsIDUyLjU2OTIwN10sIFsxMy40MDEyMDksIDUyLjU2OTIxOV0sIFsxMy40MDEzMDUsIDUyLjU2OTI1OF0sIFsxMy40MDE0NjksIDUyLjU2OTE5N10sIFsxMy40MDE2MjksIDUyLjU2OTE2NF0sIFsxMy40MDIwOSwgNTIuNTY5MTgxXSwgWzEzLjQwMzIzMSwgNTIuNTY5MzIxXSwgWzEzLjQwMzQ3OSwgNTIuNTY5MzI2XSwgWzEzLjQwNDExNSwgNTIuNTY5MzQyXSwgWzEzLjQwNDQxNCwgNTIuNTY5MzgyXSwgWzEzLjQwNzI0NywgNTIuNTcwMDk2XSwgWzEzLjQwOTE1OCwgNTIuNTcwNTQyXSwgWzEzLjQwOTQzNCwgNTIuNTcwNjI2XSwgWzEzLjQxMDM2MywgNTIuNTcwOTk4XSwgWzEzLjQxMTUzNSwgNTIuNTcxMzQ3XSwgWzEzLjQxMTc5MSwgNTIuNTcxNDY3XSwgWzEzLjQxNDgxNCwgNTIuNTcyMjU2XSwgWzEzLjQxNTAyOCwgNTIuNTcyMjU0XSwgWzEzLjQxNzMyNiwgNTIuNTcyMzUyXSwgWzEzLjQxODAzNSwgNTIuNTcyNDVdLCBbMTMuNDIxNzUyLCA1Mi41NzMxOTddLCBbMTMuNDIyMTk2LCA1Mi41NzM0MjZdLCBbMTMuNDI1NTM0LCA1Mi41NzUzNTFdLCBbMTMuNDI2MTIyLCA1Mi41NzU3NzhdLCBbMTMuNDI4MDE5LCA1Mi41NzcyNTddLCBbMTMuNDI4MzE2LCA1Mi41Nzc1MTNdLCBbMTMuNDI4NzAxLCA1Mi41Nzc5NTFdLCBbMTMuNDI4ODA3LCA1Mi41NzgyMjNdLCBbMTMuNDI4ODMsIDUyLjU3ODQzXSwgWzEzLjQyODgwMiwgNTIuNTgxNDY5XSwgWzEzLjQyODYxMSwgNTIuNTgzMDQyXSwgWzEzLjQyODYxMiwgNTIuNTgzNzAxXSwgWzEzLjQyOTAzMiwgNTIuNTg1MDgxXSwgWzEzLjQyOTg2MSwgNTIuNTg3NTU2XSwgWzEzLjQzMDcyNiwgNTIuNTkwMDMxXSwgWzEzLjQzMDk1NiwgNTIuNTkwMDA5XSwgWzEzLjQzMTE1MiwgNTIuNTkwMDIzXSwgWzEzLjQzMTI4NCwgNTIuNTkwMDYyXSwgWzEzLjQzMTQ2NiwgNTIuNTkwMTU5XSwgWzEzLjQzNjY2OCwgNTIuNTkyNTM2XSwgWzEzLjQzNjgxNSwgNTIuNTkyNDI0XSwgWzEzLjQzNzExOCwgNTIuNTkyMzA3XSwgWzEzLjQ0MDEwNywgNTIuNTkxNjM3XSwgWzEzLjQ0MDg2LCA1Mi41OTE0MTZdLCBbMTMuNDQyMTY4LCA1Mi41OTA5NTNdLCBbMTMuNDQzMjc4LCA1Mi41OTA1NF0sIFsxMy40NDM1MzIsIDUyLjU5MDQ4NF0sIFsxMy40NDM5MTUsIDUyLjU5MDQ4XSwgWzEzLjQ1MDM5OSwgNTIuNTkxMjM1XSwgWzEzLjQ1MTQ0MiwgNTIuNTkxMjk3XSwgWzEzLjQ1MzU0MSwgNTIuNTkxMzg3XSwgWzEzLjQ1MzM3NywgNTIuNTkwODU5XSwgWzEzLjQ1MzE0NywgNTIuNTg5OTA5XSwgWzEzLjQ1MzQyNiwgNTIuNTg5ODYxXSwgWzEzLjQ1NDEwOSwgNTIuNTg5Mzg3XSwgWzEzLjQ1ODcwOCwgNTIuNTg2MDU3XSwgWzEzLjQ1OTc4LCA1Mi41ODUzMDldLCBbMTMuNDYxODYxLCA1Mi41ODQ0MDldLCBbMTMuNDYyODM2LCA1Mi41ODQwOTRdLCBbMTMuNDYzMzQ2LCA1Mi41ODM5NTNdLCBbMTMuNDYzOTMyLCA1Mi41ODM4MjJdLCBbMTMuNDY0NTM0LCA1Mi41ODM3MTZdLCBbMTMuNDY3NTc5LCA1Mi41ODMyNDhdLCBbMTMuNDY3ODgsIDUyLjU4MzIzM10sIFsxMy40NjgzNTQsIDUyLjU4MzI2Nl0sIFsxMy40Njk5OTEsIDUyLjU4MzQ0OF0sIFsxMy40NzE0NjIsIDUyLjU4MzczM10sIFsxMy40NzQyMjYsIDUyLjU4NDE0NV0sIFsxMy40NzQ3NTcsIDUyLjU4NDIxN10sIFsxMy40NzUxMzgsIDUyLjU4NDIzN10sIFsxMy40NzczNzksIDUyLjU4NDAzN10sIFsxMy40Nzc5NzIsIDUyLjU4Mzk2Nl0sIFsxMy40Nzg1MjcsIDUyLjU4Mzg3OF0sIFsxMy40ODAzNzYsIDUyLjU4MzUyMV0sIFsxMy40ODAzMTUsIDUyLjU4MzQ1OV0sIFsxMy40Nzk3NjgsIDUyLjU4MTkwNF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifSk7CiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fd0f181aa20>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"start=[13.328133,52.495323]\n",
"end=[13.476791,52.581148]\n",
"r = requests.post(url=route_url, json={'points':[start,end], 'points_encoded': False, 'algorithm': 'alternative_route'})\n",
"route = r.json()\n",
"if 'message' in route: raise Exception(route[\"message\"])\n",
"\n",
"m = folium.Map(location=latlon(start), zoom_start=12)\n",
"plot_route(m, start, end, route[\"paths\"][0][\"points\"], \"route\", \"green\")\n",
"if len(route[\"paths\"]) > 1:\n",
" plot_route(m, start, end, route[\"paths\"][1][\"points\"], \"alternative\", \"red\")\n",
"if len(route[\"paths\"]) > 2:\n",
" plot_route(m, start, end, route[\"paths\"][2][\"points\"], \"second alternative\", \"orange\")\n",
"\n",
"m"
]
}
],
"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.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment