Skip to content

Instantly share code, notes, and snippets.

@sammko
Last active June 12, 2020 11:20
Show Gist options
  • Save sammko/3bce10656778e670629c2b63c62f7357 to your computer and use it in GitHub Desktop.
Save sammko/3bce10656778e670629c2b63c62f7357 to your computer and use it in GitHub Desktop.
Intersection Test
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"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.8.0"
},
"colab": {
"name": "Intersection Test",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/sammko/3bce10656778e670629c2b63c62f7357/intersection-test.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "owEDxcE6lqxu",
"colab_type": "code",
"outputId": "d95f1a1f-58ab-40f4-eab2-a54b394a9fea",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 102
}
},
"source": [
"!pip install pygeodesy"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting pygeodesy\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/3e/d2/8f880f1b22c2f308841448effcd48b69c9d883d744e394ce456ef977efd2/PyGeodesy-20.5.30-py2.py3-none-any.whl (367kB)\n",
"\u001b[K |████████████████████████████████| 368kB 2.9MB/s \n",
"\u001b[?25hInstalling collected packages: pygeodesy\n",
"Successfully installed pygeodesy-20.5.30\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "w8J1kPZAlk_H",
"colab_type": "code",
"colab": {}
},
"source": [
"import random\n",
"import folium\n",
"import itertools\n",
"from operator import itemgetter\n",
"from pygeodesy import sphericalNvector as snv\n",
"from math import cos, sin, acos, tan, radians, degrees"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "sMR5jt-5lk_L",
"colab_type": "code",
"colab": {}
},
"source": [
"def circ_intersect(s1, r1, s2, r2):\n",
" R = 6371008.77141\n",
" B = radians(s1.initialBearingTo(s2))\n",
" D = s1.distanceTo(s2)/R\n",
" a1 = r1/R\n",
" a2 = r2/R\n",
" tx = (cos(a2)/cos(a1)-cos(D))/sin(D)\n",
" try:\n",
" x = acos(tx/tan(a1))\n",
" except ValueError:\n",
" return ()\n",
" return (s1.destination(r1, degrees(B+x)), s1.destination(r1, degrees(B-x)))"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "exWVWVGClk_O",
"colab_type": "code",
"colab": {}
},
"source": [
"def rand_coords():\n",
" return snv.LatLon(random.random()*180-90, random.random()*360-180)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "MCFnTJPqlk_Q",
"colab_type": "code",
"colab": {}
},
"source": [
"def lltup(s):\n",
" return (s.lat, s.lon)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "WdI635APlk_T",
"colab_type": "code",
"outputId": "0859ef1e-d690-4e11-f2a5-d51c36adb3a8",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"N = 10\n",
"def test():\n",
" x = rand_coords()\n",
" centers = [rand_coords() for i in range(N)]\n",
" circles = [(center, center.distanceTo(x)) for center in centers]\n",
" points = []\n",
" for c1, c2 in itertools.combinations(circles, 2):\n",
" s1, r1 = c1\n",
" s2, r2 = c2\n",
" ins = circ_intersect(s1, r1, s2, r2)\n",
" ins = [(p, p.distanceTo(x)) for p in ins]\n",
" closest = min(ins, key=itemgetter(1))\n",
" points.append(closest)\n",
" #print(closest[0].distanceTo(x))\n",
" return x, circles, points\n",
"x, circles, points = test()\n",
"distances = lambda: map(itemgetter(1), points)\n",
"max(distances())"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.000508132531859604"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "3RrDysGslk_W",
"colab_type": "code",
"outputId": "0a059e69-4d13-493b-da09-79003a3be860",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
}
},
"source": [
"mymap = folium.Map()\n",
"for p, d in circles:\n",
" folium.Marker(lltup(p), icon=folium.Icon(color='red')).add_to(mymap)\n",
" folium.Circle(lltup(p), d, stroke=0.1).add_to(mymap)\n",
"folium.Marker(lltup(x)).add_to(mymap)\n",
"mymap"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfYjljZjlmY2RmMTQzNDM4OTk3NDU5NDAxNDc5M2Y1MTkgPSBMLm1hcCgKICAgICAgICAnbWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5JywgewogICAgICAgIGNlbnRlcjogWzAsIDBdLAogICAgICAgIHpvb206IDEsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2JjYjFiYTRjZWM1MDRlNzQ5YTkyOWViY2RmODE0ZTQ2ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICB7CiAgICAgICAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAgICAgICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgICAgICAgIm1heE5hdGl2ZVpvb20iOiAxOCwKICAgICAgICAibWF4Wm9vbSI6IDE4LAogICAgICAgICJtaW5ab29tIjogMCwKICAgICAgICAibm9XcmFwIjogZmFsc2UsCiAgICAgICAgIm9wYWNpdHkiOiAxLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIsCiAgICAgICAgInRtcyI6IGZhbHNlCn0pLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAKICAgICAgICB2YXIgbWFya2VyXzY5ZjY3ZTMxZGY4MjQzZmVhYzA3NDkwZWU5MjkxYjJhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFsxOS41MjkzNjMxNzA4NzUxMywgNDUuOTQ1OTI5NTI0NjYwOTI2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzU3MGZjNTIwZjVmYzRkODVhYzg2MTI2NjZhNWI2ZmEwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mby1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNjlmNjdlMzFkZjgyNDNmZWFjMDc0OTBlZTkyOTFiMmEuc2V0SWNvbihpY29uXzU3MGZjNTIwZjVmYzRkODVhYzg2MTI2NjZhNWI2ZmEwKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfOWUwZTMzZWFmOGVjNDFiZmFjZDcxMzU4NzFjMjNiMWYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFsxOS41MjkzNjMxNzA4NzUxMywgNDUuOTQ1OTI5NTI0NjYwOTI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogOTYzNTU0NC41MDA2NjM3MDUsCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2VhZGIxNjliNzZiMzQyMDA5YjE1NDJmNzk5NjQzYzg3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFszMi41MDMwODY4NDcyNzY2MzQsIC0xMzQuMzA0NDA0MjMyOTc4MTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjljZjlmY2RmMTQzNDM4OTk3NDU5NDAxNDc5M2Y1MTkpOwogICAgICAgIAogICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMDFmMmUxNThkYjk1NDg4ZjlhMTVjZTU4MzNmN2I2MDIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdpbmZvLXNpZ24nLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9lYWRiMTY5Yjc2YjM0MjAwOWIxNTQyZjc5OTY0M2M4Ny5zZXRJY29uKGljb25fMDFmMmUxNThkYjk1NDg4ZjlhMTVjZTU4MzNmN2I2MDIpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV81NTM4NDdiYWQzZWM0ZjQyYWRkNjNkYjY3ZDg1N2VhNiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzMyLjUwMzA4Njg0NzI3NjYzNCwgLTEzNC4zMDQ0MDQyMzI5NzgxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDk2MTcxNDMuOTE1NjMxMjE2LAogICJzdHJva2UiOiAwLjEsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9jYzI2NWRlYjhjZmM0ZmVkODUwNGU4MThlM2Y5NzU1ZSA9IEwubWFya2VyKAogICAgICAgICAgICBbLTg4LjAyNTQyMTk0MTAxMjc0LCAtMTM3LjQ0MTA2OTMzNzA1NTEzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzdhYmE2Njk2NDZjMDQ1MjNhMzJhYWQ1NTE1NjI0ZWI1ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mby1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfY2MyNjVkZWI4Y2ZjNGZlZDg1MDRlODE4ZTNmOTc1NWUuc2V0SWNvbihpY29uXzdhYmE2Njk2NDZjMDQ1MjNhMzJhYWQ1NTE1NjI0ZWI1KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfODU4NDgzYzhmMjI3NDFlOTkzNDQxZDhlMTBmZmEwNDUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFstODguMDI1NDIxOTQxMDEyNzQsIC0xMzcuNDQxMDY5MzM3MDU1MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMDkxNzYxNC4xODU5ODYyNDMsCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzI0ODIyMjE2NGZiNDQ4NjJiMzJjOTFjNGY1ZDg5YmZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFstMjUuODc4MzMwODc0MDE2MDcyLCAtMC44Mzc1NDQ4NjEzMzAyNTgxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2MxMjFjYWNjNTM4NTQ4ODE5ZjlhOTE3MDkwMWM5ODRjID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mby1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMjQ4MjIyMTY0ZmI0NDg2MmIzMmM5MWM0ZjVkODliZmQuc2V0SWNvbihpY29uX2MxMjFjYWNjNTM4NTQ4ODE5ZjlhOTE3MDkwMWM5ODRjKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfN2I3MjczMGYzMjM0NDA0Zjg4NzcyNjUwODAxOWNhYjEgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFstMjUuODc4MzMwODc0MDE2MDcyLCAtMC44Mzc1NDQ4NjEzMzAyNTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTk0MjUxOC40MDcwODA2NTksCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2M3ODhiMDIwZGVmZjQ0NzZhMTgzNThhMmZlNWU5OTQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs2LjQ3NjYzNTk1NzA0MDE3MywgLTIxLjgxODkxNjI2MTkyOTM4OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl83NjM3ZTVjZTE0OWM0YTVhOWE4YzU5MzVlMDM5YmQ4YiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2luZm8tc2lnbicsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2M3ODhiMDIwZGVmZjQ0NzZhMTgzNThhMmZlNWU5OTQ0LnNldEljb24oaWNvbl83NjM3ZTVjZTE0OWM0YTVhOWE4YzU5MzVlMDM5YmQ4Yik7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzQ3YWQzNDc3NWM3MDQwNTJhZmY4MGQzZDhkYjkwMWI2ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNi40NzY2MzU5NTcwNDAxNzMsIC0yMS44MTg5MTYyNjE5MjkzODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMzgwNDU2LjU5Nzg5NzA1MzcsCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2I3YTE1NTQ3ZjY4MzRhMGZhMTc2MzgyOGEyZjI5ZmY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFstNDEuNDgyMjQ0MTM0NTMyNTg2LCAtMTQ0LjAxMTA2ODE2NjgwNzY2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzI1ZmI4YzE0NzIwNDQxYjg4N2JiMzQ2YjdiMTVhYzA1ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mby1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYjdhMTU1NDdmNjgzNGEwZmExNzYzODI4YTJmMjlmZjYuc2V0SWNvbihpY29uXzI1ZmI4YzE0NzIwNDQxYjg4N2JiMzQ2YjdiMTVhYzA1KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMDQ4ZTY0Zjg4OTE0NGYxMzg0YzQ3NGFlOTRhMjQyYzQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFstNDEuNDgyMjQ0MTM0NTMyNTg2LCAtMTQ0LjAxMTA2ODE2NjgwNzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTE0ODYzNjAuMTE2NDQ2NTkyLAogICJzdHJva2UiOiAwLjEsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82NDZhNWUyZTdjYTE0ODZkOTJhNTNmNTkyYWIxZDE0NiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDcuNDQ5OTk2MjA2NTM4MDksIDE1Ni40NzM2MzMyNzA5NjUwOF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9lMGI4YWM4NjIwODE0YWRkOWZmOGQ2ZjE4MTczNzQwMyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2luZm8tc2lnbicsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzY0NmE1ZTJlN2NhMTQ4NmQ5MmE1M2Y1OTJhYjFkMTQ2LnNldEljb24oaWNvbl9lMGI4YWM4NjIwODE0YWRkOWZmOGQ2ZjE4MTczNzQwMyk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzFjZGMxNTk0NmMwYTRkNmM4N2YzYzI3ZTc3NTcxZDcxID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNDcuNDQ5OTk2MjA2NTM4MDksIDE1Ni40NzM2MzMyNzA5NjUwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEzNTQyMjIyLjg0NTI4NDc0LAogICJzdHJva2UiOiAwLjEsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wOWYzZmQ2MzljYWY0Mjg4Yjc3OGI0ZjE0OTdjNWFkOSA9IEwubWFya2VyKAogICAgICAgICAgICBbLTI0LjAzMjEzODUxMDU0ODY5LCAtMTQ4LjcwNDM4NTY0NjIwMTNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjljZjlmY2RmMTQzNDM4OTk3NDU5NDAxNDc5M2Y1MTkpOwogICAgICAgIAogICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fM2ZiMzY4MGJmODFhNGE4NDllNjVjOTcwZGQ5MzliYzcgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdpbmZvLXNpZ24nLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8wOWYzZmQ2MzljYWY0Mjg4Yjc3OGI0ZjE0OTdjNWFkOS5zZXRJY29uKGljb25fM2ZiMzY4MGJmODFhNGE4NDllNjVjOTcwZGQ5MzliYzcpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV81YTgxZGNiNzFjYTM0ZjFkODgxNjA0MTZlMWU5ZTg1NCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWy0yNC4wMzIxMzg1MTA1NDg2OSwgLTE0OC43MDQzODU2NDYyMDEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTE5MjU3NTUuMjY0OTcwNDgzLAogICJzdHJva2UiOiAwLjEsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wNjU2N2RjZWExYWM0YjllODk4Nzk1NTUxZDQ3MGE0ZCA9IEwubWFya2VyKAogICAgICAgICAgICBbNTMuOTg4MTIwMDE2OTUxNDg0LCAtNzEuNjI0MDQ0MDQ5MzM5MDldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjljZjlmY2RmMTQzNDM4OTk3NDU5NDAxNDc5M2Y1MTkpOwogICAgICAgIAogICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNGQ2NzQ0ZTc5MDg4NDBiZGFkOGMyNTcwZmVhZTk2NTIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdpbmZvLXNpZ24nLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8wNjU2N2RjZWExYWM0YjllODk4Nzk1NTUxZDQ3MGE0ZC5zZXRJY29uKGljb25fNGQ2NzQ0ZTc5MDg4NDBiZGFkOGMyNTcwZmVhZTk2NTIpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lMWI1YzdmNGM5ZTE0NjdiOTcyNmNkOWY5ZjBjZDY2NyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUzLjk4ODEyMDAxNjk1MTQ4NCwgLTcxLjYyNDA0NDA0OTMzOTA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTY5ODcxMi4wMTU2NDg1MzYsCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzdjMWI3YTQ1YmRlOTRkZDhiOTlkZjc4MGYzZTkyMTBjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFsyNS45NTcyNDA3NTM5NDUyNywgMTUuOTk4NzAwNzQwMzk1ODA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzBmNzYzMGZkNGFiYTRlMWI5YzY4ZmM3OTZjZjE3Mjc2ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mby1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfN2MxYjdhNDViZGU5NGRkOGI5OWRmNzgwZjNlOTIxMGMuc2V0SWNvbihpY29uXzBmNzYzMGZkNGFiYTRlMWI5YzY4ZmM3OTZjZjE3Mjc2KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZmE1YmU0MjZhN2U3NGRkMzg5NWM3OWQwZDM0Y2ZjMzkgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFsyNS45NTcyNDA3NTM5NDUyNywgMTUuOTk4NzAwNzQwMzk1ODA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNjU1OTE0OS44NjYzMTc5NTYsCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2UxZGY1NTY2ODQ3NjQ2ZDg5M2NhYjY1YWE1MTRkZTE0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs4LjA0ODA4NDY4MjA5NDUyNiwgLTQzLjM0NDUxNjgyNDA1MzgxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKPC9zY3JpcHQ+ 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 0x7f41d0915048>"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment