Skip to content

Instantly share code, notes, and snippets.

@mrkn
Created March 6, 2019 03:06
Show Gist options
  • Save mrkn/055662fdbbde3d070133c1a5fe51f15d to your computer and use it in GitHub Desktop.
Save mrkn/055662fdbbde3d070133c1a5fe51f15d to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 都道府県庁所在地の可視化"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 座標データのダウンロード"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"true"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"system(\"curl -fsSL -O https://www.benricho.org/chimei/latlng_data.xls\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 前処理"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"require 'spreadsheet'\n",
"book = Spreadsheet.open('latlng_data.xls')\n",
"sheet = book.worksheet(\"Sheet1\")\n",
"data = []\n",
"5.upto(sheet.rows.length - 1) {|i|\n",
" break unless sheet.rows[i][5]\n",
" name = sheet.rows[i][1, 2].join(' ')\n",
" lat, lon = sheet.rows[i][5, 2]\n",
" data << [name, lat, lon]\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 地図の初期中心点を求める\n",
"\n",
"全都道府県庁所在地の重心とする。"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[35.38240510638298, 136.0401004255319]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"require 'enumerable/statistics'\n",
"center = [\n",
" data.map {|r| r[1] }.mean,\n",
" data.map {|r| r[2] }.mean\n",
"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 地図上にマーカーを表示"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4zLjQvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4zLjQvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkgPSBMLm1hcCgKICAgICAgICAnbWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5JywgewogICAgICAgIGNlbnRlcjogWzM1LjM4MjQwNTEwNjM4Mjk4LCAxMzYuMDQwMTAwNDI1NTMxOV0sCiAgICAgICAgem9vbTogNSwKICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICBsYXllcnM6IFtdLAogICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgfSk7CgogICAgCiAgICAKICAgIHZhciB0aWxlX2xheWVyXzg2NDRhYTczYzAyNDQ3OTliMjJiZTA4NDk0ZTM0ZjNhID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICB7CiAgICAgICAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAgICAgICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgICAgICAgIm1heE5hdGl2ZVpvb20iOiAxOCwKICAgICAgICAibWF4Wm9vbSI6IDE4LAogICAgICAgICJtaW5ab29tIjogMCwKICAgICAgICAibm9XcmFwIjogZmFsc2UsCiAgICAgICAgIm9wYWNpdHkiOiAxLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIsCiAgICAgICAgInRtcyI6IGZhbHNlCn0pLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2Q4OTU4ZDVhMTZlNGIwZWJlZGM0OTEzYWIzMGI5MWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My4wNjQxNywgMTQxLjM0Njk0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzOTdmYjM2Y2RiZTRiNWZhY2RkYzJiNjlhZTBhZWI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTg5ZWYzNGU0YWIxNGQzMGJlMjQ0MmEzNWViODNmOGIgPSAkKGA8ZGl2IGlkPSJodG1sXzk4OWVmMzRlNGFiMTRkMzBiZTI0NDJhMzVlYjgzZjhiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7ljJfmtbfpgZMg5pyt5bmM5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMzk3ZmIzNmNkYmU0YjVmYWNkZGMyYjY5YWUwYWViOC5zZXRDb250ZW50KGh0bWxfOTg5ZWYzNGU0YWIxNGQzMGJlMjQ0MmEzNWViODNmOGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2Q4OTU4ZDVhMTZlNGIwZWJlZGM0OTEzYWIzMGI5MWMuYmluZFBvcHVwKHBvcHVwX2IzOTdmYjM2Y2RiZTRiNWZhY2RkYzJiNjlhZTBhZWI4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85Mjg1NWU5M2QxMjQ0ZWY4YTgxYTJkNDRmOTJmYjg1YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyNDQ0LCAxNDAuNzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODU4Zjg0ZTAxYzIwNDhjYThmMDEwMDg4Yzc0MWU5YjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZTI1N2UwYTRhOWY0NzBhOTMxYWY0N2JlMGQ4MjllZSA9ICQoYDxkaXYgaWQ9Imh0bWxfM2UyNTdlMGE0YTlmNDcwYTkzMWFmNDdiZTBkODI5ZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPumdkuajruecjCDpnZLmo67luII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1OGY4NGUwMWMyMDQ4Y2E4ZjAxMDA4OGM3NDFlOWIyLnNldENvbnRlbnQoaHRtbF8zZTI1N2UwYTRhOWY0NzBhOTMxYWY0N2JlMGQ4MjllZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Mjg1NWU5M2QxMjQ0ZWY4YTgxYTJkNDRmOTJmYjg1Yi5iaW5kUG9wdXAocG9wdXBfODU4Zjg0ZTAxYzIwNDhjYThmMDEwMDg4Yzc0MWU5YjIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2NjBiMDM5MDEzZDRjOGFhOGRlN2IxODYwM2Y2NDUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNzAzNjEsIDE0MS4xNTI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3YjZjNzM5NGZjNjRhY2I5Mzc0MDMwNTE2MmUzZjdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODNhZGQ5ODEyOTEwNGE1OWI1ODRhOGU4YmExNmI2YTYgPSAkKGA8ZGl2IGlkPSJodG1sXzgzYWRkOTgxMjkxMDRhNTliNTg0YThlOGJhMTZiNmE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7lsqnmiYvnnIwg55ub5bKh5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kN2I2YzczOTRmYzY0YWNiOTM3NDAzMDUxNjJlM2Y3Yi5zZXRDb250ZW50KGh0bWxfODNhZGQ5ODEyOTEwNGE1OWI1ODRhOGU4YmExNmI2YTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjY2MGIwMzkwMTNkNGM4YWE4ZGU3YjE4NjAzZjY0NTMuYmluZFBvcHVwKHBvcHVwX2Q3YjZjNzM5NGZjNjRhY2I5Mzc0MDMwNTE2MmUzZjdiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYTRkMjNiZjA0MmI0YjkxOGI4NzZmMjhhYjk1NzY5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjI2ODg5LCAxNDAuODcxOTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWVkZTU4Yjc0OWExNDMwZThhMmNkYWMxMzgwNWM0ZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMWNkZDNlZTg2Zjg0ODgxOTAyYjEzYWNkYWU5NGYyNSA9ICQoYDxkaXYgaWQ9Imh0bWxfZTFjZGQzZWU4NmY4NDg4MTkwMmIxM2FjZGFlOTRmMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuWuruWfjuecjCDku5nlj7DluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VlZGU1OGI3NDlhMTQzMGU4YTJjZGFjMTM4MDVjNGZlLnNldENvbnRlbnQoaHRtbF9lMWNkZDNlZTg2Zjg0ODgxOTAyYjEzYWNkYWU5NGYyNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYTRkMjNiZjA0MmI0YjkxOGI4NzZmMjhhYjk1NzY5Mi5iaW5kUG9wdXAocG9wdXBfZWVkZTU4Yjc0OWExNDMwZThhMmNkYWMxMzgwNWM0ZmUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRhNDY4M2Y4ZGRiYTQxYzI4NTgxYTI1MmEwODlkZDEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNzE4NjEsIDE0MC4xMDI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI3OTgxYTY3YzNkMjRkOThhN2M3OWNiYjMzMTZkZmI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWM1NmEzOWU2OWIyNDMwMmFhYzk2YzJhMDg4YzBiYTMgPSAkKGA8ZGl2IGlkPSJodG1sXzVjNTZhMzllNjliMjQzMDJhYWM5NmMyYTA4OGMwYmEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7np4vnlLDnnIwg56eL55Sw5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNzk4MWE2N2MzZDI0ZDk4YTdjNzljYmIzMzE2ZGZiNC5zZXRDb250ZW50KGh0bWxfNWM1NmEzOWU2OWIyNDMwMmFhYzk2YzJhMDg4YzBiYTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGE0NjgzZjhkZGJhNDFjMjg1ODFhMjUyYTA4OWRkMTMuYmluZFBvcHVwKHBvcHVwXzI3OTgxYTY3YzNkMjRkOThhN2M3OWNiYjMzMTZkZmI0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZTg2OGI2YWY2M2I0OWNlYTBmZGMzYWNmMmVhMTA4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjI0MDU2LCAxNDAuMzYzMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTA1MTYzY2YxYmZmNGY2NThjZDQ5Y2RiYjNlZjk4MTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMGU4ZDQ1MmU5ZWU0OWQ5OWI2OWQzMWViM2Q3NzE0NyA9ICQoYDxkaXYgaWQ9Imh0bWxfZjBlOGQ0NTJlOWVlNDlkOTliNjlkMzFlYjNkNzcxNDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuWxseW9ouecjCDlsbHlvaLluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwNTE2M2NmMWJmZjRmNjU4Y2Q0OWNkYmIzZWY5ODEzLnNldENvbnRlbnQoaHRtbF9mMGU4ZDQ1MmU5ZWU0OWQ5OWI2OWQzMWViM2Q3NzE0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZTg2OGI2YWY2M2I0OWNlYTBmZGMzYWNmMmVhMTA4NS5iaW5kUG9wdXAocG9wdXBfYTA1MTYzY2YxYmZmNGY2NThjZDQ5Y2RiYjNlZjk4MTMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkODU4NjEwYWMyNjRkMDY5M2M3MzllOTg3N2YwNjYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUsIDE0MC40Njc3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMWIyMTcxYjg1ZDU0OWFlOWFhZjFjMGNhZDhmZGVhNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhYThhMWIyYWE2ZDQ5NTRhN2EwNzZmMGU4YmViMTJiID0gJChgPGRpdiBpZD0iaHRtbF9hYWE4YTFiMmFhNmQ0OTU0YTdhMDc2ZjBlOGJlYjEyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+56aP5bO255yMIOemj+WztuW4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjFiMjE3MWI4NWQ1NDlhZTlhYWYxYzBjYWQ4ZmRlYTcuc2V0Q29udGVudChodG1sX2FhYThhMWIyYWE2ZDQ5NTRhN2EwNzZmMGU4YmViMTJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JkODU4NjEwYWMyNjRkMDY5M2M3MzllOTg3N2YwNjYxLmJpbmRQb3B1cChwb3B1cF9mMWIyMTcxYjg1ZDU0OWFlOWFhZjFjMGNhZDhmZGVhNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDM2NTU1NjY4OGY1NDdjZGI1MDBlZDFjZGUyN2NlYzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4zNDEzOSwgMTQwLjQ0NjY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2MTFiNjM5YzYwODQ2Zjk4NmVhMWNmMjAxZTAxMmZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmM0YjQ5MmE0NGU0NGE1MzhhYzdmYjFlYjU0MjNlOTkgPSAkKGA8ZGl2IGlkPSJodG1sX2JjNGI0OTJhNDRlNDRhNTM4YWM3ZmIxZWI1NDIzZTk5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7ojKjln47nnIwg5rC05oi45biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNjExYjYzOWM2MDg0NmY5ODZlYTFjZjIwMWUwMTJmZC5zZXRDb250ZW50KGh0bWxfYmM0YjQ5MmE0NGU0NGE1MzhhYzdmYjFlYjU0MjNlOTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDM2NTU1NjY4OGY1NDdjZGI1MDBlZDFjZGUyN2NlYzUuYmluZFBvcHVwKHBvcHVwXzE2MTFiNjM5YzYwODQ2Zjk4NmVhMWNmMjAxZTAxMmZkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZjcwMDgyOTdkN2E0MGQzYWYyN2I1ZmI3MmM1YTE1ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM2LjU2NTgzLCAxMzkuODgzNjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmQ0MjY1YWE1ODMyNDQ5Mzk1MWQxNTRhNjUyOWUwYzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yN2FjNmJkZjg2ODI0OWVkODY3ZDZhNGVhYzc0OGI3MSA9ICQoYDxkaXYgaWQ9Imh0bWxfMjdhYzZiZGY4NjgyNDllZDg2N2Q2YTRlYWM3NDhiNzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuagg+acqOecjCDlrofpg73lrq7luII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkNDI2NWFhNTgzMjQ0OTM5NTFkMTU0YTY1MjllMGM3LnNldENvbnRlbnQoaHRtbF8yN2FjNmJkZjg2ODI0OWVkODY3ZDZhNGVhYzc0OGI3MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZjcwMDgyOTdkN2E0MGQzYWYyN2I1ZmI3MmM1YTE1ZS5iaW5kUG9wdXAocG9wdXBfYmQ0MjY1YWE1ODMyNDQ5Mzk1MWQxNTRhNjUyOWUwYzcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBiNzVhZWFlZmM3NDRmMTFhODBjOTIwMmExZWM4YmFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuMzkxMTEsIDEzOS4wNjA4M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOTI0ZGY4MzFmNjc0ZmQxYThkOGJlZTIyZmJhMTMyMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwMTNkODRlNTY3YTRjNmQ5ZDRhODg2OWQ0NThmMmE2ID0gJChgPGRpdiBpZD0iaHRtbF81MDEzZDg0ZTU2N2E0YzZkOWQ0YTg4NjlkNDU4ZjJhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+576k6aas55yMIOWJjeapi+W4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTkyNGRmODMxZjY3NGZkMWE4ZDhiZWUyMmZiYTEzMjEuc2V0Q29udGVudChodG1sXzUwMTNkODRlNTY3YTRjNmQ5ZDRhODg2OWQ0NThmMmE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBiNzVhZWFlZmM3NDRmMTFhODBjOTIwMmExZWM4YmFjLmJpbmRQb3B1cChwb3B1cF8xOTI0ZGY4MzFmNjc0ZmQxYThkOGJlZTIyZmJhMTMyMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjY1ZjkyY2FmMTYxNGRlNTg2NWIwYzg5N2E4ZmM1ZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNS44NTY5NCwgMTM5LjY0ODg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlMjk1OWRlNjI0YTRjMWFiOGI4OGExYTZjZDdkYTI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTY0ZGQwMDQ1M2VmNDc3YWI0OGVjMTZiODI1OWJkNzUgPSAkKGA8ZGl2IGlkPSJodG1sXzU2NGRkMDA0NTNlZjQ3N2FiNDhlYzE2YjgyNTliZDc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7ln7znjonnnIwg44GV44GE44Gf44G+5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZTI5NTlkZTYyNGE0YzFhYjhiODhhMWE2Y2Q3ZGEyNC5zZXRDb250ZW50KGh0bWxfNTY0ZGQwMDQ1M2VmNDc3YWI0OGVjMTZiODI1OWJkNzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjY1ZjkyY2FmMTYxNGRlNTg2NWIwYzg5N2E4ZmM1ZDQuYmluZFBvcHVwKHBvcHVwXzRlMjk1OWRlNjI0YTRjMWFiOGI4OGExYTZjZDdkYTI0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMjc5MTczNTVhNTQ0NTYzYWYyYzI4NjdhNmZmM2I5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjYwNDcyLCAxNDAuMTIzMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDYwMTc1NWIyZjA5NGZhYzhmNDdmNWQzZTcxMzUxYmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNTllZGE1NmNkNmQ0YWRhYTY0NTIwY2M5ZWU2MjFhOSA9ICQoYDxkaXYgaWQ9Imh0bWxfYjU5ZWRhNTZjZDZkNGFkYWE2NDUyMGNjOWVlNjIxYTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuWNg+iRieecjCDljYPokYnluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2MDE3NTViMmYwOTRmYWM4ZjQ3ZjVkM2U3MTM1MWJjLnNldENvbnRlbnQoaHRtbF9iNTllZGE1NmNkNmQ0YWRhYTY0NTIwY2M5ZWU2MjFhOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMjc5MTczNTVhNTQ0NTYzYWYyYzI4NjdhNmZmM2I5OC5iaW5kUG9wdXAocG9wdXBfMDYwMTc1NWIyZjA5NGZhYzhmNDdmNWQzZTcxMzUxYmMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxMmY3OTM0NTIyZjQxZmM4N2VlYThiYmY1NTcyM2YxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuNjg5NDQsIDEzOS42OTE2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZDUzNTlkZDM0YjY0NjI1OTU4Mzk2OGZmNzU4MWY2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5YWNjODI1YTVlODRmMDhiNTIyYTgwMDdkYTQ2Mjg5ID0gJChgPGRpdiBpZD0iaHRtbF82OWFjYzgyNWE1ZTg0ZjA4YjUyMmE4MDA3ZGE0NjI4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+5p2x5Lqs6YO9IOaWsOWuv+WMujwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGQ1MzU5ZGQzNGI2NDYyNTk1ODM5NjhmZjc1ODFmNmQuc2V0Q29udGVudChodG1sXzY5YWNjODI1YTVlODRmMDhiNTIyYTgwMDdkYTQ2Mjg5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQxMmY3OTM0NTIyZjQxZmM4N2VlYThiYmY1NTcyM2YxLmJpbmRQb3B1cChwb3B1cF80ZDUzNTlkZDM0YjY0NjI1OTU4Mzk2OGZmNzU4MWY2ZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmRlMTQyM2EzZTMzNDBkZGE0OGVjNGQxYWIxYTVhODAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNS40NDc3OCwgMTM5LjY0MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWQ3ZDNkYTE0MDYxNGVmOThlZDU4OGNkY2RiNWE4ZjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZDRiODhiNGVkNjE0ZTczOGU4MTZkZjE5ZjYzY2U2ZiA9ICQoYDxkaXYgaWQ9Imh0bWxfN2Q0Yjg4YjRlZDYxNGU3MzhlODE2ZGYxOWY2M2NlNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuelnuWliOW3neecjCDmqKrmtZzluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFkN2QzZGExNDA2MTRlZjk4ZWQ1ODhjZGNkYjVhOGY4LnNldENvbnRlbnQoaHRtbF83ZDRiODhiNGVkNjE0ZTczOGU4MTZkZjE5ZjYzY2U2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZGUxNDIzYTNlMzM0MGRkYTQ4ZWM0ZDFhYjFhNWE4MC5iaW5kUG9wdXAocG9wdXBfMWQ3ZDNkYTE0MDYxNGVmOThlZDU4OGNkY2RiNWE4ZjgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY0NzhlYjQ4Y2Y1OTRhYTdiZTY3MDYyM2UwMmMzMzA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuOTAyMjIsIDEzOS4wMjM2MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMTFhNjkxZjFkM2Y0ODU5YWUyZjE1NjVjZTBhNTYxMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwN2MyNzExZjZjNjRhYzBhNjgwNTE1ZWYzZmI0YzBmID0gJChgPGRpdiBpZD0iaHRtbF82MDdjMjcxMWY2YzY0YWMwYTY4MDUxNWVmM2ZiNGMwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+5paw5r2f55yMIOaWsOa9n+W4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDExYTY5MWYxZDNmNDg1OWFlMmYxNTY1Y2UwYTU2MTEuc2V0Q29udGVudChodG1sXzYwN2MyNzExZjZjNjRhYzBhNjgwNTE1ZWYzZmI0YzBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY0NzhlYjQ4Y2Y1OTRhYTdiZTY3MDYyM2UwMmMzMzA0LmJpbmRQb3B1cChwb3B1cF9kMTFhNjkxZjFkM2Y0ODU5YWUyZjE1NjVjZTBhNTYxMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTFhMDYyN2NmOTg1NDBmMmE3ZjY4NjlhNWE3ZTVlZDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNi42OTUyOCwgMTM3LjIxMTM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljMDg4N2UzODQwZjQ2YmU5OGJhZmIyM2RiOGEwOGIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWJkNWVmNGJkNDk3NGYwMWJjYWMwNDZiZDU1ZmNiODQgPSAkKGA8ZGl2IGlkPSJodG1sX2FiZDVlZjRiZDQ5NzRmMDFiY2FjMDQ2YmQ1NWZjYjg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7lr4zlsbHnnIwg5a+M5bGx5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YzA4ODdlMzg0MGY0NmJlOThiYWZiMjNkYjhhMDhiMi5zZXRDb250ZW50KGh0bWxfYWJkNWVmNGJkNDk3NGYwMWJjYWMwNDZiZDU1ZmNiODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTFhMDYyN2NmOTg1NDBmMmE3ZjY4NjlhNWE3ZTVlZDMuYmluZFBvcHVwKHBvcHVwXzljMDg4N2UzODQwZjQ2YmU5OGJhZmIyM2RiOGEwOGIyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYzFhNTliY2MxNGQ0MzFmOTc3NzdhYjQ1YjA3MzBkNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM2LjU5NDQ0LCAxMzYuNjI1NTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTEwZmU0ZTk3ZWM4NDFmNDljYTI0MzU4MTIwOTMwNzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMjM3MmI0ZGI1MGE0MGYwYWM0NDYzYzhlYzg2NzQ2NSA9ICQoYDxkaXYgaWQ9Imh0bWxfMjIzNzJiNGRiNTBhNDBmMGFjNDQ2M2M4ZWM4Njc0NjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuefs+W3neecjCDph5HmsqLluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxMGZlNGU5N2VjODQxZjQ5Y2EyNDM1ODEyMDkzMDc4LnNldENvbnRlbnQoaHRtbF8yMjM3MmI0ZGI1MGE0MGYwYWM0NDYzYzhlYzg2NzQ2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYzFhNTliY2MxNGQ0MzFmOTc3NzdhYjQ1YjA3MzBkNy5iaW5kUG9wdXAocG9wdXBfZTEwZmU0ZTk3ZWM4NDFmNDljYTI0MzU4MTIwOTMwNzgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzMWUzMzc4NGVmOTQ1YjhiZjA5NDg5OGViOTBjYTg5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuMDY1MjgsIDEzNi4yMjE5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMmI4OWNmYTY4OTg0MDY1YWRiZTViMDRlZjIxZWUyZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QxMWYxNDgyNTBjNjRiMzk5ODg5NGJjN2FiZjFhNTU3ID0gJChgPGRpdiBpZD0iaHRtbF9kMTFmMTQ4MjUwYzY0YjM5OTg4OTRiYzdhYmYxYTU1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+56aP5LqV55yMIOemj+S6leW4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDJiODljZmE2ODk4NDA2NWFkYmU1YjA0ZWYyMWVlMmYuc2V0Q29udGVudChodG1sX2QxMWYxNDgyNTBjNjRiMzk5ODg5NGJjN2FiZjFhNTU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAzMWUzMzc4NGVmOTQ1YjhiZjA5NDg5OGViOTBjYTg5LmJpbmRQb3B1cChwb3B1cF8wMmI4OWNmYTY4OTg0MDY1YWRiZTViMDRlZjIxZWUyZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDY5ZWVkNjllMjExNDFlOGEwZDYyYzFlNjZkNTg4NDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNS42NjM4OSwgMTM4LjU2ODMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM1ZjFiYzE4Zjc1YzRlZDVhNWM2NjYxYjdlMjRiODA3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmQyYWE4YzI5ZmE3NDdjMzlkODhjOTQ0ZWQzZWZiMGQgPSAkKGA8ZGl2IGlkPSJodG1sXzZkMmFhOGMyOWZhNzQ3YzM5ZDg4Yzk0NGVkM2VmYjBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7lsbHmoqjnnIwg55Sy5bqc5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNWYxYmMxOGY3NWM0ZWQ1YTVjNjY2MWI3ZTI0YjgwNy5zZXRDb250ZW50KGh0bWxfNmQyYWE4YzI5ZmE3NDdjMzlkODhjOTQ0ZWQzZWZiMGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDY5ZWVkNjllMjExNDFlOGEwZDYyYzFlNjZkNTg4NDIuYmluZFBvcHVwKHBvcHVwXzM1ZjFiYzE4Zjc1YzRlZDVhNWM2NjYxYjdlMjRiODA3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yN2JhZGFjN2Q3NmU0ZWIwODYzZjJmMWNiYmFlNjIyOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM2LjY1MTM5LCAxMzguMTgxMTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDdkODM3ZDEzODllNDgzYzg3NTE0MWM4OTBkNzQzYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MjNkY2ViNTVmNTM0ZjA5OTQ4ZTRiYTUyOWEwMTkzNSA9ICQoYDxkaXYgaWQ9Imh0bWxfNDIzZGNlYjU1ZjUzNGYwOTk0OGU0YmE1MjlhMDE5MzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPumVt+mHjuecjCDplbfph47luII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ3ZDgzN2QxMzg5ZTQ4M2M4NzUxNDFjODkwZDc0M2M5LnNldENvbnRlbnQoaHRtbF80MjNkY2ViNTVmNTM0ZjA5OTQ4ZTRiYTUyOWEwMTkzNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yN2JhZGFjN2Q3NmU0ZWIwODYzZjJmMWNiYmFlNjIyOS5iaW5kUG9wdXAocG9wdXBfNDdkODM3ZDEzODllNDgzYzg3NTE0MWM4OTBkNzQzYzkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1M2UxNDIyNzc4ZjQyZGVhNWZkZWFkZGY3NDQ4ZDk2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMzkxMTEsIDEzNi43MjIyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NDI5NDg1OThjYTc0YWI3OTU4ZGE4NTdmZjJkNDNmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1OGFiN2Y1YzE0MTQ5YzI4YjYzZTc2OGU5NzlmZjE0ID0gJChgPGRpdiBpZD0iaHRtbF83NThhYjdmNWMxNDE0OWMyOGI2M2U3NjhlOTc5ZmYxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+5bKQ6Zic55yMIOWykOmYnOW4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjQyOTQ4NTk4Y2E3NGFiNzk1OGRhODU3ZmYyZDQzZjUuc2V0Q29udGVudChodG1sXzc1OGFiN2Y1YzE0MTQ5YzI4YjYzZTc2OGU5NzlmZjE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg1M2UxNDIyNzc4ZjQyZGVhNWZkZWFkZGY3NDQ4ZDk2LmJpbmRQb3B1cChwb3B1cF82NDI5NDg1OThjYTc0YWI3OTU4ZGE4NTdmZjJkNDNmNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmE1MTlkODU3OWJkNDcxYWFmNjE5MDExYTMxYmM4YjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNC45NzY5NCwgMTM4LjM4MzA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2MzA0MWUxMjQwNzRmMTY4MGUyOWEzMGZhZGMzODI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmU1YWIwZmFhMjZkNDEzM2E5OGJjZmZmMjczNjEyZTIgPSAkKGA8ZGl2IGlkPSJodG1sXzJlNWFiMGZhYTI2ZDQxMzNhOThiY2ZmZjI3MzYxMmUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7pnZnlsqHnnIwg6Z2Z5bKh5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNjMwNDFlMTI0MDc0ZjE2ODBlMjlhMzBmYWRjMzgyNC5zZXRDb250ZW50KGh0bWxfMmU1YWIwZmFhMjZkNDEzM2E5OGJjZmZmMjczNjEyZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmE1MTlkODU3OWJkNDcxYWFmNjE5MDExYTMxYmM4YjYuYmluZFBvcHVwKHBvcHVwX2U2MzA0MWUxMjQwNzRmMTY4MGUyOWEzMGZhZGMzODI0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NDJhOWVjYzYxNjM0NGQ4YmI5MTA0ZjQyOGEwNjIzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjE4MDI4LCAxMzYuOTA2NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2JhNDU2MDFkNTM5NGRlZDhlZDNhMmNkNjIxOTg1YjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kODEzN2UyNGI5NjY0M2M3ODY3Njk3MzZmMWJjM2NlMCA9ICQoYDxkaXYgaWQ9Imh0bWxfZDgxMzdlMjRiOTY2NDNjNzg2NzY5NzM2ZjFiYzNjZTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuaEm+efpeecjCDlkI3lj6TlsYvluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNiYTQ1NjAxZDUzOTRkZWQ4ZWQzYTJjZDYyMTk4NWIxLnNldENvbnRlbnQoaHRtbF9kODEzN2UyNGI5NjY0M2M3ODY3Njk3MzZmMWJjM2NlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NDJhOWVjYzYxNjM0NGQ4YmI5MTA0ZjQyOGEwNjIzZS5iaW5kUG9wdXAocG9wdXBfM2JhNDU2MDFkNTM5NGRlZDhlZDNhMmNkNjIxOTg1YjEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdjOWJmMmUyMGE2NDQ3OGZhYWUxNmUxOTAxN2ZiZGI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuNzMwMjgsIDEzNi41MDg2MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNWZhNjI4YzcxMzY0MDk4YWNkNmFhOTk5YTE2NmQwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzMDgwOTI0ZmY1OTQ1Y2ZhYjE5NjA5ZTQyMjkxMmE1ID0gJChgPGRpdiBpZD0iaHRtbF9lMzA4MDkyNGZmNTk0NWNmYWIxOTYwOWU0MjI5MTJhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+5LiJ6YeN55yMIOa0peW4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjVmYTYyOGM3MTM2NDA5OGFjZDZhYTk5OWExNjZkMDcuc2V0Q29udGVudChodG1sX2UzMDgwOTI0ZmY1OTQ1Y2ZhYjE5NjA5ZTQyMjkxMmE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdjOWJmMmUyMGE2NDQ3OGZhYWUxNmUxOTAxN2ZiZGI2LmJpbmRQb3B1cChwb3B1cF9mNWZhNjI4YzcxMzY0MDk4YWNkNmFhOTk5YTE2NmQwNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGRhMTI2ZDViNmVlNDBiYWJlYmE0NDg0YTAyODI1ODUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4wMDQ0NCwgMTM1Ljg2ODMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzczNTU5Mjg0MDVhYzRlMjY4YjgyODM0MTk1ZmE4OTlkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjIzZjlhMmQwMTYwNDRjMDk1MmJiOWNmMmI5YmY0YmYgPSAkKGA8ZGl2IGlkPSJodG1sX2IyM2Y5YTJkMDE2MDQ0YzA5NTJiYjljZjJiOWJmNGJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7mu4vos4DnnIwg5aSn5rSl5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MzU1OTI4NDA1YWM0ZTI2OGI4MjgzNDE5NWZhODk5ZC5zZXRDb250ZW50KGh0bWxfYjIzZjlhMmQwMTYwNDRjMDk1MmJiOWNmMmI5YmY0YmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGRhMTI2ZDViNmVlNDBiYWJlYmE0NDg0YTAyODI1ODUuYmluZFBvcHVwKHBvcHVwXzczNTU5Mjg0MDVhYzRlMjY4YjgyODM0MTk1ZmE4OTlkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMzU4YTVjMDE5Njk0ZTU4YWRhZWZkMzdiMjRlZGQ3MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjAyMTM5LCAxMzUuNzU1NTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTk0MTRkMjI5NTUwNDhmN2I2NDU4MGVlMjAxMTVkZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OTAwNzE1MjU3MzE0ZGU4OWM5MDIzNWExZDcxNzU5MyA9ICQoYDxkaXYgaWQ9Imh0bWxfNzkwMDcxNTI1NzMxNGRlODljOTAyMzVhMWQ3MTc1OTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuS6rOmDveW6nCDkuqzpg73luII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5NDE0ZDIyOTU1MDQ4ZjdiNjQ1ODBlZTIwMTE1ZGYwLnNldENvbnRlbnQoaHRtbF83OTAwNzE1MjU3MzE0ZGU4OWM5MDIzNWExZDcxNzU5Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMzU4YTVjMDE5Njk0ZTU4YWRhZWZkMzdiMjRlZGQ3My5iaW5kUG9wdXAocG9wdXBfMTk0MTRkMjI5NTUwNDhmN2I2NDU4MGVlMjAxMTVkZjApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI3MWJiMmM3OTRiMjQ5MzBhOTYwODNlMTVmYzg1NDExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuNjg2MzksIDEzNS41Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZTA0NmMzM2MzOTA0ZjU5OTUyMTE4ZTViNzFkMzRmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2NDdhYmVmNzliNzQwMDU4ZTZkNWQ4ZjM1NDUwOGY0ID0gJChgPGRpdiBpZD0iaHRtbF8yNjQ3YWJlZjc5Yjc0MDA1OGU2ZDVkOGYzNTQ1MDhmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+5aSn6Ziq5bqcIOWkp+mYquW4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGUwNDZjMzNjMzkwNGY1OTk1MjExOGU1YjcxZDM0ZjUuc2V0Q29udGVudChodG1sXzI2NDdhYmVmNzliNzQwMDU4ZTZkNWQ4ZjM1NDUwOGY0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI3MWJiMmM3OTRiMjQ5MzBhOTYwODNlMTVmYzg1NDExLmJpbmRQb3B1cChwb3B1cF9kZTA0NmMzM2MzOTA0ZjU5OTUyMTE4ZTViNzFkMzRmNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmZiMjRkMjZlNjA4NDgxYjk4NDgwN2M1MDViMTQwYjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNC42OTEzOSwgMTM1LjE4MzA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1ZWRlOWJlZWZmMTRmMWFhMmNkNjA1MmUyMjE1NmRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTk1ZTJlZmRjODJhNDc5MTg0OWMzMjlkZjdkZWY1OTQgPSAkKGA8ZGl2IGlkPSJodG1sXzU5NWUyZWZkYzgyYTQ3OTE4NDljMzI5ZGY3ZGVmNTk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7lhbXluqvnnIwg56We5oi45biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNWVkZTliZWVmZjE0ZjFhYTJjZDYwNTJlMjIxNTZkZS5zZXRDb250ZW50KGh0bWxfNTk1ZTJlZmRjODJhNDc5MTg0OWMzMjlkZjdkZWY1OTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmZiMjRkMjZlNjA4NDgxYjk4NDgwN2M1MDViMTQwYjQuYmluZFBvcHVwKHBvcHVwX2U1ZWRlOWJlZWZmMTRmMWFhMmNkNjA1MmUyMjE1NmRlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNjBmMmQzYmY0NDY0YWY0Yjg2MDFmZDFlZTk2ZGY1ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM0LjY4NTI4LCAxMzUuODMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWNjY2E1NjI5MjBlNDc1OTk3ZDJhM2I4NTk0YzBiMzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iM2U0ZmY2ZjMxNWQ0OGYxOGY2ODFiN2U3Yjk3ODViMyA9ICQoYDxkaXYgaWQ9Imh0bWxfYjNlNGZmNmYzMTVkNDhmMThmNjgxYjdlN2I5Nzg1YjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuWliOiJr+ecjCDlpYjoia/luII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzljY2NhNTYyOTIwZTQ3NTk5N2QyYTNiODU5NGMwYjM3LnNldENvbnRlbnQoaHRtbF9iM2U0ZmY2ZjMxNWQ0OGYxOGY2ODFiN2U3Yjk3ODViMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNjBmMmQzYmY0NDY0YWY0Yjg2MDFmZDFlZTk2ZGY1ZC5iaW5kUG9wdXAocG9wdXBfOWNjY2E1NjI5MjBlNDc1OTk3ZDJhM2I4NTk0YzBiMzcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjZmIxMTVlOTVlYzQyMTNiNzEwZTg1MThlNWY3NjkwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuMjI2MTEsIDEzNS4xNjc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUzNmE3NWRjOTkxZTQwNmY4NTlhNDFjNzZjMDVhNjFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjRmMTUzMmZkMjMxNDFmZmFiYmM4Mzg3NjcyNmRkOWIgPSAkKGA8ZGl2IGlkPSJodG1sXzI0ZjE1MzJmZDIzMTQxZmZhYmJjODM4NzY3MjZkZDliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7lkozmrYzlsbHnnIwg5ZKM5q2M5bGx5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MzZhNzVkYzk5MWU0MDZmODU5YTQxYzc2YzA1YTYxZS5zZXRDb250ZW50KGh0bWxfMjRmMTUzMmZkMjMxNDFmZmFiYmM4Mzg3NjcyNmRkOWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2NmYjExNWU5NWVjNDIxM2I3MTBlODUxOGU1Zjc2OTAuYmluZFBvcHVwKHBvcHVwXzUzNmE3NWRjOTkxZTQwNmY4NTlhNDFjNzZjMDVhNjFlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNzc2NDQ1YmU2MGM0YWU1OGM4MmU2NjY2ZDdlNjQ4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjUwMzYxLCAxMzQuMjM4MzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjIyNzNmMTQ4MTQwNGNmZTk0ODRhMDFlMTVhOGQzNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YjQ1NWI2YjJhOGQ0NWI0YmY2NjkwOTc0N2VjMDA1MyA9ICQoYDxkaXYgaWQ9Imh0bWxfNWI0NTViNmIyYThkNDViNGJmNjY5MDk3NDdlYzAwNTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPumzpeWPluecjCDps6Xlj5bluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIyMjczZjE0ODE0MDRjZmU5NDg0YTAxZTE1YThkMzU0LnNldENvbnRlbnQoaHRtbF81YjQ1NWI2YjJhOGQ0NWI0YmY2NjkwOTc0N2VjMDA1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNzc2NDQ1YmU2MGM0YWU1OGM4MmU2NjY2ZDdlNjQ4MC5iaW5kUG9wdXAocG9wdXBfMjIyNzNmMTQ4MTQwNGNmZTk0ODRhMDFlMTVhOGQzNTQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzczNDJhODY4Y2Q0YTRjN2M4M2Y3YmU5OGM5MmM5YWY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuNDcyMjIsIDEzMy4wNTA1Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNDcyNjgzMzU3ZTQ0ZWM3OTM4M2Y4ODJjOWQ0YjhjNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxZjBmYjA3NjE1ZjQzMmM5ZWM0ZDdmNDY5ZTA1ZGFjID0gJChgPGRpdiBpZD0iaHRtbF82MWYwZmIwNzYxNWY0MzJjOWVjNGQ3ZjQ2OWUwNWRhYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+5bO25qC555yMIOadvuaxn+W4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjQ3MjY4MzM1N2U0NGVjNzkzODNmODgyYzlkNGI4YzQuc2V0Q29udGVudChodG1sXzYxZjBmYjA3NjE1ZjQzMmM5ZWM0ZDdmNDY5ZTA1ZGFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzczNDJhODY4Y2Q0YTRjN2M4M2Y3YmU5OGM5MmM5YWY5LmJpbmRQb3B1cChwb3B1cF9mNDcyNjgzMzU3ZTQ0ZWM3OTM4M2Y4ODJjOWQ0YjhjNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjhiODZhYWFiOGU0NDIyMzk3MDViMjc0NzE2ZmIxMTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNC42NjE2NywgMTMzLjkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjhiYjk0ZDY3MzU0N2IyODY5YjRiZTRlNThkYTZiZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1ZmZmMGYwY2E4NTRkZTA4NDQ5YjUwMTU0Y2YyYWNlID0gJChgPGRpdiBpZD0iaHRtbF8wNWZmZjBmMGNhODU0ZGUwODQ0OWI1MDE1NGNmMmFjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+5bKh5bGx55yMIOWyoeWxseW4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzY4YmI5NGQ2NzM1NDdiMjg2OWI0YmU0ZTU4ZGE2YmUuc2V0Q29udGVudChodG1sXzA1ZmZmMGYwY2E4NTRkZTA4NDQ5YjUwMTU0Y2YyYWNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI4Yjg2YWFhYjhlNDQyMjM5NzA1YjI3NDcxNmZiMTEwLmJpbmRQb3B1cChwb3B1cF8zNjhiYjk0ZDY3MzU0N2IyODY5YjRiZTRlNThkYTZiZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTFkNzVlYmU1YThjNGVlM2I5Y2E4NDE5OTQ2YjQ0ZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNC4zOTYzOSwgMTMyLjQ1OTQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3YzFkNDNmOWYwZDRkZjFhNDVkMGY3ZTdlYjBmMjg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQ2N2JhMTI3YmZiNGMzOTg3Yzg2NDJhNTcyNzlmYTkgPSAkKGA8ZGl2IGlkPSJodG1sXzM0NjdiYTEyN2JmYjRjMzk4N2M4NjQyYTU3Mjc5ZmE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7luoPls7bnnIwg5bqD5bO25biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hN2MxZDQzZjlmMGQ0ZGYxYTQ1ZDBmN2U3ZWIwZjI4Ny5zZXRDb250ZW50KGh0bWxfMzQ2N2JhMTI3YmZiNGMzOTg3Yzg2NDJhNTcyNzlmYTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTFkNzVlYmU1YThjNGVlM2I5Y2E4NDE5OTQ2YjQ0ZWYuYmluZFBvcHVwKHBvcHVwX2E3YzFkNDNmOWYwZDRkZjFhNDVkMGY3ZTdlYjBmMjg3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMzNmMzU3ZGE4ZTY0ZDhhYmNjYTA1ODAyZjI3NjMzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM0LjE4NTgzLCAxMzEuNDcxMzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTE3YmM0MGZjNjIxNDZhODgzNzc5YzAzMGFjYmU5NWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NThmODgwZjQ3YmI0ZTExOWRlMjZmYmVkNjkzNDU1OSA9ICQoYDxkaXYgaWQ9Imh0bWxfOTU4Zjg4MGY0N2JiNGUxMTlkZTI2ZmJlZDY5MzQ1NTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuWxseWPo+ecjCDlsbHlj6PluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUxN2JjNDBmYzYyMTQ2YTg4Mzc3OWMwMzBhY2JlOTVjLnNldENvbnRlbnQoaHRtbF85NThmODgwZjQ3YmI0ZTExOWRlMjZmYmVkNjkzNDU1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMzNmMzU3ZGE4ZTY0ZDhhYmNjYTA1ODAyZjI3NjMzOC5iaW5kUG9wdXAocG9wdXBfNTE3YmM0MGZjNjIxNDZhODgzNzc5YzAzMGFjYmU5NWMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlNWNhNjdiZjBmNDRlM2I4OWUwNTBmZDU2N2RmY2Y2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuMDY1ODMsIDEzNC41NTk0NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YTE1MmI0NzI3ODg0ZWU3YTYyY2VmMzk3MDQzYmNlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjNWQ4ZTZlOWI2YzQ2ZjFiMjA4MDVlOTRkYzY5N2YwID0gJChgPGRpdiBpZD0iaHRtbF80YzVkOGU2ZTliNmM0NmYxYjIwODA1ZTk0ZGM2OTdmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+5b6z5bO255yMIOW+s+WztuW4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWExNTJiNDcyNzg4NGVlN2E2MmNlZjM5NzA0M2JjZWQuc2V0Q29udGVudChodG1sXzRjNWQ4ZTZlOWI2YzQ2ZjFiMjA4MDVlOTRkYzY5N2YwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FlNWNhNjdiZjBmNDRlM2I4OWUwNTBmZDU2N2RmY2Y2LmJpbmRQb3B1cChwb3B1cF85YTE1MmI0NzI3ODg0ZWU3YTYyY2VmMzk3MDQzYmNlZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjdhNGFkN2Y2ZWU5NGY2NThjZmExMTY3OWY4NzdjYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNC4zNDAyOCwgMTM0LjA0MzMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2MmU5M2Y0ZDI5YjQ0YzRhNzAxNmEwMTRkZGM4ZTJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWM1MDFkNWM1MThjNDk3MGI5YTIyZWY1OTZlYzg5YWUgPSAkKGA8ZGl2IGlkPSJodG1sX2VjNTAxZDVjNTE4YzQ5NzBiOWEyMmVmNTk2ZWM4OWFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7pppnlt53nnIwg6auY5p2+5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNjJlOTNmNGQyOWI0NGM0YTcwMTZhMDE0ZGRjOGUyYi5zZXRDb250ZW50KGh0bWxfZWM1MDFkNWM1MThjNDk3MGI5YTIyZWY1OTZlYzg5YWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjdhNGFkN2Y2ZWU5NGY2NThjZmExMTY3OWY4NzdjYTYuYmluZFBvcHVwKHBvcHVwX2E2MmU5M2Y0ZDI5YjQ0YzRhNzAxNmEwMTRkZGM4ZTJiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NzNkNGMxODFlMDY0NWRjYWQ1MTUyZGMxMTYwMmI4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjg0MTY3LCAxMzIuNzY2MTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTFjZGM5NzU5ZWM2NDc1OTg5ZjM2NGZhNDZiNjRhZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNDRhZjNlYjBjYWU0ZWE2ODE5OWUyZTRlMzgzZmM0OCA9ICQoYDxkaXYgaWQ9Imh0bWxfMDQ0YWYzZWIwY2FlNGVhNjgxOTllMmU0ZTM4M2ZjNDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuaEm+Wqm+ecjCDmnb7lsbHluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUxY2RjOTc1OWVjNjQ3NTk4OWYzNjRmYTQ2YjY0YWY5LnNldENvbnRlbnQoaHRtbF8wNDRhZjNlYjBjYWU0ZWE2ODE5OWUyZTRlMzgzZmM0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NzNkNGMxODFlMDY0NWRjYWQ1MTUyZGMxMTYwMmI4NS5iaW5kUG9wdXAocG9wdXBfNTFjZGM5NzU5ZWM2NDc1OTg5ZjM2NGZhNDZiNjRhZjkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RiZGQ5MjhhYjVmNTRjZTNhMmMxYzYwMDI3MDFjMGI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNTU5NzIsIDEzMy41MzExMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MmU1ZjQ3YzFjNmI0YzdjOGI2NjVhYzRkY2IyNDhiYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkZDA4ZDBjYzNhNTQ1ZTI5NTNhMTliNmRjZjNkY2JkID0gJChgPGRpdiBpZD0iaHRtbF9iZGQwOGQwY2MzYTU0NWUyOTUzYTE5YjZkY2YzZGNiZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+6auY55+l55yMIOmrmOefpeW4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDJlNWY0N2MxYzZiNGM3YzhiNjY1YWM0ZGNiMjQ4YmMuc2V0Q29udGVudChodG1sX2JkZDA4ZDBjYzNhNTQ1ZTI5NTNhMTliNmRjZjNkY2JkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RiZGQ5MjhhYjVmNTRjZTNhMmMxYzYwMDI3MDFjMGI4LmJpbmRQb3B1cChwb3B1cF80MmU1ZjQ3YzFjNmI0YzdjOGI2NjVhYzRkY2IyNDhiYykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmY0ZjBjZWUzZjQ1NDY5YzhlOTZlODM0YWJjZDc4MjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy42MDYzOSwgMTMwLjQxODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwN2YyN2U5ZmZkNTQwMzRhZGM1ZjMxNTkxMGNhMjM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDVhMTcwOWJhYWJmNDNjMmI1M2Y4OTJlNTVhMTFiN2UgPSAkKGA8ZGl2IGlkPSJodG1sXzA1YTE3MDliYWFiZjQzYzJiNTNmODkyZTU1YTExYjdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7npo/lsqHnnIwg56aP5bKh5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MDdmMjdlOWZmZDU0MDM0YWRjNWYzMTU5MTBjYTIzNS5zZXRDb250ZW50KGh0bWxfMDVhMTcwOWJhYWJmNDNjMmI1M2Y4OTJlNTVhMTFiN2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmY0ZjBjZWUzZjQ1NDY5YzhlOTZlODM0YWJjZDc4MjQuYmluZFBvcHVwKHBvcHVwXzYwN2YyN2U5ZmZkNTQwMzRhZGM1ZjMxNTkxMGNhMjM1KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jM2NjN2VlZGY2NTk0YzAxOWMwMjlkYmZjZmI3ZDY4MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjI0OTQ0LCAxMzAuMjk4ODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmJkZDkwNjU2YWVhNGNjZmIyNzU0NTkxNTJjNjk0YmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMTBlZmY0ZDUyNWI0M2FkYmRiMThkMjVhOTc3N2M2YyA9ICQoYDxkaXYgaWQ9Imh0bWxfMzEwZWZmNGQ1MjViNDNhZGJkYjE4ZDI1YTk3NzdjNmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuS9kOizgOecjCDkvZDos4DluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiZGQ5MDY1NmFlYTRjY2ZiMjc1NDU5MTUyYzY5NGJkLnNldENvbnRlbnQoaHRtbF8zMTBlZmY0ZDUyNWI0M2FkYmRiMThkMjVhOTc3N2M2Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jM2NjN2VlZGY2NTk0YzAxOWMwMjlkYmZjZmI3ZDY4Mi5iaW5kUG9wdXAocG9wdXBfNmJkZDkwNjU2YWVhNGNjZmIyNzU0NTkxNTJjNjk0YmQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q5OWRhZDM4ZDcxMzRmMzFiNTBhYTIzY2JiN2RkYzlkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzIuNzQ0NzIsIDEyOS44NzM2MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zM2RlNmU1MGYxMGI0ZGYyODY0MGM3MDE2YjI5MmU4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmOGYwOTJiNWZjOTRkZjU5Y2RjOGFiZjQ5YzQwYjk4ID0gJChgPGRpdiBpZD0iaHRtbF9kZjhmMDkyYjVmYzk0ZGY1OWNkYzhhYmY0OWM0MGI5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+6ZW35bSO55yMIOmVt+W0juW4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNkZTZlNTBmMTBiNGRmMjg2NDBjNzAxNmIyOTJlODguc2V0Q29udGVudChodG1sX2RmOGYwOTJiNWZjOTRkZjU5Y2RjOGFiZjQ5YzQwYjk4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q5OWRhZDM4ZDcxMzRmMzFiNTBhYTIzY2JiN2RkYzlkLmJpbmRQb3B1cChwb3B1cF8zM2RlNmU1MGYxMGI0ZGYyODY0MGM3MDE2YjI5MmU4OCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzVkMmEyOWFiMzhmNDgyNzgyODMzZWY5NTdiZDc0ZmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMi43ODk3MiwgMTMwLjc0MTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RmMjUxNGUxODg0MjQ4ZGRiMzlhMGNhOWI0Y2E5ZTRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWZiNDc3Yjg4NzlkNGExN2EzZGFhMTg0NmQxZGFjODkgPSAkKGA8ZGl2IGlkPSJodG1sXzVmYjQ3N2I4ODc5ZDRhMTdhM2RhYTE4NDZkMWRhYzg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7nhormnKznnIwg54aK5pys5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZjI1MTRlMTg4NDI0OGRkYjM5YTBjYTliNGNhOWU0Zi5zZXRDb250ZW50KGh0bWxfNWZiNDc3Yjg4NzlkNGExN2EzZGFhMTg0NmQxZGFjODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzVkMmEyOWFiMzhmNDgyNzgyODMzZWY5NTdiZDc0ZmIuYmluZFBvcHVwKHBvcHVwX2RmMjUxNGUxODg0MjQ4ZGRiMzlhMGNhOWI0Y2E5ZTRmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYWViOGY0NTg1NmQ0MjQ2YmE3M2FkOTMwN2QxOGM5MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjIzODA2LCAxMzEuNjEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF81ZmQ2NjY4MzZjNmI0Y2JmYTEzODhjMDhkN2RkNGM5OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYmIyZmFmNzI5NDM0MzdkODE1ZjcxODcyYzg0MTkyZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiZTQ2OGVmNGU0YjQwZTdiOTY5NzVlYmU4NzkyNmFiID0gJChgPGRpdiBpZD0iaHRtbF80YmU0NjhlZjRlNGI0MGU3Yjk2OTc1ZWJlODc5MjZhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+5aSn5YiG55yMIOWkp+WIhuW4gjwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2JiMmZhZjcyOTQzNDM3ZDgxNWY3MTg3MmM4NDE5MmYuc2V0Q29udGVudChodG1sXzRiZTQ2OGVmNGU0YjQwZTdiOTY5NzVlYmU4NzkyNmFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhZWI4ZjQ1ODU2ZDQyNDZiYTczYWQ5MzA3ZDE4YzkwLmJpbmRQb3B1cChwb3B1cF8zYmIyZmFmNzI5NDM0MzdkODE1ZjcxODcyYzg0MTkyZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDdjMTQyMjU0ODA0NGMwMWJiNmQ0NTdiNWU5ZThlODAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMS45MTExMSwgMTMxLjQyMzg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1ZWYxOGFjMzFjMDRlZjliMDlmNjMxYmE2NWYzZmFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjdkZmRlZGE5ZTNhNDU0YmI2ZGU0M2I0ZDY0ZGI4ODUgPSAkKGA8ZGl2IGlkPSJodG1sX2I3ZGZkZWRhOWUzYTQ1NGJiNmRlNDNiNGQ2NGRiODg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7lrq7ltI7nnIwg5a6u5bSO5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NWVmMThhYzMxYzA0ZWY5YjA5ZjYzMWJhNjVmM2ZhYS5zZXRDb250ZW50KGh0bWxfYjdkZmRlZGE5ZTNhNDU0YmI2ZGU0M2I0ZDY0ZGI4ODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDdjMTQyMjU0ODA0NGMwMWJiNmQ0NTdiNWU5ZThlODAuYmluZFBvcHVwKHBvcHVwXzc1ZWYxOGFjMzFjMDRlZjliMDlmNjMxYmE2NWYzZmFhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OGFmMzQzNWIwYjI0ZjIwOGU4MjU5ZTI4NzM0YjQwYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMxLjU2MDI4LCAxMzAuNTU4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfNWZkNjY2ODM2YzZiNGNiZmExMzg4YzA4ZDdkZDRjOTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzE1NDgxMDZlYTA4NGZmNmE1N2NiYjQ4MDllNDY2OWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NjMzNWEyYmVhM2M0OWM2YWQ2Nzk0ZmFlZTZmMDU3MiA9ICQoYDxkaXYgaWQ9Imh0bWxfOTYzMzVhMmJlYTNjNDljNmFkNjc5NGZhZWU2ZjA1NzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPum5v+WFkOWztuecjCDpub/lhZDls7bluII8L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxNTQ4MTA2ZWEwODRmZjZhNTdjYmI0ODA5ZTQ2NjllLnNldENvbnRlbnQoaHRtbF85NjMzNWEyYmVhM2M0OWM2YWQ2Nzk0ZmFlZTZmMDU3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OGFmMzQzNWIwYjI0ZjIwOGU4MjU5ZTI4NzM0YjQwYy5iaW5kUG9wdXAocG9wdXBfMzE1NDgxMDZlYTA4NGZmNmE1N2NiYjQ4MDllNDY2OWUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJmMTg4NzQzNzczYjRhMWM5ZmRiNzY3Y2UwYWU4Nzk5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMjYuMjEyNSwgMTI3LjY4MTExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzVmZDY2NjgzNmM2YjRjYmZhMTM4OGMwOGQ3ZGQ0Yzk5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzczYjg0NzE5Mzc1NDRlMzNiZGY4NDBkMDg2OTJhNDE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWMzNGJlMDEzOGNjNGVkNzhmNTg0NDc5ZjY3Nzc4YTYgPSAkKGA8ZGl2IGlkPSJodG1sX2VjMzRiZTAxMzhjYzRlZDc4ZjU4NDQ3OWY2Nzc3OGE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7mspbnuITnnIwg6YKj6KaH5biCPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83M2I4NDcxOTM3NTQ0ZTMzYmRmODQwZDA4NjkyYTQxNy5zZXRDb250ZW50KGh0bWxfZWMzNGJlMDEzOGNjNGVkNzhmNTg0NDc5ZjY3Nzc4YTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmYxODg3NDM3NzNiNGExYzlmZGI3NjdjZTBhZTg3OTkuYmluZFBvcHVwKHBvcHVwXzczYjg0NzE5Mzc1NDRlMzNiZGY4NDBkMDg2OTJhNDE3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map object at 0x10a6b3588>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"require 'pycall'\n",
"folium = PyCall.import_module('folium')\n",
"map = folium.Map.new(location: center, zoom_start: 5)\n",
"data.each do |r|\n",
" folium.CircleMarker.new(\n",
" location: r[1, 2],\n",
" radius: 10,\n",
" fill: true,\n",
" popup: r[0]\n",
" ).add_to(map)\n",
"end\n",
"map"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Ruby 2.6.0",
"language": "ruby",
"name": "ruby"
},
"language_info": {
"file_extension": ".rb",
"mimetype": "application/x-ruby",
"name": "ruby",
"version": "2.6.0"
},
"toc": {
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"toc_cell": false,
"toc_position": {},
"toc_section_display": "block",
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment