BackwardCompatibilityML/examples/compatibility-analysis.ipynb

428 строки
2.5 MiB
Исходник Ответственный История

Этот файл содержит неоднозначные символы Юникода!

Этот файл содержит неоднозначные символы Юникода, которые могут быть перепутаны с другими в текущей локали. Если это намеренно, можете спокойно проигнорировать это предупреждение. Используйте кнопку Экранировать, чтобы подсветить эти символы.

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import copy\n",
"import torch\n",
"import torchvision\n",
"import torchvision.transforms as transforms\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"import torch.optim as optim\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"import backwardcompatibilityml.loss as bcloss\n",
"import backwardcompatibilityml.scores as scores\n",
"from backwardcompatibilityml.helpers import training\n",
"from backwardcompatibilityml.widget.compatibility_analysis import CompatibilityAnalysis\n",
"\n",
"# Turn off warnings so that the widget screen\n",
"# real estate does not decrease.\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\")\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<torch._C.Generator at 0x7f0a4d7979b0>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n_epochs = 3\n",
"batch_size_train = 64\n",
"batch_size_test = 1000\n",
"learning_rate = 0.01\n",
"momentum = 0.5\n",
"log_interval = 10\n",
"\n",
"random_seed = 1\n",
"torch.backends.cudnn.enabled = False\n",
"torch.manual_seed(random_seed)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"train_loader = list(torch.utils.data.DataLoader(\n",
" torchvision.datasets.MNIST('datasets/', train=True, download=True,\n",
" transform=torchvision.transforms.Compose([\n",
" torchvision.transforms.ToTensor(),\n",
" torchvision.transforms.Normalize(\n",
" (0.1307,), (0.3081,))\n",
" ])),\n",
" batch_size=batch_size_train, shuffle=True))\n",
"\n",
"test_loader = list(torch.utils.data.DataLoader(\n",
" torchvision.datasets.MNIST('datasets/', train=False, download=True,\n",
" transform=torchvision.transforms.Compose([\n",
" torchvision.transforms.ToTensor(),\n",
" torchvision.transforms.Normalize(\n",
" (0.1307,), (0.3081,))\n",
" ])),\n",
" batch_size=batch_size_test, shuffle=True))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"train_loader_a = train_loader[:int(len(train_loader)/2)]\n",
"train_loader_b = train_loader[int(len(train_loader)/2):]"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(torch.Size([64, 1, 28, 28]), torch.Size([64]))"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_loader_a[0][0].size(), train_loader_a[0][1].size()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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rLPO8upmzpxZTBfzxhUKACAIEgoAIAgSCgAgiDq9htKhQwcv7tq1qxfvuuuuUfmkk07y6vr16+fF7du3j8oLFizw6h566CEvfuyxx6LyokWL8ugx6pqBAwd68VVXXeXFhxxySFRu2bJl1rbic91JQ4YMicqTJ0/Op4uoUJdccokXH3jggV7cp0+fqBwfR1L2sZIUP/b222/36rZu3erFyb9loXGFAgAIgoQCAAjCkrcvZj3YLPeDA+nSpYsXX3zxxVH57LPP9uqWLVvmxV999VVUfvzxx3M+5+GHH+7F3bp18+L99tsvKj/xxBNe3ejRo6Py8uXLcz5nMZxzVpYTFag2xk1So0aNonLv3r29ul/96lde3KtXr6jcrFkzr86sNG91/Jzz588vyTmqscA516NcJytEJYydbPbZZx8vHjp0aFQeP368V9eiRQsvzmdaKy7bbcNJ69at8+JTTz01Ks+bN6+g86dVO3a4QgEABEFCAQAEQUIBAARREbcNx+epzzvvPK9u3LhxXhyfP5wzZ45Xd84555Sgd1Ljxo29OH4L8uzZs726Nm3aROXjjjuuJP1B/uLjKDm3XYwXX3wxKs+dO9erS66/XHPNNRnbGTZsWFQu4xoKivTUU095cXx9NR9r16714vvvvz/jsfvuu68Xn3zyyRmPbdWqlRfvvPPOBfQud1yhAACCIKEAAIIgoQAAgqiVNZTkZ0t+85vfROUTTzzRq3vmmWe8OD7XvH79+hL07t99++23XlxVVZXx2Pj8ZnzrF8n/XAzKa++9947KmzZt8uq+++47L45vH//www97dcltxeNtxbdPkaRbb701Y3+2bNnixXfddVfGY1G7evT4/uMWEyZM8Or22GOPIOe47LLLvHjWrFkZj40/BkHKvoaSdO2110bl5PpPCFyhAACCIKEAAIKolSmvn//8514cn+aKb60iZX9yWbnstNNOXjxx4sSonNyKY/HixVGZKa7KER9zyR1ZN2/e7MXZdpA+88wzvfiKK66Iyskte5Li01znn3++V7dkyZKsr0X5xKe4JOkf//hHVC50uxRJWr16tRfHPyKR/AhENl9++aUXx7d4ik/tVifbreshcIUCAAiChAIACIKEAgAIomxrKCNHjozKl19+uVcXv0WuEtZMkrc1J59y9sMf/jAqf/31117dBRdcULqOIYjkEzmTa2SdO3eOyg888IBXd8QRR+R8nvjtx5I0aNCgqPzuu+/m3A5K65hjjvHiu+++24vj6yb5rKFMmzbNi59++mkvzmfdJO61117z4kcffTQqJ28/TsrncSWF4AoFABAECQUAEAQJBQAQRNnWUA455JDvT7qjf9rkVhjlkNxaPL4lfXwrGEnq1KlTxnZeffVVL/70008D9A6hxcfc6aef7tWNGTPGiw877LAg51y5cqUXf/TRR0HaRfHij+598MEHvbq2bdvm3E5yW6bf//73UTm+zYkkbdiwIY8eZpbcgr5169Y5v7ZDhw5B+pAJVygAgCBIKACAICriiY3xp5wln3j2wQcfFNxufLff+C7F0r/fuhyfkrv66qu9uuQT0rg1uO6J37KZvE00m+RtolOnTs1Y/5Of/MSr69WrlxdPmTIlKiefTIryGjp0aFTOZ4orKT7FJUlXXnllwW3l6uijj/biESNG5Pza+M7E99xzT7A+bccVCgAgCBIKACAIEgoAIIiyraGMHTs2KsfXKySpf//+Ufnll1/26iZPnuzF77zzTlROrrfE56iTkluUT58+3YvjT9tLrtu8+eabXhzfsn7GjBkZz4nKsXHjxox1Cxcu9OL4kxbfe+89r27evHkZ22nZsmXWY/N5sh7CuuSSS7x4/PjxQdqthK2i8lHq/nKFAgAIgoQCAAiChAIACKJWPoeS/EzI6NGjo3L8/nBJuuqqq7y4Xbt2GdtNPtr19ddfj8qPPfaYV5d8jGZccluWpk2benGpt4BGeIMHD47Khx56qFcXX5eTsq+3ZLN+/XovTm7Dc+CBB0blY4891qt7/vnnCzonMhswYEBU/sMf/lBwO/FH9yY/P7R06dKC2y3U3LlzvTjblvrLli3z4lWrVpWiSxGuUAAAQZBQAABB1MqUV1VVlRdff/311ZYlqX379l6cbcrrrbfeCtA7qVu3bl4cf0Ij6qatW7dG5eQTG8slfrt5csdtlFY+T1pMik9zFfqUxWLFb3tO/izxODmV/7Of/cyLSz32uUIBAARBQgEABEFCAQAEUfETuZ9//nnWuBSSty5n8+yzz5awJ6hLevfu7cU//vGPvfirr76Kys8880xZ+tSQhXo6YW2sm5xzzjlePHHixJxet3jxYi/OtlVQKXCFAgAIgoQCAAiChAIACKLi11BqQ/zzAtXF8e3ty7Gmg7rhpz/9qRfHH0EtSR9++GE5u9PgFfq4gEcffTRwT2qWXDNJ9r158+Y5tXPhhRcG61MhuEIBAARBQgEABMGUVzUOP/xwL07uLrxmzZpydgcZxG/Tveiii7y6kSNHlqUPo0aNiso1TTfwdM/yij+dMJ/pr3I9hTG+nUrytuBcp7gkadq0aVG5tqfguUIBAARBQgEABEFCAQAEwRpKNQ466KCs9ckn/KE89txzTy+OP6GzTZs2JTln8tbf5DpI/MmLyS3pk49TmDJlSuDeIVc77JD7/85HHnmkF8ef/NqjR4+c27n22muztlvolvo33HCDF48fP76gdkqBKxQAQBAkFABAEEx5pcV3Jm3WrFkt9gSZjB492ou7du0aladPn15wu0cddZQX//KXv4zKxx13nFfXunXrjO3cdNNNXnzbbbd58YoVKwrtIoqUz/TShAkTvDg+zTVw4MBgfcjWpxdffNGLZ8+eHZXjU72VhisUAEAQJBQAQBAkFABAEKyhpG3evDkqJ+c2a9p9GLWvffv2XjxmzBgvbtKkSVQ+99xzvbq99trLixs3bpzxPBs2bPDi8847Lyo/9NBDXt13332Xpccotaqqqqi8bt06r65Vq1Y5tzNo0KCoXOitvtX58ssvo/Lw4cO9uiVLlnjxqlWrgp23lLhCAQAEQUIBAARBQgEABMEaStoRRxwRlZOfNUhuX5+MUfv69++fNc7H0qVLo/JLL73k1SW3qA85p46w4r+75OMN4p8nKdejDpKfS4qvuc2bN68sfSg1rlAAAEGQUAAAQTDllZbPlgqLFy8uYU+QyW9/+1svjk9NJm8FTnrjjTei8vz58726WbNmefHChQujMk/nrB+St3Q/+eSTUXnmzJlZXxv/mEAx091PPfVUwa+tK7hCAQAEQUIBAARBQgEABGH5zAmaWb29XzZ+W2Fyrj55a2jPnj2j8qJFi0rbsRw45yp6L5j6PG7quAXOudwfQVgLGDsVq9qxwxUKACAIEgoAIAgSCgAgCNZQ6gHWUFAg1lBQKNZQAAClQ0IBAARBQgEABEFCAQAEQUIBAARBQgEABJHv9vWrJH1Uio6gYHvXdgdywLipTIwdFKrasZPX51AAAMiEKS8AQBAkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBD1OqGY2T5m5sws3236Q5x7mZn1K/d5EQZjB4VqyGOn6IRiZmeY2XwzqzKzlenypWZmITpYKmb2Texrm5ltjMUj8mxrupldH7Bv7c3sUTP7LD0w9wnVdiVh7JRk7Aw0s3lmttbMvjCzP5pZy1DtVwrGTvixk2j77vTfns75vK6ohGJmYyTdKmmypD0k/UDSxZKOktQkw2saFXPOUJxzLbZ/SfpY0qDY92ZsP642/suQtE3Sk5KG1sK5y4KxUzKtJF0vqYOkgyTtqdR7XG8wdkrLzHpL2r+gFzvnCvpSauBWSRpaw3HTJU2VNDd9fD+lBvoLktZKelvSKbHjX5B0fiweJWleLHZKDZ730q+/Xd8/KKyRpJuVesrbB5IuSx+/Yw19XCapX7rcV9Inkq6U9IWk+5N9iPWjs6QLJX0raYukbyTNibX5X5LekrRO0kxJTfN8j3dMn2efQn9PlfjF2Cn92Imd6zRJC2v7d87YqRtjR6m/OW9I6rb9XPn8foq5QukpaSdJj+Rw7FmSbpDUUtJ8SXMkPS1pd0m/kDTDzH6Ux7lPlnSkUj/0cEn909+/IF13mKQekobl0WbcHpLaKPWYywuzHeicu0PSDEmTXOq/jEGx6uGS/kPSvum+jtpekZ6S6F1g/+o6xo7KNnaOVuqPZ33B2FFJx85oSS85594q5AcoJqG0lbTKObd1+zfM7JV0hzea2dGxYx9xzv2fc26bpO6SWkia6Jzb4px7TtJjks7M49wTnXNrnXMfS3o+3aaUeiN/55xb7pxbI+nGAn+2bZImOOc2O+c2FtiGJN3mnPss3Zc5sX7KOdfaOTeviLbrMsZOzYoeO2Z2gqSfSRpfRD8qDWOnZgWNHTPrJOkiFTFeikkoqyW1jc/1Oed6Oedap+vibS+PlTtIWp7+JW/3kVJzvbn6IlbeoNRAidpOtFuIL51zmwp8bVymfjZ0jJ2aFTV2zOwnkh6QNMw5926A/lQKxk7NCh07v5N0nXNuXaEnLiahvCpps6TBORzrYuXPJHUys/i595L0abpcJal5rG6PPPr0uaROiXYL4RKx1yczS/YpeTyyY+xkPr5oZnaYpEcl/dw597fQ7dcyxk7m44t1vKTJ6bsDtyelV83srFwbKDihOOfWSrpW0hQzG2ZmLc1sBzPrLmnnLC+dr1TWHGtmjc2sr6RBkh5M178p6TQza56+Ze28PLo1S9J/mllHM9tV0lV5/liZ/FNSFzPrbmZNJV2TqF8hab9A55Ikpc+zUzrcKR3XC4wdT9CxY2ZdlbpD8BfOuTmh2q0UjB1P6L87B0g6VKkpsu3TZIMkzc61gaJuG3bOTZJ0haSxSv1wKyT9r1J3KryS4TVb0p0coNRdEVMkneOcW5I+5Bal7lxYIelepRaecnWnpKeU+kW8Lunh/H6i6qWnDK6T9KxSd3kk5yDvknRweh73r7m0mb7vvE+WQzYqdfeGJC1Jx/UGYycSeuyMkdRO0l2xzzfUp0V5xs73go4d59xK59wX27/S316Vz3rO9tveAAAoSr3eegUAUD4kFABAECQUAEAQJBQAQBAkFABAEHntaGlm3BJWgZxzlb5lN+OmMq1yzrWr7U5kw9ipWNWOHa5QgIar0C1CgGrHDgkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQRF67Ddc106ZNi8p9+vTx6rp06VLu7gBAvcYVCgAgCBIKACCIej3lNWTIkKi822671WJPADQ0I0aM8OL77rvPi59++umofNNNN3l1L7zwQsn6VUpcoQAAgiChAACCIKEAAIKo12soS5Ysicq9e/f26u6//34vHjlyZFn6hLqlX79+XnzsscdmPHbRokVevGnTJi/u2LFjVE7Op69bt67QLqKCDBgwICpffvnlXp1zzotPOOGEqNy3b1+vrl27dl78zTffBOphaXGFAgAIgoQCAAiiXk95zZ49OyofddRRXl1yCqxt27ZRedWqVaXtGCrauHHjovLYsWO9uhYtWnhxchojVwMHDvTiQYMGReVvv/22oDZRft27d/fiWbNmReVmzZrl3E6TJk282MyK61gt4QoFABAECQUAEAQJBQAQRL1eQ3n55ZejcnJOcu+99/bivfbaKyqzhtKwvfHGGxnr/vSnPxXcbq9evaJy/JZRSZo6dWpUPv/88ws+B0pr99139+LJkyd7cT7rJvURVygAgCBIKACAIEgoAIAg6vUaSlyhnxdAw/P4449H5X333derW716dcHtnnjiiVH5iSee8Or69+9fcLsonylTpnhxtq14Nm/e7MV///vfvfiYY47J+NpLLrnEiydNmpRrF2sVVygAgCBIKACAIBrMlFfytuG6urUByquYKa6kTp06Zaz75JNPgp0HYZ1xxhlR+bjjjst67MaNG6Pyc88959UldzRfs2ZNxnb23HPPfLpYMbhCAQAEQUIBAARBQgEABFGv11AWL14cld955x2v7uCDD/biIUOGROXXX3+9tB1Dg9C8eXMvPvnkkzMey5b1lSN5K/C0adOicvLxBUm//vWvo/KNN97o1e2yyy4BelfZuEIBAARBQgEABEFCAQAEUa/XUDZs2BCVN23a5NUlP4cSfwQwUIiuXbt6cfyxvpJ0/PHHR+WZM2d6dXPmzCldx5BVcl3kiiuuyFofl3zURW2sv8a31E9uFZTcwuXrr7+OyhMnTvTqPvvss6L7whUKACAIEgoAIIh6PeWVDbsPI7Qrr7zSi0eMGJHx2Ph0rCQ98sgjJekTanbBBRd48YABAzIeu3TpUi8ePHiwF8enjTp27OjVjRs3Luc+HX300V4c34pl/fr1Xl18d+zDDjss53OcffbZXtymTZucX5sJVygAgCBIKACAIEgoAIAgLJ+1BDOrswsPNT0hL/4+NGrUqCx9CsU5V9F78Zdj3DRp0sSL+/Tp48Xdu3ePykceeaRX16xZMy+ePXt2VF6+fLlX98orr3hxfKuNc88916tr2bKlF8dvFb755pu9umy3m7Zr186Lu3XrFpX/9re/ZXxdDhY453oU00CplWPsrF271otr2l6lFJIfYyjHGu9f/vIXL45v05+DascOVygAgCBIKACAIEgoAIAgGsznUOJb2UvSiSee6MV8LqXuGTp0aFSeMGGCV9elS5eC2822zfz777/vxZ07d8547JQpU7z4lltuicoffPBBxtclP4MwbNgwL+7bt29Ujq+nIHdXX311VE6uddWGHXbw/7fftm1bQe0kt0+57777vPjPf/5zVH7zzTcLOkc2XKEAAIIgoQAAgmgwU15Jydv0UJni0xFjxozx6uJbWSR/n1u3bvXif/3rX1F53bp1Xl2vXr1y7s8BBxzgxdmmJkaNGpWx7vrrr/fi+K3M1113nVd36KGHevGKFStq6iZqsGDBgqi8ZcsWr65x48YFtzt37tyo/OGHH3p1yanMQw45JConx1FyCn769OlRuaqqKuP577zzTi9etGhR9g4HxhUKACAIEgoAIAgSCgAgiAaz9cqFF17oxVOnTvXi+Puw4451a2mpPm+98uCDD0bl008/PefXrV69OtmHqFzTNt1fffVVVH733Xe9updeesmL47cnn3TSSTn3L5vk1vYLFy704vhtxEU+ZY+tVyS1b98+ec6C21qzZk1UTj4lNvkEz/gWP8lz3nPPPV580UUXReXvvvuu4P4FxNYrAIDSIaEAAIIgoQAAgqhbiwUB8TmUuiG5tXyudtttt5yPjX92QPI/75JcQ0lq1apVVD7ttNO8uoEDB3rxkCFDcupP8lELw4cPz+l1KMznn39elvOccMIJOR/72muveXGFrJvUiCsUAEAQJBQAQBANdsorebs0uw1Xpvg0Uvypi5J06qmn5tzOe++9F5WffPJJr279+vVevHHjxpzbjW/jkrzV89577/Xirl27RuXkLdB//OMfo/LKlStzPj8qV9OmTb24Y8eOOb92xowZobtTFlyhAACCIKEAAIIgoQAAgmgwaygHHnigF4d6QhpKK367ZHzL8eriSpMcU2+99Va1ZdRPyVvXTznllFrqSflwhQIACIKEAgAIosFMeS1ZssSLa3pCGgAgP1yhAACCIKEAAIIgoQAAgmgwayjJ3YW5bRhAKSV3CK6qqvLinXfeOSq/+OKLXt3mzZtL17ES4goFABAECQUAEAQJBQAQRINZQ0l+zoTPoQAopS+++MKLk48zuPTSS6Nyz549vbomTZp48ZYtWwL3rjS4QgEABEFCAQAEYflM9ZgZ80IVyDlnNR9Vexg3FWuBc65HbXcim/o0dm677TYv3n///aPypEmTvLrkbcQVqNqxwxUKACAIEgoAIAgSCgAgCNZQ6gHWUFAg1lBQKNZQAAClQ0IBAARBQgEABEFCAQAEQUIBAARBQgEABEFCAQAEQUIBAARBQgEABEFCAQAEke8TG1dJ+qgUHUHB9q7tDuSAcVOZGDsoVLVjJ6+9vAAAyIQpLwBAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBD/D0XNadxmtSfPAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 6 Axes>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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rLPO8upmzpxZTBfzxhUKACAIEgoAIAgSCgAgiDq9htKhQwcv7tq1qxfvuuuuUfmkk07y6vr16+fF7du3j8oLFizw6h566CEvfuyxx6LyokWL8ugx6pqBAwd68VVXXeXFhxxySFRu2bJl1rbic91JQ4YMicqTJ0/Op4uoUJdccokXH3jggV7cp0+fqBwfR1L2sZIUP/b222/36rZu3erFyb9loXGFAgAIgoQCAAjCkrcvZj3YLPeDA+nSpYsXX3zxxVH57LPP9uqWLVvmxV999VVUfvzxx3M+5+GHH+7F3bp18+L99tsvKj/xxBNe3ejRo6Py8uXLcz5nMZxzVpYTFag2xk1So0aNonLv3r29ul/96lde3KtXr6jcrFkzr86sNG91/Jzz588vyTmqscA516NcJytEJYydbPbZZx8vHjp0aFQeP368V9eiRQsvzmdaKy7bbcNJ69at8+JTTz01Ks+bN6+g86dVO3a4QgEABEFCAQAEQUIBAARREbcNx+epzzvvPK9u3LhxXhyfP5wzZ45Xd84555Sgd1Ljxo29OH4L8uzZs726Nm3aROXjjjuuJP1B/uLjKDm3XYwXX3wxKs+dO9erS66/XHPNNRnbGTZsWFQu4xoKivTUU095cXx9NR9r16714vvvvz/jsfvuu68Xn3zyyRmPbdWqlRfvvPPOBfQud1yhAACCIKEAAIIgoQAAgqiVNZTkZ0t+85vfROUTTzzRq3vmmWe8OD7XvH79+hL07t99++23XlxVVZXx2Pj8ZnzrF8n/XAzKa++9947KmzZt8uq+++47L45vH//www97dcltxeNtxbdPkaRbb701Y3+2bNnixXfddVfGY1G7evT4/uMWEyZM8Or22GOPIOe47LLLvHjWrFkZj40/BkHKvoaSdO2110bl5PpPCFyhAACCIKEAAIKolSmvn//8514cn+aKb60iZX9yWbnstNNOXjxx4sSonNyKY/HixVGZKa7KER9zyR1ZN2/e7MXZdpA+88wzvfiKK66Iyskte5Li01znn3++V7dkyZKsr0X5xKe4JOkf//hHVC50uxRJWr16tRfHPyKR/AhENl9++aUXx7d4ik/tVifbreshcIUCAAiChAIACIKEAgAIomxrKCNHjozKl19+uVcXv0WuEtZMkrc1J59y9sMf/jAqf/31117dBRdcULqOIYjkEzmTa2Sd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Ze28PLo1S9J/mllHM9tV0lV5/liZ/FNSFzPrbmZNJV2TqF8hab9A55Ikpc+zUzrcKR3XC4wdT9CxY2ZdlbpD8BfOuTmh2q0UjB1P6L87B0g6VKkpsu3TZIMkzc61gaJuG3bOTZJ0haSxSv1wKyT9r1J3KryS4TVb0p0coNRdEVMkneOcW5I+5Bal7lxYIelepRaecnWnpKeU+kW8Lunh/H6i6qWnDK6T9KxSd3kk5yDvknRweh73r7m0mb7vvE+WQzYqdfeGJC1Jx/UGYycSeuyMkdRO0l2xzzfUp0V5xs73go4d59xK59wX27/S316Vz3rO9tveAAAoSr3eegUAUD4kFABAECQUAEAQJBQAQBAkFABAEHntaGlm3BJWgZxzlb5lN+OmMq1yzrWr7U5kw9ipWNWOHa5QgIar0C1CgGrHDgkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQRF67Ddc106ZNi8p9+vTx6rp06VLu7gBAvcYVCgAgCBIKACCIej3lNWTIkKi822671WJPADQ0I0aM8OL77rvPi59++umofNNNN3l1L7zwQsn6VUpcoQAAgiChAACCIKEAAIKo12soS5Ysicq9e/f26u6//34vHjlyZFn6hLqlX79+XnzsscdmPHbRokVevGnTJi/u2LFjVE7Op69bt67QLqKCDBgwICpffvnlXp1zzotPOOGEqNy3b1+vrl27dl78zTffBOphaXGFAgAIgoQCAAiiXk95zZ49OyofddRRXl1yCqxt27ZRedWqVaXtGCrauHHjovLYsWO9uhYtWnhxchojVwMHDvTiQYMGReVvv/22oDZRft27d/fiWbNmReVmzZrl3E6TJk282MyK61gt4QoFABAECQUAEAQJBQAQRL1eQ3n55ZejcnJOcu+99/bivfbaKyqzhtKwvfHGGxnr/vSnPxXcbq9evaJy/JZRSZo6dWpUPv/88ws+B0pr99139+LJkyd7cT7rJvURVygAgCBIKACAIEgoAIAg6vUaSlyhnxdAw/P4449H5X333derW716dcHtnnjiiVH5iSee8Or69+9fcLsonylTpnhxtq14Nm/e7MV///vfvfiYY47J+NpLLrnEiydNmpRrF2sVVygAgCBIKACAIBrMlFfytuG6urUByquYKa6kTp06Zaz75JNPgp0HYZ1xxhlR+bjjjst67MaNG6Pyc88959UldzRfs2ZNxnb23HPPfLpYMbhCAQAEQUIBAARBQgEABFGv11AWL14cld955x2v7uCDD/biIUOGROXXX3+9tB1Dg9C8eXMvPvnkkzMey5b1lSN5K/C0adOicvLxBUm//vWvo/KNN97o1e2yyy4BelfZuEIBAARBQgEABEFCAQAEUa/XUDZs2BCVN23a5NUlP4cSfwQwUIiuXbt6cfyxvpJ0/PHHR+WZM2d6dXPmzCldx5BVcl3kiiuuyFofl3zURW2sv8a31E9uFZTcwuXrr7+OyhMnTvTqPvvss6L7whUKACAIEgoAIIh6PeWVDbsPI7Qrr7zSi0eMGJHx2Ph0rCQ98sgjJekTanbBBRd48YABAzIeu3TpUi8ePHiwF8enjTp27OjVjRs3Luc+HX300V4c34pl/fr1Xl18d+zDDjss53OcffbZXtymTZucX5sJVygAgCBIKACAIEgoAIAgLJ+1BDOrswsPNT0hL/4+NGrUqCx9CsU5V9F78Zdj3DRp0sSL+/Tp48Xdu3ePykceeaRX16xZMy+ePXt2VF6+fLlX98orr3hxfKuNc88916tr2bKlF8dvFb755pu9umy3m7Zr186Lu3XrFpX/9re/ZXxdDhY453oU00CplWPsrF271otr2l6lFJIfYyjHGu9f/vIXL45v05+DascOVygAgCBIKACAIEgoAIAgGsznUOJb2UvSiSee6MV8LqXuGTp0aFSeMGGCV9elS5eC2822zfz777/vxZ07d8547JQpU7z4lltuicoffPBBxtclP4MwbNgwL+7bt29Ujq+nIHdXX311VE6uddWGHXbw/7fftm1bQe0kt0+57777vPjPf/5zVH7zzTcLOkc2XKEAAIIgoQAAgmgwU15Jydv0UJni0xFjxozx6uJbWSR/n1u3bvXif/3rX1F53bp1Xl2vXr1y7s8BBxzgxdmmJkaNGpWx7vrrr/fi+K3M1113nVd36KGHevGKFStq6iZqsGDBgqi8ZcsWr65x48YFtzt37tyo/OGHH3p1yanMQw45JConx1FyCn769OlRuaqqKuP577zzTi9etGhR9g4HxhUKACAIEgoAIAgSCgAgiAaz9cqFF17oxVOnTvXi+Puw4451a2mpPm+98uCDD0bl008/PefXrV69OtmHqFzTNt1fffVVVH733Xe9updeesmL47cnn3TSSTn3L5vk1vYLFy704vhtxEU+ZY+tVyS1b98+ec6C21qzZk1UTj4lNvkEz/gWP8lz3nPPPV580UUXReXvvvuu4P4FxNYrAIDSIaEAAIIgoQAAgqhbiwUB8TmUuiG5tXyudtttt5yPjX92QPI/75JcQ0lq1apVVD7ttNO8uoEDB3rxkCFDcupP8lELw4cPz+l1KMznn39elvOccMIJOR/72muveXGFrJvUiCsUAEAQJBQAQBANdsorebs0uw1Xpvg0Uvypi5J06qmn5tzOe++9F5WffPJJr279+vVevHHjxpzbjW/jkrzV89577/Xirl27RuXkLdB//OMfo/LKlStzPj8qV9OmTb24Y8eOOb92xowZobtTFlyhAACCIKEAAIIgoQAAgmgwaygHHnigF4d6QhpKK367ZHzL8eriSpMcU2+99Va1ZdRPyVvXTznllFrqSflwhQIACIKEAgAIosFMeS1ZssSLa3pCGgAgP1yhAACCIKEAAIIgoQAAgmgwayjJ3YW5bRhAKSV3CK6qqvLinXfeOSq/+OKLXt3mzZtL17ES4goFABAECQUAEAQJBQAQRINZQ0l+zoTPoQAopS+++MKLk48zuPTSS6Nyz549vbomTZp48ZYtWwL3rjS4QgEABEFCAQAEYflM9ZgZ80IVyDlnNR9Vexg3FWuBc65HbXcim/o0dm677TYv3n///aPypEmTvLrkbcQVqNqxwxUKACAIEgoAIAgSCgAgCNZQ6gHWUFAg1lBQKNZQAAClQ0IBAARBQgEABEFCAQAEQUIBAARBQgEABEFCAQAEQUIBAARBQgEABEFCAQAEke8TG1dJ+qgUHUHB9q7tDuSAcVOZGDsoVLVjJ6+9vAAAyIQpLwBAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBAkFABAECQUAEAQJBQAQBD/D0XNadxmtSfPAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 6 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"for i in range(6):\n",
" plt.subplot(2,3,i+1)\n",
" plt.tight_layout()\n",
" plt.imshow(train_loader_a[0][0][i][0], cmap='gray', interpolation='none')\n",
" plt.title(\"Ground Truth: {}\".format(train_loader_a[0][1][i]))\n",
" plt.xticks([])\n",
" plt.yticks([])\n",
"fig"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"class Net(nn.Module):\n",
" def __init__(self):\n",
" super(Net, self).__init__()\n",
" self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n",
" self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n",
" self.conv2_drop = nn.Dropout2d()\n",
" self.fc1 = nn.Linear(320, 50)\n",
" self.fc2 = nn.Linear(50, 10)\n",
"\n",
" def forward(self, x):\n",
" x = F.relu(F.max_pool2d(self.conv1(x), 2))\n",
" x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))\n",
" x = x.view(-1, 320)\n",
" x = F.relu(self.fc1(x))\n",
" x = F.dropout(x, training=self.training)\n",
" x = self.fc2(x)\n",
" return x, F.softmax(x, dim=1), F.log_softmax(x, dim=1)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"h1 = Net().cuda()\n",
"optimizer = optim.SGD(h1.parameters(), lr=learning_rate, momentum=momentum)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"train_counter, test_counter, train_losses, test_losses = training.train(\n",
" n_epochs, h1, optimizer, F.nll_loss, train_loader_a, test_loader,\n",
" batch_size_train, batch_size_test, device=\"cuda\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'negative log likelihood loss')"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"plt.plot(train_counter, train_losses, color='blue')\n",
"plt.scatter(test_counter, test_losses, color='red')\n",
"plt.legend(['Train Loss', 'Test Loss'], loc='upper right')\n",
"plt.xlabel('number of training examples seen')\n",
"plt.ylabel('negative log likelihood loss')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"with torch.no_grad():\n",
" _, _, output = h1(test_loader[0][0].to(\"cuda\"))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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AIAgKCgAgCDKYg2ladOmUfzAAw94beedd56Xt2rVKsh7Jue+zSyKk3OUK1eu9PJnnnkmipNz6v/85z+D9A/FM2LECC8fMmSIl2/ZsiWKJ0+e7LWNHj3ay+Nz1A8++GCgHqKmaNasmZf/7Gc/i+KbbrrJa+vYsWNJ+lSduEIBAARBQQEABGHZbkH73sFmuR+ch9NOOy2K33rrrWK8RaWyTXllk7wFdcWKFaG6lDPnnFV+VPUp1rgp1KJFi7z8qKOO8vJhw4ZF8RtvvOG1tW3b1stnzpwZxVdddZXXlpwuK0PznXPdKj+s+pTb2Bk8eLCXx2/9laQf/vCHURz/nSJ9//dKfHr8o48+8tri0+qS9Omnn0bxfffd57Ulx2Rc8tblr7/+OuOxeapw7HCFAgAIgoICAAiCggIACKIsbhuO35abvPUyudXKrFmzovicc87x2l599dWC+xDf4uWnP/1pwedBzbNz504vP/3006P4mmuu8dp+9KMfefkdd9wRxWPGjPHaZsyY4eWbN2+uUj9RPS6//PIonjhxotfWsGHDnM/z3nvvefmNN94YxfHfaxWJbwHUokWLnN+z1LhCAQAEQUEBAARBQQEABFEWayhLly6N4uR93U2aNPHy+Dz0/fff77Vt2rSp4D6MHz8+52Pj29d/++23Bb8nykP8yXmS/3S85LpI0r333hvFyfW+oUOHevk999xTaBdRjW6++eYozmfN5NZbb/Xy5OeSVq9enfO5evToEcXJz5bEPffcc15e6t9PXKEAAIKgoAAAgiiLrVeKpU2bNlEcv2yVpCOPPNLLL7jggihOXiYmpyri2yIkt/GoDmy9kp/kz+yYY47JeGznzp29PHnrZ1zyNvaHHnrIy88888woXrduXaX9LAG2XslBv379oji59UpSfFuUefPmFfyeySfVxrekyjbtls94rSK2XgEAFA8FBQAQBAUFABBEWdw2HMq5557r5c8//3wU16tXL+tr33333ShOPs3x6aefDtA7lIvLLrvMy+fOnevldep8989iz549OZ83ufVPckvys846K4qT25OjfL3wwgsVxsWU3OIn27pJ/FbhDz/8sGh9ygVXKACAICgoAIAgKCgAgCDKfg2lQ4cOXt6pU6covv766722+BbPUuXrJnHbtm2L4i+++CKfLqKGmT9/vpd/8803Xh7fwucf//hHwe8z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\n",
"text/plain": [
"<Figure size 432x288 with 6 Axes>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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AIAgKCgAgCDKYg2ladOmUfzAAw94beedd56Xt2rVKsh7Jue+zSyKk3OUK1eu9PJnnnkmipNz6v/85z+D9A/FM2LECC8fMmSIl2/ZsiWKJ0+e7LWNHj3ay+Nz1A8++GCgHqKmaNasmZf/7Gc/i+KbbrrJa+vYsWNJ+lSduEIBAARBQQEABGHZbkH73sFmuR+ch9NOOy2K33rrrWK8RaWyTXllk7wFdcWKFaG6lDPnnFV+VPUp1rgp1KJFi7z8qKOO8vJhw4ZF8RtvvOG1tW3b1stnzpwZxVdddZXXlpwuK0PznXPdKj+s+pTb2Bk8eLCXx2/9laQf/vCHURz/nSJ9//dKfHr8o48+8tri0+qS9Omnn0bxfffd57Ulx2Rc8tblr7/+OuOxeapw7HCFAgAIgoICAAiCggIACKIsbhuO35abvPUyudXKrFmzovicc87x2l599dWC+xDf4uWnP/1pwedBzbNz504vP/3006P4mmuu8dp+9KMfefkdd9wRxWPGjPHaZsyY4eWbN2+uUj9RPS6//PIonjhxotfWsGHDnM/z3nvvefmNN94YxfHfaxWJbwHUokWLnN+z1LhCAQAEQUEBAARBQQEABFEWayhLly6N4uR93U2aNPHy+Dz0/fff77Vt2rSp4D6MHz8+52Pj29d/++23Bb8nykP8yXmS/3S85LpI0r333hvFyfW+oUOHevk999xTaBdRjW6++eYozmfN5NZbb/Xy5OeSVq9enfO5evToEcXJz5bEPffcc15e6t9PXKEAAIKgoAAAgiiLrVeKpU2bNlEcv2yVpCOPPNLLL7jggihOXiYmpyri2yIkt/GoDmy9kp/kz+yYY47JeGznzp29PHnrZ1zyNvaHHnrIy88888woXrduXaX9LAG2XslBv379oji59UpSfFuUefPmFfyeySfVxrekyjbtls94rSK2XgEAFA8FBQAQBAUFABBEWdw2HMq5557r5c8//3wU16tXL+tr33333ShOPs3x6aefDtA7lIvLLrvMy+fOnevldep8989iz549OZ83ufVPckvys846K4qT25OjfL3wwgsVxsWU3OIn27pJ/FbhDz/8sGh9ygVXKACAICgoAIAgKCgAgCDKfg2lQ4cOXt6pU6covv766722+BbPUuXrJnHbtm2L4i+++CKfLqKGmT9/vpd/8803Xh7fwucf//hHwe8z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\n",
"text/plain": [
"<Figure size 432x288 with 6 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"for i in range(6):\n",
" plt.subplot(2,3,i+1)\n",
" plt.tight_layout()\n",
" plt.imshow(test_loader[0][0][i][0], cmap='gray', interpolation='none')\n",
" plt.title(\"Prediction: {}\".format(\n",
" output.data.max(1, keepdim=True)[1][i].item()))\n",
" plt.xticks([])\n",
" plt.yticks([])\n",
"fig"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div class=\"container\">\n",
" <style>\n",
" #viz {\n",
" font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n",
" position: relative;\n",
" width: 960px;\n",
"}\n",
" \n",
".axis text {\n",
" font: 10px sans-serif;\n",
"}\n",
" \n",
".axis path,\n",
".axis line {\n",
" fill: none;\n",
" stroke: #000;\n",
" shape-rendering: crispEdges;\n",
"}\n",
" \n",
".bar {\n",
" fill: rgba(113, 113, 255, 0.8);\n",
"}\n",
" \n",
".bar:hover {\n",
" fill: rgba(226, 75, 158, 0.8);\n",
"}\n",
" \n",
"label {\n",
" position: absolute;\n",
" top: 10px;\n",
" right: 10px;\n",
"}\n",
"\n",
".plot {\n",
" display: inline-block;\n",
" margin-left: 20px;\n",
" margin-right:20px;\n",
"}\n",
"\n",
".table {\n",
" width: 600px;\n",
" text-align: center;\n",
" background-color: lightblue;\n",
"}\n",
"\n",
".data-selector .control-group {\n",
" display: inline-block;\n",
" margin-right: 50px;\n",
"}\n",
"\n",
".data-selector .control-subgroup {\n",
" display: inline-block;\n",
" margin-right: 20px;\n",
"}\n",
"\n",
".data-selector .control {\n",
" display: inline-block;\n",
" margin-right: 5px;\n",
"}\n",
"\n",
" </style>\n",
" <div id=\"widget\">\n",
" </div>\n",
" <script>\n",
" var data = null;\n",
" window.API_SERVICE_ENVIRONMENT = {\"environment_type\": \"local\", \"base_url\": \"\", \"port\": 5000};\n",
" window.WIDGET_STATE = {\n",
" data: data,\n",
" sweepStatus: null,\n",
" selectedDataPoint: null,\n",
" training: true,\n",
" testing: true,\n",
" newError: true,\n",
" strictImitation: true,\n",
" error: null,\n",
" loading: false\n",
" };\n",
"\n",
" !function(n){var t={};function e(c){if(t[c])return t[c].exports;var I=t[c]={i:c,l:!1,exports:{}};return n[c].call(I.exports,I,I.exports,e),I.l=!0,I.exports}e.m=n,e.c=t,e.d=function(n,t,c){e.o(n,t)||Object.defineProperty(n,t,{enumerable:!0,get:c})},e.r=function(n){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(n,\"__esModule\",{value:!0})},e.t=function(n,t){if(1&t&&(n=e(n)),8&t)return n;if(4&t&&\"object\"==typeof n&&n&&n.__esModule)return n;var c=Object.create(null);if(e.r(c),Object.defineProperty(c,\"default\",{enumerable:!0,value:n}),2&t&&\"string\"!=typeof n)for(var I in n)e.d(c,I,function(t){return n[t]}.bind(null,I));return c},e.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(t,\"a\",t),t},e.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},e.p=\"/\",e(e.s=20)}([function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nif (true) {\\n module.exports = __webpack_require__(22);\\n} else {}\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanM/Y2E3OCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDLG1CQUFtQixtQkFBTyxDQUFDLEVBQStCO0FBQzFELENBQUMsTUFBTSxFQUVOIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///0\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar bind = __webpack_require__(10);\\n\\n/*global toString:true*/\\n\\n// utils is a library of generic helper functions non-specific to axios\\n\\nvar toString = Object.prototype.toString;\\n\\n/**\\n * Determine if a value is an Array\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is an Array, otherwise false\\n */\\nfunction isArray(val) {\\n return toString.call(val) === '[object Array]';\\n}\\n\\n/**\\n * Determine if a value is undefined\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if the value is undefined, otherwise false\\n */\\nfunction isUndefined(val) {\\n return typeof val === 'undefined';\\n}\\n\\n/**\\n * Determine if a value is a Buffer\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is a Buffer, otherwise false\\n */\\nfunction isBuffer(val) {\\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\\n}\\n\\n/**\\n * Determine if a value is an ArrayBuffer\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\\n */\\nfunction isArrayBuffer(val) {\\n return toString.call(val) === '[object ArrayBuffer]';\\n}\\n\\n/**\\n * Determine if a value is a FormData\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is an FormData, otherwise false\\n */\\nfunction isFormData(val) {\\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\\n}\\n\\n/**\\n * Determine if a value is a view on an ArrayBuffer\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\\n */\\nfunction isArrayBufferView(val) {\\n var result;\\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\\n result = ArrayBuffer.isView(val);\\n } else {\\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\\n }\\n return result;\\n}\\n\\n/**\\n * Determine if a value is a String\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is a String, otherwise false\\n */\\nfunction isString(val) {\\n return typeof val === 'string';\\n}\\n\\n/**\\n * Determine if a value is a Number\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is a Number, otherwise false\\n */\\nfunction isNumber(val) {\\n return typeof val === 'number';\\n}\\n\\n/**\\n * Determine if a value is an Object\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is an Object, otherwise false\\n */\\nfunction isObject(val) {\\n return val !== null && typeof val === 'object';\\n}\\n\\n/**\\n * Determine if a value is a Date\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is a Date, otherwise false\\n */\\nfunction isDate(val) {\\n return toString.call(val) === '[object Date]';\\n}\\n\\n/**\\n * Determine if a value is a File\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is a File, otherwise false\\n */\\nfunction isFile(val) {\\n return toString.call(val) === '[object File]';\\n}\\n\\n/**\\n * Determine if a value is a Blob\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is a Blob, otherwise false\\n */\\nfunction isBlob(val) {\\n return toString.call(val) === '[object Blob]';\\n}\\n\\n/**\\n * Determine if a value is a Function\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is a Function, otherwise false\\n */\\nfunction isFunction(val) {\\n return toString.call(val) === '[object Function]';\\n}\\n\\n/**\\n * Determine if a value is a Stream\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is a Stream, otherwise false\\n */\\nfunction isStream(val) {\\n return isObject(val) && isFunction(val.pipe);\\n}\\n\\n/**\\n * Determine if a value is a URLSearchParams object\\n *\\n * @param {Object} val The value to test\\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\\n */\\nfunction isURLSearchParams(val) {\\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\\n}\\n\\n/**\\n * Trim excess whitespace off the beginning and end of a string\\n *\\n * @param {String} str The String to trim\\n * @returns {String} The String freed of excess whitespace\\n */\\nfunction trim(str) {\\n return str.replace(/^\\\\s*/, '').replace(/\\\\s*$/, '');\\n}\\n\\n/**\\n * Determine if we're running in a standard browser environment\\n *\\n * This allows axios to run in a web worker, and react-native.\\n * Both environments support XMLHttpRequest, but not fully standard globals.\\n *\\n * web workers:\\n * typeof window -> undefined\\n * typeof document -> undefined\\n *\\n * react-native:\\n * navigator.product -> 'ReactNative'\\n * nativescript\\n * navigator.product -> 'NativeScript' or 'NS'\\n */\\nfunction isStandardBrowserEnv() {\\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\\n navigator.product === 'NativeScript' ||\\n navigator.product === 'NS')) {\\n return false;\\n }\\n return (\\n typeof window !== 'undefined' &&\\n typeof document !== 'undefined'\\n );\\n}\\n\\n/**\\n * Iterate over an Array or an Object invoking a function for each item.\\n *\\n * If `obj` is an Array callback will be called passing\\n * the value, index, and complete array for each item.\\n *\\n * If 'obj' is an Object callback will be called passing\\n * the value, key, and complete object for each property.\\n *\\n * @param {Object|Array} obj The object to iterate\\n * @param {Function} fn The callback to invoke for each item\\n */\\nfunction forEach(obj, fn) {\\n // Don't bother if no value provided\\n if (obj === null || typeof obj === 'undefined') {\\n return;\\n }\\n\\n // Force an array if not already something iterable\\n if (typeof obj !== 'object') {\\n /*eslint no-param-reassign:0*/\\n obj = [obj];\\n }\\n\\n if (isArray(obj)) {\\n // Iterate over array values\\n for (var i = 0, l = obj.length; i < l; i++) {\\n fn.call(null, obj[i], i, obj);\\n }\\n } else {\\n // Iterate over object keys\\n for (var key in obj) {\\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\\n fn.call(null, obj[key], key, obj);\\n }\\n }\\n }\\n}\\n\\n/**\\n * Accepts varargs expecting each argument to be an object, then\\n * immutably merges the properties of each object and returns result.\\n *\\n * When multiple objects contain the same key the later object in\\n * the arguments list will take precedence.\\n *\\n * Example:\\n *\\n * ```js\\n * var result = merge({foo: 123}, {foo: 456});\\n * console.log(result.foo); // outputs 456\\n * ```\\n *\\n * @param {Object} obj1 Object to merge\\n * @returns {Object} Result of all merge properties\\n */\\nfunction merge(/* obj1, obj2, obj3, ... */) {\\n var result = {};\\n function assignValue(val, key) {\\n if (typeof result[key] === 'object' && typeof val === 'object') {\\n result[key] = merge(result[key], val);\\n } else {\\n result[key] = val;\\n }\\n }\\n\\n for (var i = 0, l = arguments.length; i < l; i++) {\\n forEach(arguments[i], assignValue);\\n }\\n return result;\\n}\\n\\n/**\\n * Function equal to merge with the difference being that no reference\\n * to original objects is kept.\\n *\\n * @see merge\\n * @param {Object} obj1 Object to merge\\n * @returns {Object} Result of all merge properties\\n */\\nfunction deepMerge(/* obj1, obj2, obj3, ... */) {\\n var result = {};\\n function assignValue(val, key) {\\n if (typeof result[key] === 'object' && typeof val === 'object') {\\n result[key] = deepMerge(result[key], val);\\n } else if (typeof val === 'object') {\\n result[key] = deepMerge({}, val);\\n } else {\\n result[key] = val;\\n }\\n }\\n\\n for (var i = 0, l = arguments.length; i < l; i++) {\\n forEach(arguments[i], assignValue);\\n }\\n return result;\\n}\\n\\n/**\\n * Extends object a by mutably adding to it the properties of object b.\\n *\\n * @param {Object} a The object to be extended\\n * @param {Object} b The object to copy properties from\\n * @param {Object} thisArg The object to bind function to\\n * @return {Object} The resulting value of object a\\n */\\nfunction extend(a, b, thisArg) {\\n forEach(b, function assignValue(val, key) {\\n if (thisArg && typeof val === 'function') {\\n a[key] = bind(val, thisArg);\\n } else {\\n a[key] = val;\\n }\\n });\\n return a;\\n}\\n\\nmodule.exports = {\\n isArray: isArray,\\n isArrayBuffer: isArrayBuffer,\\n isBuffer: isBuffer,\\n isFormData: isFormData,\\n isArrayBufferView: isArrayBufferView,\\n isString: isString,\\n isNumber: isNumber,\\n isObject: isObject,\\n isUndefined: isUndefined,\\n isDate: isDate,\\n isFile: isFile,\\n isBlob: isBlob,\\n isFunction: isFunction,\\n isStream: isStream,\\n isURLSearchParams: isURLSearchParams,\\n isStandardBrowserEnv: isStandardBrowserEnv,\\n forEach: forEach,\\n merge: merge,\\n deepMerge: deepMerge,\\n extend: extend,\\n trim: trim\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzPzczODEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsV0FBVyxtQkFBTyxDQUFDLEVBQWdCOztBQUVuQzs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQyxPQUFPO0FBQzFDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTLEdBQUcsU0FBUztBQUM1QywyQkFBMkI7QUFDM0I7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUMsT0FBTztBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsZ0NBQWdDO0FBQ2hDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDLE9BQU87QUFDOUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvYmluZCcpO1xuXG4vKmdsb2JhbCB0b1N0cmluZzp0cnVlKi9cblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbCkgJiYgdmFsLmNvbnN0cnVjdG9yICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwuY29uc3RydWN0b3IpXG4gICAgJiYgdHlwZW9mIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIodmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbCkge1xuICByZXR1cm4gKHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcpICYmICh2YWwgaW5zdGFuY2VvZiBGb3JtRGF0YSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKHZhbC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0ZpbGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZpbGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJsb2JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jsb2IodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEJsb2JdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyZWFtKHZhbCkge1xuICByZXR1cm4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VSTFNlYXJjaFBhcmFtcyh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnICYmIHZhbCBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcztcbn1cblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiB0cmltKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpLnJlcGxhY2UoL1xccyokLywgJycpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqL1xuZnVuY3Rpb24gaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAobmF2aWdhdG9yLnByb2R1Y3QgPT09ICdSZWFjdE5hdGl2ZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05hdGl2ZVNjcmlwdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05TJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4pIHtcbiAgLy8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodHlwZW9mIHJlc3VsdFtrZXldID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZShyZXN1bHRba2V5XSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGVxdWFsIHRvIG1lcmdlIHdpdGggdGhlIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCBubyByZWZlcmVuY2VcbiAqIHRvIG9yaWdpbmFsIG9iamVjdHMgaXMga2VwdC5cbiAqXG4gKiBAc2VlIG1lcmdlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBkZWVwTWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodHlwZW9mIHJlc3VsdFtrZXldID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwTWVyZ2UocmVzdWx0W2tleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwTWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZChhLCBiLCB0aGlzQXJnKSB7XG4gIGZvckVhY2goYiwgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodGhpc0FyZyAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQXJyYXk6IGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXI6IGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YTogaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXc6IGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZzogaXNTdHJpbmcsXG4gIGlzTnVtYmVyOiBpc051bWJlcixcbiAgaXNPYmplY3Q6IGlzT2JqZWN0LFxuICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gIGlzRGF0ZTogaXNEYXRlLFxuICBpc0ZpbGU6IGlzRmlsZSxcbiAgaXNCbG9iOiBpc0Jsb2IsXG4gIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtOiBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXM6IGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1N0YW5kYXJkQnJvd3NlckVudjogaXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIGZvckVhY2g6IGZvckVhY2gsXG4gIG1lcmdlOiBtZXJnZSxcbiAgZGVlcE1lcmdlOiBkZWVwTWVyZ2UsXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0cmltOiB0cmltXG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///1\\n\")},function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval('__webpack_require__.r(__webpack_exports__);\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__DO_NOT_USE__ActionTypes\", function() { return ActionTypes; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"applyMiddleware\", function() { return applyMiddleware; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bindActionCreators\", function() { return bindActionCreators; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"combineReducers\", function() { return combineReducers; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compose\", function() { return compose; });\\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createStore\", function() { return createStore; });\\n/* harmony import */ var symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7);\\n\\n\\n/**\\n * These are private action types reserved by Redux.\\n * For any unknown actions, you must return the current state.\\n * If the current state is undefined, you must return the initial state.\\n * Do not reference these action types directly in your code.\\n */\\nvar randomString = function randomString() {\\n return Math.random().toString(36).substring(7).split(\\'\\').join(\\'.\\');\\n};\\n\\nvar ActionTypes = {\\n INIT: \"@@redux/INIT\" + randomString(),\\n REPLACE: \"@@redux/REPLACE\" + randomString(),\\n PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\\n return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\\n }\\n};\\n\\n/**\\n * @param {any} obj The object to inspect.\\n * @returns {boolean} True if the argument appears to be a plain object.\\n */\\nfunction isPlainObject(obj) {\\n if (typeof obj !== \\'object\\' || obj === null) return false;\\n var proto = obj;\\n\\n while (Object.getPrototypeOf(proto) !== null) {\\n proto = Object.getPrototypeOf(proto);\\n }\\n\\n return Object.getPrototypeOf(obj) === proto;\\n}\\n\\n/**\\n * Creates a Redux store that holds the state tree.\\n * The only way to change the data in the store is to call `dispatch()` on it.\\n *\\n * There should only be a single store in your app. To specify how different\\n * parts of the state tree respond to actions, you may combine several reducers\\n * into a single reducer function by using `combineReducers`.\\n *\\n * @param {Function} reducer A function that returns the next state tree, given\\n * the current state tree and the action to handle.\\n *\\n * @param {any} [preloadedState] The initial state. You may optionally specify it\\n * to hydrate the state from the server in universal apps, or to restore a\\n * previously serialized user session.\\n * If you use `combineReducers` to produce the root reducer function, this must be\\n * an object with the same shape as `combineReducers` keys.\\n *\\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\\n * to enhance the store with third-party capabilities such as middleware,\\n * time travel, persistence, etc. The only store enhancer that ships with Redux\\n * is `applyMiddleware()`.\\n *\\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\\n * and subscribe to changes.\\n */\\n\\nfunction createStore(reducer, preloadedState, enhancer) {\\n var _ref2;\\n\\n if (typeof preloadedState === \\'function\\' && typeof enhancer === \\'function\\' || typeof enhancer === \\'function\\' && typeof arguments[3] === \\'function\\') {\\n throw new Error(\\'It looks like you are passing several store enhancers to \\' + \\'createStore(). This is not supported. Instead, compose them \\' + \\'together to a single function.\\');\\n }\\n\\n if (typeof preloadedState === \\'function\\' && typeof enhancer === \\'undefined\\') {\\n enhancer = preloadedState;\\n preloadedState = undefined;\\n }\\n\\n if (typeof enhancer !== \\'undefined\\') {\\n if (typeof enhancer !== \\'function\\') {\\n throw new Error(\\'Expected the enhancer to be a function.\\');\\n }\\n\\n return enhancer(createStore)(reducer, preloadedState);\\n }\\n\\n if (typeof reducer !== \\'function\\') {\\n throw new Error(\\'Expected the reducer to be a function.\\');\\n }\\n\\n var currentReducer = reducer;\\n var currentState = preloadedState;\\n var currentListeners = [];\\n var nextListeners = currentListeners;\\n var isDispatching = false;\\n /**\\n * This makes a shallow copy of currentListeners so we can use\\n * nextListeners as a temporary list while dispatching.\\n *\\n * This prevents any bugs around consumers calling\\n * subscribe/unsubscribe in the middle of a dispatch.\\n */\\n\\n function ensureCanMutateNextListeners() {\\n if (nextListeners === currentListeners) {\\n nextListeners = currentListeners.slice();\\n }\\n }\\n /**\\n * Reads the state tree managed by the store.\\n *\\n * @returns {any} The current state tree of your application.\\n */\\n\\n\\n function getState() {\\n if (isDispatching) {\\n throw new Error(\\'You may not call store.getState() while the reducer is executing. \\' + \\'The reducer has already received the state as an argument. \\' + \\'Pass it down from the top reducer instead of reading it from the store.\\');\\n }\\n\\n return currentState;\\n }\\n /**\\n * Adds a change listener. It will be called any time an action is dispatched,\\n * and some part of the state tree may potentially have changed. You may then\\n * call `getState()` to read the current state tree inside the callback.\\n *\\n * You may call `dispatch()` from a change listener, with the following\\n * caveats:\\n *\\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\\n * If you subscribe or unsubscribe while the listeners are being invoked, this\\n * will not have any effect on the `dispatch()` that is currently in progress.\\n * However, the next `dispatch()` call, whether nested or not, will use a more\\n * recent snapshot of the subscription list.\\n *\\n * 2. The listener should not expect to see all state changes, as the state\\n * might have been updated multiple times during a nested `dispatch()` before\\n * the listener is called. It is, however, guaranteed that all subscribers\\n * registered before the `dispatch()` started will be called with the latest\\n * state by the time it exits.\\n *\\n * @param {Function} listener A callback to be invoked on every dispatch.\\n * @returns {Function} A function to remove this change listener.\\n */\\n\\n\\n function subscribe(listener) {\\n if (typeof listener !== \\'function\\') {\\n throw new Error(\\'Expected the listener to be a function.\\');\\n }\\n\\n if (isDispatching) {\\n throw new Error(\\'You may not call store.subscribe() while the reducer is executing. \\' + \\'If you would like to be notified after the store has been updated, subscribe from a \\' + \\'component and invoke store.getState() in the callback to access the latest state. \\' + \\'See https://redux.js.org/api-reference/store#subscribelistener for more details.\\');\\n }\\n\\n var isSubscribed = true;\\n ensureCanMutateNextListeners();\\n nextListeners.push(listener);\\n return function unsubscribe() {\\n if (!isSubscribed) {\\n return;\\n }\\n\\n if (isDispatching) {\\n throw new Error(\\'You may not unsubscribe from a store listener while the reducer is executing. \\' + \\'See https://redux.js.org/api-reference/store#subscribelistener for more details.\\');\\n }\\n\\n isSubscribed = false;\\n ensureCanMutateNextListeners();\\n var index = nextListeners.indexOf(listener);\\n nextListeners.splice(index, 1);\\n currentListeners = null;\\n };\\n }\\n /**\\n * Dispatches an action. It is the only way to trigger a state change.\\n *\\n * The `reducer` function, used to create the store, will be called with the\\n * current state tree and the given `action`. Its return value will\\n * be considered the **next** state of the tree, and the change listeners\\n * will be notified.\\n *\\n * The base implementation only supports plain object actions. If you want to\\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\\n * wrap your store creating function into the corresponding middleware. For\\n * example, see the documentation for the `redux-thunk` package. Even the\\n * middleware will eventually dispatch plain object actions using this method.\\n *\\n * @param {Object} action A plain object representing “what changed”. It is\\n * a good idea to keep actions serializable so you can record and replay user\\n * sessions, or use the time travelling `redux-devtools`. An action must have\\n * a `type` property which may not be `undefined`. It is a good idea to use\\n * string constants for action types.\\n *\\n * @returns {Object} For convenience, the same action object you dispatched.\\n *\\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\\n * return something else (for example, a Promise you can await).\\n */\\n\\n\\n function dispatch(action) {\\n if (!isPlainObject(action)) {\\n throw new Error(\\'Actions must be plain objects. \\' + \\'Use custom middleware for async actions.\\');\\n }\\n\\n if (typeof action.type === \\'undefined\\') {\\n throw new Error(\\'Actions may not have an undefined \"type\" property. \\' + \\'Have you misspelled a constant?\\');\\n }\\n\\n if (isDispatching) {\\n throw new Error(\\'Reducers may not dispatch actions.\\');\\n }\\n\\n try {\\n isDispatching = true;\\n currentState = currentReducer(currentState, action);\\n } finally {\\n isDispatching = false;\\n }\\n\\n var listeners = currentListeners = nextListeners;\\n\\n for (var i = 0; i < listeners.length; i++) {\\n var listener = listeners[i];\\n listener();\\n }\\n\\n return action;\\n }\\n /**\\n * Replaces the reducer currently used by the store to calculate the state.\\n *\\n * You might need this if your app implements code splitting and you want to\\n * load some of the reducers dynamically. You might also need this if you\\n * implement a hot reloading mechanism for Redux.\\n *\\n * @param {Function} nextReducer The reducer for the store to use instead.\\n * @returns {void}\\n */\\n\\n\\n function replaceReducer(nextReducer) {\\n if (typeof nextReducer !== \\'function\\') {\\n throw new Error(\\'Expected the nextReducer to be a function.\\');\\n }\\n\\n currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.\\n // Any reducers that existed in both the new and old rootReducer\\n // will receive the previous state. This effectively populates\\n // the new state tree with any relevant data from the old one.\\n\\n dispatch({\\n type: ActionTypes.REPLACE\\n });\\n }\\n /**\\n * Interoperability point for observable/reactive libraries.\\n * @returns {observable} A minimal observable of state changes.\\n * For more information, see the observable proposal:\\n * https://github.com/tc39/proposal-observable\\n */\\n\\n\\n function observable() {\\n var _ref;\\n\\n var outerSubscribe = subscribe;\\n return _ref = {\\n /**\\n * The minimal observable subscription method.\\n * @param {Object} observer Any object that can be used as an observer.\\n * The observer object should have a `next` method.\\n * @returns {subscription} An object with an `unsubscribe` method that can\\n * be used to unsubscribe the observable from the store, and prevent further\\n * emission of values from the observable.\\n */\\n subscribe: function subscribe(observer) {\\n if (typeof observer !== \\'object\\' || observer === null) {\\n throw new TypeError(\\'Expected the observer to be an object.\\');\\n }\\n\\n function observeState() {\\n if (observer.next) {\\n observer.next(getState());\\n }\\n }\\n\\n observeState();\\n var unsubscribe = outerSubscribe(observeState);\\n return {\\n unsubscribe: unsubscribe\\n };\\n }\\n }, _ref[symbol_observable__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"]] = function () {\\n return this;\\n }, _ref;\\n } // When a store is created, an \"INIT\" action is dispatched so that every\\n // reducer returns their initial state. This effectively populates\\n // the initial state tree.\\n\\n\\n dispatch({\\n type: ActionTypes.INIT\\n });\\n return _ref2 = {\\n dispatch: dispatch,\\n subscribe: subscribe,\\n getState: getState,\\n replaceReducer: replaceReducer\\n }, _ref2[symbol_observable__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"]] = observable, _ref2;\\n}\\n\\n/**\\n * Prints a warning in the console if it exists.\\n *\\n * @param {String} message The warning message.\\n * @returns {void}\\n */\\nfunction warning(message) {\\n /* eslint-disable no-console */\\n if (typeof console !== \\'undefined\\' && typeof console.error === \\'function\\') {\\n console.error(message);\\n }\\n /* eslint-enable no-console */\\n\\n\\n try {\\n // This error was thrown as a convenience so that if you enable\\n // \"break on all exceptions\" in your console,\\n // it would pause the execution at this line.\\n throw new Error(message);\\n } catch (e) {} // eslint-disable-line no-empty\\n\\n}\\n\\nfunction getUndefinedStateErrorMessage(key, action) {\\n var actionType = action && action.type;\\n var actionDescription = actionType && \"action \\\\\"\" + String(actionType) + \"\\\\\"\" || \\'an action\\';\\n return \"Given \" + actionDescription + \", reducer \\\\\"\" + key + \"\\\\\" returned undefined. \" + \"To ignore an action, you must explicitly return the previous state. \" + \"If you want this reducer to hold no value, you can return null instead of undefined.\";\\n}\\n\\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\\n var reducerKeys = Object.keys(reducers);\\n var argumentName = action && action.type === ActionTypes.INIT ? \\'preloadedState argument passed to createStore\\' : \\'previous state received by the reducer\\';\\n\\n if (reducerKeys.length === 0) {\\n return \\'Store does not have a valid reducer. Make sure the argument passed \\' + \\'to combineReducers is an object whose values are reducers.\\';\\n }\\n\\n if (!isPlainObject(inputState)) {\\n return \"The \" + argumentName + \" has unexpected type of \\\\\"\" + {}.toString.call(inputState).match(/\\\\s([a-z|A-Z]+)/)[1] + \"\\\\\". Expected argument to be an object with the following \" + (\"keys: \\\\\"\" + reducerKeys.join(\\'\", \"\\') + \"\\\\\"\");\\n }\\n\\n var unexpectedKeys = Object.keys(inputState).filter(function (key) {\\n return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\\n });\\n unexpectedKeys.forEach(function (key) {\\n unexpectedKeyCache[key] = true;\\n });\\n if (action && action.type === ActionTypes.REPLACE) return;\\n\\n if (unexpectedKeys.length > 0) {\\n return \"Unexpected \" + (unexpectedKeys.length > 1 ? \\'keys\\' : \\'key\\') + \" \" + (\"\\\\\"\" + unexpectedKeys.join(\\'\", \"\\') + \"\\\\\" found in \" + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + (\"\\\\\"\" + reducerKeys.join(\\'\", \"\\') + \"\\\\\". Unexpected keys will be ignored.\");\\n }\\n}\\n\\nfunction assertReducerShape(reducers) {\\n Object.keys(reducers).forEach(function (key) {\\n var reducer = reducers[key];\\n var initialState = reducer(undefined, {\\n type: ActionTypes.INIT\\n });\\n\\n if (typeof initialState === \\'undefined\\') {\\n throw new Error(\"Reducer \\\\\"\" + key + \"\\\\\" returned undefined during initialization. \" + \"If the state passed to the reducer is undefined, you must \" + \"explicitly return the initial state. The initial state may \" + \"not be undefined. If you don\\'t want to set a value for this reducer, \" + \"you can use null instead of undefined.\");\\n }\\n\\n if (typeof reducer(undefined, {\\n type: ActionTypes.PROBE_UNKNOWN_ACTION()\\n }) === \\'undefined\\') {\\n throw new Error(\"Reducer \\\\\"\" + key + \"\\\\\" returned undefined when probed with a random type. \" + (\"Don\\'t try to handle \" + ActionTypes.INIT + \" or other actions in \\\\\"redux/*\\\\\" \") + \"namespace. They are considered private. Instead, you must return the \" + \"current state for any unknown actions, unless it is undefined, \" + \"in which case you must return the initial state, regardless of the \" + \"action type. The initial state may not be undefined, but can be null.\");\\n }\\n });\\n}\\n/**\\n * Turns an object whose values are different reducer functions, into a single\\n * reducer function. It will call every child reducer, and gather their results\\n * into a single state object, whose keys correspond to the keys of the passed\\n * reducer functions.\\n *\\n * @param {Object} reducers An object whose values correspond to different\\n * reducer functions that need to be combined into one. One handy way to obtain\\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\\n * undefined for any action. Instead, they should return their initial state\\n * if the state passed to them was undefined, and the current state for any\\n * unrecognized action.\\n *\\n * @returns {Function} A reducer function that invokes every reducer inside the\\n * passed object, and builds a state object with the same shape.\\n */\\n\\n\\nfunction combineReducers(reducers) {\\n var reducerKeys = Object.keys(reducers);\\n var finalReducers = {};\\n\\n for (var i = 0; i < reducerKeys.length; i++) {\\n var key = reducerKeys[i];\\n\\n if (false) {}\\n\\n if (typeof reducers[key] === \\'function\\') {\\n finalReducers[key] = reducers[key];\\n }\\n }\\n\\n var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don\\'t warn about the same\\n // keys multiple times.\\n\\n var unexpectedKeyCache;\\n\\n if (false) {}\\n\\n var shapeAssertionError;\\n\\n try {\\n assertReducerShape(finalReducers);\\n } catch (e) {\\n shapeAssertionError = e;\\n }\\n\\n return function combination(state, action) {\\n if (state === void 0) {\\n state = {};\\n }\\n\\n if (shapeAssertionError) {\\n throw shapeAssertionError;\\n }\\n\\n if (false) { var warningMessage; }\\n\\n var hasChanged = false;\\n var nextState = {};\\n\\n for (var _i = 0; _i < finalReducerKeys.length; _i++) {\\n var _key = finalReducerKeys[_i];\\n var reducer = finalReducers[_key];\\n var previousStateForKey = state[_key];\\n var nextStateForKey = reducer(previousStateForKey, action);\\n\\n if (typeof nextStateForKey === \\'undefined\\') {\\n var errorMessage = getUndefinedStateErrorMessage(_key, action);\\n throw new Error(errorMessage);\\n }\\n\\n nextState[_key] = nextStateForKey;\\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\\n }\\n\\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\\n return hasChanged ? nextState : state;\\n };\\n}\\n\\nfunction bindActionCreator(actionCreator, dispatch) {\\n return function () {\\n return dispatch(actionCreator.apply(this, arguments));\\n };\\n}\\n/**\\n * Turns an object whose values are action creators, into an object with the\\n * same keys, but with every function wrapped into a `dispatch` call so they\\n * may be invoked directly. This is just a convenience method, as you can call\\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\\n *\\n * For convenience, you can also pass an action creator as the first argument,\\n * and get a dispatch wrapped function in return.\\n *\\n * @param {Function|Object} actionCreators An object whose values are action\\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\\n * syntax. You may also pass a single function.\\n *\\n * @param {Function} dispatch The `dispatch` function available on your Redux\\n * store.\\n *\\n * @returns {Function|Object} The object mimicking the original object, but with\\n * every action creator wrapped into the `dispatch` call. If you passed a\\n * function as `actionCreators`, the return value will also be a single\\n * function.\\n */\\n\\n\\nfunction bindActionCreators(actionCreators, dispatch) {\\n if (typeof actionCreators === \\'function\\') {\\n return bindActionCreator(actionCreators, dispatch);\\n }\\n\\n if (typeof actionCreators !== \\'object\\' || actionCreators === null) {\\n throw new Error(\"bindActionCreators expected an object or a function, instead received \" + (actionCreators === null ? \\'null\\' : typeof actionCreators) + \". \" + \"Did you write \\\\\"import ActionCreators from\\\\\" instead of \\\\\"import * as ActionCreators from\\\\\"?\");\\n }\\n\\n var boundActionCreators = {};\\n\\n for (var key in actionCreators) {\\n var actionCreator = actionCreators[key];\\n\\n if (typeof actionCreator === \\'function\\') {\\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\\n }\\n }\\n\\n return boundActionCreators;\\n}\\n\\nfunction _defineProperty(obj, key, value) {\\n if (key in obj) {\\n Object.defineProperty(obj, key, {\\n value: value,\\n enumerable: true,\\n configurable: true,\\n writable: true\\n });\\n } else {\\n obj[key] = value;\\n }\\n\\n return obj;\\n}\\n\\nfunction ownKeys(object, enumerableOnly) {\\n var keys = Object.keys(object);\\n\\n if (Object.getOwnPropertySymbols) {\\n keys.push.apply(keys, Object.getOwnPropertySymbols(object));\\n }\\n\\n if (enumerableOnly) keys = keys.filter(function (sym) {\\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\\n });\\n return keys;\\n}\\n\\nfunction _objectSpread2(target) {\\n for (var i = 1; i < arguments.length; i++) {\\n var source = arguments[i] != null ? arguments[i] : {};\\n\\n if (i % 2) {\\n ownKeys(source, true).forEach(function (key) {\\n _defineProperty(target, key, source[key]);\\n });\\n } else if (Object.getOwnPropertyDescriptors) {\\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\\n } else {\\n ownKeys(source).forEach(function (key) {\\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\\n });\\n }\\n }\\n\\n return target;\\n}\\n\\n/**\\n * Composes single-argument functions from right to left. The rightmost\\n * function can take multiple arguments as it provides the signature for\\n * the resulting composite function.\\n *\\n * @param {...Function} funcs The functions to compose.\\n * @returns {Function} A function obtained by composing the argument functions\\n * from right to left. For example, compose(f, g, h) is identical to doing\\n * (...args) => f(g(h(...args))).\\n */\\nfunction compose() {\\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\\n funcs[_key] = arguments[_key];\\n }\\n\\n if (funcs.length === 0) {\\n return function (arg) {\\n return arg;\\n };\\n }\\n\\n if (funcs.length === 1) {\\n return funcs[0];\\n }\\n\\n return funcs.reduce(function (a, b) {\\n return function () {\\n return a(b.apply(void 0, arguments));\\n };\\n });\\n}\\n\\n/**\\n * Creates a store enhancer that applies middleware to the dispatch method\\n * of the Redux store. This is handy for a variety of tasks, such as expressing\\n * asynchronous actions in a concise manner, or logging every action payload.\\n *\\n * See `redux-thunk` package as an example of the Redux middleware.\\n *\\n * Because middleware is potentially asynchronous, this should be the first\\n * store enhancer in the composition chain.\\n *\\n * Note that each middleware will be given the `dispatch` and `getState` functions\\n * as named arguments.\\n *\\n * @param {...Function} middlewares The middleware chain to be applied.\\n * @returns {Function} A store enhancer applying the middleware.\\n */\\n\\nfunction applyMiddleware() {\\n for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\\n middlewares[_key] = arguments[_key];\\n }\\n\\n return function (createStore) {\\n return function () {\\n var store = createStore.apply(void 0, arguments);\\n\\n var _dispatch = function dispatch() {\\n throw new Error(\\'Dispatching while constructing your middleware is not allowed. \\' + \\'Other middleware would not be applied to this dispatch.\\');\\n };\\n\\n var middlewareAPI = {\\n getState: store.getState,\\n dispatch: function dispatch() {\\n return _dispatch.apply(void 0, arguments);\\n }\\n };\\n var chain = middlewares.map(function (middleware) {\\n return middleware(middlewareAPI);\\n });\\n _dispatch = compose.apply(void 0, chain)(store.dispatch);\\n return _objectSpread2({}, store, {\\n dispatch: _dispatch\\n });\\n };\\n };\\n}\\n\\n/*\\n * This is a dummy function to check if the function name has been altered by minification.\\n * If the function has been minified and NODE_ENV !== \\'production\\', warn the user.\\n */\\n\\nfunction isCrushed() {}\\n\\nif (false) {}\\n\\n\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgvZXMvcmVkdXguanM/OWZhYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTZDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLElBQUk7QUFDZixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0EsV0FBVyxJQUFJO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxJQUFJO0FBQ25COzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixlQUFlLFNBQVM7QUFDeEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FB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QUksS0FBNkcsRUFBRSxFQUVsSDs7QUFFK0giLCJmaWxlIjoiMi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAkJG9ic2VydmFibGUgZnJvbSAnc3ltYm9sLW9ic2VydmFibGUnO1xuXG4vKipcbiAqIFRoZXNlIGFyZSBwcml2YXRlIGFjdGlvbiB0eXBlcyByZXNlcnZlZCBieSBSZWR1eC5cbiAqIEZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB5b3UgbXVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAqIERvIG5vdCByZWZlcmVuY2UgdGhlc2UgYWN0aW9uIHR5cGVzIGRpcmVjdGx5IGluIHlvdXIgY29kZS5cbiAqL1xudmFyIHJhbmRvbVN0cmluZyA9IGZ1bmN0aW9uIHJhbmRvbVN0cmluZygpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KS5zcGxpdCgnJykuam9pbignLicpO1xufTtcblxudmFyIEFjdGlvblR5cGVzID0ge1xuICBJTklUOiBcIkBAcmVkdXgvSU5JVFwiICsgcmFuZG9tU3RyaW5nKCksXG4gIFJFUExBQ0U6IFwiQEByZWR1eC9SRVBMQUNFXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUFJPQkVfVU5LTk9XTl9BQ1RJT046IGZ1bmN0aW9uIFBST0JFX1VOS05PV05fQUNUSU9OKCkge1xuICAgIHJldHVybiBcIkBAcmVkdXgvUFJPQkVfVU5LTk9XTl9BQ1RJT05cIiArIHJhbmRvbVN0cmluZygpO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFyZ3VtZW50IGFwcGVhcnMgdG8gYmUgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgdmFyIHByb3RvID0gb2JqO1xuXG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90bztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqIFRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHN0b3JlIGlzIHRvIGNhbGwgYGRpc3BhdGNoKClgIG9uIGl0LlxuICpcbiAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHN0b3JlIGluIHlvdXIgYXBwLiBUbyBzcGVjaWZ5IGhvdyBkaWZmZXJlbnRcbiAqIHBhcnRzIG9mIHRoZSBzdGF0ZSB0cmVlIHJlc3BvbmQgdG8gYWN0aW9ucywgeW91IG1heSBjb21iaW5lIHNldmVyYWwgcmVkdWNlcnNcbiAqIGludG8gYSBzaW5nbGUgcmVkdWNlciBmdW5jdGlvbiBieSB1c2luZyBgY29tYmluZVJlZHVjZXJzYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlIHRyZWUsIGdpdmVuXG4gKiB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgYWN0aW9uIHRvIGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gW3ByZWxvYWRlZFN0YXRlXSBUaGUgaW5pdGlhbCBzdGF0ZS4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGh5ZHJhdGUgdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlciBpbiB1bml2ZXJzYWwgYXBwcywgb3IgdG8gcmVzdG9yZSBhXG4gKiBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdXNlciBzZXNzaW9uLlxuICogSWYgeW91IHVzZSBgY29tYmluZVJlZHVjZXJzYCB0byBwcm9kdWNlIHRoZSByb290IHJlZHVjZXIgZnVuY3Rpb24sIHRoaXMgbXVzdCBiZVxuICogYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGNvbWJpbmVSZWR1Y2Vyc2Aga2V5cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZW5oYW5jZXJdIFRoZSBzdG9yZSBlbmhhbmNlci4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGVuaGFuY2UgdGhlIHN0b3JlIHdpdGggdGhpcmQtcGFydHkgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgbWlkZGxld2FyZSxcbiAqIHRpbWUgdHJhdmVsLCBwZXJzaXN0ZW5jZSwgZXRjLiBUaGUgb25seSBzdG9yZSBlbmhhbmNlciB0aGF0IHNoaXBzIHdpdGggUmVkdXhcbiAqIGlzIGBhcHBseU1pZGRsZXdhcmUoKWAuXG4gKlxuICogQHJldHVybnMge1N0b3JlfSBBIFJlZHV4IHN0b3JlIHRoYXQgbGV0cyB5b3UgcmVhZCB0aGUgc3RhdGUsIGRpc3BhdGNoIGFjdGlvbnNcbiAqIGFuZCBzdWJzY3JpYmUgdG8gY2hhbmdlcy5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgdmFyIF9yZWYyO1xuXG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVuaGFuY2VyID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJdCBsb29rcyBsaWtlIHlvdSBhcmUgcGFzc2luZyBzZXZlcmFsIHN0b3JlIGVuaGFuY2VycyB0byAnICsgJ2NyZWF0ZVN0b3JlKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgY29tcG9zZSB0aGVtICcgKyAndG9nZXRoZXIgdG8gYSBzaW5nbGUgZnVuY3Rpb24uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICB2YXIgY3VycmVudExpc3RlbmVycyA9IFtdO1xuICB2YXIgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIHZhciBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGlzIG1ha2VzIGEgc2hhbGxvdyBjb3B5IG9mIGN1cnJlbnRMaXN0ZW5lcnMgc28gd2UgY2FuIHVzZVxuICAgKiBuZXh0TGlzdGVuZXJzIGFzIGEgdGVtcG9yYXJ5IGxpc3Qgd2hpbGUgZGlzcGF0Y2hpbmcuXG4gICAqXG4gICAqIFRoaXMgcHJldmVudHMgYW55IGJ1Z3MgYXJvdW5kIGNvbnN1bWVycyBjYWxsaW5nXG4gICAqIHN1YnNjcmliZS91bnN1YnNjcmliZSBpbiB0aGUgbWlkZGxlIG9mIGEgZGlzcGF0Y2guXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKG5leHRMaXN0ZW5lcnMgPT09IGN1cnJlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgc3RhdGUgdHJlZSBtYW5hZ2VkIGJ5IHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHJldHVybnMge2FueX0gVGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnVGhlIHJlZHVjZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHN0YXRlIGFzIGFuIGFyZ3VtZW50LiAnICsgJ1Bhc3MgaXQgZG93biBmcm9tIHRoZSB0b3AgcmVkdWNlciBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSB0aGUgc3RvcmUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGNoYW5nZSBsaXN0ZW5lci4gSXQgd2lsbCBiZSBjYWxsZWQgYW55IHRpbWUgYW4gYWN0aW9uIGlzIGRpc3BhdGNoZWQsXG4gICAqIGFuZCBzb21lIHBhcnQgb2YgdGhlIHN0YXRlIHRyZWUgbWF5IHBvdGVudGlhbGx5IGhhdmUgY2hhbmdlZC4gWW91IG1heSB0aGVuXG4gICAqIGNhbGwgYGdldFN0YXRlKClgIHRvIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBZb3UgbWF5IGNhbGwgYGRpc3BhdGNoKClgIGZyb20gYSBjaGFuZ2UgbGlzdGVuZXIsIHdpdGggdGhlIGZvbGxvd2luZ1xuICAgKiBjYXZlYXRzOlxuICAgKlxuICAgKiAxLiBUaGUgc3Vic2NyaXB0aW9ucyBhcmUgc25hcHNob3R0ZWQganVzdCBiZWZvcmUgZXZlcnkgYGRpc3BhdGNoKClgIGNhbGwuXG4gICAqIElmIHlvdSBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgd2hpbGUgdGhlIGxpc3RlbmVycyBhcmUgYmVpbmcgaW52b2tlZCwgdGhpc1xuICAgKiB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3Qgb24gdGhlIGBkaXNwYXRjaCgpYCB0aGF0IGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcy5cbiAgICogSG93ZXZlciwgdGhlIG5leHQgYGRpc3BhdGNoKClgIGNhbGwsIHdoZXRoZXIgbmVzdGVkIG9yIG5vdCwgd2lsbCB1c2UgYSBtb3JlXG4gICAqIHJlY2VudCBzbmFwc2hvdCBvZiB0aGUgc3Vic2NyaXB0aW9uIGxpc3QuXG4gICAqXG4gICAqIDIuIFRoZSBsaXN0ZW5lciBzaG91bGQgbm90IGV4cGVjdCB0byBzZWUgYWxsIHN0YXRlIGNoYW5nZXMsIGFzIHRoZSBzdGF0ZVxuICAgKiBtaWdodCBoYXZlIGJlZW4gdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYSBuZXN0ZWQgYGRpc3BhdGNoKClgIGJlZm9yZVxuICAgKiB0aGUgbGlzdGVuZXIgaXMgY2FsbGVkLiBJdCBpcywgaG93ZXZlciwgZ3VhcmFudGVlZCB0aGF0IGFsbCBzdWJzY3JpYmVyc1xuICAgKiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgYGRpc3BhdGNoKClgIHN0YXJ0ZWQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbGF0ZXN0XG4gICAqIHN0YXRlIGJ5IHRoZSB0aW1lIGl0IGV4aXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBBIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgb24gZXZlcnkgZGlzcGF0Y2guXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0byByZW1vdmUgdGhpcyBjaGFuZ2UgbGlzdGVuZXIuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGktcmVmZXJlbmNlL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgfVxuXG4gICAgdmFyIGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgIG5leHRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS1yZWZlcmVuY2Uvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICAgIH1cblxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgICB2YXIgaW5kZXggPSBuZXh0TGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgbmV4dExpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgY3VycmVudExpc3RlbmVycyA9IG51bGw7XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24uIEl0IGlzIHRoZSBvbmx5IHdheSB0byB0cmlnZ2VyIGEgc3RhdGUgY2hhbmdlLlxuICAgKlxuICAgKiBUaGUgYHJlZHVjZXJgIGZ1bmN0aW9uLCB1c2VkIHRvIGNyZWF0ZSB0aGUgc3RvcmUsIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlXG4gICAqIGN1cnJlbnQgc3RhdGUgdHJlZSBhbmQgdGhlIGdpdmVuIGBhY3Rpb25gLiBJdHMgcmV0dXJuIHZhbHVlIHdpbGxcbiAgICogYmUgY29uc2lkZXJlZCB0aGUgKipuZXh0Kiogc3RhdGUgb2YgdGhlIHRyZWUsIGFuZCB0aGUgY2hhbmdlIGxpc3RlbmVyc1xuICAgKiB3aWxsIGJlIG5vdGlmaWVkLlxuICAgKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHBsYWluIG9iamVjdCBhY3Rpb25zLiBJZiB5b3Ugd2FudCB0b1xuICAgKiBkaXNwYXRjaCBhIFByb21pc2UsIGFuIE9ic2VydmFibGUsIGEgdGh1bmssIG9yIHNvbWV0aGluZyBlbHNlLCB5b3UgbmVlZCB0b1xuICAgKiB3cmFwIHlvdXIgc3RvcmUgY3JlYXRpbmcgZnVuY3Rpb24gaW50byB0aGUgY29ycmVzcG9uZGluZyBtaWRkbGV3YXJlLiBGb3JcbiAgICogZXhhbXBsZSwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYHJlZHV4LXRodW5rYCBwYWNrYWdlLiBFdmVuIHRoZVxuICAgKiBtaWRkbGV3YXJlIHdpbGwgZXZlbnR1YWxseSBkaXNwYXRjaCBwbGFpbiBvYmplY3QgYWN0aW9ucyB1c2luZyB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbiBBIHBsYWluIG9iamVjdCByZXByZXNlbnRpbmcg4oCcd2hhdCBjaGFuZ2Vk4oCdLiBJdCBpc1xuICAgKiBhIGdvb2QgaWRlYSB0byBrZWVwIGFjdGlvbnMgc2VyaWFsaXphYmxlIHNvIHlvdSBjYW4gcmVjb3JkIGFuZCByZXBsYXkgdXNlclxuICAgKiBzZXNzaW9ucywgb3IgdXNlIHRoZSB0aW1lIHRyYXZlbGxpbmcgYHJlZHV4LWRldnRvb2xzYC4gQW4gYWN0aW9uIG11c3QgaGF2ZVxuICAgKiBhIGB0eXBlYCBwcm9wZXJ0eSB3aGljaCBtYXkgbm90IGJlIGB1bmRlZmluZWRgLiBJdCBpcyBhIGdvb2QgaWRlYSB0byB1c2VcbiAgICogc3RyaW5nIGNvbnN0YW50cyBmb3IgYWN0aW9uIHR5cGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGb3IgY29udmVuaWVuY2UsIHRoZSBzYW1lIGFjdGlvbiBvYmplY3QgeW91IGRpc3BhdGNoZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCwgaWYgeW91IHVzZSBhIGN1c3RvbSBtaWRkbGV3YXJlLCBpdCBtYXkgd3JhcCBgZGlzcGF0Y2goKWAgdG9cbiAgICogcmV0dXJuIHNvbWV0aGluZyBlbHNlIChmb3IgZXhhbXBsZSwgYSBQcm9taXNlIHlvdSBjYW4gYXdhaXQpLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiAnICsgJ1VzZSBjdXN0b20gbWlkZGxld2FyZSBmb3IgYXN5bmMgYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25zIG1heSBub3QgaGF2ZSBhbiB1bmRlZmluZWQgXCJ0eXBlXCIgcHJvcGVydHkuICcgKyAnSGF2ZSB5b3UgbWlzc3BlbGxlZCBhIGNvbnN0YW50PycpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7IC8vIFRoaXMgYWN0aW9uIGhhcyBhIHNpbWlsaWFyIGVmZmVjdCB0byBBY3Rpb25UeXBlcy5JTklULlxuICAgIC8vIEFueSByZWR1Y2VycyB0aGF0IGV4aXN0ZWQgaW4gYm90aCB0aGUgbmV3IGFuZCBvbGQgcm9vdFJlZHVjZXJcbiAgICAvLyB3aWxsIHJlY2VpdmUgdGhlIHByZXZpb3VzIHN0YXRlLiBUaGlzIGVmZmVjdGl2ZWx5IHBvcHVsYXRlc1xuICAgIC8vIHRoZSBuZXcgc3RhdGUgdHJlZSB3aXRoIGFueSByZWxldmFudCBkYXRhIGZyb20gdGhlIG9sZCBvbmUuXG5cbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRVBMQUNFXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEludGVyb3BlcmFiaWxpdHkgcG9pbnQgZm9yIG9ic2VydmFibGUvcmVhY3RpdmUgbGlicmFyaWVzLlxuICAgKiBAcmV0dXJucyB7b2JzZXJ2YWJsZX0gQSBtaW5pbWFsIG9ic2VydmFibGUgb2Ygc3RhdGUgY2hhbmdlcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgb2JzZXJ2YWJsZSBwcm9wb3NhbDpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIG9ic2VydmFibGUoKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgb3V0ZXJTdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4gICAgcmV0dXJuIF9yZWYgPSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBtaW5pbWFsIG9ic2VydmFibGUgc3Vic2NyaXB0aW9uIG1ldGhvZC5cbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYnNlcnZlciBBbnkgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gb2JzZXJ2ZXIuXG4gICAgICAgKiBUaGUgb2JzZXJ2ZXIgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5leHRgIG1ldGhvZC5cbiAgICAgICAqIEByZXR1cm5zIHtzdWJzY3JpcHRpb259IEFuIG9iamVjdCB3aXRoIGFuIGB1bnN1YnNjcmliZWAgbWV0aG9kIHRoYXQgY2FuXG4gICAgICAgKiBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIGZyb20gdGhlIHN0b3JlLCBhbmQgcHJldmVudCBmdXJ0aGVyXG4gICAgICAgKiBlbWlzc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgb2JzZXJ2YWJsZS5cbiAgICAgICAqL1xuICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciAhPT0gJ29iamVjdCcgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGlmIChvYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICB2YXIgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVuc3Vic2NyaWJlOiB1bnN1YnNjcmliZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIF9yZWZbJCRvYnNlcnZhYmxlXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIF9yZWY7XG4gIH0gLy8gV2hlbiBhIHN0b3JlIGlzIGNyZWF0ZWQsIGFuIFwiSU5JVFwiIGFjdGlvbiBpcyBkaXNwYXRjaGVkIHNvIHRoYXQgZXZlcnlcbiAgLy8gcmVkdWNlciByZXR1cm5zIHRoZWlyIGluaXRpYWwgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gIC8vIHRoZSBpbml0aWFsIHN0YXRlIHRyZWUuXG5cblxuICBkaXNwYXRjaCh7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuSU5JVFxuICB9KTtcbiAgcmV0dXJuIF9yZWYyID0ge1xuICAgIGRpc3BhdGNoOiBkaXNwYXRjaCxcbiAgICBzdWJzY3JpYmU6IHN1YnNjcmliZSxcbiAgICBnZXRTdGF0ZTogZ2V0U3RhdGUsXG4gICAgcmVwbGFjZVJlZHVjZXI6IHJlcGxhY2VSZWR1Y2VyXG4gIH0sIF9yZWYyWyQkb2JzZXJ2YWJsZV0gPSBvYnNlcnZhYmxlLCBfcmVmMjtcbn1cblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG59XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZFN0YXRlRXJyb3JNZXNzYWdlKGtleSwgYWN0aW9uKSB7XG4gIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICB2YXIgYWN0aW9uRGVzY3JpcHRpb24gPSBhY3Rpb25UeXBlICYmIFwiYWN0aW9uIFxcXCJcIiArIFN0cmluZyhhY3Rpb25UeXBlKSArIFwiXFxcIlwiIHx8ICdhbiBhY3Rpb24nO1xuICByZXR1cm4gXCJHaXZlbiBcIiArIGFjdGlvbkRlc2NyaXB0aW9uICsgXCIsIHJlZHVjZXIgXFxcIlwiICsga2V5ICsgXCJcXFwiIHJldHVybmVkIHVuZGVmaW5lZC4gXCIgKyBcIlRvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gXCIgKyBcIklmIHlvdSB3YW50IHRoaXMgcmVkdWNlciB0byBob2xkIG5vIHZhbHVlLCB5b3UgY2FuIHJldHVybiBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLlwiO1xufVxuXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVzLklOSVQgPyAncHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlJyA6ICdwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlcic7XG5cbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkICcgKyAndG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLic7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gXCJUaGUgXCIgKyBhcmd1bWVudE5hbWUgKyBcIiBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFxcXCJcIiArIHt9LnRvU3RyaW5nLmNhbGwoaW5wdXRTdGF0ZSkubWF0Y2goL1xccyhbYS16fEEtWl0rKS8pWzFdICsgXCJcXFwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIFwiICsgKFwia2V5czogXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCJcIik7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gXCJVbmV4cGVjdGVkIFwiICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyBcIiBcIiArIChcIlxcXCJcIiArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiIGZvdW5kIGluIFwiICsgYXJndW1lbnROYW1lICsgXCIuIFwiKSArIFwiRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiArIChcIlxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVkdWNlciBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gXCIgKyBcIklmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBcIiArIFwiZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBcIiArIFwibm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgXCIgKyBcInlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlBST0JFX1VOS05PV05fQUNUSU9OKClcbiAgICB9KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlZHVjZXIgXFxcIlwiICsga2V5ICsgXCJcXFwiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIHByb2JlZCB3aXRoIGEgcmFuZG9tIHR5cGUuIFwiICsgKFwiRG9uJ3QgdHJ5IHRvIGhhbmRsZSBcIiArIEFjdGlvblR5cGVzLklOSVQgKyBcIiBvciBvdGhlciBhY3Rpb25zIGluIFxcXCJyZWR1eC8qXFxcIiBcIikgKyBcIm5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIFwiICsgXCJjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBcIiArIFwiaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIFwiICsgXCJhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5cIik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoXCJObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOyAvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIHNhbWVcbiAgLy8ga2V5cyBtdWx0aXBsZSB0aW1lcy5cblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2hhcGVBc3NlcnRpb25FcnJvcjtcblxuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuXG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSBnZXRVbmRlZmluZWRTdGF0ZUVycm9yTWVzc2FnZShfa2V5LCBhY3Rpb24pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgbmV4dFN0YXRlW19rZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cblxuICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzdGF0ZSkubGVuZ3RoO1xuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvbiBjcmVhdG9ycywgaW50byBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIHNhbWUga2V5cywgYnV0IHdpdGggZXZlcnkgZnVuY3Rpb24gd3JhcHBlZCBpbnRvIGEgYGRpc3BhdGNoYCBjYWxsIHNvIHRoZXlcbiAqIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5LiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QsIGFzIHlvdSBjYW4gY2FsbFxuICogYHN0b3JlLmRpc3BhdGNoKE15QWN0aW9uQ3JlYXRvcnMuZG9Tb21ldGhpbmcoKSlgIHlvdXJzZWxmIGp1c3QgZmluZS5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGFuIGFjdGlvbiBjcmVhdG9yIGFzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCBnZXQgYSBkaXNwYXRjaCB3cmFwcGVkIGZ1bmN0aW9uIGluIHJldHVybi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gYWN0aW9uQ3JlYXRvcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uXG4gKiBjcmVhdG9yIGZ1bmN0aW9ucy4gT25lIGhhbmR5IHdheSB0byBvYnRhaW4gaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXNgXG4gKiBzeW50YXguIFlvdSBtYXkgYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3BhdGNoIFRoZSBgZGlzcGF0Y2hgIGZ1bmN0aW9uIGF2YWlsYWJsZSBvbiB5b3VyIFJlZHV4XG4gKiBzdG9yZS5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBUaGUgb2JqZWN0IG1pbWlja2luZyB0aGUgb3JpZ2luYWwgb2JqZWN0LCBidXQgd2l0aFxuICogZXZlcnkgYWN0aW9uIGNyZWF0b3Igd3JhcHBlZCBpbnRvIHRoZSBgZGlzcGF0Y2hgIGNhbGwuIElmIHlvdSBwYXNzZWQgYVxuICogZnVuY3Rpb24gYXMgYGFjdGlvbkNyZWF0b3JzYCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsc28gYmUgYSBzaW5nbGVcbiAqIGZ1bmN0aW9uLlxuICovXG5cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzICE9PSAnb2JqZWN0JyB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImJpbmRBY3Rpb25DcmVhdG9ycyBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgaW5zdGVhZCByZWNlaXZlZCBcIiArIChhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhY3Rpb25DcmVhdG9ycykgKyBcIi4gXCIgKyBcIkRpZCB5b3Ugd3JpdGUgXFxcImltcG9ydCBBY3Rpb25DcmVhdG9ycyBmcm9tXFxcIiBpbnN0ZWFkIG9mIFxcXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXFxcIj9cIik7XG4gIH1cblxuICB2YXIgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCkpO1xuICB9XG5cbiAgaWYgKGVudW1lcmFibGVPbmx5KSBrZXlzID0ga2V5cy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICB9KTtcbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKHNvdXJjZSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuXG4gICAgICB2YXIgX2Rpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gJyArICdPdGhlciBtaWRkbGV3YXJlIHdvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZGlzcGF0Y2guJyk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgICBkaXNwYXRjaDogZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaC5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgY2hhaW4gPSBtaWRkbGV3YXJlcy5tYXAoZnVuY3Rpb24gKG1pZGRsZXdhcmUpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmUobWlkZGxld2FyZUFQSSk7XG4gICAgICB9KTtcbiAgICAgIF9kaXNwYXRjaCA9IGNvbXBvc2UuYXBwbHkodm9pZCAwLCBjaGFpbikoc3RvcmUuZGlzcGF0Y2gpO1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQyKHt9LCBzdG9yZSwge1xuICAgICAgICBkaXNwYXRjaDogX2Rpc3BhdGNoXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xufVxuXG4vKlxuICogVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiBuYW1lIGhhcyBiZWVuIGFsdGVyZWQgYnkgbWluaWZpY2F0aW9uLlxuICogSWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIG1pbmlmaWVkIGFuZCBOT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nLCB3YXJuIHRoZSB1c2VyLlxuICovXG5cbmZ1bmN0aW9uIGlzQ3J1c2hlZCgpIHt9XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBpc0NydXNoZWQubmFtZSA9PT0gJ3N0cmluZycgJiYgaXNDcnVzaGVkLm5hbWUgIT09ICdpc0NydXNoZWQnKSB7XG4gIHdhcm5pbmcoJ1lvdSBhcmUgY3VycmVudGx5IHVzaW5nIG1pbmlmaWVkIGNvZGUgb3V0c2lkZSBvZiBOT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIuICcgKyAnVGhpcyBtZWFucyB0aGF0IHlvdSBhcmUgcnVubmluZyBhIHNsb3dlciBkZXZlbG9wbWVudCBidWlsZCBvZiBSZWR1eC4gJyArICdZb3UgY2FuIHVzZSBsb29zZS1lbnZpZnkgKGh0dHBzOi8vZ2l0aHViLmNvbS96ZXJ0b3NoL2xvb3NlLWVudmlmeSkgZm9yIGJyb3dzZXJpZnkgJyArICdvciBzZXR0aW5nIG1vZGUgdG8gcHJvZHVjdGlvbiBpbiB3ZWJwYWNrIChodHRwczovL3dlYnBhY2suanMub3JnL2NvbmNlcHRzL21vZGUvKSAnICsgJ3RvIGVuc3VyZSB5b3UgaGF2ZSB0aGUgY29ycmVjdCBjb2RlIGZvciB5b3VyIHByb2R1Y3Rpb24gYnVpbGQuJyk7XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlIH07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///2\\n')},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nfunction checkDCE() {\\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\\n if (\\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\\n ) {\\n return;\\n }\\n if (false) {}\\n try {\\n // Verify that the code above has been dead code eliminated (DCE'd).\\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\\n } catch (err) {\\n // DevTools shouldn't crash React, no matter what.\\n // We should still report in case we break this code.\\n console.error(err);\\n }\\n}\\n\\nif (true) {\\n // DCE check should happen before ReactDOM bundle executes so that\\n // DevTools can report bad minification during injection.\\n checkDCE();\\n module.exports = __webpack_require__(23);\\n} else {}\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzP2VmMDciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUMsRUFBRSxFQVMxQztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksSUFBcUM7QUFDekM7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFPLENBQUMsRUFBbUM7QUFDOUQsQ0FBQyxNQUFNLEVBRU4iLCJmaWxlIjoiMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY2hlY2tEQ0UoKSB7XG4gIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbiAgaWYgKFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUaGlzIGJyYW5jaCBpcyB1bnJlYWNoYWJsZSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWRcbiAgICAvLyBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGNvbmRpdGlvbiBpcyB0cnVlIG9ubHkgaW4gZGV2ZWxvcG1lbnQuXG4gICAgLy8gVGhlcmVmb3JlIGlmIHRoZSBicmFuY2ggaXMgc3RpbGwgaGVyZSwgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIHdhc24ndFxuICAgIC8vIHByb3Blcmx5IGFwcGxpZWQuXG4gICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBtZXNzYWdlLiBSZWFjdCBEZXZUb29scyByZWxpZXMgb24gaXQuIEFsc28gbWFrZSBzdXJlXG4gICAgLy8gdGhpcyBtZXNzYWdlIGRvZXNuJ3Qgb2NjdXIgZWxzZXdoZXJlIGluIHRoaXMgZnVuY3Rpb24sIG9yIGl0IHdpbGwgY2F1c2VcbiAgICAvLyBhIGZhbHNlIHBvc2l0aXZlLlxuICAgIHRocm93IG5ldyBFcnJvcignXl9eJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29kZSBhYm92ZSBoYXMgYmVlbiBkZWFkIGNvZGUgZWxpbWluYXRlZCAoRENFJ2QpLlxuICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShjaGVja0RDRSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIERldlRvb2xzIHNob3VsZG4ndCBjcmFzaCBSZWFjdCwgbm8gbWF0dGVyIHdoYXQuXG4gICAgLy8gV2Ugc2hvdWxkIHN0aWxsIHJlcG9ydCBpbiBjYXNlIHdlIGJyZWFrIHRoaXMgY29kZS5cbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gRENFIGNoZWNrIHNob3VsZCBoYXBwZW4gYmVmb3JlIFJlYWN0RE9NIGJ1bmRsZSBleGVjdXRlcyBzbyB0aGF0XG4gIC8vIERldlRvb2xzIGNhbiByZXBvcnQgYmFkIG1pbmlmaWNhdGlvbiBkdXJpbmcgaW5qZWN0aW9uLlxuICBjaGVja0RDRSgpO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20uZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///3\\n\")},function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval('// ESM COMPAT FLAG\\n__webpack_require__.r(__webpack_exports__);\\n\\n// EXPORTS\\n__webpack_require__.d(__webpack_exports__, \"version\", function() { return /* reexport */ version; });\\n__webpack_require__.d(__webpack_exports__, \"bisect\", function() { return /* reexport */ bisect; });\\n__webpack_require__.d(__webpack_exports__, \"bisectRight\", function() { return /* reexport */ bisectRight; });\\n__webpack_require__.d(__webpack_exports__, \"bisectLeft\", function() { return /* reexport */ bisectLeft; });\\n__webpack_require__.d(__webpack_exports__, \"ascending\", function() { return /* reexport */ ascending; });\\n__webpack_require__.d(__webpack_exports__, \"bisector\", function() { return /* reexport */ bisector; });\\n__webpack_require__.d(__webpack_exports__, \"cross\", function() { return /* reexport */ cross; });\\n__webpack_require__.d(__webpack_exports__, \"descending\", function() { return /* reexport */ descending; });\\n__webpack_require__.d(__webpack_exports__, \"deviation\", function() { return /* reexport */ deviation; });\\n__webpack_require__.d(__webpack_exports__, \"extent\", function() { return /* reexport */ src_extent; });\\n__webpack_require__.d(__webpack_exports__, \"histogram\", function() { return /* reexport */ src_histogram; });\\n__webpack_require__.d(__webpack_exports__, \"thresholdFreedmanDiaconis\", function() { return /* reexport */ freedmanDiaconis; });\\n__webpack_require__.d(__webpack_exports__, \"thresholdScott\", function() { return /* reexport */ scott; });\\n__webpack_require__.d(__webpack_exports__, \"thresholdSturges\", function() { return /* reexport */ sturges; });\\n__webpack_require__.d(__webpack_exports__, \"max\", function() { return /* reexport */ src_max; });\\n__webpack_require__.d(__webpack_exports__, \"mean\", function() { return /* reexport */ src_mean; });\\n__webpack_require__.d(__webpack_exports__, \"median\", function() { return /* reexport */ median; });\\n__webpack_require__.d(__webpack_exports__, \"merge\", function() { return /* reexport */ src_merge; });\\n__webpack_require__.d(__webpack_exports__, \"min\", function() { return /* reexport */ src_min; });\\n__webpack_require__.d(__webpack_exports__, \"pairs\", function() { return /* reexport */ pairs; });\\n__webpack_require__.d(__webpack_exports__, \"permute\", function() { return /* reexport */ permute; });\\n__webpack_require__.d(__webpack_exports__, \"quantile\", function() { return /* reexport */ quantile; });\\n__webpack_require__.d(__webpack_exports__, \"range\", function() { return /* reexport */ src_range; });\\n__webpack_require__.d(__webpack_exports__, \"scan\", function() { return /* reexport */ scan; });\\n__webpack_require__.d(__webpack_exports__, \"shuffle\", function() { return /* reexport */ shuffle; });\\n__webpack_require__.d(__webpack_exports__, \"sum\", function() { return /* reexport */ src_sum; });\\n__webpack_require__.d(__webpack_exports__, \"ticks\", function() { return /* reexport */ ticks; });\\n__webpack_require__.d(__webpack_exports__, \"tickIncrement\", function() { return /* reexport */ tickIncrement; });\\n__webpack_require__.d(__webpack_exports__, \"tickStep\", function() { return /* reexport */ tickStep; });\\n__webpack_require__.d(__webpack_exports__, \"transpose\", function() { return /* reexport */ src_transpose; });\\n__webpack_require__.d(__webpack_exports__, \"variance\", function() { return /* reexport */ variance; });\\n__webpack_require__.d(__webpack_exports__, \"zip\", function() { return /* reexport */ zip; });\\n__webpack_require__.d(__webpack_exports__, \"axisTop\", function() { return /* reexport */ axisTop; });\\n__webpack_require__.d(__webpack_exports__, \"axisRight\", function() { return /* reexport */ axisRight; });\\n__webpack_require__.d(__webpack_exports__, \"axisBottom\", function() { return /* reexport */ axisBottom; });\\n__webpack_require__.d(__webpack_exports__, \"axisLeft\", function() { return /* reexport */ axisLeft; });\\n__webpack_require__.d(__webpack_exports__, \"brush\", function() { return /* reexport */ src_brush; });\\n__webpack_require__.d(__webpack_exports__, \"brushX\", function() { return /* reexport */ brushX; });\\n__webpack_require__.d(__webpack_exports__, \"brushY\", function() { return /* reexport */ brushY; });\\n__webpack_require__.d(__webpack_exports__, \"brushSelection\", function() { return /* reexport */ brushSelection; });\\n__webpack_require__.d(__webpack_exports__, \"chord\", function() { return /* reexport */ src_chord; });\\n__webpack_require__.d(__webpack_exports__, \"ribbon\", function() { return /* reexport */ src_ribbon; });\\n__webpack_require__.d(__webpack_exports__, \"nest\", function() { return /* reexport */ src_nest; });\\n__webpack_require__.d(__webpack_exports__, \"set\", function() { return /* reexport */ src_set; });\\n__webpack_require__.d(__webpack_exports__, \"map\", function() { return /* reexport */ src_map; });\\n__webpack_require__.d(__webpack_exports__, \"keys\", function() { return /* reexport */ src_keys; });\\n__webpack_require__.d(__webpack_exports__, \"values\", function() { return /* reexport */ src_values; });\\n__webpack_require__.d(__webpack_exports__, \"entries\", function() { return /* reexport */ src_entries; });\\n__webpack_require__.d(__webpack_exports__, \"color\", function() { return /* reexport */ color_color; });\\n__webpack_require__.d(__webpack_exports__, \"rgb\", function() { return /* reexport */ color_rgb; });\\n__webpack_require__.d(__webpack_exports__, \"hsl\", function() { return /* reexport */ hsl; });\\n__webpack_require__.d(__webpack_exports__, \"lab\", function() { return /* reexport */ lab; });\\n__webpack_require__.d(__webpack_exports__, \"hcl\", function() { return /* reexport */ hcl; });\\n__webpack_require__.d(__webpack_exports__, \"lch\", function() { return /* reexport */ lch; });\\n__webpack_require__.d(__webpack_exports__, \"gray\", function() { return /* reexport */ gray; });\\n__webpack_require__.d(__webpack_exports__, \"cubehelix\", function() { return /* reexport */ cubehelix_cubehelix; });\\n__webpack_require__.d(__webpack_exports__, \"contours\", function() { return /* reexport */ src_contours; });\\n__webpack_require__.d(__webpack_exports__, \"contourDensity\", function() { return /* reexport */ src_density; });\\n__webpack_require__.d(__webpack_exports__, \"dispatch\", function() { return /* reexport */ src_dispatch; });\\n__webpack_require__.d(__webpack_exports__, \"drag\", function() { return /* reexport */ src_drag; });\\n__webpack_require__.d(__webpack_exports__, \"dragDisable\", function() { return /* reexport */ nodrag; });\\n__webpack_require__.d(__webpack_exports__, \"dragEnable\", function() { return /* reexport */ yesdrag; });\\n__webpack_require__.d(__webpack_exports__, \"dsvFormat\", function() { return /* reexport */ dsv; });\\n__webpack_require__.d(__webpack_exports__, \"csvParse\", function() { return /* reexport */ csvParse; });\\n__webpack_require__.d(__webpack_exports__, \"csvParseRows\", function() { return /* reexport */ csvParseRows; });\\n__webpack_require__.d(__webpack_exports__, \"csvFormat\", function() { return /* reexport */ csvFormat; });\\n__webpack_require__.d(__webpack_exports__, \"csvFormatBody\", function() { return /* reexport */ csvFormatBody; });\\n__webpack_require__.d(__webpack_exports__, \"csvFormatRows\", function() { return /* reexport */ csvFormatRows; });\\n__webpack_require__.d(__webpack_exports__, \"csvFormatRow\", function() { return /* reexport */ csvFormatRow; });\\n__webpack_require__.d(__webpack_exports__, \"csvFormatValue\", function() { return /* reexport */ csvFormatValue; });\\n__webpack_require__.d(__webpack_exports__, \"tsvParse\", function() { return /* reexport */ tsvParse; });\\n__webpack_require__.d(__webpack_exports__, \"tsvParseRows\", function() { return /* reexport */ tsvParseRows; });\\n__webpack_require__.d(__webpack_exports__, \"tsvFormat\", function() { return /* reexport */ tsvFormat; });\\n__webpack_require__.d(__webpack_exports__, \"tsvFormatBody\", function() { return /* reexport */ tsvFormatBody; });\\n__webpack_require__.d(__webpack_exports__, \"tsvFormatRows\", function() { return /* reexport */ tsvFormatRows; });\\n__webpack_require__.d(__webpack_exports__, \"tsvFormatRow\", function() { return /* reexport */ tsvFormatRow; });\\n__webpack_require__.d(__webpack_exports__, \"tsvFormatValue\", function() { return /* reexport */ tsvFormatValue; });\\n__webpack_require__.d(__webpack_exports__, \"autoType\", function() { return /* reexport */ autoType; });\\n__webpack_require__.d(__webpack_exports__, \"easeLinear\", function() { return /* reexport */ linear_linear; });\\n__webpack_require__.d(__webpack_exports__, \"easeQuad\", function() { return /* reexport */ quadInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeQuadIn\", function() { return /* reexport */ quadIn; });\\n__webpack_require__.d(__webpack_exports__, \"easeQuadOut\", function() { return /* reexport */ quadOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeQuadInOut\", function() { return /* reexport */ quadInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeCubic\", function() { return /* reexport */ cubicInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeCubicIn\", function() { return /* reexport */ cubicIn; });\\n__webpack_require__.d(__webpack_exports__, \"easeCubicOut\", function() { return /* reexport */ cubicOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeCubicInOut\", function() { return /* reexport */ cubicInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easePoly\", function() { return /* reexport */ polyInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easePolyIn\", function() { return /* reexport */ polyIn; });\\n__webpack_require__.d(__webpack_exports__, \"easePolyOut\", function() { return /* reexport */ polyOut; });\\n__webpack_require__.d(__webpack_exports__, \"easePolyInOut\", function() { return /* reexport */ polyInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeSin\", function() { return /* reexport */ sinInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeSinIn\", function() { return /* reexport */ sinIn; });\\n__webpack_require__.d(__webpack_exports__, \"easeSinOut\", function() { return /* reexport */ sinOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeSinInOut\", function() { return /* reexport */ sinInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeExp\", function() { return /* reexport */ expInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeExpIn\", function() { return /* reexport */ expIn; });\\n__webpack_require__.d(__webpack_exports__, \"easeExpOut\", function() { return /* reexport */ expOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeExpInOut\", function() { return /* reexport */ expInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeCircle\", function() { return /* reexport */ circleInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeCircleIn\", function() { return /* reexport */ circleIn; });\\n__webpack_require__.d(__webpack_exports__, \"easeCircleOut\", function() { return /* reexport */ circleOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeCircleInOut\", function() { return /* reexport */ circleInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeBounce\", function() { return /* reexport */ bounceOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeBounceIn\", function() { return /* reexport */ bounceIn; });\\n__webpack_require__.d(__webpack_exports__, \"easeBounceOut\", function() { return /* reexport */ bounceOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeBounceInOut\", function() { return /* reexport */ bounceInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeBack\", function() { return /* reexport */ backInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeBackIn\", function() { return /* reexport */ backIn; });\\n__webpack_require__.d(__webpack_exports__, \"easeBackOut\", function() { return /* reexport */ backOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeBackInOut\", function() { return /* reexport */ backInOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeElastic\", function() { return /* reexport */ elasticOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeElasticIn\", function() { return /* reexport */ elasticIn; });\\n__webpack_require__.d(__webpack_exports__, \"easeElasticOut\", function() { return /* reexport */ elasticOut; });\\n__webpack_require__.d(__webpack_exports__, \"easeElasticInOut\", function() { return /* reexport */ elasticInOut; });\\n__webpack_require__.d(__webpack_exports__, \"blob\", function() { return /* reexport */ blob; });\\n__webpack_require__.d(__webpack_exports__, \"buffer\", function() { return /* reexport */ src_buffer; });\\n__webpack_require__.d(__webpack_exports__, \"dsv\", function() { return /* reexport */ dsv_dsv; });\\n__webpack_require__.d(__webpack_exports__, \"csv\", function() { return /* reexport */ dsv_csv; });\\n__webpack_require__.d(__webpack_exports__, \"tsv\", function() { return /* reexport */ dsv_tsv; });\\n__webpack_require__.d(__webpack_exports__, \"image\", function() { return /* reexport */ src_image; });\\n__webpack_require__.d(__webpack_exports__, \"json\", function() { return /* reexport */ json; });\\n__webpack_require__.d(__webpack_exports__, \"text\", function() { return /* reexport */ src_text; });\\n__webpack_require__.d(__webpack_exports__, \"xml\", function() { return /* reexport */ xml; });\\n__webpack_require__.d(__webpack_exports__, \"html\", function() { return /* reexport */ xml_html; });\\n__webpack_require__.d(__webpack_exports__, \"svg\", function() { return /* reexport */ svg; });\\n__webpack_require__.d(__webpack_exports__, \"forceCenter\", function() { return /* reexport */ src_center; });\\n__webpack_require__.d(__webpack_exports__, \"forceCollide\", function() { return /* reexport */ collide; });\\n__webpack_require__.d(__webpack_exports__, \"forceLink\", function() { return /* reexport */ src_link; });\\n__webpack_require__.d(__webpack_exports__, \"forceManyBody\", function() { return /* reexport */ manyBody; });\\n__webpack_require__.d(__webpack_exports__, \"forceRadial\", function() { return /* reexport */ radial; });\\n__webpack_require__.d(__webpack_exports__, \"forceSimulation\", function() { return /* reexport */ src_simulation; });\\n__webpack_require__.d(__webpack_exports__, \"forceX\", function() { return /* reexport */ d3_force_src_x; });\\n__webpack_require__.d(__webpack_exports__, \"forceY\", function() { return /* reexport */ d3_force_src_y; });\\n__webpack_require__.d(__webpack_exports__, \"formatDefaultLocale\", function() { return /* reexport */ defaultLocale; });\\n__webpack_require__.d(__webpack_exports__, \"format\", function() { return /* reexport */ defaultLocale_format; });\\n__webpack_require__.d(__webpack_exports__, \"formatPrefix\", function() { return /* reexport */ defaultLocale_formatPrefix; });\\n__webpack_require__.d(__webpack_exports__, \"formatLocale\", function() { return /* reexport */ src_locale; });\\n__webpack_require__.d(__webpack_exports__, \"formatSpecifier\", function() { return /* reexport */ formatSpecifier; });\\n__webpack_require__.d(__webpack_exports__, \"FormatSpecifier\", function() { return /* reexport */ FormatSpecifier; });\\n__webpack_require__.d(__webpack_exports__, \"precisionFixed\", function() { return /* reexport */ precisionFixed; });\\n__webpack_require__.d(__webpack_exports__, \"precisionPrefix\", function() { return /* reexport */ precisionPrefix; });\\n__webpack_require__.d(__webpack_exports__, \"precisionRound\", function() { return /* reexport */ precisionRound; });\\n__webpack_require__.d(__webpack_exports__, \"geoArea\", function() { return /* reexport */ d3_geo_src_area; });\\n__webpack_require__.d(__webpack_exports__, \"geoBounds\", function() { return /* reexport */ bounds; });\\n__webpack_require__.d(__webpack_exports__, \"geoCentroid\", function() { return /* reexport */ src_centroid; });\\n__webpack_require__.d(__webpack_exports__, \"geoCircle\", function() { return /* reexport */ src_circle; });\\n__webpack_require__.d(__webpack_exports__, \"geoClipAntimeridian\", function() { return /* reexport */ clip_antimeridian; });\\n__webpack_require__.d(__webpack_exports__, \"geoClipCircle\", function() { return /* reexport */ clip_circle; });\\n__webpack_require__.d(__webpack_exports__, \"geoClipExtent\", function() { return /* reexport */ clip_extent; });\\n__webpack_require__.d(__webpack_exports__, \"geoClipRectangle\", function() { return /* reexport */ clipRectangle; });\\n__webpack_require__.d(__webpack_exports__, \"geoContains\", function() { return /* reexport */ src_contains; });\\n__webpack_require__.d(__webpack_exports__, \"geoDistance\", function() { return /* reexport */ src_distance; });\\n__webpack_require__.d(__webpack_exports__, \"geoGraticule\", function() { return /* reexport */ graticule_graticule; });\\n__webpack_require__.d(__webpack_exports__, \"geoGraticule10\", function() { return /* reexport */ graticule10; });\\n__webpack_require__.d(__webpack_exports__, \"geoInterpolate\", function() { return /* reexport */ src_interpolate; });\\n__webpack_require__.d(__webpack_exports__, \"geoLength\", function() { return /* reexport */ src_length; });\\n__webpack_require__.d(__webpack_exports__, \"geoPath\", function() { return /* reexport */ d3_geo_src_path; });\\n__webpack_require__.d(__webpack_exports__, \"geoAlbers\", function() { return /* reexport */ albers; });\\n__webpack_require__.d(__webpack_exports__, \"geoAlbersUsa\", function() { return /* reexport */ projection_albersUsa; });\\n__webpack_require__.d(__webpack_exports__, \"geoAzimuthalEqualArea\", function() { return /* reexport */ azimuthalEqualArea; });\\n__webpack_require__.d(__webpack_exports__, \"geoAzimuthalEqualAreaRaw\", function() { return /* reexport */ azimuthalEqualAreaRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoAzimuthalEquidistant\", function() { return /* reexport */ azimuthalEquidistant; });\\n__webpack_require__.d(__webpack_exports__, \"geoAzimuthalEquidistantRaw\", function() { return /* reexport */ azimuthalEquidistantRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoConicConformal\", function() { return /* reexport */ conicConformal; });\\n__webpack_require__.d(__webpack_exports__, \"geoConicConformalRaw\", function() { return /* reexport */ conicConformalRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoConicEqualArea\", function() { return /* reexport */ conicEqualArea; });\\n__webpack_require__.d(__webpack_exports__, \"geoConicEqualAreaRaw\", function() { return /* reexport */ conicEqualAreaRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoConicEquidistant\", function() { return /* reexport */ conicEquidistant; });\\n__webpack_require__.d(__webpack_exports__, \"geoConicEquidistantRaw\", function() { return /* reexport */ conicEquidistantRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoEqualEarth\", function() { return /* reexport */ equalEarth; });\\n__webpack_require__.d(__webpack_exports__, \"geoEqualEarthRaw\", function() { return /* reexport */ equalEarthRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoEquirectangular\", function() { return /* reexport */ equirectangular; });\\n__webpack_require__.d(__webpack_exports__, \"geoEquirectangularRaw\", function() { return /* reexport */ equirectangularRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoGnomonic\", function() { return /* reexport */ gnomonic; });\\n__webpack_require__.d(__webpack_exports__, \"geoGnomonicRaw\", function() { return /* reexport */ gnomonicRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoIdentity\", function() { return /* reexport */ projection_identity; });\\n__webpack_require__.d(__webpack_exports__, \"geoProjection\", function() { return /* reexport */ projection_projection; });\\n__webpack_require__.d(__webpack_exports__, \"geoProjectionMutator\", function() { return /* reexport */ projectionMutator; });\\n__webpack_require__.d(__webpack_exports__, \"geoMercator\", function() { return /* reexport */ mercator; });\\n__webpack_require__.d(__webpack_exports__, \"geoMercatorRaw\", function() { return /* reexport */ mercatorRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoNaturalEarth1\", function() { return /* reexport */ naturalEarth1; });\\n__webpack_require__.d(__webpack_exports__, \"geoNaturalEarth1Raw\", function() { return /* reexport */ naturalEarth1Raw; });\\n__webpack_require__.d(__webpack_exports__, \"geoOrthographic\", function() { return /* reexport */ orthographic; });\\n__webpack_require__.d(__webpack_exports__, \"geoOrthographicRaw\", function() { return /* reexport */ orthographicRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoStereographic\", function() { return /* reexport */ stereographic; });\\n__webpack_require__.d(__webpack_exports__, \"geoStereographicRaw\", function() { return /* reexport */ stereographicRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoTransverseMercator\", function() { return /* reexport */ transverseMercator; });\\n__webpack_require__.d(__webpack_exports__, \"geoTransverseMercatorRaw\", function() { return /* reexport */ transverseMercatorRaw; });\\n__webpack_require__.d(__webpack_exports__, \"geoRotation\", function() { return /* reexport */ src_rotation; });\\n__webpack_require__.d(__webpack_exports__, \"geoStream\", function() { return /* reexport */ src_stream; });\\n__webpack_require__.d(__webpack_exports__, \"geoTransform\", function() { return /* reexport */ src_transform; });\\n__webpack_require__.d(__webpack_exports__, \"cluster\", function() { return /* reexport */ cluster; });\\n__webpack_require__.d(__webpack_exports__, \"hierarchy\", function() { return /* reexport */ hierarchy; });\\n__webpack_require__.d(__webpack_exports__, \"pack\", function() { return /* reexport */ src_pack; });\\n__webpack_require__.d(__webpack_exports__, \"packSiblings\", function() { return /* reexport */ siblings; });\\n__webpack_require__.d(__webpack_exports__, \"packEnclose\", function() { return /* reexport */ enclose; });\\n__webpack_require__.d(__webpack_exports__, \"partition\", function() { return /* reexport */ src_partition; });\\n__webpack_require__.d(__webpack_exports__, \"stratify\", function() { return /* reexport */ src_stratify; });\\n__webpack_require__.d(__webpack_exports__, \"tree\", function() { return /* reexport */ src_tree; });\\n__webpack_require__.d(__webpack_exports__, \"treemap\", function() { return /* reexport */ src_treemap; });\\n__webpack_require__.d(__webpack_exports__, \"treemapBinary\", function() { return /* reexport */ binary; });\\n__webpack_require__.d(__webpack_exports__, \"treemapDice\", function() { return /* reexport */ dice; });\\n__webpack_require__.d(__webpack_exports__, \"treemapSlice\", function() { return /* reexport */ treemap_slice; });\\n__webpack_require__.d(__webpack_exports__, \"treemapSliceDice\", function() { return /* reexport */ sliceDice; });\\n__webpack_require__.d(__webpack_exports__, \"treemapSquarify\", function() { return /* reexport */ squarify; });\\n__webpack_require__.d(__webpack_exports__, \"treemapResquarify\", function() { return /* reexport */ treemap_resquarify; });\\n__webpack_require__.d(__webpack_exports__, \"interpolate\", function() { return /* reexport */ src_value; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateArray\", function() { return /* reexport */ src_array; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateBasis\", function() { return /* reexport */ src_basis; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateBasisClosed\", function() { return /* reexport */ basisClosed; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateDate\", function() { return /* reexport */ src_date; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateDiscrete\", function() { return /* reexport */ discrete; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateHue\", function() { return /* reexport */ src_hue; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateNumber\", function() { return /* reexport */ src_number; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateNumberArray\", function() { return /* reexport */ numberArray; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateObject\", function() { return /* reexport */ src_object; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateRound\", function() { return /* reexport */ src_round; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateString\", function() { return /* reexport */ src_string; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateTransformCss\", function() { return /* reexport */ interpolateTransformCss; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateTransformSvg\", function() { return /* reexport */ interpolateTransformSvg; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateZoom\", function() { return /* reexport */ src_zoom; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateRgb\", function() { return /* reexport */ src_rgb; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateRgbBasis\", function() { return /* reexport */ rgbBasis; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateRgbBasisClosed\", function() { return /* reexport */ rgbBasisClosed; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateHsl\", function() { return /* reexport */ src_hsl; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateHslLong\", function() { return /* reexport */ hslLong; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateLab\", function() { return /* reexport */ lab_lab; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateHcl\", function() { return /* reexport */ src_hcl; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateHclLong\", function() { return /* reexport */ hclLong; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateCubehelix\", function() { return /* reexport */ src_cubehelix; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateCubehelixLong\", function() { return /* reexport */ cubehelixLong; });\\n__webpack_require__.d(__webpack_exports__, \"piecewise\", function() { return /* reexport */ piecewise_piecewise; });\\n__webpack_require__.d(__webpack_exports__, \"quantize\", function() { return /* reexport */ quantize; });\\n__webpack_require__.d(__webpack_exports__, \"path\", function() { return /* reexport */ src_path; });\\n__webpack_require__.d(__webpack_exports__, \"polygonArea\", function() { return /* reexport */ d3_polygon_src_area; });\\n__webpack_require__.d(__webpack_exports__, \"polygonCentroid\", function() { return /* reexport */ d3_polygon_src_centroid; });\\n__webpack_require__.d(__webpack_exports__, \"polygonHull\", function() { return /* reexport */ hull; });\\n__webpack_require__.d(__webpack_exports__, \"polygonContains\", function() { return /* reexport */ d3_polygon_src_contains; });\\n__webpack_require__.d(__webpack_exports__, \"polygonLength\", function() { return /* reexport */ d3_polygon_src_length; });\\n__webpack_require__.d(__webpack_exports__, \"quadtree\", function() { return /* reexport */ quadtree; });\\n__webpack_require__.d(__webpack_exports__, \"randomUniform\", function() { return /* reexport */ uniform; });\\n__webpack_require__.d(__webpack_exports__, \"randomNormal\", function() { return /* reexport */ src_normal; });\\n__webpack_require__.d(__webpack_exports__, \"randomLogNormal\", function() { return /* reexport */ logNormal; });\\n__webpack_require__.d(__webpack_exports__, \"randomBates\", function() { return /* reexport */ bates; });\\n__webpack_require__.d(__webpack_exports__, \"randomIrwinHall\", function() { return /* reexport */ irwinHall; });\\n__webpack_require__.d(__webpack_exports__, \"randomExponential\", function() { return /* reexport */ src_exponential; });\\n__webpack_require__.d(__webpack_exports__, \"scaleBand\", function() { return /* reexport */ band; });\\n__webpack_require__.d(__webpack_exports__, \"scalePoint\", function() { return /* reexport */ band_point; });\\n__webpack_require__.d(__webpack_exports__, \"scaleIdentity\", function() { return /* reexport */ identity_identity; });\\n__webpack_require__.d(__webpack_exports__, \"scaleLinear\", function() { return /* reexport */ src_linear_linear; });\\n__webpack_require__.d(__webpack_exports__, \"scaleLog\", function() { return /* reexport */ log_log; });\\n__webpack_require__.d(__webpack_exports__, \"scaleSymlog\", function() { return /* reexport */ symlog; });\\n__webpack_require__.d(__webpack_exports__, \"scaleOrdinal\", function() { return /* reexport */ ordinal; });\\n__webpack_require__.d(__webpack_exports__, \"scaleImplicit\", function() { return /* reexport */ implicit; });\\n__webpack_require__.d(__webpack_exports__, \"scalePow\", function() { return /* reexport */ pow_pow; });\\n__webpack_require__.d(__webpack_exports__, \"scaleSqrt\", function() { return /* reexport */ pow_sqrt; });\\n__webpack_require__.d(__webpack_exports__, \"scaleQuantile\", function() { return /* reexport */ quantile_quantile; });\\n__webpack_require__.d(__webpack_exports__, \"scaleQuantize\", function() { return /* reexport */ quantize_quantize; });\\n__webpack_require__.d(__webpack_exports__, \"scaleThreshold\", function() { return /* reexport */ threshold_threshold; });\\n__webpack_require__.d(__webpack_exports__, \"scaleTime\", function() { return /* reexport */ src_time; });\\n__webpack_require__.d(__webpack_exports__, \"scaleUtc\", function() { return /* reexport */ utcTime; });\\n__webpack_require__.d(__webpack_exports__, \"scaleSequential\", function() { return /* reexport */ sequential; });\\n__webpack_require__.d(__webpack_exports__, \"scaleSequentialLog\", function() { return /* reexport */ sequentialLog; });\\n__webpack_require__.d(__webpack_exports__, \"scaleSequentialPow\", function() { return /* reexport */ sequentialPow; });\\n__webpack_require__.d(__webpack_exports__, \"scaleSequentialSqrt\", function() { return /* reexport */ sequentialSqrt; });\\n__webpack_require__.d(__webpack_exports__, \"scaleSequentialSymlog\", function() { return /* reexport */ sequentialSymlog; });\\n__webpack_require__.d(__webpack_exports__, \"scaleSequentialQuantile\", function() { return /* reexport */ sequentialQuantile; });\\n__webpack_require__.d(__webpack_exports__, \"scaleDiverging\", function() { return /* reexport */ diverging; });\\n__webpack_require__.d(__webpack_exports__, \"scaleDivergingLog\", function() { return /* reexport */ divergingLog; });\\n__webpack_require__.d(__webpack_exports__, \"scaleDivergingPow\", function() { return /* reexport */ divergingPow; });\\n__webpack_require__.d(__webpack_exports__, \"scaleDivergingSqrt\", function() { return /* reexport */ divergingSqrt; });\\n__webpack_require__.d(__webpack_exports__, \"scaleDivergingSymlog\", function() { return /* reexport */ divergingSymlog; });\\n__webpack_require__.d(__webpack_exports__, \"tickFormat\", function() { return /* reexport */ src_tickFormat; });\\n__webpack_require__.d(__webpack_exports__, \"schemeCategory10\", function() { return /* reexport */ category10; });\\n__webpack_require__.d(__webpack_exports__, \"schemeAccent\", function() { return /* reexport */ Accent; });\\n__webpack_require__.d(__webpack_exports__, \"schemeDark2\", function() { return /* reexport */ Dark2; });\\n__webpack_require__.d(__webpack_exports__, \"schemePaired\", function() { return /* reexport */ Paired; });\\n__webpack_require__.d(__webpack_exports__, \"schemePastel1\", function() { return /* reexport */ Pastel1; });\\n__webpack_require__.d(__webpack_exports__, \"schemePastel2\", function() { return /* reexport */ Pastel2; });\\n__webpack_require__.d(__webpack_exports__, \"schemeSet1\", function() { return /* reexport */ Set1; });\\n__webpack_require__.d(__webpack_exports__, \"schemeSet2\", function() { return /* reexport */ Set2; });\\n__webpack_require__.d(__webpack_exports__, \"schemeSet3\", function() { return /* reexport */ Set3; });\\n__webpack_require__.d(__webpack_exports__, \"schemeTableau10\", function() { return /* reexport */ Tableau10; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateBrBG\", function() { return /* reexport */ BrBG; });\\n__webpack_require__.d(__webpack_exports__, \"schemeBrBG\", function() { return /* reexport */ BrBG_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolatePRGn\", function() { return /* reexport */ PRGn; });\\n__webpack_require__.d(__webpack_exports__, \"schemePRGn\", function() { return /* reexport */ PRGn_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolatePiYG\", function() { return /* reexport */ PiYG; });\\n__webpack_require__.d(__webpack_exports__, \"schemePiYG\", function() { return /* reexport */ PiYG_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolatePuOr\", function() { return /* reexport */ PuOr; });\\n__webpack_require__.d(__webpack_exports__, \"schemePuOr\", function() { return /* reexport */ PuOr_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateRdBu\", function() { return /* reexport */ RdBu; });\\n__webpack_require__.d(__webpack_exports__, \"schemeRdBu\", function() { return /* reexport */ RdBu_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateRdGy\", function() { return /* reexport */ RdGy; });\\n__webpack_require__.d(__webpack_exports__, \"schemeRdGy\", function() { return /* reexport */ RdGy_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateRdYlBu\", function() { return /* reexport */ RdYlBu; });\\n__webpack_require__.d(__webpack_exports__, \"schemeRdYlBu\", function() { return /* reexport */ RdYlBu_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateRdYlGn\", function() { return /* reexport */ RdYlGn; });\\n__webpack_require__.d(__webpack_exports__, \"schemeRdYlGn\", function() { return /* reexport */ RdYlGn_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateSpectral\", function() { return /* reexport */ Spectral; });\\n__webpack_require__.d(__webpack_exports__, \"schemeSpectral\", function() { return /* reexport */ Spectral_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateBuGn\", function() { return /* reexport */ BuGn; });\\n__webpack_require__.d(__webpack_exports__, \"schemeBuGn\", function() { return /* reexport */ BuGn_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateBuPu\", function() { return /* reexport */ BuPu; });\\n__webpack_require__.d(__webpack_exports__, \"schemeBuPu\", function() { return /* reexport */ BuPu_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateGnBu\", function() { return /* reexport */ GnBu; });\\n__webpack_require__.d(__webpack_exports__, \"schemeGnBu\", function() { return /* reexport */ GnBu_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateOrRd\", function() { return /* reexport */ OrRd; });\\n__webpack_require__.d(__webpack_exports__, \"schemeOrRd\", function() { return /* reexport */ OrRd_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolatePuBuGn\", function() { return /* reexport */ PuBuGn; });\\n__webpack_require__.d(__webpack_exports__, \"schemePuBuGn\", function() { return /* reexport */ PuBuGn_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolatePuBu\", function() { return /* reexport */ PuBu; });\\n__webpack_require__.d(__webpack_exports__, \"schemePuBu\", function() { return /* reexport */ PuBu_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolatePuRd\", function() { return /* reexport */ PuRd; });\\n__webpack_require__.d(__webpack_exports__, \"schemePuRd\", function() { return /* reexport */ PuRd_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateRdPu\", function() { return /* reexport */ RdPu; });\\n__webpack_require__.d(__webpack_exports__, \"schemeRdPu\", function() { return /* reexport */ RdPu_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateYlGnBu\", function() { return /* reexport */ YlGnBu; });\\n__webpack_require__.d(__webpack_exports__, \"schemeYlGnBu\", function() { return /* reexport */ YlGnBu_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateYlGn\", function() { return /* reexport */ YlGn; });\\n__webpack_require__.d(__webpack_exports__, \"schemeYlGn\", function() { return /* reexport */ YlGn_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateYlOrBr\", function() { return /* reexport */ YlOrBr; });\\n__webpack_require__.d(__webpack_exports__, \"schemeYlOrBr\", function() { return /* reexport */ YlOrBr_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateYlOrRd\", function() { return /* reexport */ YlOrRd; });\\n__webpack_require__.d(__webpack_exports__, \"schemeYlOrRd\", function() { return /* reexport */ YlOrRd_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateBlues\", function() { return /* reexport */ Blues; });\\n__webpack_require__.d(__webpack_exports__, \"schemeBlues\", function() { return /* reexport */ Blues_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateGreens\", function() { return /* reexport */ Greens; });\\n__webpack_require__.d(__webpack_exports__, \"schemeGreens\", function() { return /* reexport */ Greens_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateGreys\", function() { return /* reexport */ Greys; });\\n__webpack_require__.d(__webpack_exports__, \"schemeGreys\", function() { return /* reexport */ Greys_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolatePurples\", function() { return /* reexport */ Purples; });\\n__webpack_require__.d(__webpack_exports__, \"schemePurples\", function() { return /* reexport */ Purples_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateReds\", function() { return /* reexport */ Reds; });\\n__webpack_require__.d(__webpack_exports__, \"schemeReds\", function() { return /* reexport */ Reds_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateOranges\", function() { return /* reexport */ Oranges; });\\n__webpack_require__.d(__webpack_exports__, \"schemeOranges\", function() { return /* reexport */ Oranges_scheme; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateCividis\", function() { return /* reexport */ cividis; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateCubehelixDefault\", function() { return /* reexport */ sequential_multi_cubehelix; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateRainbow\", function() { return /* reexport */ rainbow; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateWarm\", function() { return /* reexport */ warm; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateCool\", function() { return /* reexport */ cool; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateSinebow\", function() { return /* reexport */ sinebow; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateTurbo\", function() { return /* reexport */ turbo; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateViridis\", function() { return /* reexport */ viridis; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateMagma\", function() { return /* reexport */ magma; });\\n__webpack_require__.d(__webpack_exports__, \"interpolateInferno\", function() { return /* reexport */ inferno; });\\n__webpack_require__.d(__webpack_exports__, \"interpolatePlasma\", function() { return /* reexport */ plasma; });\\n__webpack_require__.d(__webpack_exports__, \"create\", function() { return /* reexport */ src_create; });\\n__webpack_require__.d(__webpack_exports__, \"creator\", function() { return /* reexport */ creator; });\\n__webpack_require__.d(__webpack_exports__, \"local\", function() { return /* reexport */ local_local; });\\n__webpack_require__.d(__webpack_exports__, \"matcher\", function() { return /* reexport */ matcher; });\\n__webpack_require__.d(__webpack_exports__, \"mouse\", function() { return /* reexport */ mouse; });\\n__webpack_require__.d(__webpack_exports__, \"namespace\", function() { return /* reexport */ namespace; });\\n__webpack_require__.d(__webpack_exports__, \"namespaces\", function() { return /* reexport */ namespaces; });\\n__webpack_require__.d(__webpack_exports__, \"clientPoint\", function() { return /* reexport */ src_point; });\\n__webpack_require__.d(__webpack_exports__, \"select\", function() { return /* reexport */ src_select; });\\n__webpack_require__.d(__webpack_exports__, \"selectAll\", function() { return /* reexport */ src_selectAll; });\\n__webpack_require__.d(__webpack_exports__, \"selection\", function() { return /* reexport */ src_selection; });\\n__webpack_require__.d(__webpack_exports__, \"selector\", function() { return /* reexport */ src_selector; });\\n__webpack_require__.d(__webpack_exports__, \"selectorAll\", function() { return /* reexport */ selectorAll; });\\n__webpack_require__.d(__webpack_exports__, \"style\", function() { return /* reexport */ styleValue; });\\n__webpack_require__.d(__webpack_exports__, \"touch\", function() { return /* reexport */ src_touch; });\\n__webpack_require__.d(__webpack_exports__, \"touches\", function() { return /* reexport */ src_touches; });\\n__webpack_require__.d(__webpack_exports__, \"window\", function() { return /* reexport */ src_window; });\\n__webpack_require__.d(__webpack_exports__, \"event\", function() { return /* reexport */ on_event; });\\n__webpack_require__.d(__webpack_exports__, \"customEvent\", function() { return /* reexport */ customEvent; });\\n__webpack_require__.d(__webpack_exports__, \"arc\", function() { return /* reexport */ src_arc; });\\n__webpack_require__.d(__webpack_exports__, \"area\", function() { return /* reexport */ d3_shape_src_area; });\\n__webpack_require__.d(__webpack_exports__, \"line\", function() { return /* reexport */ src_line; });\\n__webpack_require__.d(__webpack_exports__, \"pie\", function() { return /* reexport */ src_pie; });\\n__webpack_require__.d(__webpack_exports__, \"areaRadial\", function() { return /* reexport */ areaRadial; });\\n__webpack_require__.d(__webpack_exports__, \"radialArea\", function() { return /* reexport */ areaRadial; });\\n__webpack_require__.d(__webpack_exports__, \"lineRadial\", function() { return /* reexport */ src_lineRadial; });\\n__webpack_require__.d(__webpack_exports__, \"radialLine\", function() { return /* reexport */ src_lineRadial; });\\n__webpack_require__.d(__webpack_exports__, \"pointRadial\", function() { return /* reexport */ pointRadial; });\\n__webpack_require__.d(__webpack_exports__, \"linkHorizontal\", function() { return /* reexport */ linkHorizontal; });\\n__webpack_require__.d(__webpack_exports__, \"linkVertical\", function() { return /* reexport */ linkVertical; });\\n__webpack_require__.d(__webpack_exports__, \"linkRadial\", function() { return /* reexport */ linkRadial; });\\n__webpack_require__.d(__webpack_exports__, \"symbol\", function() { return /* reexport */ src_symbol; });\\n__webpack_require__.d(__webpack_exports__, \"symbols\", function() { return /* reexport */ symbols; });\\n__webpack_require__.d(__webpack_exports__, \"symbolCircle\", function() { return /* reexport */ symbol_circle; });\\n__webpack_require__.d(__webpack_exports__, \"symbolCross\", function() { return /* reexport */ symbol_cross; });\\n__webpack_require__.d(__webpack_exports__, \"symbolDiamond\", function() { return /* reexport */ diamond; });\\n__webpack_require__.d(__webpack_exports__, \"symbolSquare\", function() { return /* reexport */ square; });\\n__webpack_require__.d(__webpack_exports__, \"symbolStar\", function() { return /* reexport */ star; });\\n__webpack_require__.d(__webpack_exports__, \"symbolTriangle\", function() { return /* reexport */ triangle; });\\n__webpack_require__.d(__webpack_exports__, \"symbolWye\", function() { return /* reexport */ wye; });\\n__webpack_require__.d(__webpack_exports__, \"curveBasisClosed\", function() { return /* reexport */ curve_basisClosed; });\\n__webpack_require__.d(__webpack_exports__, \"curveBasisOpen\", function() { return /* reexport */ basisOpen; });\\n__webpack_require__.d(__webpack_exports__, \"curveBasis\", function() { return /* reexport */ curve_basis; });\\n__webpack_require__.d(__webpack_exports__, \"curveBundle\", function() { return /* reexport */ curve_bundle; });\\n__webpack_require__.d(__webpack_exports__, \"curveCardinalClosed\", function() { return /* reexport */ cardinalClosed; });\\n__webpack_require__.d(__webpack_exports__, \"curveCardinalOpen\", function() { return /* reexport */ cardinalOpen; });\\n__webpack_require__.d(__webpack_exports__, \"curveCardinal\", function() { return /* reexport */ cardinal; });\\n__webpack_require__.d(__webpack_exports__, \"curveCatmullRomClosed\", function() { return /* reexport */ catmullRomClosed; });\\n__webpack_require__.d(__webpack_exports__, \"curveCatmullRomOpen\", function() { return /* reexport */ catmullRomOpen; });\\n__webpack_require__.d(__webpack_exports__, \"curveCatmullRom\", function() { return /* reexport */ curve_catmullRom; });\\n__webpack_require__.d(__webpack_exports__, \"curveLinearClosed\", function() { return /* reexport */ linearClosed; });\\n__webpack_require__.d(__webpack_exports__, \"curveLinear\", function() { return /* reexport */ curve_linear; });\\n__webpack_require__.d(__webpack_exports__, \"curveMonotoneX\", function() { return /* reexport */ monotoneX; });\\n__webpack_require__.d(__webpack_exports__, \"curveMonotoneY\", function() { return /* reexport */ monotoneY; });\\n__webpack_require__.d(__webpack_exports__, \"curveNatural\", function() { return /* reexport */ natural; });\\n__webpack_require__.d(__webpack_exports__, \"curveStep\", function() { return /* reexport */ curve_step; });\\n__webpack_require__.d(__webpack_exports__, \"curveStepAfter\", function() { return /* reexport */ stepAfter; });\\n__webpack_require__.d(__webpack_exports__, \"curveStepBefore\", function() { return /* reexport */ stepBefore; });\\n__webpack_require__.d(__webpack_exports__, \"stack\", function() { return /* reexport */ src_stack; });\\n__webpack_require__.d(__webpack_exports__, \"stackOffsetExpand\", function() { return /* reexport */ expand; });\\n__webpack_require__.d(__webpack_exports__, \"stackOffsetDiverging\", function() { return /* reexport */ offset_diverging; });\\n__webpack_require__.d(__webpack_exports__, \"stackOffsetNone\", function() { return /* reexport */ offset_none; });\\n__webpack_require__.d(__webpack_exports__, \"stackOffsetSilhouette\", function() { return /* reexport */ silhouette; });\\n__webpack_require__.d(__webpack_exports__, \"stackOffsetWiggle\", function() { return /* reexport */ wiggle; });\\n__webpack_require__.d(__webpack_exports__, \"stackOrderAppearance\", function() { return /* reexport */ appearance; });\\n__webpack_require__.d(__webpack_exports__, \"stackOrderAscending\", function() { return /* reexport */ order_ascending; });\\n__webpack_require__.d(__webpack_exports__, \"stackOrderDescending\", function() { return /* reexport */ order_descending; });\\n__webpack_require__.d(__webpack_exports__, \"stackOrderInsideOut\", function() { return /* reexport */ insideOut; });\\n__webpack_require__.d(__webpack_exports__, \"stackOrderNone\", function() { return /* reexport */ order_none; });\\n__webpack_require__.d(__webpack_exports__, \"stackOrderReverse\", function() { return /* reexport */ order_reverse; });\\n__webpack_require__.d(__webpack_exports__, \"timeInterval\", function() { return /* reexport */ newInterval; });\\n__webpack_require__.d(__webpack_exports__, \"timeMillisecond\", function() { return /* reexport */ src_millisecond; });\\n__webpack_require__.d(__webpack_exports__, \"timeMilliseconds\", function() { return /* reexport */ milliseconds; });\\n__webpack_require__.d(__webpack_exports__, \"utcMillisecond\", function() { return /* reexport */ src_millisecond; });\\n__webpack_require__.d(__webpack_exports__, \"utcMilliseconds\", function() { return /* reexport */ milliseconds; });\\n__webpack_require__.d(__webpack_exports__, \"timeSecond\", function() { return /* reexport */ src_second; });\\n__webpack_require__.d(__webpack_exports__, \"timeSeconds\", function() { return /* reexport */ seconds; });\\n__webpack_require__.d(__webpack_exports__, \"utcSecond\", function() { return /* reexport */ src_second; });\\n__webpack_require__.d(__webpack_exports__, \"utcSeconds\", function() { return /* reexport */ seconds; });\\n__webpack_require__.d(__webpack_exports__, \"timeMinute\", function() { return /* reexport */ src_minute; });\\n__webpack_require__.d(__webpack_exports__, \"timeMinutes\", function() { return /* reexport */ minutes; });\\n__webpack_require__.d(__webpack_exports__, \"timeHour\", function() { return /* reexport */ src_hour; });\\n__webpack_require__.d(__webpack_exports__, \"timeHours\", function() { return /* reexport */ hours; });\\n__webpack_require__.d(__webpack_exports__, \"timeDay\", function() { return /* reexport */ src_day; });\\n__webpack_require__.d(__webpack_exports__, \"timeDays\", function() { return /* reexport */ days; });\\n__webpack_require__.d(__webpack_exports__, \"timeWeek\", function() { return /* reexport */ sunday; });\\n__webpack_require__.d(__webpack_exports__, \"timeWeeks\", function() { return /* reexport */ sundays; });\\n__webpack_require__.d(__webpack_exports__, \"timeSunday\", function() { return /* reexport */ sunday; });\\n__webpack_require__.d(__webpack_exports__, \"timeSundays\", function() { return /* reexport */ sundays; });\\n__webpack_require__.d(__webpack_exports__, \"timeMonday\", function() { return /* reexport */ monday; });\\n__webpack_require__.d(__webpack_exports__, \"timeMondays\", function() { return /* reexport */ mondays; });\\n__webpack_require__.d(__webpack_exports__, \"timeTuesday\", function() { return /* reexport */ tuesday; });\\n__webpack_require__.d(__webpack_exports__, \"timeTuesdays\", function() { return /* reexport */ tuesdays; });\\n__webpack_require__.d(__webpack_exports__, \"timeWednesday\", function() { return /* reexport */ wednesday; });\\n__webpack_require__.d(__webpack_exports__, \"timeWednesdays\", function() { return /* reexport */ wednesdays; });\\n__webpack_require__.d(__webpack_exports__, \"timeThursday\", function() { return /* reexport */ thursday; });\\n__webpack_require__.d(__webpack_exports__, \"timeThursdays\", function() { return /* reexport */ thursdays; });\\n__webpack_require__.d(__webpack_exports__, \"timeFriday\", function() { return /* reexport */ friday; });\\n__webpack_require__.d(__webpack_exports__, \"timeFridays\", function() { return /* reexport */ fridays; });\\n__webpack_require__.d(__webpack_exports__, \"timeSaturday\", function() { return /* reexport */ saturday; });\\n__webpack_require__.d(__webpack_exports__, \"timeSaturdays\", function() { return /* reexport */ saturdays; });\\n__webpack_require__.d(__webpack_exports__, \"timeMonth\", function() { return /* reexport */ src_month; });\\n__webpack_require__.d(__webpack_exports__, \"timeMonths\", function() { return /* reexport */ months; });\\n__webpack_require__.d(__webpack_exports__, \"timeYear\", function() { return /* reexport */ src_year; });\\n__webpack_require__.d(__webpack_exports__, \"timeYears\", function() { return /* reexport */ years; });\\n__webpack_require__.d(__webpack_exports__, \"utcMinute\", function() { return /* reexport */ src_utcMinute; });\\n__webpack_require__.d(__webpack_exports__, \"utcMinutes\", function() { return /* reexport */ utcMinutes; });\\n__webpack_require__.d(__webpack_exports__, \"utcHour\", function() { return /* reexport */ src_utcHour; });\\n__webpack_require__.d(__webpack_exports__, \"utcHours\", function() { return /* reexport */ utcHours; });\\n__webpack_require__.d(__webpack_exports__, \"utcDay\", function() { return /* reexport */ src_utcDay; });\\n__webpack_require__.d(__webpack_exports__, \"utcDays\", function() { return /* reexport */ utcDays; });\\n__webpack_require__.d(__webpack_exports__, \"utcWeek\", function() { return /* reexport */ utcSunday; });\\n__webpack_require__.d(__webpack_exports__, \"utcWeeks\", function() { return /* reexport */ utcSundays; });\\n__webpack_require__.d(__webpack_exports__, \"utcSunday\", function() { return /* reexport */ utcSunday; });\\n__webpack_require__.d(__webpack_exports__, \"utcSundays\", function() { return /* reexport */ utcSundays; });\\n__webpack_require__.d(__webpack_exports__, \"utcMonday\", function() { return /* reexport */ utcMonday; });\\n__webpack_require__.d(__webpack_exports__, \"utcMondays\", function() { return /* reexport */ utcMondays; });\\n__webpack_require__.d(__webpack_exports__, \"utcTuesday\", function() { return /* reexport */ utcTuesday; });\\n__webpack_require__.d(__webpack_exports__, \"utcTuesdays\", function() { return /* reexport */ utcTuesdays; });\\n__webpack_require__.d(__webpack_exports__, \"utcWednesday\", function() { return /* reexport */ utcWednesday; });\\n__webpack_require__.d(__webpack_exports__, \"utcWednesdays\", function() { return /* reexport */ utcWednesdays; });\\n__webpack_require__.d(__webpack_exports__, \"utcThursday\", function() { return /* reexport */ utcThursday; });\\n__webpack_require__.d(__webpack_exports__, \"utcThursdays\", function() { return /* reexport */ utcThursdays; });\\n__webpack_require__.d(__webpack_exports__, \"utcFriday\", function() { return /* reexport */ utcFriday; });\\n__webpack_require__.d(__webpack_exports__, \"utcFridays\", function() { return /* reexport */ utcFridays; });\\n__webpack_require__.d(__webpack_exports__, \"utcSaturday\", function() { return /* reexport */ utcSaturday; });\\n__webpack_require__.d(__webpack_exports__, \"utcSaturdays\", function() { return /* reexport */ utcSaturdays; });\\n__webpack_require__.d(__webpack_exports__, \"utcMonth\", function() { return /* reexport */ src_utcMonth; });\\n__webpack_require__.d(__webpack_exports__, \"utcMonths\", function() { return /* reexport */ utcMonths; });\\n__webpack_require__.d(__webpack_exports__, \"utcYear\", function() { return /* reexport */ src_utcYear; });\\n__webpack_require__.d(__webpack_exports__, \"utcYears\", function() { return /* reexport */ utcYears; });\\n__webpack_require__.d(__webpack_exports__, \"timeFormatDefaultLocale\", function() { return /* reexport */ defaultLocale_defaultLocale; });\\n__webpack_require__.d(__webpack_exports__, \"timeFormat\", function() { return /* reexport */ timeFormat; });\\n__webpack_require__.d(__webpack_exports__, \"timeParse\", function() { return /* reexport */ timeParse; });\\n__webpack_require__.d(__webpack_exports__, \"utcFormat\", function() { return /* reexport */ utcFormat; });\\n__webpack_require__.d(__webpack_exports__, \"utcParse\", function() { return /* reexport */ utcParse; });\\n__webpack_require__.d(__webpack_exports__, \"timeFormatLocale\", function() { return /* reexport */ formatLocale; });\\n__webpack_require__.d(__webpack_exports__, \"isoFormat\", function() { return /* reexport */ isoFormat; });\\n__webpack_require__.d(__webpack_exports__, \"isoParse\", function() { return /* reexport */ isoParse; });\\n__webpack_require__.d(__webpack_exports__, \"now\", function() { return /* reexport */ now; });\\n__webpack_require__.d(__webpack_exports__, \"timer\", function() { return /* reexport */ timer; });\\n__webpack_require__.d(__webpack_exports__, \"timerFlush\", function() { return /* reexport */ timerFlush; });\\n__webpack_require__.d(__webpack_exports__, \"timeout\", function() { return /* reexport */ src_timeout; });\\n__webpack_require__.d(__webpack_exports__, \"interval\", function() { return /* reexport */ src_interval; });\\n__webpack_require__.d(__webpack_exports__, \"transition\", function() { return /* reexport */ src_transition_transition; });\\n__webpack_require__.d(__webpack_exports__, \"active\", function() { return /* reexport */ src_active; });\\n__webpack_require__.d(__webpack_exports__, \"interrupt\", function() { return /* reexport */ interrupt; });\\n__webpack_require__.d(__webpack_exports__, \"voronoi\", function() { return /* reexport */ src_voronoi; });\\n__webpack_require__.d(__webpack_exports__, \"zoom\", function() { return /* reexport */ d3_zoom_src_zoom; });\\n__webpack_require__.d(__webpack_exports__, \"zoomTransform\", function() { return /* reexport */ transform_transform; });\\n__webpack_require__.d(__webpack_exports__, \"zoomIdentity\", function() { return /* reexport */ transform_identity; });\\n\\n// CONCATENATED MODULE: ./node_modules/d3/dist/package.js\\nvar package_name = \"d3\";\\nvar version = \"5.16.0\";\\nvar description = \"Data-Driven Documents\";\\nvar keywords = [\"dom\",\"visualization\",\"svg\",\"animation\",\"canvas\"];\\nvar homepage = \"https://d3js.org\";\\nvar license = \"BSD-3-Clause\";\\nvar author = {\"name\":\"Mike Bostock\",\"url\":\"https://bost.ocks.org/mike\"};\\nvar main = \"dist/d3.node.js\";\\nvar unpkg = \"dist/d3.min.js\";\\nvar jsdelivr = \"dist/d3.min.js\";\\nvar package_module = \"index.js\";\\nvar repository = {\"type\":\"git\",\"url\":\"https://github.com/d3/d3.git\"};\\nvar files = [\"dist/**/*.js\",\"index.js\"];\\nvar scripts = {\"pretest\":\"rimraf dist && mkdir dist && json2module package.json > dist/package.js && rollup -c\",\"test\":\"tape \\'test/**/*-test.js\\'\",\"prepublishOnly\":\"yarn test\",\"postpublish\":\"git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3/dist/d3.js d3.v5.js && cp ../d3/dist/d3.min.js d3.v5.min.js && git add d3.v5.js d3.v5.min.js && git commit -m \\\\\"d3 ${npm_package_version}\\\\\" && git push && cd - && cd ../d3-bower && git pull && cp ../d3/LICENSE ../d3/README.md ../d3/dist/d3.js ../d3/dist/d3.min.js . && git add -- LICENSE README.md d3.js d3.min.js && git commit -m \\\\\"${npm_package_version}\\\\\" && git tag -am \\\\\"${npm_package_version}\\\\\" v${npm_package_version} && git push && git push --tags && cd - && zip -j dist/d3.zip -- LICENSE README.md API.md CHANGES.md dist/d3.js dist/d3.min.js\"};\\nvar devDependencies = {\"json2module\":\"0.0\",\"rimraf\":\"2\",\"rollup\":\"1\",\"rollup-plugin-ascii\":\"0.0\",\"rollup-plugin-node-resolve\":\"3\",\"rollup-plugin-terser\":\"5\",\"tape\":\"4\"};\\nvar dependencies = {\"d3-array\":\"1\",\"d3-axis\":\"1\",\"d3-brush\":\"1\",\"d3-chord\":\"1\",\"d3-collection\":\"1\",\"d3-color\":\"1\",\"d3-contour\":\"1\",\"d3-dispatch\":\"1\",\"d3-drag\":\"1\",\"d3-dsv\":\"1\",\"d3-ease\":\"1\",\"d3-fetch\":\"1\",\"d3-force\":\"1\",\"d3-format\":\"1\",\"d3-geo\":\"1\",\"d3-hierarchy\":\"1\",\"d3-interpolate\":\"1\",\"d3-path\":\"1\",\"d3-polygon\":\"1\",\"d3-quadtree\":\"1\",\"d3-random\":\"1\",\"d3-scale\":\"2\",\"d3-scale-chromatic\":\"1\",\"d3-selection\":\"1\",\"d3-shape\":\"1\",\"d3-time\":\"1\",\"d3-time-format\":\"2\",\"d3-timer\":\"1\",\"d3-transition\":\"1\",\"d3-voronoi\":\"1\",\"d3-zoom\":\"1\"};\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/ascending.js\\n/* harmony default export */ var ascending = (function(a, b) {\\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/bisector.js\\n\\n\\n/* harmony default export */ var bisector = (function(compare) {\\n if (compare.length === 1) compare = ascendingComparator(compare);\\n return {\\n left: function(a, x, lo, hi) {\\n if (lo == null) lo = 0;\\n if (hi == null) hi = a.length;\\n while (lo < hi) {\\n var mid = lo + hi >>> 1;\\n if (compare(a[mid], x) < 0) lo = mid + 1;\\n else hi = mid;\\n }\\n return lo;\\n },\\n right: function(a, x, lo, hi) {\\n if (lo == null) lo = 0;\\n if (hi == null) hi = a.length;\\n while (lo < hi) {\\n var mid = lo + hi >>> 1;\\n if (compare(a[mid], x) > 0) hi = mid;\\n else lo = mid + 1;\\n }\\n return lo;\\n }\\n };\\n});\\n\\nfunction ascendingComparator(f) {\\n return function(d, x) {\\n return ascending(f(d), x);\\n };\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/bisect.js\\n\\n\\n\\nvar ascendingBisect = bisector(ascending);\\nvar bisectRight = ascendingBisect.right;\\nvar bisectLeft = ascendingBisect.left;\\n/* harmony default export */ var bisect = (bisectRight);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/pairs.js\\n/* harmony default export */ var pairs = (function(array, f) {\\n if (f == null) f = pair;\\n var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);\\n while (i < n) pairs[i] = f(p, p = array[++i]);\\n return pairs;\\n});\\n\\nfunction pair(a, b) {\\n return [a, b];\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/cross.js\\n\\n\\n/* harmony default export */ var cross = (function(values0, values1, reduce) {\\n var n0 = values0.length,\\n n1 = values1.length,\\n values = new Array(n0 * n1),\\n i0,\\n i1,\\n i,\\n value0;\\n\\n if (reduce == null) reduce = pair;\\n\\n for (i0 = i = 0; i0 < n0; ++i0) {\\n for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\\n values[i] = reduce(value0, values1[i1]);\\n }\\n }\\n\\n return values;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/descending.js\\n/* harmony default export */ var descending = (function(a, b) {\\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/number.js\\n/* harmony default export */ var number = (function(x) {\\n return x === null ? NaN : +x;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/variance.js\\n\\n\\n/* harmony default export */ var variance = (function(values, valueof) {\\n var n = values.length,\\n m = 0,\\n i = -1,\\n mean = 0,\\n value,\\n delta,\\n sum = 0;\\n\\n if (valueof == null) {\\n while (++i < n) {\\n if (!isNaN(value = number(values[i]))) {\\n delta = value - mean;\\n mean += delta / ++m;\\n sum += delta * (value - mean);\\n }\\n }\\n }\\n\\n else {\\n while (++i < n) {\\n if (!isNaN(value = number(valueof(values[i], i, values)))) {\\n delta = value - mean;\\n mean += delta / ++m;\\n sum += delta * (value - mean);\\n }\\n }\\n }\\n\\n if (m > 1) return sum / (m - 1);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/deviation.js\\n\\n\\n/* harmony default export */ var deviation = (function(array, f) {\\n var v = variance(array, f);\\n return v ? Math.sqrt(v) : v;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/extent.js\\n/* harmony default export */ var src_extent = (function(values, valueof) {\\n var n = values.length,\\n i = -1,\\n value,\\n min,\\n max;\\n\\n if (valueof == null) {\\n while (++i < n) { // Find the first comparable value.\\n if ((value = values[i]) != null && value >= value) {\\n min = max = value;\\n while (++i < n) { // Compare the remaining values.\\n if ((value = values[i]) != null) {\\n if (min > value) min = value;\\n if (max < value) max = value;\\n }\\n }\\n }\\n }\\n }\\n\\n else {\\n while (++i < n) { // Find the first comparable value.\\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\\n min = max = value;\\n while (++i < n) { // Compare the remaining values.\\n if ((value = valueof(values[i], i, values)) != null) {\\n if (min > value) min = value;\\n if (max < value) max = value;\\n }\\n }\\n }\\n }\\n }\\n\\n return [min, max];\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/array.js\\nvar array_array = Array.prototype;\\n\\nvar slice = array_array.slice;\\nvar map = array_array.map;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/constant.js\\n/* harmony default export */ var constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/identity.js\\n/* harmony default export */ var identity = (function(x) {\\n return x;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/range.js\\n/* harmony default export */ var src_range = (function(start, stop, step) {\\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\\n\\n var i = -1,\\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\\n range = new Array(n);\\n\\n while (++i < n) {\\n range[i] = start + i * step;\\n }\\n\\n return range;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/ticks.js\\nvar e10 = Math.sqrt(50),\\n e5 = Math.sqrt(10),\\n e2 = Math.sqrt(2);\\n\\n/* harmony default export */ var ticks = (function(start, stop, count) {\\n var reverse,\\n i = -1,\\n n,\\n ticks,\\n step;\\n\\n stop = +stop, start = +start, count = +count;\\n if (start === stop && count > 0) return [start];\\n if (reverse = stop < start) n = start, start = stop, stop = n;\\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\\n\\n if (step > 0) {\\n start = Math.ceil(start / step);\\n stop = Math.floor(stop / step);\\n ticks = new Array(n = Math.ceil(stop - start + 1));\\n while (++i < n) ticks[i] = (start + i) * step;\\n } else {\\n start = Math.floor(start * step);\\n stop = Math.ceil(stop * step);\\n ticks = new Array(n = Math.ceil(start - stop + 1));\\n while (++i < n) ticks[i] = (start - i) / step;\\n }\\n\\n if (reverse) ticks.reverse();\\n\\n return ticks;\\n});\\n\\nfunction tickIncrement(start, stop, count) {\\n var step = (stop - start) / Math.max(0, count),\\n power = Math.floor(Math.log(step) / Math.LN10),\\n error = step / Math.pow(10, power);\\n return power >= 0\\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\\n}\\n\\nfunction tickStep(start, stop, count) {\\n var step0 = Math.abs(stop - start) / Math.max(0, count),\\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\\n error = step0 / step1;\\n if (error >= e10) step1 *= 10;\\n else if (error >= e5) step1 *= 5;\\n else if (error >= e2) step1 *= 2;\\n return stop < start ? -step1 : step1;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/threshold/sturges.js\\n/* harmony default export */ var sturges = (function(values) {\\n return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/histogram.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/* harmony default export */ var src_histogram = (function() {\\n var value = identity,\\n domain = src_extent,\\n threshold = sturges;\\n\\n function histogram(data) {\\n var i,\\n n = data.length,\\n x,\\n values = new Array(n);\\n\\n for (i = 0; i < n; ++i) {\\n values[i] = value(data[i], i, data);\\n }\\n\\n var xz = domain(values),\\n x0 = xz[0],\\n x1 = xz[1],\\n tz = threshold(values, x0, x1);\\n\\n // Convert number of thresholds into uniform thresholds.\\n if (!Array.isArray(tz)) {\\n tz = tickStep(x0, x1, tz);\\n tz = src_range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive\\n }\\n\\n // Remove any thresholds outside the domain.\\n var m = tz.length;\\n while (tz[0] <= x0) tz.shift(), --m;\\n while (tz[m - 1] > x1) tz.pop(), --m;\\n\\n var bins = new Array(m + 1),\\n bin;\\n\\n // Initialize bins.\\n for (i = 0; i <= m; ++i) {\\n bin = bins[i] = [];\\n bin.x0 = i > 0 ? tz[i - 1] : x0;\\n bin.x1 = i < m ? tz[i] : x1;\\n }\\n\\n // Assign data to bins by value, ignoring any outside the domain.\\n for (i = 0; i < n; ++i) {\\n x = values[i];\\n if (x0 <= x && x <= x1) {\\n bins[bisect(tz, x, 0, m)].push(data[i]);\\n }\\n }\\n\\n return bins;\\n }\\n\\n histogram.value = function(_) {\\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(_), histogram) : value;\\n };\\n\\n histogram.domain = function(_) {\\n return arguments.length ? (domain = typeof _ === \"function\" ? _ : constant([_[0], _[1]]), histogram) : domain;\\n };\\n\\n histogram.thresholds = function(_) {\\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;\\n };\\n\\n return histogram;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/quantile.js\\n\\n\\n/* harmony default export */ var quantile = (function(values, p, valueof) {\\n if (valueof == null) valueof = number;\\n if (!(n = values.length)) return;\\n if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\\n if (p >= 1) return +valueof(values[n - 1], n - 1, values);\\n var n,\\n i = (n - 1) * p,\\n i0 = Math.floor(i),\\n value0 = +valueof(values[i0], i0, values),\\n value1 = +valueof(values[i0 + 1], i0 + 1, values);\\n return value0 + (value1 - value0) * (i - i0);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/threshold/freedmanDiaconis.js\\n\\n\\n\\n\\n\\n/* harmony default export */ var freedmanDiaconis = (function(values, min, max) {\\n values = map.call(values, number).sort(ascending);\\n return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/threshold/scott.js\\n\\n\\n/* harmony default export */ var scott = (function(values, min, max) {\\n return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/max.js\\n/* harmony default export */ var src_max = (function(values, valueof) {\\n var n = values.length,\\n i = -1,\\n value,\\n max;\\n\\n if (valueof == null) {\\n while (++i < n) { // Find the first comparable value.\\n if ((value = values[i]) != null && value >= value) {\\n max = value;\\n while (++i < n) { // Compare the remaining values.\\n if ((value = values[i]) != null && value > max) {\\n max = value;\\n }\\n }\\n }\\n }\\n }\\n\\n else {\\n while (++i < n) { // Find the first comparable value.\\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\\n max = value;\\n while (++i < n) { // Compare the remaining values.\\n if ((value = valueof(values[i], i, values)) != null && value > max) {\\n max = value;\\n }\\n }\\n }\\n }\\n }\\n\\n return max;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/mean.js\\n\\n\\n/* harmony default export */ var src_mean = (function(values, valueof) {\\n var n = values.length,\\n m = n,\\n i = -1,\\n value,\\n sum = 0;\\n\\n if (valueof == null) {\\n while (++i < n) {\\n if (!isNaN(value = number(values[i]))) sum += value;\\n else --m;\\n }\\n }\\n\\n else {\\n while (++i < n) {\\n if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;\\n else --m;\\n }\\n }\\n\\n if (m) return sum / m;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/median.js\\n\\n\\n\\n\\n/* harmony default export */ var median = (function(values, valueof) {\\n var n = values.length,\\n i = -1,\\n value,\\n numbers = [];\\n\\n if (valueof == null) {\\n while (++i < n) {\\n if (!isNaN(value = number(values[i]))) {\\n numbers.push(value);\\n }\\n }\\n }\\n\\n else {\\n while (++i < n) {\\n if (!isNaN(value = number(valueof(values[i], i, values)))) {\\n numbers.push(value);\\n }\\n }\\n }\\n\\n return quantile(numbers.sort(ascending), 0.5);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/merge.js\\n/* harmony default export */ var src_merge = (function(arrays) {\\n var n = arrays.length,\\n m,\\n i = -1,\\n j = 0,\\n merged,\\n array;\\n\\n while (++i < n) j += arrays[i].length;\\n merged = new Array(j);\\n\\n while (--n >= 0) {\\n array = arrays[n];\\n m = array.length;\\n while (--m >= 0) {\\n merged[--j] = array[m];\\n }\\n }\\n\\n return merged;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/min.js\\n/* harmony default export */ var src_min = (function(values, valueof) {\\n var n = values.length,\\n i = -1,\\n value,\\n min;\\n\\n if (valueof == null) {\\n while (++i < n) { // Find the first comparable value.\\n if ((value = values[i]) != null && value >= value) {\\n min = value;\\n while (++i < n) { // Compare the remaining values.\\n if ((value = values[i]) != null && min > value) {\\n min = value;\\n }\\n }\\n }\\n }\\n }\\n\\n else {\\n while (++i < n) { // Find the first comparable value.\\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\\n min = value;\\n while (++i < n) { // Compare the remaining values.\\n if ((value = valueof(values[i], i, values)) != null && min > value) {\\n min = value;\\n }\\n }\\n }\\n }\\n }\\n\\n return min;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/permute.js\\n/* harmony default export */ var permute = (function(array, indexes) {\\n var i = indexes.length, permutes = new Array(i);\\n while (i--) permutes[i] = array[indexes[i]];\\n return permutes;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/scan.js\\n\\n\\n/* harmony default export */ var scan = (function(values, compare) {\\n if (!(n = values.length)) return;\\n var n,\\n i = 0,\\n j = 0,\\n xi,\\n xj = values[j];\\n\\n if (compare == null) compare = ascending;\\n\\n while (++i < n) {\\n if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {\\n xj = xi, j = i;\\n }\\n }\\n\\n if (compare(xj, xj) === 0) return j;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/shuffle.js\\n/* harmony default export */ var shuffle = (function(array, i0, i1) {\\n var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),\\n t,\\n i;\\n\\n while (m) {\\n i = Math.random() * m-- | 0;\\n t = array[m + i0];\\n array[m + i0] = array[i + i0];\\n array[i + i0] = t;\\n }\\n\\n return array;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/sum.js\\n/* harmony default export */ var src_sum = (function(values, valueof) {\\n var n = values.length,\\n i = -1,\\n value,\\n sum = 0;\\n\\n if (valueof == null) {\\n while (++i < n) {\\n if (value = +values[i]) sum += value; // Note: zero and null are equivalent.\\n }\\n }\\n\\n else {\\n while (++i < n) {\\n if (value = +valueof(values[i], i, values)) sum += value;\\n }\\n }\\n\\n return sum;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/transpose.js\\n\\n\\n/* harmony default export */ var src_transpose = (function(matrix) {\\n if (!(n = matrix.length)) return [];\\n for (var i = -1, m = src_min(matrix, transpose_length), transpose = new Array(m); ++i < m;) {\\n for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\\n row[j] = matrix[j][i];\\n }\\n }\\n return transpose;\\n});\\n\\nfunction transpose_length(d) {\\n return d.length;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/zip.js\\n\\n\\n/* harmony default export */ var zip = (function() {\\n return src_transpose(arguments);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-array/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-axis/src/array.js\\nvar array_slice = Array.prototype.slice;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-axis/src/identity.js\\n/* harmony default export */ var src_identity = (function(x) {\\n return x;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-axis/src/axis.js\\n\\n\\n\\nvar axis_top = 1,\\n axis_right = 2,\\n axis_bottom = 3,\\n axis_left = 4,\\n epsilon = 1e-6;\\n\\nfunction translateX(x) {\\n return \"translate(\" + (x + 0.5) + \",0)\";\\n}\\n\\nfunction translateY(y) {\\n return \"translate(0,\" + (y + 0.5) + \")\";\\n}\\n\\nfunction axis_number(scale) {\\n return function(d) {\\n return +scale(d);\\n };\\n}\\n\\nfunction axis_center(scale) {\\n var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.\\n if (scale.round()) offset = Math.round(offset);\\n return function(d) {\\n return +scale(d) + offset;\\n };\\n}\\n\\nfunction entering() {\\n return !this.__axis;\\n}\\n\\nfunction axis_axis(orient, scale) {\\n var tickArguments = [],\\n tickValues = null,\\n tickFormat = null,\\n tickSizeInner = 6,\\n tickSizeOuter = 6,\\n tickPadding = 3,\\n k = orient === axis_top || orient === axis_left ? -1 : 1,\\n x = orient === axis_left || orient === axis_right ? \"x\" : \"y\",\\n transform = orient === axis_top || orient === axis_bottom ? translateX : translateY;\\n\\n function axis(context) {\\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : src_identity) : tickFormat,\\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\\n range = scale.range(),\\n range0 = +range[0] + 0.5,\\n range1 = +range[range.length - 1] + 0.5,\\n position = (scale.bandwidth ? axis_center : axis_number)(scale.copy()),\\n selection = context.selection ? context.selection() : context,\\n path = selection.selectAll(\".domain\").data([null]),\\n tick = selection.selectAll(\".tick\").data(values, scale).order(),\\n tickExit = tick.exit(),\\n tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\\n line = tick.select(\"line\"),\\n text = tick.select(\"text\");\\n\\n path = path.merge(path.enter().insert(\"path\", \".tick\")\\n .attr(\"class\", \"domain\")\\n .attr(\"stroke\", \"currentColor\"));\\n\\n tick = tick.merge(tickEnter);\\n\\n line = line.merge(tickEnter.append(\"line\")\\n .attr(\"stroke\", \"currentColor\")\\n .attr(x + \"2\", k * tickSizeInner));\\n\\n text = text.merge(tickEnter.append(\"text\")\\n .attr(\"fill\", \"currentColor\")\\n .attr(x, k * spacing)\\n .attr(\"dy\", orient === axis_top ? \"0em\" : orient === axis_bottom ? \"0.71em\" : \"0.32em\"));\\n\\n if (context !== selection) {\\n path = path.transition(context);\\n tick = tick.transition(context);\\n line = line.transition(context);\\n text = text.transition(context);\\n\\n tickExit = tickExit.transition(context)\\n .attr(\"opacity\", epsilon)\\n .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute(\"transform\"); });\\n\\n tickEnter\\n .attr(\"opacity\", epsilon)\\n .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });\\n }\\n\\n tickExit.remove();\\n\\n path\\n .attr(\"d\", orient === axis_left || orient == axis_right\\n ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H0.5V\" + range1 + \"H\" + k * tickSizeOuter : \"M0.5,\" + range0 + \"V\" + range1)\\n : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V0.5H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",0.5H\" + range1));\\n\\n tick\\n .attr(\"opacity\", 1)\\n .attr(\"transform\", function(d) { return transform(position(d)); });\\n\\n line\\n .attr(x + \"2\", k * tickSizeInner);\\n\\n text\\n .attr(x, k * spacing)\\n .text(format);\\n\\n selection.filter(entering)\\n .attr(\"fill\", \"none\")\\n .attr(\"font-size\", 10)\\n .attr(\"font-family\", \"sans-serif\")\\n .attr(\"text-anchor\", orient === axis_right ? \"start\" : orient === axis_left ? \"end\" : \"middle\");\\n\\n selection\\n .each(function() { this.__axis = position; });\\n }\\n\\n axis.scale = function(_) {\\n return arguments.length ? (scale = _, axis) : scale;\\n };\\n\\n axis.ticks = function() {\\n return tickArguments = array_slice.call(arguments), axis;\\n };\\n\\n axis.tickArguments = function(_) {\\n return arguments.length ? (tickArguments = _ == null ? [] : array_slice.call(_), axis) : tickArguments.slice();\\n };\\n\\n axis.tickValues = function(_) {\\n return arguments.length ? (tickValues = _ == null ? null : array_slice.call(_), axis) : tickValues && tickValues.slice();\\n };\\n\\n axis.tickFormat = function(_) {\\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\\n };\\n\\n axis.tickSize = function(_) {\\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\\n };\\n\\n axis.tickSizeInner = function(_) {\\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\\n };\\n\\n axis.tickSizeOuter = function(_) {\\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\\n };\\n\\n axis.tickPadding = function(_) {\\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\\n };\\n\\n return axis;\\n}\\n\\nfunction axisTop(scale) {\\n return axis_axis(axis_top, scale);\\n}\\n\\nfunction axisRight(scale) {\\n return axis_axis(axis_right, scale);\\n}\\n\\nfunction axisBottom(scale) {\\n return axis_axis(axis_bottom, scale);\\n}\\n\\nfunction axisLeft(scale) {\\n return axis_axis(axis_left, scale);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-axis/src/index.js\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-dispatch/src/dispatch.js\\nvar noop = {value: function() {}};\\n\\nfunction dispatch() {\\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\\n _[t] = [];\\n }\\n return new Dispatch(_);\\n}\\n\\nfunction Dispatch(_) {\\n this._ = _;\\n}\\n\\nfunction parseTypenames(typenames, types) {\\n return typenames.trim().split(/^|\\\\s+/).map(function(t) {\\n var name = \"\", i = t.indexOf(\".\");\\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\\n return {type: t, name: name};\\n });\\n}\\n\\nDispatch.prototype = dispatch.prototype = {\\n constructor: Dispatch,\\n on: function(typename, callback) {\\n var _ = this._,\\n T = parseTypenames(typename + \"\", _),\\n t,\\n i = -1,\\n n = T.length;\\n\\n // If no callback was specified, return the callback of the given type and name.\\n if (arguments.length < 2) {\\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\\n return;\\n }\\n\\n // If a type was specified, set the callback for the given type and name.\\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\\n while (++i < n) {\\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\\n }\\n\\n return this;\\n },\\n copy: function() {\\n var copy = {}, _ = this._;\\n for (var t in _) copy[t] = _[t].slice();\\n return new Dispatch(copy);\\n },\\n call: function(type, that) {\\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\\n },\\n apply: function(type, that, args) {\\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\\n }\\n};\\n\\nfunction get(type, name) {\\n for (var i = 0, n = type.length, c; i < n; ++i) {\\n if ((c = type[i]).name === name) {\\n return c.value;\\n }\\n }\\n}\\n\\nfunction set(type, name, callback) {\\n for (var i = 0, n = type.length; i < n; ++i) {\\n if (type[i].name === name) {\\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\\n break;\\n }\\n }\\n if (callback != null) type.push({name: name, value: callback});\\n return type;\\n}\\n\\n/* harmony default export */ var src_dispatch = (dispatch);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selector.js\\nfunction none() {}\\n\\n/* harmony default export */ var src_selector = (function(selector) {\\n return selector == null ? none : function() {\\n return this.querySelector(selector);\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/select.js\\n\\n\\n\\n/* harmony default export */ var selection_select = (function(select) {\\n if (typeof select !== \"function\") select = src_selector(select);\\n\\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\\n subgroup[i] = subnode;\\n }\\n }\\n }\\n\\n return new Selection(subgroups, this._parents);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selectorAll.js\\nfunction selectorAll_empty() {\\n return [];\\n}\\n\\n/* harmony default export */ var selectorAll = (function(selector) {\\n return selector == null ? selectorAll_empty : function() {\\n return this.querySelectorAll(selector);\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/selectAll.js\\n\\n\\n\\n/* harmony default export */ var selectAll = (function(select) {\\n if (typeof select !== \"function\") select = selectorAll(select);\\n\\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\\n if (node = group[i]) {\\n subgroups.push(select.call(node, node.__data__, i, group));\\n parents.push(node);\\n }\\n }\\n }\\n\\n return new Selection(subgroups, parents);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/matcher.js\\n/* harmony default export */ var matcher = (function(selector) {\\n return function() {\\n return this.matches(selector);\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/filter.js\\n\\n\\n\\n/* harmony default export */ var selection_filter = (function(match) {\\n if (typeof match !== \"function\") match = matcher(match);\\n\\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\\n subgroup.push(node);\\n }\\n }\\n }\\n\\n return new Selection(subgroups, this._parents);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/sparse.js\\n/* harmony default export */ var sparse = (function(update) {\\n return new Array(update.length);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/enter.js\\n\\n\\n\\n/* harmony default export */ var selection_enter = (function() {\\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\\n});\\n\\nfunction EnterNode(parent, datum) {\\n this.ownerDocument = parent.ownerDocument;\\n this.namespaceURI = parent.namespaceURI;\\n this._next = null;\\n this._parent = parent;\\n this.__data__ = datum;\\n}\\n\\nEnterNode.prototype = {\\n constructor: EnterNode,\\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\\n querySelector: function(selector) { return this._parent.querySelector(selector); },\\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\\n};\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/constant.js\\n/* harmony default export */ var src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/data.js\\n\\n\\n\\n\\nvar keyPrefix = \"$\"; // Protect against keys like “__proto__”.\\n\\nfunction bindIndex(parent, group, enter, update, exit, data) {\\n var i = 0,\\n node,\\n groupLength = group.length,\\n dataLength = data.length;\\n\\n // Put any non-null nodes that fit into update.\\n // Put any null nodes into enter.\\n // Put any remaining data into enter.\\n for (; i < dataLength; ++i) {\\n if (node = group[i]) {\\n node.__data__ = data[i];\\n update[i] = node;\\n } else {\\n enter[i] = new EnterNode(parent, data[i]);\\n }\\n }\\n\\n // Put any non-null nodes that dont fit into exit.\\n for (; i < groupLength; ++i) {\\n if (node = group[i]) {\\n exit[i] = node;\\n }\\n }\\n}\\n\\nfunction bindKey(parent, group, enter, update, exit, data, key) {\\n var i,\\n node,\\n nodeByKeyValue = {},\\n groupLength = group.length,\\n dataLength = data.length,\\n keyValues = new Array(groupLength),\\n keyValue;\\n\\n // Compute the key for each node.\\n // If multiple nodes have the same key, the duplicates are added to exit.\\n for (i = 0; i < groupLength; ++i) {\\n if (node = group[i]) {\\n keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);\\n if (keyValue in nodeByKeyValue) {\\n exit[i] = node;\\n } else {\\n nodeByKeyValue[keyValue] = node;\\n }\\n }\\n }\\n\\n // Compute the key for each datum.\\n // If there a node associated with this key, join and add it to update.\\n // If there is not (or the key is a duplicate), add it to enter.\\n for (i = 0; i < dataLength; ++i) {\\n keyValue = keyPrefix + key.call(parent, data[i], i, data);\\n if (node = nodeByKeyValue[keyValue]) {\\n update[i] = node;\\n node.__data__ = data[i];\\n nodeByKeyValue[keyValue] = null;\\n } else {\\n enter[i] = new EnterNode(parent, data[i]);\\n }\\n }\\n\\n // Add any remaining nodes that were not bound to data to exit.\\n for (i = 0; i < groupLength; ++i) {\\n if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {\\n exit[i] = node;\\n }\\n }\\n}\\n\\n/* harmony default export */ var selection_data = (function(value, key) {\\n if (!value) {\\n data = new Array(this.size()), j = -1;\\n this.each(function(d) { data[++j] = d; });\\n return data;\\n }\\n\\n var bind = key ? bindKey : bindIndex,\\n parents = this._parents,\\n groups = this._groups;\\n\\n if (typeof value !== \"function\") value = src_constant(value);\\n\\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\\n var parent = parents[j],\\n group = groups[j],\\n groupLength = group.length,\\n data = value.call(parent, parent && parent.__data__, j, parents),\\n dataLength = data.length,\\n enterGroup = enter[j] = new Array(dataLength),\\n updateGroup = update[j] = new Array(dataLength),\\n exitGroup = exit[j] = new Array(groupLength);\\n\\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\\n\\n // Now connect the enter nodes to their following update node, such that\\n // appendChild can insert the materialized enter node before this node,\\n // rather than at the end of the parent node.\\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\\n if (previous = enterGroup[i0]) {\\n if (i0 >= i1) i1 = i0 + 1;\\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\\n previous._next = next || null;\\n }\\n }\\n }\\n\\n update = new Selection(update, parents);\\n update._enter = enter;\\n update._exit = exit;\\n return update;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/exit.js\\n\\n\\n\\n/* harmony default export */ var selection_exit = (function() {\\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/join.js\\n/* harmony default export */ var join = (function(onenter, onupdate, onexit) {\\n var enter = this.enter(), update = this, exit = this.exit();\\n enter = typeof onenter === \"function\" ? onenter(enter) : enter.append(onenter + \"\");\\n if (onupdate != null) update = onupdate(update);\\n if (onexit == null) exit.remove(); else onexit(exit);\\n return enter && update ? enter.merge(update).order() : update;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/merge.js\\n\\n\\n/* harmony default export */ var selection_merge = (function(selection) {\\n\\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\\n if (node = group0[i] || group1[i]) {\\n merge[i] = node;\\n }\\n }\\n }\\n\\n for (; j < m0; ++j) {\\n merges[j] = groups0[j];\\n }\\n\\n return new Selection(merges, this._parents);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/order.js\\n/* harmony default export */ var selection_order = (function() {\\n\\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\\n if (node = group[i]) {\\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\\n next = node;\\n }\\n }\\n }\\n\\n return this;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/sort.js\\n\\n\\n/* harmony default export */ var selection_sort = (function(compare) {\\n if (!compare) compare = sort_ascending;\\n\\n function compareNode(a, b) {\\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\\n }\\n\\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\\n if (node = group[i]) {\\n sortgroup[i] = node;\\n }\\n }\\n sortgroup.sort(compareNode);\\n }\\n\\n return new Selection(sortgroups, this._parents).order();\\n});\\n\\nfunction sort_ascending(a, b) {\\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/call.js\\n/* harmony default export */ var call = (function() {\\n var callback = arguments[0];\\n arguments[0] = this;\\n callback.apply(null, arguments);\\n return this;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/nodes.js\\n/* harmony default export */ var selection_nodes = (function() {\\n var nodes = new Array(this.size()), i = -1;\\n this.each(function() { nodes[++i] = this; });\\n return nodes;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/node.js\\n/* harmony default export */ var selection_node = (function() {\\n\\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\\n var node = group[i];\\n if (node) return node;\\n }\\n }\\n\\n return null;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/size.js\\n/* harmony default export */ var selection_size = (function() {\\n var size = 0;\\n this.each(function() { ++size; });\\n return size;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/empty.js\\n/* harmony default export */ var selection_empty = (function() {\\n return !this.node();\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/each.js\\n/* harmony default export */ var each = (function(callback) {\\n\\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\\n if (node = group[i]) callback.call(node, node.__data__, i, group);\\n }\\n }\\n\\n return this;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/namespaces.js\\nvar xhtml = \"http://www.w3.org/1999/xhtml\";\\n\\n/* harmony default export */ var namespaces = ({\\n svg: \"http://www.w3.org/2000/svg\",\\n xhtml: xhtml,\\n xlink: \"http://www.w3.org/1999/xlink\",\\n xml: \"http://www.w3.org/XML/1998/namespace\",\\n xmlns: \"http://www.w3.org/2000/xmlns/\"\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/namespace.js\\n\\n\\n/* harmony default export */ var namespace = (function(name) {\\n var prefix = name += \"\", i = prefix.indexOf(\":\");\\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/attr.js\\n\\n\\nfunction attrRemove(name) {\\n return function() {\\n this.removeAttribute(name);\\n };\\n}\\n\\nfunction attrRemoveNS(fullname) {\\n return function() {\\n this.removeAttributeNS(fullname.space, fullname.local);\\n };\\n}\\n\\nfunction attrConstant(name, value) {\\n return function() {\\n this.setAttribute(name, value);\\n };\\n}\\n\\nfunction attrConstantNS(fullname, value) {\\n return function() {\\n this.setAttributeNS(fullname.space, fullname.local, value);\\n };\\n}\\n\\nfunction attrFunction(name, value) {\\n return function() {\\n var v = value.apply(this, arguments);\\n if (v == null) this.removeAttribute(name);\\n else this.setAttribute(name, v);\\n };\\n}\\n\\nfunction attrFunctionNS(fullname, value) {\\n return function() {\\n var v = value.apply(this, arguments);\\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\\n else this.setAttributeNS(fullname.space, fullname.local, v);\\n };\\n}\\n\\n/* harmony default export */ var attr = (function(name, value) {\\n var fullname = namespace(name);\\n\\n if (arguments.length < 2) {\\n var node = this.node();\\n return fullname.local\\n ? node.getAttributeNS(fullname.space, fullname.local)\\n : node.getAttribute(fullname);\\n }\\n\\n return this.each((value == null\\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\\n ? (fullname.local ? attrFunctionNS : attrFunction)\\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/window.js\\n/* harmony default export */ var src_window = (function(node) {\\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\\n || (node.document && node) // node is a Window\\n || node.defaultView; // node is a Document\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/style.js\\n\\n\\nfunction styleRemove(name) {\\n return function() {\\n this.style.removeProperty(name);\\n };\\n}\\n\\nfunction styleConstant(name, value, priority) {\\n return function() {\\n this.style.setProperty(name, value, priority);\\n };\\n}\\n\\nfunction styleFunction(name, value, priority) {\\n return function() {\\n var v = value.apply(this, arguments);\\n if (v == null) this.style.removeProperty(name);\\n else this.style.setProperty(name, v, priority);\\n };\\n}\\n\\n/* harmony default export */ var style = (function(name, value, priority) {\\n return arguments.length > 1\\n ? this.each((value == null\\n ? styleRemove : typeof value === \"function\"\\n ? styleFunction\\n : styleConstant)(name, value, priority == null ? \"\" : priority))\\n : styleValue(this.node(), name);\\n});\\n\\nfunction styleValue(node, name) {\\n return node.style.getPropertyValue(name)\\n || src_window(node).getComputedStyle(node, null).getPropertyValue(name);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/property.js\\nfunction propertyRemove(name) {\\n return function() {\\n delete this[name];\\n };\\n}\\n\\nfunction propertyConstant(name, value) {\\n return function() {\\n this[name] = value;\\n };\\n}\\n\\nfunction propertyFunction(name, value) {\\n return function() {\\n var v = value.apply(this, arguments);\\n if (v == null) delete this[name];\\n else this[name] = v;\\n };\\n}\\n\\n/* harmony default export */ var property = (function(name, value) {\\n return arguments.length > 1\\n ? this.each((value == null\\n ? propertyRemove : typeof value === \"function\"\\n ? propertyFunction\\n : propertyConstant)(name, value))\\n : this.node()[name];\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/classed.js\\nfunction classArray(string) {\\n return string.trim().split(/^|\\\\s+/);\\n}\\n\\nfunction classList(node) {\\n return node.classList || new ClassList(node);\\n}\\n\\nfunction ClassList(node) {\\n this._node = node;\\n this._names = classArray(node.getAttribute(\"class\") || \"\");\\n}\\n\\nClassList.prototype = {\\n add: function(name) {\\n var i = this._names.indexOf(name);\\n if (i < 0) {\\n this._names.push(name);\\n this._node.setAttribute(\"class\", this._names.join(\" \"));\\n }\\n },\\n remove: function(name) {\\n var i = this._names.indexOf(name);\\n if (i >= 0) {\\n this._names.splice(i, 1);\\n this._node.setAttribute(\"class\", this._names.join(\" \"));\\n }\\n },\\n contains: function(name) {\\n return this._names.indexOf(name) >= 0;\\n }\\n};\\n\\nfunction classedAdd(node, names) {\\n var list = classList(node), i = -1, n = names.length;\\n while (++i < n) list.add(names[i]);\\n}\\n\\nfunction classedRemove(node, names) {\\n var list = classList(node), i = -1, n = names.length;\\n while (++i < n) list.remove(names[i]);\\n}\\n\\nfunction classedTrue(names) {\\n return function() {\\n classedAdd(this, names);\\n };\\n}\\n\\nfunction classedFalse(names) {\\n return function() {\\n classedRemove(this, names);\\n };\\n}\\n\\nfunction classedFunction(names, value) {\\n return function() {\\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\\n };\\n}\\n\\n/* harmony default export */ var classed = (function(name, value) {\\n var names = classArray(name + \"\");\\n\\n if (arguments.length < 2) {\\n var list = classList(this.node()), i = -1, n = names.length;\\n while (++i < n) if (!list.contains(names[i])) return false;\\n return true;\\n }\\n\\n return this.each((typeof value === \"function\"\\n ? classedFunction : value\\n ? classedTrue\\n : classedFalse)(names, value));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/text.js\\nfunction textRemove() {\\n this.textContent = \"\";\\n}\\n\\nfunction textConstant(value) {\\n return function() {\\n this.textContent = value;\\n };\\n}\\n\\nfunction textFunction(value) {\\n return function() {\\n var v = value.apply(this, arguments);\\n this.textContent = v == null ? \"\" : v;\\n };\\n}\\n\\n/* harmony default export */ var selection_text = (function(value) {\\n return arguments.length\\n ? this.each(value == null\\n ? textRemove : (typeof value === \"function\"\\n ? textFunction\\n : textConstant)(value))\\n : this.node().textContent;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/html.js\\nfunction htmlRemove() {\\n this.innerHTML = \"\";\\n}\\n\\nfunction htmlConstant(value) {\\n return function() {\\n this.innerHTML = value;\\n };\\n}\\n\\nfunction htmlFunction(value) {\\n return function() {\\n var v = value.apply(this, arguments);\\n this.innerHTML = v == null ? \"\" : v;\\n };\\n}\\n\\n/* harmony default export */ var html = (function(value) {\\n return arguments.length\\n ? this.each(value == null\\n ? htmlRemove : (typeof value === \"function\"\\n ? htmlFunction\\n : htmlConstant)(value))\\n : this.node().innerHTML;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/raise.js\\nfunction raise() {\\n if (this.nextSibling) this.parentNode.appendChild(this);\\n}\\n\\n/* harmony default export */ var selection_raise = (function() {\\n return this.each(raise);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/lower.js\\nfunction lower() {\\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\\n}\\n\\n/* harmony default export */ var selection_lower = (function() {\\n return this.each(lower);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/creator.js\\n\\n\\n\\nfunction creatorInherit(name) {\\n return function() {\\n var document = this.ownerDocument,\\n uri = this.namespaceURI;\\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\\n ? document.createElement(name)\\n : document.createElementNS(uri, name);\\n };\\n}\\n\\nfunction creatorFixed(fullname) {\\n return function() {\\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\\n };\\n}\\n\\n/* harmony default export */ var creator = (function(name) {\\n var fullname = namespace(name);\\n return (fullname.local\\n ? creatorFixed\\n : creatorInherit)(fullname);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/append.js\\n\\n\\n/* harmony default export */ var append = (function(name) {\\n var create = typeof name === \"function\" ? name : creator(name);\\n return this.select(function() {\\n return this.appendChild(create.apply(this, arguments));\\n });\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/insert.js\\n\\n\\n\\nfunction constantNull() {\\n return null;\\n}\\n\\n/* harmony default export */ var insert = (function(name, before) {\\n var create = typeof name === \"function\" ? name : creator(name),\\n select = before == null ? constantNull : typeof before === \"function\" ? before : src_selector(before);\\n return this.select(function() {\\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\\n });\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/remove.js\\nfunction remove_remove() {\\n var parent = this.parentNode;\\n if (parent) parent.removeChild(this);\\n}\\n\\n/* harmony default export */ var selection_remove = (function() {\\n return this.each(remove_remove);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/clone.js\\nfunction selection_cloneShallow() {\\n var clone = this.cloneNode(false), parent = this.parentNode;\\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\\n}\\n\\nfunction selection_cloneDeep() {\\n var clone = this.cloneNode(true), parent = this.parentNode;\\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\\n}\\n\\n/* harmony default export */ var clone = (function(deep) {\\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/datum.js\\n/* harmony default export */ var datum = (function(value) {\\n return arguments.length\\n ? this.property(\"__data__\", value)\\n : this.node().__data__;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/on.js\\nvar filterEvents = {};\\n\\nvar on_event = null;\\n\\nif (typeof document !== \"undefined\") {\\n var on_element = document.documentElement;\\n if (!(\"onmouseenter\" in on_element)) {\\n filterEvents = {mouseenter: \"mouseover\", mouseleave: \"mouseout\"};\\n }\\n}\\n\\nfunction filterContextListener(listener, index, group) {\\n listener = contextListener(listener, index, group);\\n return function(event) {\\n var related = event.relatedTarget;\\n if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {\\n listener.call(this, event);\\n }\\n };\\n}\\n\\nfunction contextListener(listener, index, group) {\\n return function(event1) {\\n var event0 = on_event; // Events can be reentrant (e.g., focus).\\n on_event = event1;\\n try {\\n listener.call(this, this.__data__, index, group);\\n } finally {\\n on_event = event0;\\n }\\n };\\n}\\n\\nfunction on_parseTypenames(typenames) {\\n return typenames.trim().split(/^|\\\\s+/).map(function(t) {\\n var name = \"\", i = t.indexOf(\".\");\\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\\n return {type: t, name: name};\\n });\\n}\\n\\nfunction onRemove(typename) {\\n return function() {\\n var on = this.__on;\\n if (!on) return;\\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\\n this.removeEventListener(o.type, o.listener, o.capture);\\n } else {\\n on[++i] = o;\\n }\\n }\\n if (++i) on.length = i;\\n else delete this.__on;\\n };\\n}\\n\\nfunction onAdd(typename, value, capture) {\\n var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;\\n return function(d, i, group) {\\n var on = this.__on, o, listener = wrap(value, i, group);\\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\\n this.removeEventListener(o.type, o.listener, o.capture);\\n this.addEventListener(o.type, o.listener = listener, o.capture = capture);\\n o.value = value;\\n return;\\n }\\n }\\n this.addEventListener(typename.type, listener, capture);\\n o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};\\n if (!on) this.__on = [o];\\n else on.push(o);\\n };\\n}\\n\\n/* harmony default export */ var selection_on = (function(typename, value, capture) {\\n var typenames = on_parseTypenames(typename + \"\"), i, n = typenames.length, t;\\n\\n if (arguments.length < 2) {\\n var on = this.node().__on;\\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\\n for (i = 0, o = on[j]; i < n; ++i) {\\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\\n return o.value;\\n }\\n }\\n }\\n return;\\n }\\n\\n on = value ? onAdd : onRemove;\\n if (capture == null) capture = false;\\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));\\n return this;\\n});\\n\\nfunction customEvent(event1, listener, that, args) {\\n var event0 = on_event;\\n event1.sourceEvent = on_event;\\n on_event = event1;\\n try {\\n return listener.apply(that, args);\\n } finally {\\n on_event = event0;\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/dispatch.js\\n\\n\\nfunction dispatchEvent(node, type, params) {\\n var window = src_window(node),\\n event = window.CustomEvent;\\n\\n if (typeof event === \"function\") {\\n event = new event(type, params);\\n } else {\\n event = window.document.createEvent(\"Event\");\\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\\n else event.initEvent(type, false, false);\\n }\\n\\n node.dispatchEvent(event);\\n}\\n\\nfunction dispatchConstant(type, params) {\\n return function() {\\n return dispatchEvent(this, type, params);\\n };\\n}\\n\\nfunction dispatchFunction(type, params) {\\n return function() {\\n return dispatchEvent(this, type, params.apply(this, arguments));\\n };\\n}\\n\\n/* harmony default export */ var selection_dispatch = (function(type, params) {\\n return this.each((typeof params === \"function\"\\n ? dispatchFunction\\n : dispatchConstant)(type, params));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selection/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nvar selection_root = [null];\\n\\nfunction Selection(groups, parents) {\\n this._groups = groups;\\n this._parents = parents;\\n}\\n\\nfunction selection_selection() {\\n return new Selection([[document.documentElement]], selection_root);\\n}\\n\\nSelection.prototype = selection_selection.prototype = {\\n constructor: Selection,\\n select: selection_select,\\n selectAll: selectAll,\\n filter: selection_filter,\\n data: selection_data,\\n enter: selection_enter,\\n exit: selection_exit,\\n join: join,\\n merge: selection_merge,\\n order: selection_order,\\n sort: selection_sort,\\n call: call,\\n nodes: selection_nodes,\\n node: selection_node,\\n size: selection_size,\\n empty: selection_empty,\\n each: each,\\n attr: attr,\\n style: style,\\n property: property,\\n classed: classed,\\n text: selection_text,\\n html: html,\\n raise: selection_raise,\\n lower: selection_lower,\\n append: append,\\n insert: insert,\\n remove: selection_remove,\\n clone: clone,\\n datum: datum,\\n on: selection_on,\\n dispatch: selection_dispatch\\n};\\n\\n/* harmony default export */ var src_selection = (selection_selection);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/select.js\\n\\n\\n/* harmony default export */ var src_select = (function(selector) {\\n return typeof selector === \"string\"\\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\\n : new Selection([[selector]], selection_root);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-drag/src/noevent.js\\n\\n\\nfunction nopropagation() {\\n on_event.stopImmediatePropagation();\\n}\\n\\n/* harmony default export */ var noevent = (function() {\\n on_event.preventDefault();\\n on_event.stopImmediatePropagation();\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-drag/src/nodrag.js\\n\\n\\n\\n/* harmony default export */ var nodrag = (function(view) {\\n var root = view.document.documentElement,\\n selection = src_select(view).on(\"dragstart.drag\", noevent, true);\\n if (\"onselectstart\" in root) {\\n selection.on(\"selectstart.drag\", noevent, true);\\n } else {\\n root.__noselect = root.style.MozUserSelect;\\n root.style.MozUserSelect = \"none\";\\n }\\n});\\n\\nfunction yesdrag(view, noclick) {\\n var root = view.document.documentElement,\\n selection = src_select(view).on(\"dragstart.drag\", null);\\n if (noclick) {\\n selection.on(\"click.drag\", noevent, true);\\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\\n }\\n if (\"onselectstart\" in root) {\\n selection.on(\"selectstart.drag\", null);\\n } else {\\n root.style.MozUserSelect = root.__noselect;\\n delete root.__noselect;\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-color/src/define.js\\n/* harmony default export */ var define = (function(constructor, factory, prototype) {\\n constructor.prototype = factory.prototype = prototype;\\n prototype.constructor = constructor;\\n});\\n\\nfunction extend(parent, definition) {\\n var prototype = Object.create(parent.prototype);\\n for (var key in definition) prototype[key] = definition[key];\\n return prototype;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-color/src/color.js\\n\\n\\nfunction Color() {}\\n\\nvar darker = 0.7;\\nvar brighter = 1 / darker;\\n\\nvar reI = \"\\\\\\\\s*([+-]?\\\\\\\\d+)\\\\\\\\s*\",\\n reN = \"\\\\\\\\s*([+-]?\\\\\\\\d*\\\\\\\\.?\\\\\\\\d+(?:[eE][+-]?\\\\\\\\d+)?)\\\\\\\\s*\",\\n reP = \"\\\\\\\\s*([+-]?\\\\\\\\d*\\\\\\\\.?\\\\\\\\d+(?:[eE][+-]?\\\\\\\\d+)?)%\\\\\\\\s*\",\\n reHex = /^#([0-9a-f]{3,8})$/,\\n reRgbInteger = new RegExp(\"^rgb\\\\\\\\(\" + [reI, reI, reI] + \"\\\\\\\\)$\"),\\n reRgbPercent = new RegExp(\"^rgb\\\\\\\\(\" + [reP, reP, reP] + \"\\\\\\\\)$\"),\\n reRgbaInteger = new RegExp(\"^rgba\\\\\\\\(\" + [reI, reI, reI, reN] + \"\\\\\\\\)$\"),\\n reRgbaPercent = new RegExp(\"^rgba\\\\\\\\(\" + [reP, reP, reP, reN] + \"\\\\\\\\)$\"),\\n reHslPercent = new RegExp(\"^hsl\\\\\\\\(\" + [reN, reP, reP] + \"\\\\\\\\)$\"),\\n reHslaPercent = new RegExp(\"^hsla\\\\\\\\(\" + [reN, reP, reP, reN] + \"\\\\\\\\)$\");\\n\\nvar named = {\\n aliceblue: 0xf0f8ff,\\n antiquewhite: 0xfaebd7,\\n aqua: 0x00ffff,\\n aquamarine: 0x7fffd4,\\n azure: 0xf0ffff,\\n beige: 0xf5f5dc,\\n bisque: 0xffe4c4,\\n black: 0x000000,\\n blanchedalmond: 0xffebcd,\\n blue: 0x0000ff,\\n blueviolet: 0x8a2be2,\\n brown: 0xa52a2a,\\n burlywood: 0xdeb887,\\n cadetblue: 0x5f9ea0,\\n chartreuse: 0x7fff00,\\n chocolate: 0xd2691e,\\n coral: 0xff7f50,\\n cornflowerblue: 0x6495ed,\\n cornsilk: 0xfff8dc,\\n crimson: 0xdc143c,\\n cyan: 0x00ffff,\\n darkblue: 0x00008b,\\n darkcyan: 0x008b8b,\\n darkgoldenrod: 0xb8860b,\\n darkgray: 0xa9a9a9,\\n darkgreen: 0x006400,\\n darkgrey: 0xa9a9a9,\\n darkkhaki: 0xbdb76b,\\n darkmagenta: 0x8b008b,\\n darkolivegreen: 0x556b2f,\\n darkorange: 0xff8c00,\\n darkorchid: 0x9932cc,\\n darkred: 0x8b0000,\\n darksalmon: 0xe9967a,\\n darkseagreen: 0x8fbc8f,\\n darkslateblue: 0x483d8b,\\n darkslategray: 0x2f4f4f,\\n darkslategrey: 0x2f4f4f,\\n darkturquoise: 0x00ced1,\\n darkviolet: 0x9400d3,\\n deeppink: 0xff1493,\\n deepskyblue: 0x00bfff,\\n dimgray: 0x696969,\\n dimgrey: 0x696969,\\n dodgerblue: 0x1e90ff,\\n firebrick: 0xb22222,\\n floralwhite: 0xfffaf0,\\n forestgreen: 0x228b22,\\n fuchsia: 0xff00ff,\\n gainsboro: 0xdcdcdc,\\n ghostwhite: 0xf8f8ff,\\n gold: 0xffd700,\\n goldenrod: 0xdaa520,\\n gray: 0x808080,\\n green: 0x008000,\\n greenyellow: 0xadff2f,\\n grey: 0x808080,\\n honeydew: 0xf0fff0,\\n hotpink: 0xff69b4,\\n indianred: 0xcd5c5c,\\n indigo: 0x4b0082,\\n ivory: 0xfffff0,\\n khaki: 0xf0e68c,\\n lavender: 0xe6e6fa,\\n lavenderblush: 0xfff0f5,\\n lawngreen: 0x7cfc00,\\n lemonchiffon: 0xfffacd,\\n lightblue: 0xadd8e6,\\n lightcoral: 0xf08080,\\n lightcyan: 0xe0ffff,\\n lightgoldenrodyellow: 0xfafad2,\\n lightgray: 0xd3d3d3,\\n lightgreen: 0x90ee90,\\n lightgrey: 0xd3d3d3,\\n lightpink: 0xffb6c1,\\n lightsalmon: 0xffa07a,\\n lightseagreen: 0x20b2aa,\\n lightskyblue: 0x87cefa,\\n lightslategray: 0x778899,\\n lightslategrey: 0x778899,\\n lightsteelblue: 0xb0c4de,\\n lightyellow: 0xffffe0,\\n lime: 0x00ff00,\\n limegreen: 0x32cd32,\\n linen: 0xfaf0e6,\\n magenta: 0xff00ff,\\n maroon: 0x800000,\\n mediumaquamarine: 0x66cdaa,\\n mediumblue: 0x0000cd,\\n mediumorchid: 0xba55d3,\\n mediumpurple: 0x9370db,\\n mediumseagreen: 0x3cb371,\\n mediumslateblue: 0x7b68ee,\\n mediumspringgreen: 0x00fa9a,\\n mediumturquoise: 0x48d1cc,\\n mediumvioletred: 0xc71585,\\n midnightblue: 0x191970,\\n mintcream: 0xf5fffa,\\n mistyrose: 0xffe4e1,\\n moccasin: 0xffe4b5,\\n navajowhite: 0xffdead,\\n navy: 0x000080,\\n oldlace: 0xfdf5e6,\\n olive: 0x808000,\\n olivedrab: 0x6b8e23,\\n orange: 0xffa500,\\n orangered: 0xff4500,\\n orchid: 0xda70d6,\\n palegoldenrod: 0xeee8aa,\\n palegreen: 0x98fb98,\\n paleturquoise: 0xafeeee,\\n palevioletred: 0xdb7093,\\n papayawhip: 0xffefd5,\\n peachpuff: 0xffdab9,\\n peru: 0xcd853f,\\n pink: 0xffc0cb,\\n plum: 0xdda0dd,\\n powderblue: 0xb0e0e6,\\n purple: 0x800080,\\n rebeccapurple: 0x663399,\\n red: 0xff0000,\\n rosybrown: 0xbc8f8f,\\n royalblue: 0x4169e1,\\n saddlebrown: 0x8b4513,\\n salmon: 0xfa8072,\\n sandybrown: 0xf4a460,\\n seagreen: 0x2e8b57,\\n seashell: 0xfff5ee,\\n sienna: 0xa0522d,\\n silver: 0xc0c0c0,\\n skyblue: 0x87ceeb,\\n slateblue: 0x6a5acd,\\n slategray: 0x708090,\\n slategrey: 0x708090,\\n snow: 0xfffafa,\\n springgreen: 0x00ff7f,\\n steelblue: 0x4682b4,\\n tan: 0xd2b48c,\\n teal: 0x008080,\\n thistle: 0xd8bfd8,\\n tomato: 0xff6347,\\n turquoise: 0x40e0d0,\\n violet: 0xee82ee,\\n wheat: 0xf5deb3,\\n white: 0xffffff,\\n whitesmoke: 0xf5f5f5,\\n yellow: 0xffff00,\\n yellowgreen: 0x9acd32\\n};\\n\\ndefine(Color, color_color, {\\n copy: function(channels) {\\n return Object.assign(new this.constructor, this, channels);\\n },\\n displayable: function() {\\n return this.rgb().displayable();\\n },\\n hex: color_formatHex, // Deprecated! Use color.formatHex.\\n formatHex: color_formatHex,\\n formatHsl: color_formatHsl,\\n formatRgb: color_formatRgb,\\n toString: color_formatRgb\\n});\\n\\nfunction color_formatHex() {\\n return this.rgb().formatHex();\\n}\\n\\nfunction color_formatHsl() {\\n return hslConvert(this).formatHsl();\\n}\\n\\nfunction color_formatRgb() {\\n return this.rgb().formatRgb();\\n}\\n\\nfunction color_color(format) {\\n var m, l;\\n format = (format + \"\").trim().toLowerCase();\\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\\n : null) // invalid hex\\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\\n : null;\\n}\\n\\nfunction rgbn(n) {\\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\\n}\\n\\nfunction rgba(r, g, b, a) {\\n if (a <= 0) r = g = b = NaN;\\n return new Rgb(r, g, b, a);\\n}\\n\\nfunction rgbConvert(o) {\\n if (!(o instanceof Color)) o = color_color(o);\\n if (!o) return new Rgb;\\n o = o.rgb();\\n return new Rgb(o.r, o.g, o.b, o.opacity);\\n}\\n\\nfunction color_rgb(r, g, b, opacity) {\\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\\n}\\n\\nfunction Rgb(r, g, b, opacity) {\\n this.r = +r;\\n this.g = +g;\\n this.b = +b;\\n this.opacity = +opacity;\\n}\\n\\ndefine(Rgb, color_rgb, extend(Color, {\\n brighter: function(k) {\\n k = k == null ? brighter : Math.pow(brighter, k);\\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\\n },\\n darker: function(k) {\\n k = k == null ? darker : Math.pow(darker, k);\\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\\n },\\n rgb: function() {\\n return this;\\n },\\n displayable: function() {\\n return (-0.5 <= this.r && this.r < 255.5)\\n && (-0.5 <= this.g && this.g < 255.5)\\n && (-0.5 <= this.b && this.b < 255.5)\\n && (0 <= this.opacity && this.opacity <= 1);\\n },\\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\\n formatHex: rgb_formatHex,\\n formatRgb: rgb_formatRgb,\\n toString: rgb_formatRgb\\n}));\\n\\nfunction rgb_formatHex() {\\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\\n}\\n\\nfunction rgb_formatRgb() {\\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\\n return (a === 1 ? \"rgb(\" : \"rgba(\")\\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\\n + (a === 1 ? \")\" : \", \" + a + \")\");\\n}\\n\\nfunction hex(value) {\\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\\n}\\n\\nfunction hsla(h, s, l, a) {\\n if (a <= 0) h = s = l = NaN;\\n else if (l <= 0 || l >= 1) h = s = NaN;\\n else if (s <= 0) h = NaN;\\n return new Hsl(h, s, l, a);\\n}\\n\\nfunction hslConvert(o) {\\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\\n if (!(o instanceof Color)) o = color_color(o);\\n if (!o) return new Hsl;\\n if (o instanceof Hsl) return o;\\n o = o.rgb();\\n var r = o.r / 255,\\n g = o.g / 255,\\n b = o.b / 255,\\n min = Math.min(r, g, b),\\n max = Math.max(r, g, b),\\n h = NaN,\\n s = max - min,\\n l = (max + min) / 2;\\n if (s) {\\n if (r === max) h = (g - b) / s + (g < b) * 6;\\n else if (g === max) h = (b - r) / s + 2;\\n else h = (r - g) / s + 4;\\n s /= l < 0.5 ? max + min : 2 - max - min;\\n h *= 60;\\n } else {\\n s = l > 0 && l < 1 ? 0 : h;\\n }\\n return new Hsl(h, s, l, o.opacity);\\n}\\n\\nfunction hsl(h, s, l, opacity) {\\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\\n}\\n\\nfunction Hsl(h, s, l, opacity) {\\n this.h = +h;\\n this.s = +s;\\n this.l = +l;\\n this.opacity = +opacity;\\n}\\n\\ndefine(Hsl, hsl, extend(Color, {\\n brighter: function(k) {\\n k = k == null ? brighter : Math.pow(brighter, k);\\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\\n },\\n darker: function(k) {\\n k = k == null ? darker : Math.pow(darker, k);\\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\\n },\\n rgb: function() {\\n var h = this.h % 360 + (this.h < 0) * 360,\\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\\n l = this.l,\\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\\n m1 = 2 * l - m2;\\n return new Rgb(\\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\\n hsl2rgb(h, m1, m2),\\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\\n this.opacity\\n );\\n },\\n displayable: function() {\\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\\n && (0 <= this.l && this.l <= 1)\\n && (0 <= this.opacity && this.opacity <= 1);\\n },\\n formatHsl: function() {\\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\\n return (a === 1 ? \"hsl(\" : \"hsla(\")\\n + (this.h || 0) + \", \"\\n + (this.s || 0) * 100 + \"%, \"\\n + (this.l || 0) * 100 + \"%\"\\n + (a === 1 ? \")\" : \", \" + a + \")\");\\n }\\n}));\\n\\n/* From FvD 13.37, CSS Color Module Level 3 */\\nfunction hsl2rgb(h, m1, m2) {\\n return (h < 60 ? m1 + (m2 - m1) * h / 60\\n : h < 180 ? m2\\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\\n : m1) * 255;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/basis.js\\nfunction basis(t1, v0, v1, v2, v3) {\\n var t2 = t1 * t1, t3 = t2 * t1;\\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\\n + (4 - 6 * t2 + 3 * t3) * v1\\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\\n + t3 * v3) / 6;\\n}\\n\\n/* harmony default export */ var src_basis = (function(values) {\\n var n = values.length - 1;\\n return function(t) {\\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\\n v1 = values[i],\\n v2 = values[i + 1],\\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\\n return basis((t - i / n) * n, v0, v1, v2, v3);\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/basisClosed.js\\n\\n\\n/* harmony default export */ var basisClosed = (function(values) {\\n var n = values.length;\\n return function(t) {\\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\\n v0 = values[(i + n - 1) % n],\\n v1 = values[i % n],\\n v2 = values[(i + 1) % n],\\n v3 = values[(i + 2) % n];\\n return basis((t - i / n) * n, v0, v1, v2, v3);\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/constant.js\\n/* harmony default export */ var d3_interpolate_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/color.js\\n\\n\\nfunction linear(a, d) {\\n return function(t) {\\n return a + t * d;\\n };\\n}\\n\\nfunction exponential(a, b, y) {\\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\\n return Math.pow(a + t * b, y);\\n };\\n}\\n\\nfunction color_hue(a, b) {\\n var d = b - a;\\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : d3_interpolate_src_constant(isNaN(a) ? b : a);\\n}\\n\\nfunction gamma(y) {\\n return (y = +y) === 1 ? nogamma : function(a, b) {\\n return b - a ? exponential(a, b, y) : d3_interpolate_src_constant(isNaN(a) ? b : a);\\n };\\n}\\n\\nfunction nogamma(a, b) {\\n var d = b - a;\\n return d ? linear(a, d) : d3_interpolate_src_constant(isNaN(a) ? b : a);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/rgb.js\\n\\n\\n\\n\\n\\n/* harmony default export */ var src_rgb = ((function rgbGamma(y) {\\n var color = gamma(y);\\n\\n function rgb(start, end) {\\n var r = color((start = color_rgb(start)).r, (end = color_rgb(end)).r),\\n g = color(start.g, end.g),\\n b = color(start.b, end.b),\\n opacity = nogamma(start.opacity, end.opacity);\\n return function(t) {\\n start.r = r(t);\\n start.g = g(t);\\n start.b = b(t);\\n start.opacity = opacity(t);\\n return start + \"\";\\n };\\n }\\n\\n rgb.gamma = rgbGamma;\\n\\n return rgb;\\n})(1));\\n\\nfunction rgbSpline(spline) {\\n return function(colors) {\\n var n = colors.length,\\n r = new Array(n),\\n g = new Array(n),\\n b = new Array(n),\\n i, color;\\n for (i = 0; i < n; ++i) {\\n color = color_rgb(colors[i]);\\n r[i] = color.r || 0;\\n g[i] = color.g || 0;\\n b[i] = color.b || 0;\\n }\\n r = spline(r);\\n g = spline(g);\\n b = spline(b);\\n color.opacity = 1;\\n return function(t) {\\n color.r = r(t);\\n color.g = g(t);\\n color.b = b(t);\\n return color + \"\";\\n };\\n };\\n}\\n\\nvar rgbBasis = rgbSpline(src_basis);\\nvar rgbBasisClosed = rgbSpline(basisClosed);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/numberArray.js\\n/* harmony default export */ var numberArray = (function(a, b) {\\n if (!b) b = [];\\n var n = a ? Math.min(b.length, a.length) : 0,\\n c = b.slice(),\\n i;\\n return function(t) {\\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\\n return c;\\n };\\n});\\n\\nfunction isNumberArray(x) {\\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/array.js\\n\\n\\n\\n/* harmony default export */ var src_array = (function(a, b) {\\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\\n});\\n\\nfunction genericArray(a, b) {\\n var nb = b ? b.length : 0,\\n na = a ? Math.min(nb, a.length) : 0,\\n x = new Array(na),\\n c = new Array(nb),\\n i;\\n\\n for (i = 0; i < na; ++i) x[i] = src_value(a[i], b[i]);\\n for (; i < nb; ++i) c[i] = b[i];\\n\\n return function(t) {\\n for (i = 0; i < na; ++i) c[i] = x[i](t);\\n return c;\\n };\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/date.js\\n/* harmony default export */ var src_date = (function(a, b) {\\n var d = new Date;\\n return a = +a, b = +b, function(t) {\\n return d.setTime(a * (1 - t) + b * t), d;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/number.js\\n/* harmony default export */ var src_number = (function(a, b) {\\n return a = +a, b = +b, function(t) {\\n return a * (1 - t) + b * t;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/object.js\\n\\n\\n/* harmony default export */ var src_object = (function(a, b) {\\n var i = {},\\n c = {},\\n k;\\n\\n if (a === null || typeof a !== \"object\") a = {};\\n if (b === null || typeof b !== \"object\") b = {};\\n\\n for (k in b) {\\n if (k in a) {\\n i[k] = src_value(a[k], b[k]);\\n } else {\\n c[k] = b[k];\\n }\\n }\\n\\n return function(t) {\\n for (k in i) c[k] = i[k](t);\\n return c;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/string.js\\n\\n\\nvar reA = /[-+]?(?:\\\\d+\\\\.?\\\\d*|\\\\.?\\\\d+)(?:[eE][-+]?\\\\d+)?/g,\\n reB = new RegExp(reA.source, \"g\");\\n\\nfunction string_zero(b) {\\n return function() {\\n return b;\\n };\\n}\\n\\nfunction one(b) {\\n return function(t) {\\n return b(t) + \"\";\\n };\\n}\\n\\n/* harmony default export */ var src_string = (function(a, b) {\\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\\n am, // current match in a\\n bm, // current match in b\\n bs, // string preceding current number in b, if any\\n i = -1, // index in s\\n s = [], // string constants and placeholders\\n q = []; // number interpolators\\n\\n // Coerce inputs to strings.\\n a = a + \"\", b = b + \"\";\\n\\n // Interpolate pairs of numbers in a & b.\\n while ((am = reA.exec(a))\\n && (bm = reB.exec(b))) {\\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\\n bs = b.slice(bi, bs);\\n if (s[i]) s[i] += bs; // coalesce with previous string\\n else s[++i] = bs;\\n }\\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\\n if (s[i]) s[i] += bm; // coalesce with previous string\\n else s[++i] = bm;\\n } else { // interpolate non-matching numbers\\n s[++i] = null;\\n q.push({i: i, x: src_number(am, bm)});\\n }\\n bi = reB.lastIndex;\\n }\\n\\n // Add remains of b.\\n if (bi < b.length) {\\n bs = b.slice(bi);\\n if (s[i]) s[i] += bs; // coalesce with previous string\\n else s[++i] = bs;\\n }\\n\\n // Special optimization for only a single match.\\n // Otherwise, interpolate each of the numbers and rejoin the string.\\n return s.length < 2 ? (q[0]\\n ? one(q[0].x)\\n : string_zero(b))\\n : (b = q.length, function(t) {\\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\\n return s.join(\"\");\\n });\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/value.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/* harmony default export */ var src_value = (function(a, b) {\\n var t = typeof b, c;\\n return b == null || t === \"boolean\" ? d3_interpolate_src_constant(b)\\n : (t === \"number\" ? src_number\\n : t === \"string\" ? ((c = color_color(b)) ? (b = c, src_rgb) : src_string)\\n : b instanceof color_color ? src_rgb\\n : b instanceof Date ? src_date\\n : isNumberArray(b) ? numberArray\\n : Array.isArray(b) ? genericArray\\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? src_object\\n : src_number)(a, b);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/sourceEvent.js\\n\\n\\n/* harmony default export */ var sourceEvent = (function() {\\n var current = on_event, source;\\n while (source = current.sourceEvent) current = source;\\n return current;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/point.js\\n/* harmony default export */ var src_point = (function(node, event) {\\n var svg = node.ownerSVGElement || node;\\n\\n if (svg.createSVGPoint) {\\n var point = svg.createSVGPoint();\\n point.x = event.clientX, point.y = event.clientY;\\n point = point.matrixTransform(node.getScreenCTM().inverse());\\n return [point.x, point.y];\\n }\\n\\n var rect = node.getBoundingClientRect();\\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/touch.js\\n\\n\\n\\n/* harmony default export */ var src_touch = (function(node, touches, identifier) {\\n if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;\\n\\n for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {\\n if ((touch = touches[i]).identifier === identifier) {\\n return src_point(node, touch);\\n }\\n }\\n\\n return null;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/mouse.js\\n\\n\\n\\n/* harmony default export */ var mouse = (function(node) {\\n var event = sourceEvent();\\n if (event.changedTouches) event = event.changedTouches[0];\\n return src_point(node, event);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-timer/src/timer.js\\nvar timer_frame = 0, // is an animation frame pending?\\n timeout = 0, // is a timeout pending?\\n timer_interval = 0, // are any timers active?\\n pokeDelay = 1000, // how frequently we check for clock skew\\n taskHead,\\n taskTail,\\n clockLast = 0,\\n clockNow = 0,\\n clockSkew = 0,\\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\\n\\nfunction now() {\\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\\n}\\n\\nfunction clearNow() {\\n clockNow = 0;\\n}\\n\\nfunction Timer() {\\n this._call =\\n this._time =\\n this._next = null;\\n}\\n\\nTimer.prototype = timer.prototype = {\\n constructor: Timer,\\n restart: function(callback, delay, time) {\\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\\n if (!this._next && taskTail !== this) {\\n if (taskTail) taskTail._next = this;\\n else taskHead = this;\\n taskTail = this;\\n }\\n this._call = callback;\\n this._time = time;\\n sleep();\\n },\\n stop: function() {\\n if (this._call) {\\n this._call = null;\\n this._time = Infinity;\\n sleep();\\n }\\n }\\n};\\n\\nfunction timer(callback, delay, time) {\\n var t = new Timer;\\n t.restart(callback, delay, time);\\n return t;\\n}\\n\\nfunction timerFlush() {\\n now(); // Get the current time, if not already set.\\n ++timer_frame; // Pretend weve set an alarm, if we havent already.\\n var t = taskHead, e;\\n while (t) {\\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\\n t = t._next;\\n }\\n --timer_frame;\\n}\\n\\nfunction wake() {\\n clockNow = (clockLast = clock.now()) + clockSkew;\\n timer_frame = timeout = 0;\\n try {\\n timerFlush();\\n } finally {\\n timer_frame = 0;\\n nap();\\n clockNow = 0;\\n }\\n}\\n\\nfunction poke() {\\n var now = clock.now(), delay = now - clockLast;\\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\\n}\\n\\nfunction nap() {\\n var t0, t1 = taskHead, t2, time = Infinity;\\n while (t1) {\\n if (t1._call) {\\n if (time > t1._time) time = t1._time;\\n t0 = t1, t1 = t1._next;\\n } else {\\n t2 = t1._next, t1._next = null;\\n t1 = t0 ? t0._next = t2 : taskHead = t2;\\n }\\n }\\n taskTail = t0;\\n sleep(time);\\n}\\n\\nfunction sleep(time) {\\n if (timer_frame) return; // Soonest alarm already set, or will be.\\n if (timeout) timeout = clearTimeout(timeout);\\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\\n if (delay > 24) {\\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\\n if (timer_interval) timer_interval = clearInterval(timer_interval);\\n } else {\\n if (!timer_interval) clockLast = clock.now(), timer_interval = setInterval(poke, pokeDelay);\\n timer_frame = 1, setFrame(wake);\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-timer/src/timeout.js\\n\\n\\n/* harmony default export */ var src_timeout = (function(callback, delay, time) {\\n var t = new Timer;\\n delay = delay == null ? 0 : +delay;\\n t.restart(function(elapsed) {\\n t.stop();\\n callback(elapsed + delay);\\n }, delay, time);\\n return t;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/schedule.js\\n\\n\\n\\nvar emptyOn = src_dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\\nvar emptyTween = [];\\n\\nvar CREATED = 0;\\nvar SCHEDULED = 1;\\nvar STARTING = 2;\\nvar STARTED = 3;\\nvar RUNNING = 4;\\nvar ENDING = 5;\\nvar ENDED = 6;\\n\\n/* harmony default export */ var transition_schedule = (function(node, name, id, index, group, timing) {\\n var schedules = node.__transition;\\n if (!schedules) node.__transition = {};\\n else if (id in schedules) return;\\n schedule_create(node, id, {\\n name: name,\\n index: index, // For context during callback.\\n group: group, // For context during callback.\\n on: emptyOn,\\n tween: emptyTween,\\n time: timing.time,\\n delay: timing.delay,\\n duration: timing.duration,\\n ease: timing.ease,\\n timer: null,\\n state: CREATED\\n });\\n});\\n\\nfunction schedule_init(node, id) {\\n var schedule = schedule_get(node, id);\\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\\n return schedule;\\n}\\n\\nfunction schedule_set(node, id) {\\n var schedule = schedule_get(node, id);\\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\\n return schedule;\\n}\\n\\nfunction schedule_get(node, id) {\\n var schedule = node.__transition;\\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\\n return schedule;\\n}\\n\\nfunction schedule_create(node, id, self) {\\n var schedules = node.__transition,\\n tween;\\n\\n // Initialize the self timer when the transition is created.\\n // Note the actual delay is not known until the first callback!\\n schedules[id] = self;\\n self.timer = timer(schedule, 0, self.time);\\n\\n function schedule(elapsed) {\\n self.state = SCHEDULED;\\n self.timer.restart(start, self.delay, self.time);\\n\\n // If the elapsed delay is less than our first sleep, start immediately.\\n if (self.delay <= elapsed) start(elapsed - self.delay);\\n }\\n\\n function start(elapsed) {\\n var i, j, n, o;\\n\\n // If the state is not SCHEDULED, then we previously errored on start.\\n if (self.state !== SCHEDULED) return stop();\\n\\n for (i in schedules) {\\n o = schedules[i];\\n if (o.name !== self.name) continue;\\n\\n // While this element already has a starting transition during this frame,\\n // defer starting an interrupting transition until that transition has a\\n // chance to tick (and possibly end); see d3/d3-transition#54!\\n if (o.state === STARTED) return src_timeout(start);\\n\\n // Interrupt the active transition, if any.\\n if (o.state === RUNNING) {\\n o.state = ENDED;\\n o.timer.stop();\\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\\n delete schedules[i];\\n }\\n\\n // Cancel any pre-empted transitions.\\n else if (+i < id) {\\n o.state = ENDED;\\n o.timer.stop();\\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\\n delete schedules[i];\\n }\\n }\\n\\n // Defer the first tick to end of the current frame; see d3/d3#1576.\\n // Note the transition may be canceled after start and before the first tick!\\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\\n // Assuming this is successful, subsequent callbacks go straight to tick.\\n src_timeout(function() {\\n if (self.state === STARTED) {\\n self.state = RUNNING;\\n self.timer.restart(tick, self.delay, self.time);\\n tick(elapsed);\\n }\\n });\\n\\n // Dispatch the start event.\\n // Note this must be done before the tween are initialized.\\n self.state = STARTING;\\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\\n if (self.state !== STARTING) return; // interrupted\\n self.state = STARTED;\\n\\n // Initialize the tween, deleting null tween.\\n tween = new Array(n = self.tween.length);\\n for (i = 0, j = -1; i < n; ++i) {\\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\\n tween[++j] = o;\\n }\\n }\\n tween.length = j + 1;\\n }\\n\\n function tick(elapsed) {\\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\\n i = -1,\\n n = tween.length;\\n\\n while (++i < n) {\\n tween[i].call(node, t);\\n }\\n\\n // Dispatch the end event.\\n if (self.state === ENDING) {\\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\\n stop();\\n }\\n }\\n\\n function stop() {\\n self.state = ENDED;\\n self.timer.stop();\\n delete schedules[id];\\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\\n delete node.__transition;\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/interrupt.js\\n\\n\\n/* harmony default export */ var interrupt = (function(node, name) {\\n var schedules = node.__transition,\\n schedule,\\n active,\\n empty = true,\\n i;\\n\\n if (!schedules) return;\\n\\n name = name == null ? null : name + \"\";\\n\\n for (i in schedules) {\\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\\n active = schedule.state > STARTING && schedule.state < ENDING;\\n schedule.state = ENDED;\\n schedule.timer.stop();\\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\\n delete schedules[i];\\n }\\n\\n if (empty) delete node.__transition;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/selection/interrupt.js\\n\\n\\n/* harmony default export */ var selection_interrupt = (function(name) {\\n return this.each(function() {\\n interrupt(this, name);\\n });\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/transform/decompose.js\\nvar degrees = 180 / Math.PI;\\n\\nvar decompose_identity = {\\n translateX: 0,\\n translateY: 0,\\n rotate: 0,\\n skewX: 0,\\n scaleX: 1,\\n scaleY: 1\\n};\\n\\n/* harmony default export */ var decompose = (function(a, b, c, d, e, f) {\\n var scaleX, scaleY, skewX;\\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\\n return {\\n translateX: e,\\n translateY: f,\\n rotate: Math.atan2(b, a) * degrees,\\n skewX: Math.atan(skewX) * degrees,\\n scaleX: scaleX,\\n scaleY: scaleY\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/transform/parse.js\\n\\n\\nvar cssNode,\\n cssRoot,\\n cssView,\\n svgNode;\\n\\nfunction parseCss(value) {\\n if (value === \"none\") return decompose_identity;\\n if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\\n cssNode.style.transform = value;\\n value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\\n cssRoot.removeChild(cssNode);\\n value = value.slice(7, -1).split(\",\");\\n return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\\n}\\n\\nfunction parseSvg(value) {\\n if (value == null) return decompose_identity;\\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\\n svgNode.setAttribute(\"transform\", value);\\n if (!(value = svgNode.transform.baseVal.consolidate())) return decompose_identity;\\n value = value.matrix;\\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/transform/index.js\\n\\n\\n\\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\\n\\n function pop(s) {\\n return s.length ? s.pop() + \" \" : \"\";\\n }\\n\\n function translate(xa, ya, xb, yb, s, q) {\\n if (xa !== xb || ya !== yb) {\\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\\n q.push({i: i - 4, x: src_number(xa, xb)}, {i: i - 2, x: src_number(ya, yb)});\\n } else if (xb || yb) {\\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\\n }\\n }\\n\\n function rotate(a, b, s, q) {\\n if (a !== b) {\\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: src_number(a, b)});\\n } else if (b) {\\n s.push(pop(s) + \"rotate(\" + b + degParen);\\n }\\n }\\n\\n function skewX(a, b, s, q) {\\n if (a !== b) {\\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: src_number(a, b)});\\n } else if (b) {\\n s.push(pop(s) + \"skewX(\" + b + degParen);\\n }\\n }\\n\\n function scale(xa, ya, xb, yb, s, q) {\\n if (xa !== xb || ya !== yb) {\\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\\n q.push({i: i - 4, x: src_number(xa, xb)}, {i: i - 2, x: src_number(ya, yb)});\\n } else if (xb !== 1 || yb !== 1) {\\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\\n }\\n }\\n\\n return function(a, b) {\\n var s = [], // string constants and placeholders\\n q = []; // number interpolators\\n a = parse(a), b = parse(b);\\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\\n rotate(a.rotate, b.rotate, s, q);\\n skewX(a.skewX, b.skewX, s, q);\\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\\n a = b = null; // gc\\n return function(t) {\\n var i = -1, n = q.length, o;\\n while (++i < n) s[(o = q[i]).i] = o.x(t);\\n return s.join(\"\");\\n };\\n };\\n}\\n\\nvar interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\\nvar interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/tween.js\\n\\n\\nfunction tweenRemove(id, name) {\\n var tween0, tween1;\\n return function() {\\n var schedule = schedule_set(this, id),\\n tween = schedule.tween;\\n\\n // If this node shared tween with the previous node,\\n // just assign the updated shared tween and were done!\\n // Otherwise, copy-on-write.\\n if (tween !== tween0) {\\n tween1 = tween0 = tween;\\n for (var i = 0, n = tween1.length; i < n; ++i) {\\n if (tween1[i].name === name) {\\n tween1 = tween1.slice();\\n tween1.splice(i, 1);\\n break;\\n }\\n }\\n }\\n\\n schedule.tween = tween1;\\n };\\n}\\n\\nfunction tweenFunction(id, name, value) {\\n var tween0, tween1;\\n if (typeof value !== \"function\") throw new Error;\\n return function() {\\n var schedule = schedule_set(this, id),\\n tween = schedule.tween;\\n\\n // If this node shared tween with the previous node,\\n // just assign the updated shared tween and were done!\\n // Otherwise, copy-on-write.\\n if (tween !== tween0) {\\n tween1 = (tween0 = tween).slice();\\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\\n if (tween1[i].name === name) {\\n tween1[i] = t;\\n break;\\n }\\n }\\n if (i === n) tween1.push(t);\\n }\\n\\n schedule.tween = tween1;\\n };\\n}\\n\\n/* harmony default export */ var transition_tween = (function(name, value) {\\n var id = this._id;\\n\\n name += \"\";\\n\\n if (arguments.length < 2) {\\n var tween = schedule_get(this.node(), id).tween;\\n for (var i = 0, n = tween.length, t; i < n; ++i) {\\n if ((t = tween[i]).name === name) {\\n return t.value;\\n }\\n }\\n return null;\\n }\\n\\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\\n});\\n\\nfunction tweenValue(transition, name, value) {\\n var id = transition._id;\\n\\n transition.each(function() {\\n var schedule = schedule_set(this, id);\\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\\n });\\n\\n return function(node) {\\n return schedule_get(node, id).value[name];\\n };\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/interpolate.js\\n\\n\\n\\n/* harmony default export */ var transition_interpolate = (function(a, b) {\\n var c;\\n return (typeof b === \"number\" ? src_number\\n : b instanceof color_color ? src_rgb\\n : (c = color_color(b)) ? (b = c, src_rgb)\\n : src_string)(a, b);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/attr.js\\n\\n\\n\\n\\n\\nfunction attr_attrRemove(name) {\\n return function() {\\n this.removeAttribute(name);\\n };\\n}\\n\\nfunction attr_attrRemoveNS(fullname) {\\n return function() {\\n this.removeAttributeNS(fullname.space, fullname.local);\\n };\\n}\\n\\nfunction attr_attrConstant(name, interpolate, value1) {\\n var string00,\\n string1 = value1 + \"\",\\n interpolate0;\\n return function() {\\n var string0 = this.getAttribute(name);\\n return string0 === string1 ? null\\n : string0 === string00 ? interpolate0\\n : interpolate0 = interpolate(string00 = string0, value1);\\n };\\n}\\n\\nfunction attr_attrConstantNS(fullname, interpolate, value1) {\\n var string00,\\n string1 = value1 + \"\",\\n interpolate0;\\n return function() {\\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\\n return string0 === string1 ? null\\n : string0 === string00 ? interpolate0\\n : interpolate0 = interpolate(string00 = string0, value1);\\n };\\n}\\n\\nfunction attr_attrFunction(name, interpolate, value) {\\n var string00,\\n string10,\\n interpolate0;\\n return function() {\\n var string0, value1 = value(this), string1;\\n if (value1 == null) return void this.removeAttribute(name);\\n string0 = this.getAttribute(name);\\n string1 = value1 + \"\";\\n return string0 === string1 ? null\\n : string0 === string00 && string1 === string10 ? interpolate0\\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\\n };\\n}\\n\\nfunction attr_attrFunctionNS(fullname, interpolate, value) {\\n var string00,\\n string10,\\n interpolate0;\\n return function() {\\n var string0, value1 = value(this), string1;\\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\\n string0 = this.getAttributeNS(fullname.space, fullname.local);\\n string1 = value1 + \"\";\\n return string0 === string1 ? null\\n : string0 === string00 && string1 === string10 ? interpolate0\\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\\n };\\n}\\n\\n/* harmony default export */ var transition_attr = (function(name, value) {\\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransformSvg : transition_interpolate;\\n return this.attrTween(name, typeof value === \"function\"\\n ? (fullname.local ? attr_attrFunctionNS : attr_attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\\n : value == null ? (fullname.local ? attr_attrRemoveNS : attr_attrRemove)(fullname)\\n : (fullname.local ? attr_attrConstantNS : attr_attrConstant)(fullname, i, value));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/attrTween.js\\n\\n\\nfunction attrInterpolate(name, i) {\\n return function(t) {\\n this.setAttribute(name, i.call(this, t));\\n };\\n}\\n\\nfunction attrInterpolateNS(fullname, i) {\\n return function(t) {\\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\\n };\\n}\\n\\nfunction attrTweenNS(fullname, value) {\\n var t0, i0;\\n function tween() {\\n var i = value.apply(this, arguments);\\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\\n return t0;\\n }\\n tween._value = value;\\n return tween;\\n}\\n\\nfunction attrTween(name, value) {\\n var t0, i0;\\n function tween() {\\n var i = value.apply(this, arguments);\\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\\n return t0;\\n }\\n tween._value = value;\\n return tween;\\n}\\n\\n/* harmony default export */ var transition_attrTween = (function(name, value) {\\n var key = \"attr.\" + name;\\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\\n if (value == null) return this.tween(key, null);\\n if (typeof value !== \"function\") throw new Error;\\n var fullname = namespace(name);\\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/delay.js\\n\\n\\nfunction delayFunction(id, value) {\\n return function() {\\n schedule_init(this, id).delay = +value.apply(this, arguments);\\n };\\n}\\n\\nfunction delayConstant(id, value) {\\n return value = +value, function() {\\n schedule_init(this, id).delay = value;\\n };\\n}\\n\\n/* harmony default export */ var transition_delay = (function(value) {\\n var id = this._id;\\n\\n return arguments.length\\n ? this.each((typeof value === \"function\"\\n ? delayFunction\\n : delayConstant)(id, value))\\n : schedule_get(this.node(), id).delay;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/duration.js\\n\\n\\nfunction durationFunction(id, value) {\\n return function() {\\n schedule_set(this, id).duration = +value.apply(this, arguments);\\n };\\n}\\n\\nfunction durationConstant(id, value) {\\n return value = +value, function() {\\n schedule_set(this, id).duration = value;\\n };\\n}\\n\\n/* harmony default export */ var transition_duration = (function(value) {\\n var id = this._id;\\n\\n return arguments.length\\n ? this.each((typeof value === \"function\"\\n ? durationFunction\\n : durationConstant)(id, value))\\n : schedule_get(this.node(), id).duration;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/ease.js\\n\\n\\nfunction easeConstant(id, value) {\\n if (typeof value !== \"function\") throw new Error;\\n return function() {\\n schedule_set(this, id).ease = value;\\n };\\n}\\n\\n/* harmony default export */ var ease = (function(value) {\\n var id = this._id;\\n\\n return arguments.length\\n ? this.each(easeConstant(id, value))\\n : schedule_get(this.node(), id).ease;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/filter.js\\n\\n\\n\\n/* harmony default export */ var transition_filter = (function(match) {\\n if (typeof match !== \"function\") match = matcher(match);\\n\\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\\n subgroup.push(node);\\n }\\n }\\n }\\n\\n return new Transition(subgroups, this._parents, this._name, this._id);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/merge.js\\n\\n\\n/* harmony default export */ var transition_merge = (function(transition) {\\n if (transition._id !== this._id) throw new Error;\\n\\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\\n if (node = group0[i] || group1[i]) {\\n merge[i] = node;\\n }\\n }\\n }\\n\\n for (; j < m0; ++j) {\\n merges[j] = groups0[j];\\n }\\n\\n return new Transition(merges, this._parents, this._name, this._id);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/on.js\\n\\n\\nfunction on_start(name) {\\n return (name + \"\").trim().split(/^|\\\\s+/).every(function(t) {\\n var i = t.indexOf(\".\");\\n if (i >= 0) t = t.slice(0, i);\\n return !t || t === \"start\";\\n });\\n}\\n\\nfunction onFunction(id, name, listener) {\\n var on0, on1, sit = on_start(name) ? schedule_init : schedule_set;\\n return function() {\\n var schedule = sit(this, id),\\n on = schedule.on;\\n\\n // If this node shared a dispatch with the previous node,\\n // just assign the updated shared dispatch and were done!\\n // Otherwise, copy-on-write.\\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\\n\\n schedule.on = on1;\\n };\\n}\\n\\n/* harmony default export */ var transition_on = (function(name, listener) {\\n var id = this._id;\\n\\n return arguments.length < 2\\n ? schedule_get(this.node(), id).on.on(name)\\n : this.each(onFunction(id, name, listener));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/remove.js\\nfunction removeFunction(id) {\\n return function() {\\n var parent = this.parentNode;\\n for (var i in this.__transition) if (+i !== id) return;\\n if (parent) parent.removeChild(this);\\n };\\n}\\n\\n/* harmony default export */ var transition_remove = (function() {\\n return this.on(\"end.remove\", removeFunction(this._id));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/select.js\\n\\n\\n\\n\\n/* harmony default export */ var transition_select = (function(select) {\\n var name = this._name,\\n id = this._id;\\n\\n if (typeof select !== \"function\") select = src_selector(select);\\n\\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\\n subgroup[i] = subnode;\\n transition_schedule(subgroup[i], name, id, i, subgroup, schedule_get(node, id));\\n }\\n }\\n }\\n\\n return new Transition(subgroups, this._parents, name, id);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/selectAll.js\\n\\n\\n\\n\\n/* harmony default export */ var transition_selectAll = (function(select) {\\n var name = this._name,\\n id = this._id;\\n\\n if (typeof select !== \"function\") select = selectorAll(select);\\n\\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\\n if (node = group[i]) {\\n for (var children = select.call(node, node.__data__, i, group), child, inherit = schedule_get(node, id), k = 0, l = children.length; k < l; ++k) {\\n if (child = children[k]) {\\n transition_schedule(child, name, id, k, children, inherit);\\n }\\n }\\n subgroups.push(children);\\n parents.push(node);\\n }\\n }\\n }\\n\\n return new Transition(subgroups, parents, name, id);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/selection.js\\n\\n\\nvar selection_Selection = src_selection.prototype.constructor;\\n\\n/* harmony default export */ var transition_selection = (function() {\\n return new selection_Selection(this._groups, this._parents);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/style.js\\n\\n\\n\\n\\n\\n\\nfunction styleNull(name, interpolate) {\\n var string00,\\n string10,\\n interpolate0;\\n return function() {\\n var string0 = styleValue(this, name),\\n string1 = (this.style.removeProperty(name), styleValue(this, name));\\n return string0 === string1 ? null\\n : string0 === string00 && string1 === string10 ? interpolate0\\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\\n };\\n}\\n\\nfunction style_styleRemove(name) {\\n return function() {\\n this.style.removeProperty(name);\\n };\\n}\\n\\nfunction style_styleConstant(name, interpolate, value1) {\\n var string00,\\n string1 = value1 + \"\",\\n interpolate0;\\n return function() {\\n var string0 = styleValue(this, name);\\n return string0 === string1 ? null\\n : string0 === string00 ? interpolate0\\n : interpolate0 = interpolate(string00 = string0, value1);\\n };\\n}\\n\\nfunction style_styleFunction(name, interpolate, value) {\\n var string00,\\n string10,\\n interpolate0;\\n return function() {\\n var string0 = styleValue(this, name),\\n value1 = value(this),\\n string1 = value1 + \"\";\\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));\\n return string0 === string1 ? null\\n : string0 === string00 && string1 === string10 ? interpolate0\\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\\n };\\n}\\n\\nfunction styleMaybeRemove(id, name) {\\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\\n return function() {\\n var schedule = schedule_set(this, id),\\n on = schedule.on,\\n listener = schedule.value[key] == null ? remove || (remove = style_styleRemove(name)) : undefined;\\n\\n // If this node shared a dispatch with the previous node,\\n // just assign the updated shared dispatch and were done!\\n // Otherwise, copy-on-write.\\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\\n\\n schedule.on = on1;\\n };\\n}\\n\\n/* harmony default export */ var transition_style = (function(name, value, priority) {\\n var i = (name += \"\") === \"transform\" ? interpolateTransformCss : transition_interpolate;\\n return value == null ? this\\n .styleTween(name, styleNull(name, i))\\n .on(\"end.style.\" + name, style_styleRemove(name))\\n : typeof value === \"function\" ? this\\n .styleTween(name, style_styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\\n .each(styleMaybeRemove(this._id, name))\\n : this\\n .styleTween(name, style_styleConstant(name, i, value), priority)\\n .on(\"end.style.\" + name, null);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/styleTween.js\\nfunction styleInterpolate(name, i, priority) {\\n return function(t) {\\n this.style.setProperty(name, i.call(this, t), priority);\\n };\\n}\\n\\nfunction styleTween(name, value, priority) {\\n var t, i0;\\n function tween() {\\n var i = value.apply(this, arguments);\\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\\n return t;\\n }\\n tween._value = value;\\n return tween;\\n}\\n\\n/* harmony default export */ var transition_styleTween = (function(name, value, priority) {\\n var key = \"style.\" + (name += \"\");\\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\\n if (value == null) return this.tween(key, null);\\n if (typeof value !== \"function\") throw new Error;\\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/text.js\\n\\n\\nfunction text_textConstant(value) {\\n return function() {\\n this.textContent = value;\\n };\\n}\\n\\nfunction text_textFunction(value) {\\n return function() {\\n var value1 = value(this);\\n this.textContent = value1 == null ? \"\" : value1;\\n };\\n}\\n\\n/* harmony default export */ var transition_text = (function(value) {\\n return this.tween(\"text\", typeof value === \"function\"\\n ? text_textFunction(tweenValue(this, \"text\", value))\\n : text_textConstant(value == null ? \"\" : value + \"\"));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/textTween.js\\nfunction textInterpolate(i) {\\n return function(t) {\\n this.textContent = i.call(this, t);\\n };\\n}\\n\\nfunction textTween(value) {\\n var t0, i0;\\n function tween() {\\n var i = value.apply(this, arguments);\\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\\n return t0;\\n }\\n tween._value = value;\\n return tween;\\n}\\n\\n/* harmony default export */ var transition_textTween = (function(value) {\\n var key = \"text\";\\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\\n if (value == null) return this.tween(key, null);\\n if (typeof value !== \"function\") throw new Error;\\n return this.tween(key, textTween(value));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/transition.js\\n\\n\\n\\n/* harmony default export */ var transition_transition = (function() {\\n var name = this._name,\\n id0 = this._id,\\n id1 = newId();\\n\\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\\n if (node = group[i]) {\\n var inherit = schedule_get(node, id0);\\n transition_schedule(node, name, id1, i, group, {\\n time: inherit.time + inherit.delay + inherit.duration,\\n delay: 0,\\n duration: inherit.duration,\\n ease: inherit.ease\\n });\\n }\\n }\\n }\\n\\n return new Transition(groups, this._parents, name, id1);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/end.js\\n\\n\\n/* harmony default export */ var transition_end = (function() {\\n var on0, on1, that = this, id = that._id, size = that.size();\\n return new Promise(function(resolve, reject) {\\n var cancel = {value: reject},\\n end = {value: function() { if (--size === 0) resolve(); }};\\n\\n that.each(function() {\\n var schedule = schedule_set(this, id),\\n on = schedule.on;\\n\\n // If this node shared a dispatch with the previous node,\\n // just assign the updated shared dispatch and were done!\\n // Otherwise, copy-on-write.\\n if (on !== on0) {\\n on1 = (on0 = on).copy();\\n on1._.cancel.push(cancel);\\n on1._.interrupt.push(cancel);\\n on1._.end.push(end);\\n }\\n\\n schedule.on = on1;\\n });\\n });\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/transition/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nvar transition_id = 0;\\n\\nfunction Transition(groups, parents, name, id) {\\n this._groups = groups;\\n this._parents = parents;\\n this._name = name;\\n this._id = id;\\n}\\n\\nfunction src_transition_transition(name) {\\n return src_selection().transition(name);\\n}\\n\\nfunction newId() {\\n return ++transition_id;\\n}\\n\\nvar selection_prototype = src_selection.prototype;\\n\\nTransition.prototype = src_transition_transition.prototype = {\\n constructor: Transition,\\n select: transition_select,\\n selectAll: transition_selectAll,\\n filter: transition_filter,\\n merge: transition_merge,\\n selection: transition_selection,\\n transition: transition_transition,\\n call: selection_prototype.call,\\n nodes: selection_prototype.nodes,\\n node: selection_prototype.node,\\n size: selection_prototype.size,\\n empty: selection_prototype.empty,\\n each: selection_prototype.each,\\n on: transition_on,\\n attr: transition_attr,\\n attrTween: transition_attrTween,\\n style: transition_style,\\n styleTween: transition_styleTween,\\n text: transition_text,\\n textTween: transition_textTween,\\n remove: transition_remove,\\n tween: transition_tween,\\n delay: transition_delay,\\n duration: transition_duration,\\n ease: ease,\\n end: transition_end\\n};\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/cubic.js\\nfunction cubicIn(t) {\\n return t * t * t;\\n}\\n\\nfunction cubicOut(t) {\\n return --t * t * t + 1;\\n}\\n\\nfunction cubicInOut(t) {\\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/selection/transition.js\\n\\n\\n\\n\\n\\nvar defaultTiming = {\\n time: null, // Set on use.\\n delay: 0,\\n duration: 250,\\n ease: cubicInOut\\n};\\n\\nfunction transition_inherit(node, id) {\\n var timing;\\n while (!(timing = node.__transition) || !(timing = timing[id])) {\\n if (!(node = node.parentNode)) {\\n return defaultTiming.time = now(), defaultTiming;\\n }\\n }\\n return timing;\\n}\\n\\n/* harmony default export */ var selection_transition = (function(name) {\\n var id,\\n timing;\\n\\n if (name instanceof Transition) {\\n id = name._id, name = name._name;\\n } else {\\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\\n }\\n\\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\\n if (node = group[i]) {\\n transition_schedule(node, name, id, i, group, timing || transition_inherit(node, id));\\n }\\n }\\n }\\n\\n return new Transition(groups, this._parents, name, id);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/selection/index.js\\n\\n\\n\\n\\nsrc_selection.prototype.interrupt = selection_interrupt;\\nsrc_selection.prototype.transition = selection_transition;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/active.js\\n\\n\\n\\nvar active_root = [null];\\n\\n/* harmony default export */ var src_active = (function(node, name) {\\n var schedules = node.__transition,\\n schedule,\\n i;\\n\\n if (schedules) {\\n name = name == null ? null : name + \"\";\\n for (i in schedules) {\\n if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {\\n return new Transition([[node]], active_root, name, +i);\\n }\\n }\\n }\\n\\n return null;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-transition/src/index.js\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-brush/src/constant.js\\n/* harmony default export */ var d3_brush_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-brush/src/event.js\\n/* harmony default export */ var src_event = (function(target, type, selection) {\\n this.target = target;\\n this.type = type;\\n this.selection = selection;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-brush/src/noevent.js\\n\\n\\nfunction noevent_nopropagation() {\\n on_event.stopImmediatePropagation();\\n}\\n\\n/* harmony default export */ var src_noevent = (function() {\\n on_event.preventDefault();\\n on_event.stopImmediatePropagation();\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-brush/src/brush.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nvar MODE_DRAG = {name: \"drag\"},\\n MODE_SPACE = {name: \"space\"},\\n MODE_HANDLE = {name: \"handle\"},\\n MODE_CENTER = {name: \"center\"};\\n\\nfunction number1(e) {\\n return [+e[0], +e[1]];\\n}\\n\\nfunction number2(e) {\\n return [number1(e[0]), number1(e[1])];\\n}\\n\\nfunction toucher(identifier) {\\n return function(target) {\\n return src_touch(target, on_event.touches, identifier);\\n };\\n}\\n\\nvar brush_X = {\\n name: \"x\",\\n handles: [\"w\", \"e\"].map(brush_type),\\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\\n};\\n\\nvar brush_Y = {\\n name: \"y\",\\n handles: [\"n\", \"s\"].map(brush_type),\\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\\n};\\n\\nvar XY = {\\n name: \"xy\",\\n handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(brush_type),\\n input: function(xy) { return xy == null ? null : number2(xy); },\\n output: function(xy) { return xy; }\\n};\\n\\nvar cursors = {\\n overlay: \"crosshair\",\\n selection: \"move\",\\n n: \"ns-resize\",\\n e: \"ew-resize\",\\n s: \"ns-resize\",\\n w: \"ew-resize\",\\n nw: \"nwse-resize\",\\n ne: \"nesw-resize\",\\n se: \"nwse-resize\",\\n sw: \"nesw-resize\"\\n};\\n\\nvar flipX = {\\n e: \"w\",\\n w: \"e\",\\n nw: \"ne\",\\n ne: \"nw\",\\n se: \"sw\",\\n sw: \"se\"\\n};\\n\\nvar flipY = {\\n n: \"s\",\\n s: \"n\",\\n nw: \"sw\",\\n ne: \"se\",\\n se: \"ne\",\\n sw: \"nw\"\\n};\\n\\nvar signsX = {\\n overlay: +1,\\n selection: +1,\\n n: null,\\n e: +1,\\n s: null,\\n w: -1,\\n nw: -1,\\n ne: +1,\\n se: +1,\\n sw: -1\\n};\\n\\nvar signsY = {\\n overlay: +1,\\n selection: +1,\\n n: -1,\\n e: null,\\n s: +1,\\n w: null,\\n nw: -1,\\n ne: -1,\\n se: +1,\\n sw: +1\\n};\\n\\nfunction brush_type(t) {\\n return {type: t};\\n}\\n\\n// Ignore right-click, since that should open the context menu.\\nfunction defaultFilter() {\\n return !on_event.ctrlKey && !on_event.button;\\n}\\n\\nfunction defaultExtent() {\\n var svg = this.ownerSVGElement || this;\\n if (svg.hasAttribute(\"viewBox\")) {\\n svg = svg.viewBox.baseVal;\\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\\n }\\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\\n}\\n\\nfunction defaultTouchable() {\\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\\n}\\n\\n// Like d3.local, but with the name “__brush” rather than auto-generated.\\nfunction local(node) {\\n while (!node.__brush) if (!(node = node.parentNode)) return;\\n return node.__brush;\\n}\\n\\nfunction brush_empty(extent) {\\n return extent[0][0] === extent[1][0]\\n || extent[0][1] === extent[1][1];\\n}\\n\\nfunction brushSelection(node) {\\n var state = node.__brush;\\n return state ? state.dim.output(state.selection) : null;\\n}\\n\\nfunction brushX() {\\n return brush_brush(brush_X);\\n}\\n\\nfunction brushY() {\\n return brush_brush(brush_Y);\\n}\\n\\n/* harmony default export */ var src_brush = (function() {\\n return brush_brush(XY);\\n});\\n\\nfunction brush_brush(dim) {\\n var extent = defaultExtent,\\n filter = defaultFilter,\\n touchable = defaultTouchable,\\n keys = true,\\n listeners = src_dispatch(\"start\", \"brush\", \"end\"),\\n handleSize = 6,\\n touchending;\\n\\n function brush(group) {\\n var overlay = group\\n .property(\"__brush\", initialize)\\n .selectAll(\".overlay\")\\n .data([brush_type(\"overlay\")]);\\n\\n overlay.enter().append(\"rect\")\\n .attr(\"class\", \"overlay\")\\n .attr(\"pointer-events\", \"all\")\\n .attr(\"cursor\", cursors.overlay)\\n .merge(overlay)\\n .each(function() {\\n var extent = local(this).extent;\\n src_select(this)\\n .attr(\"x\", extent[0][0])\\n .attr(\"y\", extent[0][1])\\n .attr(\"width\", extent[1][0] - extent[0][0])\\n .attr(\"height\", extent[1][1] - extent[0][1]);\\n });\\n\\n group.selectAll(\".selection\")\\n .data([brush_type(\"selection\")])\\n .enter().append(\"rect\")\\n .attr(\"class\", \"selection\")\\n .attr(\"cursor\", cursors.selection)\\n .attr(\"fill\", \"#777\")\\n .attr(\"fill-opacity\", 0.3)\\n .attr(\"stroke\", \"#fff\")\\n .attr(\"shape-rendering\", \"crispEdges\");\\n\\n var handle = group.selectAll(\".handle\")\\n .data(dim.handles, function(d) { return d.type; });\\n\\n handle.exit().remove();\\n\\n handle.enter().append(\"rect\")\\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\\n\\n group\\n .each(redraw)\\n .attr(\"fill\", \"none\")\\n .attr(\"pointer-events\", \"all\")\\n .on(\"mousedown.brush\", started)\\n .filter(touchable)\\n .on(\"touchstart.brush\", started)\\n .on(\"touchmove.brush\", touchmoved)\\n .on(\"touchend.brush touchcancel.brush\", touchended)\\n .style(\"touch-action\", \"none\")\\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\\n }\\n\\n brush.move = function(group, selection) {\\n if (group.selection) {\\n group\\n .on(\"start.brush\", function() { emitter(this, arguments).beforestart().start(); })\\n .on(\"interrupt.brush end.brush\", function() { emitter(this, arguments).end(); })\\n .tween(\"brush\", function() {\\n var that = this,\\n state = that.__brush,\\n emit = emitter(that, arguments),\\n selection0 = state.selection,\\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\\n i = src_value(selection0, selection1);\\n\\n function tween(t) {\\n state.selection = t === 1 && selection1 === null ? null : i(t);\\n redraw.call(that);\\n emit.brush();\\n }\\n\\n return selection0 !== null && selection1 !== null ? tween : tween(1);\\n });\\n } else {\\n group\\n .each(function() {\\n var that = this,\\n args = arguments,\\n state = that.__brush,\\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\\n emit = emitter(that, args).beforestart();\\n\\n interrupt(that);\\n state.selection = selection1 === null ? null : selection1;\\n redraw.call(that);\\n emit.start().brush().end();\\n });\\n }\\n };\\n\\n brush.clear = function(group) {\\n brush.move(group, null);\\n };\\n\\n function redraw() {\\n var group = src_select(this),\\n selection = local(this).selection;\\n\\n if (selection) {\\n group.selectAll(\".selection\")\\n .style(\"display\", null)\\n .attr(\"x\", selection[0][0])\\n .attr(\"y\", selection[0][1])\\n .attr(\"width\", selection[1][0] - selection[0][0])\\n .attr(\"height\", selection[1][1] - selection[0][1]);\\n\\n group.selectAll(\".handle\")\\n .style(\"display\", null)\\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\\n }\\n\\n else {\\n group.selectAll(\".selection,.handle\")\\n .style(\"display\", \"none\")\\n .attr(\"x\", null)\\n .attr(\"y\", null)\\n .attr(\"width\", null)\\n .attr(\"height\", null);\\n }\\n }\\n\\n function emitter(that, args, clean) {\\n return (!clean && that.__brush.emitter) || new Emitter(that, args);\\n }\\n\\n function Emitter(that, args) {\\n this.that = that;\\n this.args = args;\\n this.state = that.__brush;\\n this.active = 0;\\n }\\n\\n Emitter.prototype = {\\n beforestart: function() {\\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\\n return this;\\n },\\n start: function() {\\n if (this.starting) this.starting = false, this.emit(\"start\");\\n else this.emit(\"brush\");\\n return this;\\n },\\n brush: function() {\\n this.emit(\"brush\");\\n return this;\\n },\\n end: function() {\\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\");\\n return this;\\n },\\n emit: function(type) {\\n customEvent(new src_event(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);\\n }\\n };\\n\\n function started() {\\n if (touchending && !on_event.touches) return;\\n if (!filter.apply(this, arguments)) return;\\n\\n var that = this,\\n type = on_event.target.__data__.type,\\n mode = (keys && on_event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && on_event.altKey ? MODE_CENTER : MODE_HANDLE),\\n signX = dim === brush_Y ? null : signsX[type],\\n signY = dim === brush_X ? null : signsY[type],\\n state = local(that),\\n extent = state.extent,\\n selection = state.selection,\\n W = extent[0][0], w0, w1,\\n N = extent[0][1], n0, n1,\\n E = extent[1][0], e0, e1,\\n S = extent[1][1], s0, s1,\\n dx = 0,\\n dy = 0,\\n moving,\\n shifting = signX && signY && keys && on_event.shiftKey,\\n lockX,\\n lockY,\\n pointer = on_event.touches ? toucher(on_event.changedTouches[0].identifier) : mouse,\\n point0 = pointer(that),\\n point = point0,\\n emit = emitter(that, arguments, true).beforestart();\\n\\n if (type === \"overlay\") {\\n if (selection) moving = true;\\n state.selection = selection = [\\n [w0 = dim === brush_Y ? W : point0[0], n0 = dim === brush_X ? N : point0[1]],\\n [e0 = dim === brush_Y ? E : w0, s0 = dim === brush_X ? S : n0]\\n ];\\n } else {\\n w0 = selection[0][0];\\n n0 = selection[0][1];\\n e0 = selection[1][0];\\n s0 = selection[1][1];\\n }\\n\\n w1 = w0;\\n n1 = n0;\\n e1 = e0;\\n s1 = s0;\\n\\n var group = src_select(that)\\n .attr(\"pointer-events\", \"none\");\\n\\n var overlay = group.selectAll(\".overlay\")\\n .attr(\"cursor\", cursors[type]);\\n\\n if (on_event.touches) {\\n emit.moved = moved;\\n emit.ended = ended;\\n } else {\\n var view = src_select(on_event.view)\\n .on(\"mousemove.brush\", moved, true)\\n .on(\"mouseup.brush\", ended, true);\\n if (keys) view\\n .on(\"keydown.brush\", keydowned, true)\\n .on(\"keyup.brush\", keyupped, true)\\n\\n nodrag(on_event.view);\\n }\\n\\n noevent_nopropagation();\\n interrupt(that);\\n redraw.call(that);\\n emit.start();\\n\\n function moved() {\\n var point1 = pointer(that);\\n if (shifting && !lockX && !lockY) {\\n if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;\\n else lockX = true;\\n }\\n point = point1;\\n moving = true;\\n src_noevent();\\n move();\\n }\\n\\n function move() {\\n var t;\\n\\n dx = point[0] - point0[0];\\n dy = point[1] - point0[1];\\n\\n switch (mode) {\\n case MODE_SPACE:\\n case MODE_DRAG: {\\n if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\\n if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\\n break;\\n }\\n case MODE_HANDLE: {\\n if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\\n else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\\n if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\\n else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\\n break;\\n }\\n case MODE_CENTER: {\\n if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));\\n if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));\\n break;\\n }\\n }\\n\\n if (e1 < w1) {\\n signX *= -1;\\n t = w0, w0 = e0, e0 = t;\\n t = w1, w1 = e1, e1 = t;\\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\\n }\\n\\n if (s1 < n1) {\\n signY *= -1;\\n t = n0, n0 = s0, s0 = t;\\n t = n1, n1 = s1, s1 = t;\\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\\n }\\n\\n if (state.selection) selection = state.selection; // May be set by brush.move!\\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\\n\\n if (selection[0][0] !== w1\\n || selection[0][1] !== n1\\n || selection[1][0] !== e1\\n || selection[1][1] !== s1) {\\n state.selection = [[w1, n1], [e1, s1]];\\n redraw.call(that);\\n emit.brush();\\n }\\n }\\n\\n function ended() {\\n noevent_nopropagation();\\n if (on_event.touches) {\\n if (on_event.touches.length) return;\\n if (touchending) clearTimeout(touchending);\\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\\n } else {\\n yesdrag(on_event.view, moving);\\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\\n }\\n group.attr(\"pointer-events\", \"all\");\\n overlay.attr(\"cursor\", cursors.overlay);\\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\\n if (brush_empty(selection)) state.selection = null, redraw.call(that);\\n emit.end();\\n }\\n\\n function keydowned() {\\n switch (on_event.keyCode) {\\n case 16: { // SHIFT\\n shifting = signX && signY;\\n break;\\n }\\n case 18: { // ALT\\n if (mode === MODE_HANDLE) {\\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\\n mode = MODE_CENTER;\\n move();\\n }\\n break;\\n }\\n case 32: { // SPACE; takes priority over ALT\\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\\n mode = MODE_SPACE;\\n overlay.attr(\"cursor\", cursors.selection);\\n move();\\n }\\n break;\\n }\\n default: return;\\n }\\n src_noevent();\\n }\\n\\n function keyupped() {\\n switch (on_event.keyCode) {\\n case 16: { // SHIFT\\n if (shifting) {\\n lockX = lockY = shifting = false;\\n move();\\n }\\n break;\\n }\\n case 18: { // ALT\\n if (mode === MODE_CENTER) {\\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\\n mode = MODE_HANDLE;\\n move();\\n }\\n break;\\n }\\n case 32: { // SPACE\\n if (mode === MODE_SPACE) {\\n if (on_event.altKey) {\\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\\n mode = MODE_CENTER;\\n } else {\\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\\n mode = MODE_HANDLE;\\n }\\n overlay.attr(\"cursor\", cursors[type]);\\n move();\\n }\\n break;\\n }\\n default: return;\\n }\\n src_noevent();\\n }\\n }\\n\\n function touchmoved() {\\n emitter(this, arguments).moved();\\n }\\n\\n function touchended() {\\n emitter(this, arguments).ended();\\n }\\n\\n function initialize() {\\n var state = this.__brush || {selection: null};\\n state.extent = number2(extent.apply(this, arguments));\\n state.dim = dim;\\n return state;\\n }\\n\\n brush.extent = function(_) {\\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : d3_brush_src_constant(number2(_)), brush) : extent;\\n };\\n\\n brush.filter = function(_) {\\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : d3_brush_src_constant(!!_), brush) : filter;\\n };\\n\\n brush.touchable = function(_) {\\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : d3_brush_src_constant(!!_), brush) : touchable;\\n };\\n\\n brush.handleSize = function(_) {\\n return arguments.length ? (handleSize = +_, brush) : handleSize;\\n };\\n\\n brush.keyModifiers = function(_) {\\n return arguments.length ? (keys = !!_, brush) : keys;\\n };\\n\\n brush.on = function() {\\n var value = listeners.on.apply(listeners, arguments);\\n return value === listeners ? brush : value;\\n };\\n\\n return brush;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-brush/src/index.js\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-chord/src/math.js\\nvar cos = Math.cos;\\nvar sin = Math.sin;\\nvar pi = Math.PI;\\nvar halfPi = pi / 2;\\nvar tau = pi * 2;\\nvar math_max = Math.max;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-chord/src/chord.js\\n\\n\\n\\nfunction compareValue(compare) {\\n return function(a, b) {\\n return compare(\\n a.source.value + a.target.value,\\n b.source.value + b.target.value\\n );\\n };\\n}\\n\\n/* harmony default export */ var src_chord = (function() {\\n var padAngle = 0,\\n sortGroups = null,\\n sortSubgroups = null,\\n sortChords = null;\\n\\n function chord(matrix) {\\n var n = matrix.length,\\n groupSums = [],\\n groupIndex = src_range(n),\\n subgroupIndex = [],\\n chords = [],\\n groups = chords.groups = new Array(n),\\n subgroups = new Array(n * n),\\n k,\\n x,\\n x0,\\n dx,\\n i,\\n j;\\n\\n // Compute the sum.\\n k = 0, i = -1; while (++i < n) {\\n x = 0, j = -1; while (++j < n) {\\n x += matrix[i][j];\\n }\\n groupSums.push(x);\\n subgroupIndex.push(src_range(n));\\n k += x;\\n }\\n\\n // Sort groups…\\n if (sortGroups) groupIndex.sort(function(a, b) {\\n return sortGroups(groupSums[a], groupSums[b]);\\n });\\n\\n // Sort subgroups…\\n if (sortSubgroups) subgroupIndex.forEach(function(d, i) {\\n d.sort(function(a, b) {\\n return sortSubgroups(matrix[i][a], matrix[i][b]);\\n });\\n });\\n\\n // Convert the sum to scaling factor for [0, 2pi].\\n // TODO Allow start and end angle to be specified?\\n // TODO Allow padding to be specified as percentage?\\n k = math_max(0, tau - padAngle * n) / k;\\n dx = k ? padAngle : tau / n;\\n\\n // Compute the start and end angle for each group and subgroup.\\n // Note: Opera has a bug reordering object literal properties!\\n x = 0, i = -1; while (++i < n) {\\n x0 = x, j = -1; while (++j < n) {\\n var di = groupIndex[i],\\n dj = subgroupIndex[di][j],\\n v = matrix[di][dj],\\n a0 = x,\\n a1 = x += v * k;\\n subgroups[dj * n + di] = {\\n index: di,\\n subindex: dj,\\n startAngle: a0,\\n endAngle: a1,\\n value: v\\n };\\n }\\n groups[di] = {\\n index: di,\\n startAngle: x0,\\n endAngle: x,\\n value: groupSums[di]\\n };\\n x += dx;\\n }\\n\\n // Generate chords for each (non-empty) subgroup-subgroup link.\\n i = -1; while (++i < n) {\\n j = i - 1; while (++j < n) {\\n var source = subgroups[j * n + i],\\n target = subgroups[i * n + j];\\n if (source.value || target.value) {\\n chords.push(source.value < target.value\\n ? {source: target, target: source}\\n : {source: source, target: target});\\n }\\n }\\n }\\n\\n return sortChords ? chords.sort(sortChords) : chords;\\n }\\n\\n chord.padAngle = function(_) {\\n return arguments.length ? (padAngle = math_max(0, _), chord) : padAngle;\\n };\\n\\n chord.sortGroups = function(_) {\\n return arguments.length ? (sortGroups = _, chord) : sortGroups;\\n };\\n\\n chord.sortSubgroups = function(_) {\\n return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;\\n };\\n\\n chord.sortChords = function(_) {\\n return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;\\n };\\n\\n return chord;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-chord/src/array.js\\nvar src_array_slice = Array.prototype.slice;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-chord/src/constant.js\\n/* harmony default export */ var d3_chord_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-path/src/path.js\\nvar path_pi = Math.PI,\\n path_tau = 2 * path_pi,\\n path_epsilon = 1e-6,\\n tauEpsilon = path_tau - path_epsilon;\\n\\nfunction Path() {\\n this._x0 = this._y0 = // start of current subpath\\n this._x1 = this._y1 = null; // end of current subpath\\n this._ = \"\";\\n}\\n\\nfunction path_path() {\\n return new Path;\\n}\\n\\nPath.prototype = path_path.prototype = {\\n constructor: Path,\\n moveTo: function(x, y) {\\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\\n },\\n closePath: function() {\\n if (this._x1 !== null) {\\n this._x1 = this._x0, this._y1 = this._y0;\\n this._ += \"Z\";\\n }\\n },\\n lineTo: function(x, y) {\\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\\n },\\n quadraticCurveTo: function(x1, y1, x, y) {\\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\\n },\\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\\n },\\n arcTo: function(x1, y1, x2, y2, r) {\\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\\n var x0 = this._x1,\\n y0 = this._y1,\\n x21 = x2 - x1,\\n y21 = y2 - y1,\\n x01 = x0 - x1,\\n y01 = y0 - y1,\\n l01_2 = x01 * x01 + y01 * y01;\\n\\n // Is the radius negative? Error.\\n if (r < 0) throw new Error(\"negative radius: \" + r);\\n\\n // Is this path empty? Move to (x1,y1).\\n if (this._x1 === null) {\\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\\n }\\n\\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\\n else if (!(l01_2 > path_epsilon));\\n\\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\\n // Or, is the radius zero? Line to (x1,y1).\\n else if (!(Math.abs(y01 * x21 - y21 * x01) > path_epsilon) || !r) {\\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\\n }\\n\\n // Otherwise, draw an arc!\\n else {\\n var x20 = x2 - x0,\\n y20 = y2 - y0,\\n l21_2 = x21 * x21 + y21 * y21,\\n l20_2 = x20 * x20 + y20 * y20,\\n l21 = Math.sqrt(l21_2),\\n l01 = Math.sqrt(l01_2),\\n l = r * Math.tan((path_pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\\n t01 = l / l01,\\n t21 = l / l21;\\n\\n // If the start tangent is not coincident with (x0,y0), line to.\\n if (Math.abs(t01 - 1) > path_epsilon) {\\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\\n }\\n\\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\\n }\\n },\\n arc: function(x, y, r, a0, a1, ccw) {\\n x = +x, y = +y, r = +r, ccw = !!ccw;\\n var dx = r * Math.cos(a0),\\n dy = r * Math.sin(a0),\\n x0 = x + dx,\\n y0 = y + dy,\\n cw = 1 ^ ccw,\\n da = ccw ? a0 - a1 : a1 - a0;\\n\\n // Is the radius negative? Error.\\n if (r < 0) throw new Error(\"negative radius: \" + r);\\n\\n // Is this path empty? Move to (x0,y0).\\n if (this._x1 === null) {\\n this._ += \"M\" + x0 + \",\" + y0;\\n }\\n\\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\\n else if (Math.abs(this._x1 - x0) > path_epsilon || Math.abs(this._y1 - y0) > path_epsilon) {\\n this._ += \"L\" + x0 + \",\" + y0;\\n }\\n\\n // Is this arc empty? Were done.\\n if (!r) return;\\n\\n // Does the angle go the wrong way? Flip the direction.\\n if (da < 0) da = da % path_tau + path_tau;\\n\\n // Is this a complete circle? Draw two arcs to complete the circle.\\n if (da > tauEpsilon) {\\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\\n }\\n\\n // Is this arc non-empty? Draw an arc!\\n else if (da > path_epsilon) {\\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= path_pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\\n }\\n },\\n rect: function(x, y, w, h) {\\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\\n },\\n toString: function() {\\n return this._;\\n }\\n};\\n\\n/* harmony default export */ var src_path = (path_path);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-chord/src/ribbon.js\\n\\n\\n\\n\\n\\nfunction defaultSource(d) {\\n return d.source;\\n}\\n\\nfunction defaultTarget(d) {\\n return d.target;\\n}\\n\\nfunction defaultRadius(d) {\\n return d.radius;\\n}\\n\\nfunction defaultStartAngle(d) {\\n return d.startAngle;\\n}\\n\\nfunction defaultEndAngle(d) {\\n return d.endAngle;\\n}\\n\\n/* harmony default export */ var src_ribbon = (function() {\\n var source = defaultSource,\\n target = defaultTarget,\\n radius = defaultRadius,\\n startAngle = defaultStartAngle,\\n endAngle = defaultEndAngle,\\n context = null;\\n\\n function ribbon() {\\n var buffer,\\n argv = src_array_slice.call(arguments),\\n s = source.apply(this, argv),\\n t = target.apply(this, argv),\\n sr = +radius.apply(this, (argv[0] = s, argv)),\\n sa0 = startAngle.apply(this, argv) - halfPi,\\n sa1 = endAngle.apply(this, argv) - halfPi,\\n sx0 = sr * cos(sa0),\\n sy0 = sr * sin(sa0),\\n tr = +radius.apply(this, (argv[0] = t, argv)),\\n ta0 = startAngle.apply(this, argv) - halfPi,\\n ta1 = endAngle.apply(this, argv) - halfPi;\\n\\n if (!context) context = buffer = src_path();\\n\\n context.moveTo(sx0, sy0);\\n context.arc(0, 0, sr, sa0, sa1);\\n if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?\\n context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));\\n context.arc(0, 0, tr, ta0, ta1);\\n }\\n context.quadraticCurveTo(0, 0, sx0, sy0);\\n context.closePath();\\n\\n if (buffer) return context = null, buffer + \"\" || null;\\n }\\n\\n ribbon.radius = function(_) {\\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : d3_chord_src_constant(+_), ribbon) : radius;\\n };\\n\\n ribbon.startAngle = function(_) {\\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : d3_chord_src_constant(+_), ribbon) : startAngle;\\n };\\n\\n ribbon.endAngle = function(_) {\\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : d3_chord_src_constant(+_), ribbon) : endAngle;\\n };\\n\\n ribbon.source = function(_) {\\n return arguments.length ? (source = _, ribbon) : source;\\n };\\n\\n ribbon.target = function(_) {\\n return arguments.length ? (target = _, ribbon) : target;\\n };\\n\\n ribbon.context = function(_) {\\n return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;\\n };\\n\\n return ribbon;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-chord/src/index.js\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-collection/src/map.js\\nvar map_prefix = \"$\";\\n\\nfunction Map() {}\\n\\nMap.prototype = map_map.prototype = {\\n constructor: Map,\\n has: function(key) {\\n return (map_prefix + key) in this;\\n },\\n get: function(key) {\\n return this[map_prefix + key];\\n },\\n set: function(key, value) {\\n this[map_prefix + key] = value;\\n return this;\\n },\\n remove: function(key) {\\n var property = map_prefix + key;\\n return property in this && delete this[property];\\n },\\n clear: function() {\\n for (var property in this) if (property[0] === map_prefix) delete this[property];\\n },\\n keys: function() {\\n var keys = [];\\n for (var property in this) if (property[0] === map_prefix) keys.push(property.slice(1));\\n return keys;\\n },\\n values: function() {\\n var values = [];\\n for (var property in this) if (property[0] === map_prefix) values.push(this[property]);\\n return values;\\n },\\n entries: function() {\\n var entries = [];\\n for (var property in this) if (property[0] === map_prefix) entries.push({key: property.slice(1), value: this[property]});\\n return entries;\\n },\\n size: function() {\\n var size = 0;\\n for (var property in this) if (property[0] === map_prefix) ++size;\\n return size;\\n },\\n empty: function() {\\n for (var property in this) if (property[0] === map_prefix) return false;\\n return true;\\n },\\n each: function(f) {\\n for (var property in this) if (property[0] === map_prefix) f(this[property], property.slice(1), this);\\n }\\n};\\n\\nfunction map_map(object, f) {\\n var map = new Map;\\n\\n // Copy constructor.\\n if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\\n\\n // Index array by numeric index or specified key function.\\n else if (Array.isArray(object)) {\\n var i = -1,\\n n = object.length,\\n o;\\n\\n if (f == null) while (++i < n) map.set(i, object[i]);\\n else while (++i < n) map.set(f(o = object[i], i, object), o);\\n }\\n\\n // Convert object to map.\\n else if (object) for (var key in object) map.set(key, object[key]);\\n\\n return map;\\n}\\n\\n/* harmony default export */ var src_map = (map_map);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-collection/src/nest.js\\n\\n\\n/* harmony default export */ var src_nest = (function() {\\n var keys = [],\\n sortKeys = [],\\n sortValues,\\n rollup,\\n nest;\\n\\n function apply(array, depth, createResult, setResult) {\\n if (depth >= keys.length) {\\n if (sortValues != null) array.sort(sortValues);\\n return rollup != null ? rollup(array) : array;\\n }\\n\\n var i = -1,\\n n = array.length,\\n key = keys[depth++],\\n keyValue,\\n value,\\n valuesByKey = src_map(),\\n values,\\n result = createResult();\\n\\n while (++i < n) {\\n if (values = valuesByKey.get(keyValue = key(value = array[i]) + \"\")) {\\n values.push(value);\\n } else {\\n valuesByKey.set(keyValue, [value]);\\n }\\n }\\n\\n valuesByKey.each(function(values, key) {\\n setResult(result, key, apply(values, depth, createResult, setResult));\\n });\\n\\n return result;\\n }\\n\\n function entries(map, depth) {\\n if (++depth > keys.length) return map;\\n var array, sortKey = sortKeys[depth - 1];\\n if (rollup != null && depth >= keys.length) array = map.entries();\\n else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });\\n return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;\\n }\\n\\n return nest = {\\n object: function(array) { return apply(array, 0, createObject, setObject); },\\n map: function(array) { return apply(array, 0, createMap, setMap); },\\n entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },\\n key: function(d) { keys.push(d); return nest; },\\n sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },\\n sortValues: function(order) { sortValues = order; return nest; },\\n rollup: function(f) { rollup = f; return nest; }\\n };\\n});\\n\\nfunction createObject() {\\n return {};\\n}\\n\\nfunction setObject(object, key, value) {\\n object[key] = value;\\n}\\n\\nfunction createMap() {\\n return src_map();\\n}\\n\\nfunction setMap(map, key, value) {\\n map.set(key, value);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-collection/src/set.js\\n\\n\\nfunction Set() {}\\n\\nvar proto = src_map.prototype;\\n\\nSet.prototype = set_set.prototype = {\\n constructor: Set,\\n has: proto.has,\\n add: function(value) {\\n value += \"\";\\n this[map_prefix + value] = value;\\n return this;\\n },\\n remove: proto.remove,\\n clear: proto.clear,\\n values: proto.keys,\\n size: proto.size,\\n empty: proto.empty,\\n each: proto.each\\n};\\n\\nfunction set_set(object, f) {\\n var set = new Set;\\n\\n // Copy constructor.\\n if (object instanceof Set) object.each(function(value) { set.add(value); });\\n\\n // Otherwise, assume its an array.\\n else if (object) {\\n var i = -1, n = object.length;\\n if (f == null) while (++i < n) set.add(object[i]);\\n else while (++i < n) set.add(f(object[i], i, object));\\n }\\n\\n return set;\\n}\\n\\n/* harmony default export */ var src_set = (set_set);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-collection/src/keys.js\\n/* harmony default export */ var src_keys = (function(map) {\\n var keys = [];\\n for (var key in map) keys.push(key);\\n return keys;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-collection/src/values.js\\n/* harmony default export */ var src_values = (function(map) {\\n var values = [];\\n for (var key in map) values.push(map[key]);\\n return values;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-collection/src/entries.js\\n/* harmony default export */ var src_entries = (function(map) {\\n var entries = [];\\n for (var key in map) entries.push({key: key, value: map[key]});\\n return entries;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-collection/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-color/src/math.js\\nvar deg2rad = Math.PI / 180;\\nvar rad2deg = 180 / Math.PI;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-color/src/lab.js\\n\\n\\n\\n\\n// https://observablehq.com/@mbostock/lab-and-rgb\\nvar K = 18,\\n Xn = 0.96422,\\n Yn = 1,\\n Zn = 0.82521,\\n lab_t0 = 4 / 29,\\n lab_t1 = 6 / 29,\\n lab_t2 = 3 * lab_t1 * lab_t1,\\n t3 = lab_t1 * lab_t1 * lab_t1;\\n\\nfunction labConvert(o) {\\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\\n if (o instanceof Hcl) return hcl2lab(o);\\n if (!(o instanceof Rgb)) o = rgbConvert(o);\\n var r = rgb2lrgb(o.r),\\n g = rgb2lrgb(o.g),\\n b = rgb2lrgb(o.b),\\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\\n if (r === g && g === b) x = z = y; else {\\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\\n }\\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\\n}\\n\\nfunction gray(l, opacity) {\\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\\n}\\n\\nfunction lab(l, a, b, opacity) {\\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\\n}\\n\\nfunction Lab(l, a, b, opacity) {\\n this.l = +l;\\n this.a = +a;\\n this.b = +b;\\n this.opacity = +opacity;\\n}\\n\\ndefine(Lab, lab, extend(Color, {\\n brighter: function(k) {\\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\\n },\\n darker: function(k) {\\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\\n },\\n rgb: function() {\\n var y = (this.l + 16) / 116,\\n x = isNaN(this.a) ? y : y + this.a / 500,\\n z = isNaN(this.b) ? y : y - this.b / 200;\\n x = Xn * lab2xyz(x);\\n y = Yn * lab2xyz(y);\\n z = Zn * lab2xyz(z);\\n return new Rgb(\\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\\n this.opacity\\n );\\n }\\n}));\\n\\nfunction xyz2lab(t) {\\n return t > t3 ? Math.pow(t, 1 / 3) : t / lab_t2 + lab_t0;\\n}\\n\\nfunction lab2xyz(t) {\\n return t > lab_t1 ? t * t * t : lab_t2 * (t - lab_t0);\\n}\\n\\nfunction lrgb2rgb(x) {\\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\\n}\\n\\nfunction rgb2lrgb(x) {\\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\\n}\\n\\nfunction hclConvert(o) {\\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\\n if (!(o instanceof Lab)) o = labConvert(o);\\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\\n var h = Math.atan2(o.b, o.a) * rad2deg;\\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\\n}\\n\\nfunction lch(l, c, h, opacity) {\\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\\n}\\n\\nfunction hcl(h, c, l, opacity) {\\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\\n}\\n\\nfunction Hcl(h, c, l, opacity) {\\n this.h = +h;\\n this.c = +c;\\n this.l = +l;\\n this.opacity = +opacity;\\n}\\n\\nfunction hcl2lab(o) {\\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\\n var h = o.h * deg2rad;\\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\\n}\\n\\ndefine(Hcl, hcl, extend(Color, {\\n brighter: function(k) {\\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\\n },\\n darker: function(k) {\\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\\n },\\n rgb: function() {\\n return hcl2lab(this).rgb();\\n }\\n}));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-color/src/cubehelix.js\\n\\n\\n\\n\\nvar cubehelix_A = -0.14861,\\n cubehelix_B = +1.78277,\\n C = -0.29227,\\n cubehelix_D = -0.90649,\\n cubehelix_E = +1.97294,\\n ED = cubehelix_E * cubehelix_D,\\n EB = cubehelix_E * cubehelix_B,\\n BC_DA = cubehelix_B * C - cubehelix_D * cubehelix_A;\\n\\nfunction cubehelixConvert(o) {\\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\\n if (!(o instanceof Rgb)) o = rgbConvert(o);\\n var r = o.r / 255,\\n g = o.g / 255,\\n b = o.b / 255,\\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\\n bl = b - l,\\n k = (cubehelix_E * (g - l) - C * bl) / cubehelix_D,\\n s = Math.sqrt(k * k + bl * bl) / (cubehelix_E * l * (1 - l)), // NaN if l=0 or l=1\\n h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\\n}\\n\\nfunction cubehelix_cubehelix(h, s, l, opacity) {\\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\\n}\\n\\nfunction Cubehelix(h, s, l, opacity) {\\n this.h = +h;\\n this.s = +s;\\n this.l = +l;\\n this.opacity = +opacity;\\n}\\n\\ndefine(Cubehelix, cubehelix_cubehelix, extend(Color, {\\n brighter: function(k) {\\n k = k == null ? brighter : Math.pow(brighter, k);\\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\\n },\\n darker: function(k) {\\n k = k == null ? darker : Math.pow(darker, k);\\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\\n },\\n rgb: function() {\\n var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\\n l = +this.l,\\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\\n cosh = Math.cos(h),\\n sinh = Math.sin(h);\\n return new Rgb(\\n 255 * (l + a * (cubehelix_A * cosh + cubehelix_B * sinh)),\\n 255 * (l + a * (C * cosh + cubehelix_D * sinh)),\\n 255 * (l + a * (cubehelix_E * cosh)),\\n this.opacity\\n );\\n }\\n}));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-color/src/index.js\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-contour/src/array.js\\nvar src_array_array = Array.prototype;\\n\\nvar d3_contour_src_array_slice = src_array_array.slice;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-contour/src/ascending.js\\n/* harmony default export */ var src_ascending = (function(a, b) {\\n return a - b;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-contour/src/area.js\\n/* harmony default export */ var src_area = (function(ring) {\\n var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\\n while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\\n return area;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-contour/src/constant.js\\n/* harmony default export */ var d3_contour_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-contour/src/contains.js\\n/* harmony default export */ var contains = (function(ring, hole) {\\n var i = -1, n = hole.length, c;\\n while (++i < n) if (c = ringContains(ring, hole[i])) return c;\\n return 0;\\n});\\n\\nfunction ringContains(ring, point) {\\n var x = point[0], y = point[1], contains = -1;\\n for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {\\n var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];\\n if (segmentContains(pi, pj, point)) return 0;\\n if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains;\\n }\\n return contains;\\n}\\n\\nfunction segmentContains(a, b, c) {\\n var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);\\n}\\n\\nfunction collinear(a, b, c) {\\n return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);\\n}\\n\\nfunction within(p, q, r) {\\n return p <= q && q <= r || r <= q && q <= p;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-contour/src/noop.js\\n/* harmony default export */ var src_noop = (function() {});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-contour/src/contours.js\\n\\n\\n\\n\\n\\n\\n\\n\\nvar cases = [\\n [],\\n [[[1.0, 1.5], [0.5, 1.0]]],\\n [[[1.5, 1.0], [1.0, 1.5]]],\\n [[[1.5, 1.0], [0.5, 1.0]]],\\n [[[1.0, 0.5], [1.5, 1.0]]],\\n [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]],\\n [[[1.0, 0.5], [1.0, 1.5]]],\\n [[[1.0, 0.5], [0.5, 1.0]]],\\n [[[0.5, 1.0], [1.0, 0.5]]],\\n [[[1.0, 1.5], [1.0, 0.5]]],\\n [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]],\\n [[[1.5, 1.0], [1.0, 0.5]]],\\n [[[0.5, 1.0], [1.5, 1.0]]],\\n [[[1.0, 1.5], [1.5, 1.0]]],\\n [[[0.5, 1.0], [1.0, 1.5]]],\\n []\\n];\\n\\n/* harmony default export */ var src_contours = (function() {\\n var dx = 1,\\n dy = 1,\\n threshold = sturges,\\n smooth = smoothLinear;\\n\\n function contours(values) {\\n var tz = threshold(values);\\n\\n // Convert number of thresholds into uniform thresholds.\\n if (!Array.isArray(tz)) {\\n var domain = src_extent(values), start = domain[0], stop = domain[1];\\n tz = tickStep(start, stop, tz);\\n tz = src_range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);\\n } else {\\n tz = tz.slice().sort(src_ascending);\\n }\\n\\n return tz.map(function(value) {\\n return contour(values, value);\\n });\\n }\\n\\n // Accumulate, smooth contour rings, assign holes to exterior rings.\\n // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js\\n function contour(values, value) {\\n var polygons = [],\\n holes = [];\\n\\n isorings(values, value, function(ring) {\\n smooth(ring, values, value);\\n if (src_area(ring) > 0) polygons.push([ring]);\\n else holes.push(ring);\\n });\\n\\n holes.forEach(function(hole) {\\n for (var i = 0, n = polygons.length, polygon; i < n; ++i) {\\n if (contains((polygon = polygons[i])[0], hole) !== -1) {\\n polygon.push(hole);\\n return;\\n }\\n }\\n });\\n\\n return {\\n type: \"MultiPolygon\",\\n value: value,\\n coordinates: polygons\\n };\\n }\\n\\n // Marching squares with isolines stitched into rings.\\n // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js\\n function isorings(values, value, callback) {\\n var fragmentByStart = new Array,\\n fragmentByEnd = new Array,\\n x, y, t0, t1, t2, t3;\\n\\n // Special case for the first row (y = -1, t2 = t3 = 0).\\n x = y = -1;\\n t1 = values[0] >= value;\\n cases[t1 << 1].forEach(stitch);\\n while (++x < dx - 1) {\\n t0 = t1, t1 = values[x + 1] >= value;\\n cases[t0 | t1 << 1].forEach(stitch);\\n }\\n cases[t1 << 0].forEach(stitch);\\n\\n // General case for the intermediate rows.\\n while (++y < dy - 1) {\\n x = -1;\\n t1 = values[y * dx + dx] >= value;\\n t2 = values[y * dx] >= value;\\n cases[t1 << 1 | t2 << 2].forEach(stitch);\\n while (++x < dx - 1) {\\n t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;\\n t3 = t2, t2 = values[y * dx + x + 1] >= value;\\n cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);\\n }\\n cases[t1 | t2 << 3].forEach(stitch);\\n }\\n\\n // Special case for the last row (y = dy - 1, t0 = t1 = 0).\\n x = -1;\\n t2 = values[y * dx] >= value;\\n cases[t2 << 2].forEach(stitch);\\n while (++x < dx - 1) {\\n t3 = t2, t2 = values[y * dx + x + 1] >= value;\\n cases[t2 << 2 | t3 << 3].forEach(stitch);\\n }\\n cases[t2 << 3].forEach(stitch);\\n\\n function stitch(line) {\\n var start = [line[0][0] + x, line[0][1] + y],\\n end = [line[1][0] + x, line[1][1] + y],\\n startIndex = index(start),\\n endIndex = index(end),\\n f, g;\\n if (f = fragmentByEnd[startIndex]) {\\n if (g = fragmentByStart[endIndex]) {\\n delete fragmentByEnd[f.end];\\n delete fragmentByStart[g.start];\\n if (f === g) {\\n f.ring.push(end);\\n callback(f.ring);\\n } else {\\n fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)};\\n }\\n } else {\\n delete fragmentByEnd[f.end];\\n f.ring.push(end);\\n fragmentByEnd[f.end = endIndex] = f;\\n }\\n } else if (f = fragmentByStart[endIndex]) {\\n if (g = fragmentByEnd[startIndex]) {\\n delete fragmentByStart[f.start];\\n delete fragmentByEnd[g.end];\\n if (f === g) {\\n f.ring.push(end);\\n callback(f.ring);\\n } else {\\n fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)};\\n }\\n } else {\\n delete fragmentByStart[f.start];\\n f.ring.unshift(start);\\n fragmentByStart[f.start = startIndex] = f;\\n }\\n } else {\\n fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]};\\n }\\n }\\n }\\n\\n function index(point) {\\n return point[0] * 2 + point[1] * (dx + 1) * 4;\\n }\\n\\n function smoothLinear(ring, values, value) {\\n ring.forEach(function(point) {\\n var x = point[0],\\n y = point[1],\\n xt = x | 0,\\n yt = y | 0,\\n v0,\\n v1 = values[yt * dx + xt];\\n if (x > 0 && x < dx && xt === x) {\\n v0 = values[yt * dx + xt - 1];\\n point[0] = x + (value - v0) / (v1 - v0) - 0.5;\\n }\\n if (y > 0 && y < dy && yt === y) {\\n v0 = values[(yt - 1) * dx + xt];\\n point[1] = y + (value - v0) / (v1 - v0) - 0.5;\\n }\\n });\\n }\\n\\n contours.contour = contour;\\n\\n contours.size = function(_) {\\n if (!arguments.length) return [dx, dy];\\n var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);\\n if (!(_0 > 0) || !(_1 > 0)) throw new Error(\"invalid size\");\\n return dx = _0, dy = _1, contours;\\n };\\n\\n contours.thresholds = function(_) {\\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? d3_contour_src_constant(d3_contour_src_array_slice.call(_)) : d3_contour_src_constant(_), contours) : threshold;\\n };\\n\\n contours.smooth = function(_) {\\n return arguments.length ? (smooth = _ ? smoothLinear : src_noop, contours) : smooth === smoothLinear;\\n };\\n\\n return contours;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-contour/src/blur.js\\n// TODO Optimize edge cases.\\n// TODO Optimize index calculation.\\n// TODO Optimize arguments.\\nfunction blurX(source, target, r) {\\n var n = source.width,\\n m = source.height,\\n w = (r << 1) + 1;\\n for (var j = 0; j < m; ++j) {\\n for (var i = 0, sr = 0; i < n + r; ++i) {\\n if (i < n) {\\n sr += source.data[i + j * n];\\n }\\n if (i >= r) {\\n if (i >= w) {\\n sr -= source.data[i - w + j * n];\\n }\\n target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);\\n }\\n }\\n }\\n}\\n\\n// TODO Optimize edge cases.\\n// TODO Optimize index calculation.\\n// TODO Optimize arguments.\\nfunction blurY(source, target, r) {\\n var n = source.width,\\n m = source.height,\\n w = (r << 1) + 1;\\n for (var i = 0; i < n; ++i) {\\n for (var j = 0, sr = 0; j < m + r; ++j) {\\n if (j < m) {\\n sr += source.data[i + j * n];\\n }\\n if (j >= r) {\\n if (j >= w) {\\n sr -= source.data[i + (j - w) * n];\\n }\\n target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);\\n }\\n }\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-contour/src/density.js\\n\\n\\n\\n\\n\\n\\nfunction defaultX(d) {\\n return d[0];\\n}\\n\\nfunction defaultY(d) {\\n return d[1];\\n}\\n\\nfunction defaultWeight() {\\n return 1;\\n}\\n\\n/* harmony default export */ var src_density = (function() {\\n var x = defaultX,\\n y = defaultY,\\n weight = defaultWeight,\\n dx = 960,\\n dy = 500,\\n r = 20, // blur radius\\n k = 2, // log2(grid cell size)\\n o = r * 3, // grid offset, to pad for blur\\n n = (dx + o * 2) >> k, // grid width\\n m = (dy + o * 2) >> k, // grid height\\n threshold = d3_contour_src_constant(20);\\n\\n function density(data) {\\n var values0 = new Float32Array(n * m),\\n values1 = new Float32Array(n * m);\\n\\n data.forEach(function(d, i, data) {\\n var xi = (+x(d, i, data) + o) >> k,\\n yi = (+y(d, i, data) + o) >> k,\\n wi = +weight(d, i, data);\\n if (xi >= 0 && xi < n && yi >= 0 && yi < m) {\\n values0[xi + yi * n] += wi;\\n }\\n });\\n\\n // TODO Optimize.\\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\\n blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);\\n blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);\\n\\n var tz = threshold(values0);\\n\\n // Convert number of thresholds into uniform thresholds.\\n if (!Array.isArray(tz)) {\\n var stop = src_max(values0);\\n tz = tickStep(0, stop, tz);\\n tz = src_range(0, Math.floor(stop / tz) * tz, tz);\\n tz.shift();\\n }\\n\\n return src_contours()\\n .thresholds(tz)\\n .size([n, m])\\n (values0)\\n .map(transform);\\n }\\n\\n function transform(geometry) {\\n geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.\\n geometry.coordinates.forEach(transformPolygon);\\n return geometry;\\n }\\n\\n function transformPolygon(coordinates) {\\n coordinates.forEach(transformRing);\\n }\\n\\n function transformRing(coordinates) {\\n coordinates.forEach(transformPoint);\\n }\\n\\n // TODO Optimize.\\n function transformPoint(coordinates) {\\n coordinates[0] = coordinates[0] * Math.pow(2, k) - o;\\n coordinates[1] = coordinates[1] * Math.pow(2, k) - o;\\n }\\n\\n function resize() {\\n o = r * 3;\\n n = (dx + o * 2) >> k;\\n m = (dy + o * 2) >> k;\\n return density;\\n }\\n\\n density.x = function(_) {\\n return arguments.length ? (x = typeof _ === \"function\" ? _ : d3_contour_src_constant(+_), density) : x;\\n };\\n\\n density.y = function(_) {\\n return arguments.length ? (y = typeof _ === \"function\" ? _ : d3_contour_src_constant(+_), density) : y;\\n };\\n\\n density.weight = function(_) {\\n return arguments.length ? (weight = typeof _ === \"function\" ? _ : d3_contour_src_constant(+_), density) : weight;\\n };\\n\\n density.size = function(_) {\\n if (!arguments.length) return [dx, dy];\\n var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);\\n if (!(_0 >= 0) && !(_0 >= 0)) throw new Error(\"invalid size\");\\n return dx = _0, dy = _1, resize();\\n };\\n\\n density.cellSize = function(_) {\\n if (!arguments.length) return 1 << k;\\n if (!((_ = +_) >= 1)) throw new Error(\"invalid cell size\");\\n return k = Math.floor(Math.log(_) / Math.LN2), resize();\\n };\\n\\n density.thresholds = function(_) {\\n return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? d3_contour_src_constant(d3_contour_src_array_slice.call(_)) : d3_contour_src_constant(_), density) : threshold;\\n };\\n\\n density.bandwidth = function(_) {\\n if (!arguments.length) return Math.sqrt(r * (r + 1));\\n if (!((_ = +_) >= 0)) throw new Error(\"invalid bandwidth\");\\n return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();\\n };\\n\\n return density;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-contour/src/index.js\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-dispatch/src/index.js\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-drag/src/constant.js\\n/* harmony default export */ var d3_drag_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-drag/src/event.js\\nfunction DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {\\n this.target = target;\\n this.type = type;\\n this.subject = subject;\\n this.identifier = id;\\n this.active = active;\\n this.x = x;\\n this.y = y;\\n this.dx = dx;\\n this.dy = dy;\\n this._ = dispatch;\\n}\\n\\nDragEvent.prototype.on = function() {\\n var value = this._.on.apply(this._, arguments);\\n return value === this._ ? this : value;\\n};\\n\\n// CONCATENATED MODULE: ./node_modules/d3-drag/src/drag.js\\n\\n\\n\\n\\n\\n\\n\\n// Ignore right-click, since that should open the context menu.\\nfunction drag_defaultFilter() {\\n return !on_event.ctrlKey && !on_event.button;\\n}\\n\\nfunction defaultContainer() {\\n return this.parentNode;\\n}\\n\\nfunction defaultSubject(d) {\\n return d == null ? {x: on_event.x, y: on_event.y} : d;\\n}\\n\\nfunction drag_defaultTouchable() {\\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\\n}\\n\\n/* harmony default export */ var src_drag = (function() {\\n var filter = drag_defaultFilter,\\n container = defaultContainer,\\n subject = defaultSubject,\\n touchable = drag_defaultTouchable,\\n gestures = {},\\n listeners = src_dispatch(\"start\", \"drag\", \"end\"),\\n active = 0,\\n mousedownx,\\n mousedowny,\\n mousemoving,\\n touchending,\\n clickDistance2 = 0;\\n\\n function drag(selection) {\\n selection\\n .on(\"mousedown.drag\", mousedowned)\\n .filter(touchable)\\n .on(\"touchstart.drag\", touchstarted)\\n .on(\"touchmove.drag\", touchmoved)\\n .on(\"touchend.drag touchcancel.drag\", touchended)\\n .style(\"touch-action\", \"none\")\\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\\n }\\n\\n function mousedowned() {\\n if (touchending || !filter.apply(this, arguments)) return;\\n var gesture = beforestart(\"mouse\", container.apply(this, arguments), mouse, this, arguments);\\n if (!gesture) return;\\n src_select(on_event.view).on(\"mousemove.drag\", mousemoved, true).on(\"mouseup.drag\", mouseupped, true);\\n nodrag(on_event.view);\\n nopropagation();\\n mousemoving = false;\\n mousedownx = on_event.clientX;\\n mousedowny = on_event.clientY;\\n gesture(\"start\");\\n }\\n\\n function mousemoved() {\\n noevent();\\n if (!mousemoving) {\\n var dx = on_event.clientX - mousedownx, dy = on_event.clientY - mousedowny;\\n mousemoving = dx * dx + dy * dy > clickDistance2;\\n }\\n gestures.mouse(\"drag\");\\n }\\n\\n function mouseupped() {\\n src_select(on_event.view).on(\"mousemove.drag mouseup.drag\", null);\\n yesdrag(on_event.view, mousemoving);\\n noevent();\\n gestures.mouse(\"end\");\\n }\\n\\n function touchstarted() {\\n if (!filter.apply(this, arguments)) return;\\n var touches = on_event.changedTouches,\\n c = container.apply(this, arguments),\\n n = touches.length, i, gesture;\\n\\n for (i = 0; i < n; ++i) {\\n if (gesture = beforestart(touches[i].identifier, c, src_touch, this, arguments)) {\\n nopropagation();\\n gesture(\"start\");\\n }\\n }\\n }\\n\\n function touchmoved() {\\n var touches = on_event.changedTouches,\\n n = touches.length, i, gesture;\\n\\n for (i = 0; i < n; ++i) {\\n if (gesture = gestures[touches[i].identifier]) {\\n noevent();\\n gesture(\"drag\");\\n }\\n }\\n }\\n\\n function touchended() {\\n var touches = on_event.changedTouches,\\n n = touches.length, i, gesture;\\n\\n if (touchending) clearTimeout(touchending);\\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\\n for (i = 0; i < n; ++i) {\\n if (gesture = gestures[touches[i].identifier]) {\\n nopropagation();\\n gesture(\"end\");\\n }\\n }\\n }\\n\\n function beforestart(id, container, point, that, args) {\\n var p = point(container, id), s, dx, dy,\\n sublisteners = listeners.copy();\\n\\n if (!customEvent(new DragEvent(drag, \"beforestart\", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {\\n if ((on_event.subject = s = subject.apply(that, args)) == null) return false;\\n dx = s.x - p[0] || 0;\\n dy = s.y - p[1] || 0;\\n return true;\\n })) return;\\n\\n return function gesture(type) {\\n var p0 = p, n;\\n switch (type) {\\n case \"start\": gestures[id] = gesture, n = active++; break;\\n case \"end\": delete gestures[id], --active; // nobreak\\n case \"drag\": p = point(container, id), n = active; break;\\n }\\n customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);\\n };\\n }\\n\\n drag.filter = function(_) {\\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : d3_drag_src_constant(!!_), drag) : filter;\\n };\\n\\n drag.container = function(_) {\\n return arguments.length ? (container = typeof _ === \"function\" ? _ : d3_drag_src_constant(_), drag) : container;\\n };\\n\\n drag.subject = function(_) {\\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : d3_drag_src_constant(_), drag) : subject;\\n };\\n\\n drag.touchable = function(_) {\\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : d3_drag_src_constant(!!_), drag) : touchable;\\n };\\n\\n drag.on = function() {\\n var value = listeners.on.apply(listeners, arguments);\\n return value === listeners ? drag : value;\\n };\\n\\n drag.clickDistance = function(_) {\\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\\n };\\n\\n return drag;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-drag/src/index.js\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-dsv/src/dsv.js\\nvar EOL = {},\\n EOF = {},\\n QUOTE = 34,\\n NEWLINE = 10,\\n RETURN = 13;\\n\\nfunction objectConverter(columns) {\\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\\n return JSON.stringify(name) + \": d[\" + i + \"] || \\\\\"\\\\\"\";\\n }).join(\",\") + \"}\");\\n}\\n\\nfunction customConverter(columns, f) {\\n var object = objectConverter(columns);\\n return function(row, i) {\\n return f(object(row), i, columns);\\n };\\n}\\n\\n// Compute unique columns in order of discovery.\\nfunction inferColumns(rows) {\\n var columnSet = Object.create(null),\\n columns = [];\\n\\n rows.forEach(function(row) {\\n for (var column in row) {\\n if (!(column in columnSet)) {\\n columns.push(columnSet[column] = column);\\n }\\n }\\n });\\n\\n return columns;\\n}\\n\\nfunction pad(value, width) {\\n var s = value + \"\", length = s.length;\\n return length < width ? new Array(width - length + 1).join(0) + s : s;\\n}\\n\\nfunction dsv_formatYear(year) {\\n return year < 0 ? \"-\" + pad(-year, 6)\\n : year > 9999 ? \"+\" + pad(year, 6)\\n : pad(year, 4);\\n}\\n\\nfunction formatDate(date) {\\n var hours = date.getUTCHours(),\\n minutes = date.getUTCMinutes(),\\n seconds = date.getUTCSeconds(),\\n milliseconds = date.getUTCMilliseconds();\\n return isNaN(date) ? \"Invalid Date\"\\n : dsv_formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2)\\n + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\"\\n : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\"\\n : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\"\\n : \"\");\\n}\\n\\n/* harmony default export */ var dsv = (function(delimiter) {\\n var reFormat = new RegExp(\"[\\\\\"\" + delimiter + \"\\\\n\\\\r]\"),\\n DELIMITER = delimiter.charCodeAt(0);\\n\\n function parse(text, f) {\\n var convert, columns, rows = parseRows(text, function(row, i) {\\n if (convert) return convert(row, i - 1);\\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\\n });\\n rows.columns = columns || [];\\n return rows;\\n }\\n\\n function parseRows(text, f) {\\n var rows = [], // output rows\\n N = text.length,\\n I = 0, // current character index\\n n = 0, // current line number\\n t, // current token\\n eof = N <= 0, // current token followed by EOF?\\n eol = false; // current token followed by EOL?\\n\\n // Strip the trailing newline.\\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\\n if (text.charCodeAt(N - 1) === RETURN) --N;\\n\\n function token() {\\n if (eof) return EOF;\\n if (eol) return eol = false, EOL;\\n\\n // Unescape quotes.\\n var i, j = I, c;\\n if (text.charCodeAt(j) === QUOTE) {\\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\\n if ((i = I) >= N) eof = true;\\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\\\"\");\\n }\\n\\n // Find next delimiter or newline.\\n while (I < N) {\\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\\n else if (c !== DELIMITER) continue;\\n return text.slice(j, i);\\n }\\n\\n // Return last token before EOF.\\n return eof = true, text.slice(j, N);\\n }\\n\\n while ((t = token()) !== EOF) {\\n var row = [];\\n while (t !== EOL && t !== EOF) row.push(t), t = token();\\n if (f && (row = f(row, n++)) == null) continue;\\n rows.push(row);\\n }\\n\\n return rows;\\n }\\n\\n function preformatBody(rows, columns) {\\n return rows.map(function(row) {\\n return columns.map(function(column) {\\n return formatValue(row[column]);\\n }).join(delimiter);\\n });\\n }\\n\\n function format(rows, columns) {\\n if (columns == null) columns = inferColumns(rows);\\n return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\\\n\");\\n }\\n\\n function formatBody(rows, columns) {\\n if (columns == null) columns = inferColumns(rows);\\n return preformatBody(rows, columns).join(\"\\\\n\");\\n }\\n\\n function formatRows(rows) {\\n return rows.map(formatRow).join(\"\\\\n\");\\n }\\n\\n function formatRow(row) {\\n return row.map(formatValue).join(delimiter);\\n }\\n\\n function formatValue(value) {\\n return value == null ? \"\"\\n : value instanceof Date ? formatDate(value)\\n : reFormat.test(value += \"\") ? \"\\\\\"\" + value.replace(/\"/g, \"\\\\\"\\\\\"\") + \"\\\\\"\"\\n : value;\\n }\\n\\n return {\\n parse: parse,\\n parseRows: parseRows,\\n format: format,\\n formatBody: formatBody,\\n formatRows: formatRows,\\n formatRow: formatRow,\\n formatValue: formatValue\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-dsv/src/csv.js\\n\\n\\nvar csv = dsv(\",\");\\n\\nvar csvParse = csv.parse;\\nvar csvParseRows = csv.parseRows;\\nvar csvFormat = csv.format;\\nvar csvFormatBody = csv.formatBody;\\nvar csvFormatRows = csv.formatRows;\\nvar csvFormatRow = csv.formatRow;\\nvar csvFormatValue = csv.formatValue;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-dsv/src/tsv.js\\n\\n\\nvar tsv = dsv(\"\\\\t\");\\n\\nvar tsvParse = tsv.parse;\\nvar tsvParseRows = tsv.parseRows;\\nvar tsvFormat = tsv.format;\\nvar tsvFormatBody = tsv.formatBody;\\nvar tsvFormatRows = tsv.formatRows;\\nvar tsvFormatRow = tsv.formatRow;\\nvar tsvFormatValue = tsv.formatValue;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-dsv/src/autoType.js\\nfunction autoType(object) {\\n for (var key in object) {\\n var value = object[key].trim(), number, m;\\n if (!value) value = null;\\n else if (value === \"true\") value = true;\\n else if (value === \"false\") value = false;\\n else if (value === \"NaN\") value = NaN;\\n else if (!isNaN(number = +value)) value = number;\\n else if (m = value.match(/^([-+]\\\\d{2})?\\\\d{4}(-\\\\d{2}(-\\\\d{2})?)?(T\\\\d{2}:\\\\d{2}(:\\\\d{2}(\\\\.\\\\d{3})?)?(Z|[-+]\\\\d{2}:\\\\d{2})?)?$/)) {\\n if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, \"/\").replace(/T/, \" \");\\n value = new Date(value);\\n }\\n else continue;\\n object[key] = value;\\n }\\n return object;\\n}\\n\\n// https://github.com/d3/d3-dsv/issues/45\\nvar fixtz = new Date(\"2019-01-01T00:00\").getHours() || new Date(\"2019-07-01T00:00\").getHours();\\n// CONCATENATED MODULE: ./node_modules/d3-dsv/src/index.js\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/linear.js\\nfunction linear_linear(t) {\\n return +t;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/quad.js\\nfunction quadIn(t) {\\n return t * t;\\n}\\n\\nfunction quadOut(t) {\\n return t * (2 - t);\\n}\\n\\nfunction quadInOut(t) {\\n return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/poly.js\\nvar poly_exponent = 3;\\n\\nvar polyIn = (function custom(e) {\\n e = +e;\\n\\n function polyIn(t) {\\n return Math.pow(t, e);\\n }\\n\\n polyIn.exponent = custom;\\n\\n return polyIn;\\n})(poly_exponent);\\n\\nvar polyOut = (function custom(e) {\\n e = +e;\\n\\n function polyOut(t) {\\n return 1 - Math.pow(1 - t, e);\\n }\\n\\n polyOut.exponent = custom;\\n\\n return polyOut;\\n})(poly_exponent);\\n\\nvar polyInOut = (function custom(e) {\\n e = +e;\\n\\n function polyInOut(t) {\\n return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\\n }\\n\\n polyInOut.exponent = custom;\\n\\n return polyInOut;\\n})(poly_exponent);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/sin.js\\nvar sin_pi = Math.PI,\\n sin_halfPi = sin_pi / 2;\\n\\nfunction sinIn(t) {\\n return 1 - Math.cos(t * sin_halfPi);\\n}\\n\\nfunction sinOut(t) {\\n return Math.sin(t * sin_halfPi);\\n}\\n\\nfunction sinInOut(t) {\\n return (1 - Math.cos(sin_pi * t)) / 2;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/exp.js\\nfunction expIn(t) {\\n return Math.pow(2, 10 * t - 10);\\n}\\n\\nfunction expOut(t) {\\n return 1 - Math.pow(2, -10 * t);\\n}\\n\\nfunction expInOut(t) {\\n return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/circle.js\\nfunction circleIn(t) {\\n return 1 - Math.sqrt(1 - t * t);\\n}\\n\\nfunction circleOut(t) {\\n return Math.sqrt(1 - --t * t);\\n}\\n\\nfunction circleInOut(t) {\\n return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/bounce.js\\nvar bounce_b1 = 4 / 11,\\n b2 = 6 / 11,\\n b3 = 8 / 11,\\n b4 = 3 / 4,\\n b5 = 9 / 11,\\n b6 = 10 / 11,\\n b7 = 15 / 16,\\n b8 = 21 / 22,\\n b9 = 63 / 64,\\n bounce_b0 = 1 / bounce_b1 / bounce_b1;\\n\\nfunction bounceIn(t) {\\n return 1 - bounceOut(1 - t);\\n}\\n\\nfunction bounceOut(t) {\\n return (t = +t) < bounce_b1 ? bounce_b0 * t * t : t < b3 ? bounce_b0 * (t -= b2) * t + b4 : t < b6 ? bounce_b0 * (t -= b5) * t + b7 : bounce_b0 * (t -= b8) * t + b9;\\n}\\n\\nfunction bounceInOut(t) {\\n return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/back.js\\nvar overshoot = 1.70158;\\n\\nvar backIn = (function custom(s) {\\n s = +s;\\n\\n function backIn(t) {\\n return t * t * ((s + 1) * t - s);\\n }\\n\\n backIn.overshoot = custom;\\n\\n return backIn;\\n})(overshoot);\\n\\nvar backOut = (function custom(s) {\\n s = +s;\\n\\n function backOut(t) {\\n return --t * t * ((s + 1) * t + s) + 1;\\n }\\n\\n backOut.overshoot = custom;\\n\\n return backOut;\\n})(overshoot);\\n\\nvar backInOut = (function custom(s) {\\n s = +s;\\n\\n function backInOut(t) {\\n return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\\n }\\n\\n backInOut.overshoot = custom;\\n\\n return backInOut;\\n})(overshoot);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/elastic.js\\nvar elastic_tau = 2 * Math.PI,\\n amplitude = 1,\\n period = 0.3;\\n\\nvar elasticIn = (function custom(a, p) {\\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= elastic_tau);\\n\\n function elasticIn(t) {\\n return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\\n }\\n\\n elasticIn.amplitude = function(a) { return custom(a, p * elastic_tau); };\\n elasticIn.period = function(p) { return custom(a, p); };\\n\\n return elasticIn;\\n})(amplitude, period);\\n\\nvar elasticOut = (function custom(a, p) {\\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= elastic_tau);\\n\\n function elasticOut(t) {\\n return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\\n }\\n\\n elasticOut.amplitude = function(a) { return custom(a, p * elastic_tau); };\\n elasticOut.period = function(p) { return custom(a, p); };\\n\\n return elasticOut;\\n})(amplitude, period);\\n\\nvar elasticInOut = (function custom(a, p) {\\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= elastic_tau);\\n\\n function elasticInOut(t) {\\n return ((t = t * 2 - 1) < 0\\n ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)\\n : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\\n }\\n\\n elasticInOut.amplitude = function(a) { return custom(a, p * elastic_tau); };\\n elasticInOut.period = function(p) { return custom(a, p); };\\n\\n return elasticInOut;\\n})(amplitude, period);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-fetch/src/blob.js\\nfunction responseBlob(response) {\\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\\n return response.blob();\\n}\\n\\n/* harmony default export */ var blob = (function(input, init) {\\n return fetch(input, init).then(responseBlob);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-fetch/src/buffer.js\\nfunction responseArrayBuffer(response) {\\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\\n return response.arrayBuffer();\\n}\\n\\n/* harmony default export */ var src_buffer = (function(input, init) {\\n return fetch(input, init).then(responseArrayBuffer);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-fetch/src/text.js\\nfunction responseText(response) {\\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\\n return response.text();\\n}\\n\\n/* harmony default export */ var src_text = (function(input, init) {\\n return fetch(input, init).then(responseText);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-fetch/src/dsv.js\\n\\n\\n\\nfunction dsvParse(parse) {\\n return function(input, init, row) {\\n if (arguments.length === 2 && typeof init === \"function\") row = init, init = undefined;\\n return src_text(input, init).then(function(response) {\\n return parse(response, row);\\n });\\n };\\n}\\n\\nfunction dsv_dsv(delimiter, input, init, row) {\\n if (arguments.length === 3 && typeof init === \"function\") row = init, init = undefined;\\n var format = dsv(delimiter);\\n return src_text(input, init).then(function(response) {\\n return format.parse(response, row);\\n });\\n}\\n\\nvar dsv_csv = dsvParse(csvParse);\\nvar dsv_tsv = dsvParse(tsvParse);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-fetch/src/image.js\\n/* harmony default export */ var src_image = (function(input, init) {\\n return new Promise(function(resolve, reject) {\\n var image = new Image;\\n for (var key in init) image[key] = init[key];\\n image.onerror = reject;\\n image.onload = function() { resolve(image); };\\n image.src = input;\\n });\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-fetch/src/json.js\\nfunction responseJson(response) {\\n if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\\n if (response.status === 204 || response.status === 205) return;\\n return response.json();\\n}\\n\\n/* harmony default export */ var json = (function(input, init) {\\n return fetch(input, init).then(responseJson);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-fetch/src/xml.js\\n\\n\\nfunction parser(type) {\\n return function(input, init) {\\n return src_text(input, init).then(function(text) {\\n return (new DOMParser).parseFromString(text, type);\\n });\\n };\\n}\\n\\n/* harmony default export */ var xml = (parser(\"application/xml\"));\\n\\nvar xml_html = parser(\"text/html\");\\n\\nvar svg = parser(\"image/svg+xml\");\\n\\n// CONCATENATED MODULE: ./node_modules/d3-fetch/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/center.js\\n/* harmony default export */ var src_center = (function(x, y) {\\n var nodes;\\n\\n if (x == null) x = 0;\\n if (y == null) y = 0;\\n\\n function force() {\\n var i,\\n n = nodes.length,\\n node,\\n sx = 0,\\n sy = 0;\\n\\n for (i = 0; i < n; ++i) {\\n node = nodes[i], sx += node.x, sy += node.y;\\n }\\n\\n for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {\\n node = nodes[i], node.x -= sx, node.y -= sy;\\n }\\n }\\n\\n force.initialize = function(_) {\\n nodes = _;\\n };\\n\\n force.x = function(_) {\\n return arguments.length ? (x = +_, force) : x;\\n };\\n\\n force.y = function(_) {\\n return arguments.length ? (y = +_, force) : y;\\n };\\n\\n return force;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/constant.js\\n/* harmony default export */ var d3_force_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/jiggle.js\\n/* harmony default export */ var jiggle = (function() {\\n return (Math.random() - 0.5) * 1e-6;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/add.js\\n/* harmony default export */ var add = (function(d) {\\n var x = +this._x.call(null, d),\\n y = +this._y.call(null, d);\\n return add_add(this.cover(x, y), x, y, d);\\n});\\n\\nfunction add_add(tree, x, y, d) {\\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\\n\\n var parent,\\n node = tree._root,\\n leaf = {data: d},\\n x0 = tree._x0,\\n y0 = tree._y0,\\n x1 = tree._x1,\\n y1 = tree._y1,\\n xm,\\n ym,\\n xp,\\n yp,\\n right,\\n bottom,\\n i,\\n j;\\n\\n // If the tree is empty, initialize the root as a leaf.\\n if (!node) return tree._root = leaf, tree;\\n\\n // Find the existing leaf for the new point, or add it.\\n while (node.length) {\\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\\n }\\n\\n // Is the new point is exactly coincident with the existing point?\\n xp = +tree._x.call(null, node.data);\\n yp = +tree._y.call(null, node.data);\\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\\n\\n // Otherwise, split the leaf node until the old and new point are separated.\\n do {\\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\\n return parent[j] = node, parent[i] = leaf, tree;\\n}\\n\\nfunction addAll(data) {\\n var d, i, n = data.length,\\n x,\\n y,\\n xz = new Array(n),\\n yz = new Array(n),\\n x0 = Infinity,\\n y0 = Infinity,\\n x1 = -Infinity,\\n y1 = -Infinity;\\n\\n // Compute the points and their extent.\\n for (i = 0; i < n; ++i) {\\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\\n xz[i] = x;\\n yz[i] = y;\\n if (x < x0) x0 = x;\\n if (x > x1) x1 = x;\\n if (y < y0) y0 = y;\\n if (y > y1) y1 = y;\\n }\\n\\n // If there were no (valid) points, abort.\\n if (x0 > x1 || y0 > y1) return this;\\n\\n // Expand the tree to cover the new points.\\n this.cover(x0, y0).cover(x1, y1);\\n\\n // Add the new points.\\n for (i = 0; i < n; ++i) {\\n add_add(this, xz[i], yz[i], data[i]);\\n }\\n\\n return this;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/cover.js\\n/* harmony default export */ var src_cover = (function(x, y) {\\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\\n\\n var x0 = this._x0,\\n y0 = this._y0,\\n x1 = this._x1,\\n y1 = this._y1;\\n\\n // If the quadtree has no extent, initialize them.\\n // Integer extent are necessary so that if we later double the extent,\\n // the existing quadrant boundaries dont change due to floating point error!\\n if (isNaN(x0)) {\\n x1 = (x0 = Math.floor(x)) + 1;\\n y1 = (y0 = Math.floor(y)) + 1;\\n }\\n\\n // Otherwise, double repeatedly to cover.\\n else {\\n var z = x1 - x0,\\n node = this._root,\\n parent,\\n i;\\n\\n while (x0 > x || x >= x1 || y0 > y || y >= y1) {\\n i = (y < y0) << 1 | (x < x0);\\n parent = new Array(4), parent[i] = node, node = parent, z *= 2;\\n switch (i) {\\n case 0: x1 = x0 + z, y1 = y0 + z; break;\\n case 1: x0 = x1 - z, y1 = y0 + z; break;\\n case 2: x1 = x0 + z, y0 = y1 - z; break;\\n case 3: x0 = x1 - z, y0 = y1 - z; break;\\n }\\n }\\n\\n if (this._root && this._root.length) this._root = node;\\n }\\n\\n this._x0 = x0;\\n this._y0 = y0;\\n this._x1 = x1;\\n this._y1 = y1;\\n return this;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/data.js\\n/* harmony default export */ var src_data = (function() {\\n var data = [];\\n this.visit(function(node) {\\n if (!node.length) do data.push(node.data); while (node = node.next)\\n });\\n return data;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/extent.js\\n/* harmony default export */ var d3_quadtree_src_extent = (function(_) {\\n return arguments.length\\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/quad.js\\n/* harmony default export */ var src_quad = (function(node, x0, y0, x1, y1) {\\n this.node = node;\\n this.x0 = x0;\\n this.y0 = y0;\\n this.x1 = x1;\\n this.y1 = y1;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/find.js\\n\\n\\n/* harmony default export */ var find = (function(x, y, radius) {\\n var data,\\n x0 = this._x0,\\n y0 = this._y0,\\n x1,\\n y1,\\n x2,\\n y2,\\n x3 = this._x1,\\n y3 = this._y1,\\n quads = [],\\n node = this._root,\\n q,\\n i;\\n\\n if (node) quads.push(new src_quad(node, x0, y0, x3, y3));\\n if (radius == null) radius = Infinity;\\n else {\\n x0 = x - radius, y0 = y - radius;\\n x3 = x + radius, y3 = y + radius;\\n radius *= radius;\\n }\\n\\n while (q = quads.pop()) {\\n\\n // Stop searching if this quadrant cant contain a closer node.\\n if (!(node = q.node)\\n || (x1 = q.x0) > x3\\n || (y1 = q.y0) > y3\\n || (x2 = q.x1) < x0\\n || (y2 = q.y1) < y0) continue;\\n\\n // Bisect the current quadrant.\\n if (node.length) {\\n var xm = (x1 + x2) / 2,\\n ym = (y1 + y2) / 2;\\n\\n quads.push(\\n new src_quad(node[3], xm, ym, x2, y2),\\n new src_quad(node[2], x1, ym, xm, y2),\\n new src_quad(node[1], xm, y1, x2, ym),\\n new src_quad(node[0], x1, y1, xm, ym)\\n );\\n\\n // Visit the closest quadrant first.\\n if (i = (y >= ym) << 1 | (x >= xm)) {\\n q = quads[quads.length - 1];\\n quads[quads.length - 1] = quads[quads.length - 1 - i];\\n quads[quads.length - 1 - i] = q;\\n }\\n }\\n\\n // Visit this point. (Visiting coincident points isnt necessary!)\\n else {\\n var dx = x - +this._x.call(null, node.data),\\n dy = y - +this._y.call(null, node.data),\\n d2 = dx * dx + dy * dy;\\n if (d2 < radius) {\\n var d = Math.sqrt(radius = d2);\\n x0 = x - d, y0 = y - d;\\n x3 = x + d, y3 = y + d;\\n data = node.data;\\n }\\n }\\n }\\n\\n return data;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/remove.js\\n/* harmony default export */ var src_remove = (function(d) {\\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\\n\\n var parent,\\n node = this._root,\\n retainer,\\n previous,\\n next,\\n x0 = this._x0,\\n y0 = this._y0,\\n x1 = this._x1,\\n y1 = this._y1,\\n x,\\n y,\\n xm,\\n ym,\\n right,\\n bottom,\\n i,\\n j;\\n\\n // If the tree is empty, initialize the root as a leaf.\\n if (!node) return this;\\n\\n // Find the leaf node for the point.\\n // While descending, also retain the deepest parent with a non-removed sibling.\\n if (node.length) while (true) {\\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\\n if (!node.length) break;\\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\\n }\\n\\n // Find the point to remove.\\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\\n if (next = node.next) delete node.next;\\n\\n // If there are multiple coincident points, remove just the point.\\n if (previous) return (next ? previous.next = next : delete previous.next), this;\\n\\n // If this is the root point, remove it.\\n if (!parent) return this._root = next, this;\\n\\n // Remove this leaf.\\n next ? parent[i] = next : delete parent[i];\\n\\n // If the parent now contains exactly one leaf, collapse superfluous parents.\\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\\n && !node.length) {\\n if (retainer) retainer[j] = node;\\n else this._root = node;\\n }\\n\\n return this;\\n});\\n\\nfunction removeAll(data) {\\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\\n return this;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/root.js\\n/* harmony default export */ var src_root = (function() {\\n return this._root;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/size.js\\n/* harmony default export */ var src_size = (function() {\\n var size = 0;\\n this.visit(function(node) {\\n if (!node.length) do ++size; while (node = node.next)\\n });\\n return size;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/visit.js\\n\\n\\n/* harmony default export */ var visit = (function(callback) {\\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\\n if (node) quads.push(new src_quad(node, this._x0, this._y0, this._x1, this._y1));\\n while (q = quads.pop()) {\\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\\n if (child = node[3]) quads.push(new src_quad(child, xm, ym, x1, y1));\\n if (child = node[2]) quads.push(new src_quad(child, x0, ym, xm, y1));\\n if (child = node[1]) quads.push(new src_quad(child, xm, y0, x1, ym));\\n if (child = node[0]) quads.push(new src_quad(child, x0, y0, xm, ym));\\n }\\n }\\n return this;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/visitAfter.js\\n\\n\\n/* harmony default export */ var visitAfter = (function(callback) {\\n var quads = [], next = [], q;\\n if (this._root) quads.push(new src_quad(this._root, this._x0, this._y0, this._x1, this._y1));\\n while (q = quads.pop()) {\\n var node = q.node;\\n if (node.length) {\\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\\n if (child = node[0]) quads.push(new src_quad(child, x0, y0, xm, ym));\\n if (child = node[1]) quads.push(new src_quad(child, xm, y0, x1, ym));\\n if (child = node[2]) quads.push(new src_quad(child, x0, ym, xm, y1));\\n if (child = node[3]) quads.push(new src_quad(child, xm, ym, x1, y1));\\n }\\n next.push(q);\\n }\\n while (q = next.pop()) {\\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\\n }\\n return this;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/x.js\\nfunction x_defaultX(d) {\\n return d[0];\\n}\\n\\n/* harmony default export */ var src_x = (function(_) {\\n return arguments.length ? (this._x = _, this) : this._x;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/y.js\\nfunction y_defaultY(d) {\\n return d[1];\\n}\\n\\n/* harmony default export */ var src_y = (function(_) {\\n return arguments.length ? (this._y = _, this) : this._y;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/quadtree.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nfunction quadtree(nodes, x, y) {\\n var tree = new Quadtree(x == null ? x_defaultX : x, y == null ? y_defaultY : y, NaN, NaN, NaN, NaN);\\n return nodes == null ? tree : tree.addAll(nodes);\\n}\\n\\nfunction Quadtree(x, y, x0, y0, x1, y1) {\\n this._x = x;\\n this._y = y;\\n this._x0 = x0;\\n this._y0 = y0;\\n this._x1 = x1;\\n this._y1 = y1;\\n this._root = undefined;\\n}\\n\\nfunction leaf_copy(leaf) {\\n var copy = {data: leaf.data}, next = copy;\\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\\n return copy;\\n}\\n\\nvar treeProto = quadtree.prototype = Quadtree.prototype;\\n\\ntreeProto.copy = function() {\\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\\n node = this._root,\\n nodes,\\n child;\\n\\n if (!node) return copy;\\n\\n if (!node.length) return copy._root = leaf_copy(node), copy;\\n\\n nodes = [{source: node, target: copy._root = new Array(4)}];\\n while (node = nodes.pop()) {\\n for (var i = 0; i < 4; ++i) {\\n if (child = node.source[i]) {\\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\\n else node.target[i] = leaf_copy(child);\\n }\\n }\\n }\\n\\n return copy;\\n};\\n\\ntreeProto.add = add;\\ntreeProto.addAll = addAll;\\ntreeProto.cover = src_cover;\\ntreeProto.data = src_data;\\ntreeProto.extent = d3_quadtree_src_extent;\\ntreeProto.find = find;\\ntreeProto.remove = src_remove;\\ntreeProto.removeAll = removeAll;\\ntreeProto.root = src_root;\\ntreeProto.size = src_size;\\ntreeProto.visit = visit;\\ntreeProto.visitAfter = visitAfter;\\ntreeProto.x = src_x;\\ntreeProto.y = src_y;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/collide.js\\n\\n\\n\\n\\nfunction collide_x(d) {\\n return d.x + d.vx;\\n}\\n\\nfunction collide_y(d) {\\n return d.y + d.vy;\\n}\\n\\n/* harmony default export */ var collide = (function(radius) {\\n var nodes,\\n radii,\\n strength = 1,\\n iterations = 1;\\n\\n if (typeof radius !== \"function\") radius = d3_force_src_constant(radius == null ? 1 : +radius);\\n\\n function force() {\\n var i, n = nodes.length,\\n tree,\\n node,\\n xi,\\n yi,\\n ri,\\n ri2;\\n\\n for (var k = 0; k < iterations; ++k) {\\n tree = quadtree(nodes, collide_x, collide_y).visitAfter(prepare);\\n for (i = 0; i < n; ++i) {\\n node = nodes[i];\\n ri = radii[node.index], ri2 = ri * ri;\\n xi = node.x + node.vx;\\n yi = node.y + node.vy;\\n tree.visit(apply);\\n }\\n }\\n\\n function apply(quad, x0, y0, x1, y1) {\\n var data = quad.data, rj = quad.r, r = ri + rj;\\n if (data) {\\n if (data.index > node.index) {\\n var x = xi - data.x - data.vx,\\n y = yi - data.y - data.vy,\\n l = x * x + y * y;\\n if (l < r * r) {\\n if (x === 0) x = jiggle(), l += x * x;\\n if (y === 0) y = jiggle(), l += y * y;\\n l = (r - (l = Math.sqrt(l))) / l * strength;\\n node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));\\n node.vy += (y *= l) * r;\\n data.vx -= x * (r = 1 - r);\\n data.vy -= y * r;\\n }\\n }\\n return;\\n }\\n return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;\\n }\\n }\\n\\n function prepare(quad) {\\n if (quad.data) return quad.r = radii[quad.data.index];\\n for (var i = quad.r = 0; i < 4; ++i) {\\n if (quad[i] && quad[i].r > quad.r) {\\n quad.r = quad[i].r;\\n }\\n }\\n }\\n\\n function initialize() {\\n if (!nodes) return;\\n var i, n = nodes.length, node;\\n radii = new Array(n);\\n for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);\\n }\\n\\n force.initialize = function(_) {\\n nodes = _;\\n initialize();\\n };\\n\\n force.iterations = function(_) {\\n return arguments.length ? (iterations = +_, force) : iterations;\\n };\\n\\n force.strength = function(_) {\\n return arguments.length ? (strength = +_, force) : strength;\\n };\\n\\n force.radius = function(_) {\\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : d3_force_src_constant(+_), initialize(), force) : radius;\\n };\\n\\n return force;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/link.js\\n\\n\\n\\n\\nfunction link_index(d) {\\n return d.index;\\n}\\n\\nfunction link_find(nodeById, nodeId) {\\n var node = nodeById.get(nodeId);\\n if (!node) throw new Error(\"missing: \" + nodeId);\\n return node;\\n}\\n\\n/* harmony default export */ var src_link = (function(links) {\\n var id = link_index,\\n strength = defaultStrength,\\n strengths,\\n distance = d3_force_src_constant(30),\\n distances,\\n nodes,\\n count,\\n bias,\\n iterations = 1;\\n\\n if (links == null) links = [];\\n\\n function defaultStrength(link) {\\n return 1 / Math.min(count[link.source.index], count[link.target.index]);\\n }\\n\\n function force(alpha) {\\n for (var k = 0, n = links.length; k < iterations; ++k) {\\n for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {\\n link = links[i], source = link.source, target = link.target;\\n x = target.x + target.vx - source.x - source.vx || jiggle();\\n y = target.y + target.vy - source.y - source.vy || jiggle();\\n l = Math.sqrt(x * x + y * y);\\n l = (l - distances[i]) / l * alpha * strengths[i];\\n x *= l, y *= l;\\n target.vx -= x * (b = bias[i]);\\n target.vy -= y * b;\\n source.vx += x * (b = 1 - b);\\n source.vy += y * b;\\n }\\n }\\n }\\n\\n function initialize() {\\n if (!nodes) return;\\n\\n var i,\\n n = nodes.length,\\n m = links.length,\\n nodeById = src_map(nodes, id),\\n link;\\n\\n for (i = 0, count = new Array(n); i < m; ++i) {\\n link = links[i], link.index = i;\\n if (typeof link.source !== \"object\") link.source = link_find(nodeById, link.source);\\n if (typeof link.target !== \"object\") link.target = link_find(nodeById, link.target);\\n count[link.source.index] = (count[link.source.index] || 0) + 1;\\n count[link.target.index] = (count[link.target.index] || 0) + 1;\\n }\\n\\n for (i = 0, bias = new Array(m); i < m; ++i) {\\n link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\\n }\\n\\n strengths = new Array(m), initializeStrength();\\n distances = new Array(m), initializeDistance();\\n }\\n\\n function initializeStrength() {\\n if (!nodes) return;\\n\\n for (var i = 0, n = links.length; i < n; ++i) {\\n strengths[i] = +strength(links[i], i, links);\\n }\\n }\\n\\n function initializeDistance() {\\n if (!nodes) return;\\n\\n for (var i = 0, n = links.length; i < n; ++i) {\\n distances[i] = +distance(links[i], i, links);\\n }\\n }\\n\\n force.initialize = function(_) {\\n nodes = _;\\n initialize();\\n };\\n\\n force.links = function(_) {\\n return arguments.length ? (links = _, initialize(), force) : links;\\n };\\n\\n force.id = function(_) {\\n return arguments.length ? (id = _, force) : id;\\n };\\n\\n force.iterations = function(_) {\\n return arguments.length ? (iterations = +_, force) : iterations;\\n };\\n\\n force.strength = function(_) {\\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : d3_force_src_constant(+_), initializeStrength(), force) : strength;\\n };\\n\\n force.distance = function(_) {\\n return arguments.length ? (distance = typeof _ === \"function\" ? _ : d3_force_src_constant(+_), initializeDistance(), force) : distance;\\n };\\n\\n return force;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/simulation.js\\n\\n\\n\\n\\nfunction simulation_x(d) {\\n return d.x;\\n}\\n\\nfunction simulation_y(d) {\\n return d.y;\\n}\\n\\nvar initialRadius = 10,\\n initialAngle = Math.PI * (3 - Math.sqrt(5));\\n\\n/* harmony default export */ var src_simulation = (function(nodes) {\\n var simulation,\\n alpha = 1,\\n alphaMin = 0.001,\\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\\n alphaTarget = 0,\\n velocityDecay = 0.6,\\n forces = src_map(),\\n stepper = timer(step),\\n event = src_dispatch(\"tick\", \"end\");\\n\\n if (nodes == null) nodes = [];\\n\\n function step() {\\n tick();\\n event.call(\"tick\", simulation);\\n if (alpha < alphaMin) {\\n stepper.stop();\\n event.call(\"end\", simulation);\\n }\\n }\\n\\n function tick(iterations) {\\n var i, n = nodes.length, node;\\n\\n if (iterations === undefined) iterations = 1;\\n\\n for (var k = 0; k < iterations; ++k) {\\n alpha += (alphaTarget - alpha) * alphaDecay;\\n\\n forces.each(function (force) {\\n force(alpha);\\n });\\n\\n for (i = 0; i < n; ++i) {\\n node = nodes[i];\\n if (node.fx == null) node.x += node.vx *= velocityDecay;\\n else node.x = node.fx, node.vx = 0;\\n if (node.fy == null) node.y += node.vy *= velocityDecay;\\n else node.y = node.fy, node.vy = 0;\\n }\\n }\\n\\n return simulation;\\n }\\n\\n function initializeNodes() {\\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\\n node = nodes[i], node.index = i;\\n if (node.fx != null) node.x = node.fx;\\n if (node.fy != null) node.y = node.fy;\\n if (isNaN(node.x) || isNaN(node.y)) {\\n var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;\\n node.x = radius * Math.cos(angle);\\n node.y = radius * Math.sin(angle);\\n }\\n if (isNaN(node.vx) || isNaN(node.vy)) {\\n node.vx = node.vy = 0;\\n }\\n }\\n }\\n\\n function initializeForce(force) {\\n if (force.initialize) force.initialize(nodes);\\n return force;\\n }\\n\\n initializeNodes();\\n\\n return simulation = {\\n tick: tick,\\n\\n restart: function() {\\n return stepper.restart(step), simulation;\\n },\\n\\n stop: function() {\\n return stepper.stop(), simulation;\\n },\\n\\n nodes: function(_) {\\n return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;\\n },\\n\\n alpha: function(_) {\\n return arguments.length ? (alpha = +_, simulation) : alpha;\\n },\\n\\n alphaMin: function(_) {\\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\\n },\\n\\n alphaDecay: function(_) {\\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\\n },\\n\\n alphaTarget: function(_) {\\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\\n },\\n\\n velocityDecay: function(_) {\\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\\n },\\n\\n force: function(name, _) {\\n return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\\n },\\n\\n find: function(x, y, radius) {\\n var i = 0,\\n n = nodes.length,\\n dx,\\n dy,\\n d2,\\n node,\\n closest;\\n\\n if (radius == null) radius = Infinity;\\n else radius *= radius;\\n\\n for (i = 0; i < n; ++i) {\\n node = nodes[i];\\n dx = x - node.x;\\n dy = y - node.y;\\n d2 = dx * dx + dy * dy;\\n if (d2 < radius) closest = node, radius = d2;\\n }\\n\\n return closest;\\n },\\n\\n on: function(name, _) {\\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\\n }\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/manyBody.js\\n\\n\\n\\n\\n\\n/* harmony default export */ var manyBody = (function() {\\n var nodes,\\n node,\\n alpha,\\n strength = d3_force_src_constant(-30),\\n strengths,\\n distanceMin2 = 1,\\n distanceMax2 = Infinity,\\n theta2 = 0.81;\\n\\n function force(_) {\\n var i, n = nodes.length, tree = quadtree(nodes, simulation_x, simulation_y).visitAfter(accumulate);\\n for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\\n }\\n\\n function initialize() {\\n if (!nodes) return;\\n var i, n = nodes.length, node;\\n strengths = new Array(n);\\n for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\\n }\\n\\n function accumulate(quad) {\\n var strength = 0, q, c, weight = 0, x, y, i;\\n\\n // For internal nodes, accumulate forces from child quadrants.\\n if (quad.length) {\\n for (x = y = i = 0; i < 4; ++i) {\\n if ((q = quad[i]) && (c = Math.abs(q.value))) {\\n strength += q.value, weight += c, x += c * q.x, y += c * q.y;\\n }\\n }\\n quad.x = x / weight;\\n quad.y = y / weight;\\n }\\n\\n // For leaf nodes, accumulate forces from coincident quadrants.\\n else {\\n q = quad;\\n q.x = q.data.x;\\n q.y = q.data.y;\\n do strength += strengths[q.data.index];\\n while (q = q.next);\\n }\\n\\n quad.value = strength;\\n }\\n\\n function apply(quad, x1, _, x2) {\\n if (!quad.value) return true;\\n\\n var x = quad.x - node.x,\\n y = quad.y - node.y,\\n w = x2 - x1,\\n l = x * x + y * y;\\n\\n // Apply the Barnes-Hut approximation if possible.\\n // Limit forces for very close nodes; randomize direction if coincident.\\n if (w * w / theta2 < l) {\\n if (l < distanceMax2) {\\n if (x === 0) x = jiggle(), l += x * x;\\n if (y === 0) y = jiggle(), l += y * y;\\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\\n node.vx += x * quad.value * alpha / l;\\n node.vy += y * quad.value * alpha / l;\\n }\\n return true;\\n }\\n\\n // Otherwise, process points directly.\\n else if (quad.length || l >= distanceMax2) return;\\n\\n // Limit forces for very close nodes; randomize direction if coincident.\\n if (quad.data !== node || quad.next) {\\n if (x === 0) x = jiggle(), l += x * x;\\n if (y === 0) y = jiggle(), l += y * y;\\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\\n }\\n\\n do if (quad.data !== node) {\\n w = strengths[quad.data.index] * alpha / l;\\n node.vx += x * w;\\n node.vy += y * w;\\n } while (quad = quad.next);\\n }\\n\\n force.initialize = function(_) {\\n nodes = _;\\n initialize();\\n };\\n\\n force.strength = function(_) {\\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : d3_force_src_constant(+_), initialize(), force) : strength;\\n };\\n\\n force.distanceMin = function(_) {\\n return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\\n };\\n\\n force.distanceMax = function(_) {\\n return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\\n };\\n\\n force.theta = function(_) {\\n return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\\n };\\n\\n return force;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/radial.js\\n\\n\\n/* harmony default export */ var radial = (function(radius, x, y) {\\n var nodes,\\n strength = d3_force_src_constant(0.1),\\n strengths,\\n radiuses;\\n\\n if (typeof radius !== \"function\") radius = d3_force_src_constant(+radius);\\n if (x == null) x = 0;\\n if (y == null) y = 0;\\n\\n function force(alpha) {\\n for (var i = 0, n = nodes.length; i < n; ++i) {\\n var node = nodes[i],\\n dx = node.x - x || 1e-6,\\n dy = node.y - y || 1e-6,\\n r = Math.sqrt(dx * dx + dy * dy),\\n k = (radiuses[i] - r) * strengths[i] * alpha / r;\\n node.vx += dx * k;\\n node.vy += dy * k;\\n }\\n }\\n\\n function initialize() {\\n if (!nodes) return;\\n var i, n = nodes.length;\\n strengths = new Array(n);\\n radiuses = new Array(n);\\n for (i = 0; i < n; ++i) {\\n radiuses[i] = +radius(nodes[i], i, nodes);\\n strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);\\n }\\n }\\n\\n force.initialize = function(_) {\\n nodes = _, initialize();\\n };\\n\\n force.strength = function(_) {\\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : d3_force_src_constant(+_), initialize(), force) : strength;\\n };\\n\\n force.radius = function(_) {\\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : d3_force_src_constant(+_), initialize(), force) : radius;\\n };\\n\\n force.x = function(_) {\\n return arguments.length ? (x = +_, force) : x;\\n };\\n\\n force.y = function(_) {\\n return arguments.length ? (y = +_, force) : y;\\n };\\n\\n return force;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/x.js\\n\\n\\n/* harmony default export */ var d3_force_src_x = (function(x) {\\n var strength = d3_force_src_constant(0.1),\\n nodes,\\n strengths,\\n xz;\\n\\n if (typeof x !== \"function\") x = d3_force_src_constant(x == null ? 0 : +x);\\n\\n function force(alpha) {\\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\\n node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\\n }\\n }\\n\\n function initialize() {\\n if (!nodes) return;\\n var i, n = nodes.length;\\n strengths = new Array(n);\\n xz = new Array(n);\\n for (i = 0; i < n; ++i) {\\n strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\\n }\\n }\\n\\n force.initialize = function(_) {\\n nodes = _;\\n initialize();\\n };\\n\\n force.strength = function(_) {\\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : d3_force_src_constant(+_), initialize(), force) : strength;\\n };\\n\\n force.x = function(_) {\\n return arguments.length ? (x = typeof _ === \"function\" ? _ : d3_force_src_constant(+_), initialize(), force) : x;\\n };\\n\\n return force;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/y.js\\n\\n\\n/* harmony default export */ var d3_force_src_y = (function(y) {\\n var strength = d3_force_src_constant(0.1),\\n nodes,\\n strengths,\\n yz;\\n\\n if (typeof y !== \"function\") y = d3_force_src_constant(y == null ? 0 : +y);\\n\\n function force(alpha) {\\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\\n node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\\n }\\n }\\n\\n function initialize() {\\n if (!nodes) return;\\n var i, n = nodes.length;\\n strengths = new Array(n);\\n yz = new Array(n);\\n for (i = 0; i < n; ++i) {\\n strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\\n }\\n }\\n\\n force.initialize = function(_) {\\n nodes = _;\\n initialize();\\n };\\n\\n force.strength = function(_) {\\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : d3_force_src_constant(+_), initialize(), force) : strength;\\n };\\n\\n force.y = function(_) {\\n return arguments.length ? (y = typeof _ === \"function\" ? _ : d3_force_src_constant(+_), initialize(), force) : y;\\n };\\n\\n return force;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-force/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/formatDecimal.js\\n// Computes the decimal coefficient and exponent of the specified number x with\\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\\n// For example, formatDecimal(1.23) returns [\"123\", 0].\\n/* harmony default export */ var formatDecimal = (function(x, p) {\\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\\n var i, coefficient = x.slice(0, i);\\n\\n // The string returned by toExponential either has the form \\\\d\\\\.\\\\d+e[-+]\\\\d+\\n // (e.g., 1.2e+3) or the form \\\\de[-+]\\\\d+ (e.g., 1e+3).\\n return [\\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\\n +x.slice(i + 1)\\n ];\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/exponent.js\\n\\n\\n/* harmony default export */ var src_exponent = (function(x) {\\n return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/formatGroup.js\\n/* harmony default export */ var formatGroup = (function(grouping, thousands) {\\n return function(value, width) {\\n var i = value.length,\\n t = [],\\n j = 0,\\n g = grouping[0],\\n length = 0;\\n\\n while (i > 0 && g > 0) {\\n if (length + g + 1 > width) g = Math.max(1, width - length);\\n t.push(value.substring(i -= g, i + g));\\n if ((length += g + 1) > width) break;\\n g = grouping[j = (j + 1) % grouping.length];\\n }\\n\\n return t.reverse().join(thousands);\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/formatNumerals.js\\n/* harmony default export */ var formatNumerals = (function(numerals) {\\n return function(value) {\\n return value.replace(/[0-9]/g, function(i) {\\n return numerals[+i];\\n });\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/formatSpecifier.js\\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\\nvar re = /^(?:(.)?([<>=^]))?([+\\\\-( ])?([$#])?(0)?(\\\\d+)?(,)?(\\\\.\\\\d+)?(~)?([a-z%])?$/i;\\n\\nfunction formatSpecifier(specifier) {\\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\\n var match;\\n return new FormatSpecifier({\\n fill: match[1],\\n align: match[2],\\n sign: match[3],\\n symbol: match[4],\\n zero: match[5],\\n width: match[6],\\n comma: match[7],\\n precision: match[8] && match[8].slice(1),\\n trim: match[9],\\n type: match[10]\\n });\\n}\\n\\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\\n\\nfunction FormatSpecifier(specifier) {\\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\\n this.zero = !!specifier.zero;\\n this.width = specifier.width === undefined ? undefined : +specifier.width;\\n this.comma = !!specifier.comma;\\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\\n this.trim = !!specifier.trim;\\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\\n}\\n\\nFormatSpecifier.prototype.toString = function() {\\n return this.fill\\n + this.align\\n + this.sign\\n + this.symbol\\n + (this.zero ? \"0\" : \"\")\\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\\n + (this.comma ? \",\" : \"\")\\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\\n + (this.trim ? \"~\" : \"\")\\n + this.type;\\n};\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/formatTrim.js\\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\\n/* harmony default export */ var formatTrim = (function(s) {\\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\\n switch (s[i]) {\\n case \".\": i0 = i1 = i; break;\\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\\n }\\n }\\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/formatPrefixAuto.js\\n\\n\\nvar prefixExponent;\\n\\n/* harmony default export */ var formatPrefixAuto = (function(x, p) {\\n var d = formatDecimal(x, p);\\n if (!d) return x + \"\";\\n var coefficient = d[0],\\n exponent = d[1],\\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\\n n = coefficient.length;\\n return i === n ? coefficient\\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/formatRounded.js\\n\\n\\n/* harmony default export */ var formatRounded = (function(x, p) {\\n var d = formatDecimal(x, p);\\n if (!d) return x + \"\";\\n var coefficient = d[0],\\n exponent = d[1];\\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/formatTypes.js\\n\\n\\n\\n/* harmony default export */ var formatTypes = ({\\n \"%\": function(x, p) { return (x * 100).toFixed(p); },\\n \"b\": function(x) { return Math.round(x).toString(2); },\\n \"c\": function(x) { return x + \"\"; },\\n \"d\": function(x) { return Math.round(x).toString(10); },\\n \"e\": function(x, p) { return x.toExponential(p); },\\n \"f\": function(x, p) { return x.toFixed(p); },\\n \"g\": function(x, p) { return x.toPrecision(p); },\\n \"o\": function(x) { return Math.round(x).toString(8); },\\n \"p\": function(x, p) { return formatRounded(x * 100, p); },\\n \"r\": formatRounded,\\n \"s\": formatPrefixAuto,\\n \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\\n \"x\": function(x) { return Math.round(x).toString(16); }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/identity.js\\n/* harmony default export */ var d3_format_src_identity = (function(x) {\\n return x;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/locale.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nvar locale_map = Array.prototype.map,\\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\\n\\n/* harmony default export */ var src_locale = (function(locale) {\\n var group = locale.grouping === undefined || locale.thousands === undefined ? d3_format_src_identity : formatGroup(locale_map.call(locale.grouping, Number), locale.thousands + \"\"),\\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\\n numerals = locale.numerals === undefined ? d3_format_src_identity : formatNumerals(locale_map.call(locale.numerals, String)),\\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\\n minus = locale.minus === undefined ? \"-\" : locale.minus + \"\",\\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\\n\\n function newFormat(specifier) {\\n specifier = formatSpecifier(specifier);\\n\\n var fill = specifier.fill,\\n align = specifier.align,\\n sign = specifier.sign,\\n symbol = specifier.symbol,\\n zero = specifier.zero,\\n width = specifier.width,\\n comma = specifier.comma,\\n precision = specifier.precision,\\n trim = specifier.trim,\\n type = specifier.type;\\n\\n // The \"n\" type is an alias for \",g\".\\n if (type === \"n\") comma = true, type = \"g\";\\n\\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\\n\\n // If zero fill is specified, padding goes after sign and before digits.\\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\\n\\n // Compute the prefix and suffix.\\n // For SI-prefix, the suffix is lazily computed.\\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\\n\\n // What format function should we use?\\n // Is this an integer type?\\n // Can this type generate exponential notation?\\n var formatType = formatTypes[type],\\n maybeSuffix = /[defgprs%]/.test(type);\\n\\n // Set the default precision if not specified,\\n // or clamp the specified precision to the supported range.\\n // For significant precision, it must be in [1, 21].\\n // For fixed precision, it must be in [0, 20].\\n precision = precision === undefined ? 6\\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\\n : Math.max(0, Math.min(20, precision));\\n\\n function format(value) {\\n var valuePrefix = prefix,\\n valueSuffix = suffix,\\n i, n, c;\\n\\n if (type === \"c\") {\\n valueSuffix = formatType(value) + valueSuffix;\\n value = \"\";\\n } else {\\n value = +value;\\n\\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\\n var valueNegative = value < 0 || 1 / value < 0;\\n\\n // Perform the initial formatting.\\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\\n\\n // Trim insignificant zeros.\\n if (trim) value = formatTrim(value);\\n\\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\\n\\n // Compute the prefix and suffix.\\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\\n\\n // Break the formatted value into the integer “value” part that can be\\n // grouped, and fractional or exponential “suffix” part that is not.\\n if (maybeSuffix) {\\n i = -1, n = value.length;\\n while (++i < n) {\\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\\n value = value.slice(0, i);\\n break;\\n }\\n }\\n }\\n }\\n\\n // If the fill character is not \"0\", grouping is applied before padding.\\n if (comma && !zero) value = group(value, Infinity);\\n\\n // Compute the padding.\\n var length = valuePrefix.length + value.length + valueSuffix.length,\\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\\n\\n // If the fill character is \"0\", grouping is applied after padding.\\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\\n\\n // Reconstruct the final output based on the desired alignment.\\n switch (align) {\\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\\n default: value = padding + valuePrefix + value + valueSuffix; break;\\n }\\n\\n return numerals(value);\\n }\\n\\n format.toString = function() {\\n return specifier + \"\";\\n };\\n\\n return format;\\n }\\n\\n function formatPrefix(specifier, value) {\\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\\n e = Math.max(-8, Math.min(8, Math.floor(src_exponent(value) / 3))) * 3,\\n k = Math.pow(10, -e),\\n prefix = prefixes[8 + e / 3];\\n return function(value) {\\n return f(k * value) + prefix;\\n };\\n }\\n\\n return {\\n format: newFormat,\\n formatPrefix: formatPrefix\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/defaultLocale.js\\n\\n\\nvar defaultLocale_locale;\\nvar defaultLocale_format;\\nvar defaultLocale_formatPrefix;\\n\\ndefaultLocale({\\n decimal: \".\",\\n thousands: \",\",\\n grouping: [3],\\n currency: [\"$\", \"\"],\\n minus: \"-\"\\n});\\n\\nfunction defaultLocale(definition) {\\n defaultLocale_locale = src_locale(definition);\\n defaultLocale_format = defaultLocale_locale.format;\\n defaultLocale_formatPrefix = defaultLocale_locale.formatPrefix;\\n return defaultLocale_locale;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/precisionFixed.js\\n\\n\\n/* harmony default export */ var precisionFixed = (function(step) {\\n return Math.max(0, -src_exponent(Math.abs(step)));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/precisionPrefix.js\\n\\n\\n/* harmony default export */ var precisionPrefix = (function(step, value) {\\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(src_exponent(value) / 3))) * 3 - src_exponent(Math.abs(step)));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/precisionRound.js\\n\\n\\n/* harmony default export */ var precisionRound = (function(step, max) {\\n step = Math.abs(step), max = Math.abs(max) - step;\\n return Math.max(0, src_exponent(max) - src_exponent(step)) + 1;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-format/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/adder.js\\n// Adds floating point numbers with twice the normal precision.\\n// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and\\n// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)\\n// 305–363 (1997).\\n// Code adapted from GeographicLib by Charles F. F. Karney,\\n// http://geographiclib.sourceforge.net/\\n\\n/* harmony default export */ var adder = (function() {\\n return new Adder;\\n});\\n\\nfunction Adder() {\\n this.reset();\\n}\\n\\nAdder.prototype = {\\n constructor: Adder,\\n reset: function() {\\n this.s = // rounded value\\n this.t = 0; // exact error\\n },\\n add: function(y) {\\n adder_add(temp, y, this.t);\\n adder_add(this, temp.s, this.s);\\n if (this.s) this.t += temp.t;\\n else this.s = temp.t;\\n },\\n valueOf: function() {\\n return this.s;\\n }\\n};\\n\\nvar temp = new Adder;\\n\\nfunction adder_add(adder, a, b) {\\n var x = adder.s = a + b,\\n bv = x - a,\\n av = x - bv;\\n adder.t = (a - av) + (b - bv);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/math.js\\nvar math_epsilon = 1e-6;\\nvar epsilon2 = 1e-12;\\nvar math_pi = Math.PI;\\nvar math_halfPi = math_pi / 2;\\nvar quarterPi = math_pi / 4;\\nvar math_tau = math_pi * 2;\\n\\nvar math_degrees = 180 / math_pi;\\nvar radians = math_pi / 180;\\n\\nvar abs = Math.abs;\\nvar atan = Math.atan;\\nvar atan2 = Math.atan2;\\nvar math_cos = Math.cos;\\nvar ceil = Math.ceil;\\nvar exp = Math.exp;\\nvar floor = Math.floor;\\nvar log = Math.log;\\nvar pow = Math.pow;\\nvar math_sin = Math.sin;\\nvar math_sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };\\nvar sqrt = Math.sqrt;\\nvar tan = Math.tan;\\n\\nfunction acos(x) {\\n return x > 1 ? 0 : x < -1 ? math_pi : Math.acos(x);\\n}\\n\\nfunction asin(x) {\\n return x > 1 ? math_halfPi : x < -1 ? -math_halfPi : Math.asin(x);\\n}\\n\\nfunction haversin(x) {\\n return (x = math_sin(x / 2)) * x;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/noop.js\\nfunction noop_noop() {}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/stream.js\\nfunction streamGeometry(geometry, stream) {\\n if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\\n streamGeometryType[geometry.type](geometry, stream);\\n }\\n}\\n\\nvar streamObjectType = {\\n Feature: function(object, stream) {\\n streamGeometry(object.geometry, stream);\\n },\\n FeatureCollection: function(object, stream) {\\n var features = object.features, i = -1, n = features.length;\\n while (++i < n) streamGeometry(features[i].geometry, stream);\\n }\\n};\\n\\nvar streamGeometryType = {\\n Sphere: function(object, stream) {\\n stream.sphere();\\n },\\n Point: function(object, stream) {\\n object = object.coordinates;\\n stream.point(object[0], object[1], object[2]);\\n },\\n MultiPoint: function(object, stream) {\\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\\n while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);\\n },\\n LineString: function(object, stream) {\\n streamLine(object.coordinates, stream, 0);\\n },\\n MultiLineString: function(object, stream) {\\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\\n while (++i < n) streamLine(coordinates[i], stream, 0);\\n },\\n Polygon: function(object, stream) {\\n streamPolygon(object.coordinates, stream);\\n },\\n MultiPolygon: function(object, stream) {\\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\\n while (++i < n) streamPolygon(coordinates[i], stream);\\n },\\n GeometryCollection: function(object, stream) {\\n var geometries = object.geometries, i = -1, n = geometries.length;\\n while (++i < n) streamGeometry(geometries[i], stream);\\n }\\n};\\n\\nfunction streamLine(coordinates, stream, closed) {\\n var i = -1, n = coordinates.length - closed, coordinate;\\n stream.lineStart();\\n while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);\\n stream.lineEnd();\\n}\\n\\nfunction streamPolygon(coordinates, stream) {\\n var i = -1, n = coordinates.length;\\n stream.polygonStart();\\n while (++i < n) streamLine(coordinates[i], stream, 1);\\n stream.polygonEnd();\\n}\\n\\n/* harmony default export */ var src_stream = (function(object, stream) {\\n if (object && streamObjectType.hasOwnProperty(object.type)) {\\n streamObjectType[object.type](object, stream);\\n } else {\\n streamGeometry(object, stream);\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/area.js\\n\\n\\n\\n\\n\\nvar areaRingSum = adder();\\n\\nvar areaSum = adder(),\\n area_lambda00,\\n phi00,\\n area_lambda0,\\n area_cosPhi0,\\n area_sinPhi0;\\n\\nvar areaStream = {\\n point: noop_noop,\\n lineStart: noop_noop,\\n lineEnd: noop_noop,\\n polygonStart: function() {\\n areaRingSum.reset();\\n areaStream.lineStart = areaRingStart;\\n areaStream.lineEnd = areaRingEnd;\\n },\\n polygonEnd: function() {\\n var areaRing = +areaRingSum;\\n areaSum.add(areaRing < 0 ? math_tau + areaRing : areaRing);\\n this.lineStart = this.lineEnd = this.point = noop_noop;\\n },\\n sphere: function() {\\n areaSum.add(math_tau);\\n }\\n};\\n\\nfunction areaRingStart() {\\n areaStream.point = areaPointFirst;\\n}\\n\\nfunction areaRingEnd() {\\n areaPoint(area_lambda00, phi00);\\n}\\n\\nfunction areaPointFirst(lambda, phi) {\\n areaStream.point = areaPoint;\\n area_lambda00 = lambda, phi00 = phi;\\n lambda *= radians, phi *= radians;\\n area_lambda0 = lambda, area_cosPhi0 = math_cos(phi = phi / 2 + quarterPi), area_sinPhi0 = math_sin(phi);\\n}\\n\\nfunction areaPoint(lambda, phi) {\\n lambda *= radians, phi *= radians;\\n phi = phi / 2 + quarterPi; // half the angular distance from south pole\\n\\n // Spherical excess E for a spherical triangle with vertices: south pole,\\n // previous point, current point. Uses a formula derived from Cagnolis\\n // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).\\n var dLambda = lambda - area_lambda0,\\n sdLambda = dLambda >= 0 ? 1 : -1,\\n adLambda = sdLambda * dLambda,\\n cosPhi = math_cos(phi),\\n sinPhi = math_sin(phi),\\n k = area_sinPhi0 * sinPhi,\\n u = area_cosPhi0 * cosPhi + k * math_cos(adLambda),\\n v = k * sdLambda * math_sin(adLambda);\\n areaRingSum.add(atan2(v, u));\\n\\n // Advance the previous points.\\n area_lambda0 = lambda, area_cosPhi0 = cosPhi, area_sinPhi0 = sinPhi;\\n}\\n\\n/* harmony default export */ var d3_geo_src_area = (function(object) {\\n areaSum.reset();\\n src_stream(object, areaStream);\\n return areaSum * 2;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/cartesian.js\\n\\n\\nfunction cartesian_spherical(cartesian) {\\n return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];\\n}\\n\\nfunction cartesian_cartesian(spherical) {\\n var lambda = spherical[0], phi = spherical[1], cosPhi = math_cos(phi);\\n return [cosPhi * math_cos(lambda), cosPhi * math_sin(lambda), math_sin(phi)];\\n}\\n\\nfunction cartesianDot(a, b) {\\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\\n}\\n\\nfunction cartesianCross(a, b) {\\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\\n}\\n\\n// TODO return a\\nfunction cartesianAddInPlace(a, b) {\\n a[0] += b[0], a[1] += b[1], a[2] += b[2];\\n}\\n\\nfunction cartesianScale(vector, k) {\\n return [vector[0] * k, vector[1] * k, vector[2] * k];\\n}\\n\\n// TODO return d\\nfunction cartesianNormalizeInPlace(d) {\\n var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\\n d[0] /= l, d[1] /= l, d[2] /= l;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/bounds.js\\n\\n\\n\\n\\n\\n\\nvar bounds_lambda0, bounds_phi0, bounds_lambda1, bounds_phi1, // bounds\\n bounds_lambda2, // previous lambda-coordinate\\n bounds_lambda00, bounds_phi00, // first point\\n bounds_p0, // previous 3D point\\n deltaSum = adder(),\\n ranges,\\n bounds_range;\\n\\nvar boundsStream = {\\n point: boundsPoint,\\n lineStart: boundsLineStart,\\n lineEnd: boundsLineEnd,\\n polygonStart: function() {\\n boundsStream.point = boundsRingPoint;\\n boundsStream.lineStart = boundsRingStart;\\n boundsStream.lineEnd = boundsRingEnd;\\n deltaSum.reset();\\n areaStream.polygonStart();\\n },\\n polygonEnd: function() {\\n areaStream.polygonEnd();\\n boundsStream.point = boundsPoint;\\n boundsStream.lineStart = boundsLineStart;\\n boundsStream.lineEnd = boundsLineEnd;\\n if (areaRingSum < 0) bounds_lambda0 = -(bounds_lambda1 = 180), bounds_phi0 = -(bounds_phi1 = 90);\\n else if (deltaSum > math_epsilon) bounds_phi1 = 90;\\n else if (deltaSum < -math_epsilon) bounds_phi0 = -90;\\n bounds_range[0] = bounds_lambda0, bounds_range[1] = bounds_lambda1;\\n },\\n sphere: function() {\\n bounds_lambda0 = -(bounds_lambda1 = 180), bounds_phi0 = -(bounds_phi1 = 90);\\n }\\n};\\n\\nfunction boundsPoint(lambda, phi) {\\n ranges.push(bounds_range = [bounds_lambda0 = lambda, bounds_lambda1 = lambda]);\\n if (phi < bounds_phi0) bounds_phi0 = phi;\\n if (phi > bounds_phi1) bounds_phi1 = phi;\\n}\\n\\nfunction bounds_linePoint(lambda, phi) {\\n var p = cartesian_cartesian([lambda * radians, phi * radians]);\\n if (bounds_p0) {\\n var normal = cartesianCross(bounds_p0, p),\\n equatorial = [normal[1], -normal[0], 0],\\n inflection = cartesianCross(equatorial, normal);\\n cartesianNormalizeInPlace(inflection);\\n inflection = cartesian_spherical(inflection);\\n var delta = lambda - bounds_lambda2,\\n sign = delta > 0 ? 1 : -1,\\n lambdai = inflection[0] * math_degrees * sign,\\n phii,\\n antimeridian = abs(delta) > 180;\\n if (antimeridian ^ (sign * bounds_lambda2 < lambdai && lambdai < sign * lambda)) {\\n phii = inflection[1] * math_degrees;\\n if (phii > bounds_phi1) bounds_phi1 = phii;\\n } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * bounds_lambda2 < lambdai && lambdai < sign * lambda)) {\\n phii = -inflection[1] * math_degrees;\\n if (phii < bounds_phi0) bounds_phi0 = phii;\\n } else {\\n if (phi < bounds_phi0) bounds_phi0 = phi;\\n if (phi > bounds_phi1) bounds_phi1 = phi;\\n }\\n if (antimeridian) {\\n if (lambda < bounds_lambda2) {\\n if (bounds_angle(bounds_lambda0, lambda) > bounds_angle(bounds_lambda0, bounds_lambda1)) bounds_lambda1 = lambda;\\n } else {\\n if (bounds_angle(lambda, bounds_lambda1) > bounds_angle(bounds_lambda0, bounds_lambda1)) bounds_lambda0 = lambda;\\n }\\n } else {\\n if (bounds_lambda1 >= bounds_lambda0) {\\n if (lambda < bounds_lambda0) bounds_lambda0 = lambda;\\n if (lambda > bounds_lambda1) bounds_lambda1 = lambda;\\n } else {\\n if (lambda > bounds_lambda2) {\\n if (bounds_angle(bounds_lambda0, lambda) > bounds_angle(bounds_lambda0, bounds_lambda1)) bounds_lambda1 = lambda;\\n } else {\\n if (bounds_angle(lambda, bounds_lambda1) > bounds_angle(bounds_lambda0, bounds_lambda1)) bounds_lambda0 = lambda;\\n }\\n }\\n }\\n } else {\\n ranges.push(bounds_range = [bounds_lambda0 = lambda, bounds_lambda1 = lambda]);\\n }\\n if (phi < bounds_phi0) bounds_phi0 = phi;\\n if (phi > bounds_phi1) bounds_phi1 = phi;\\n bounds_p0 = p, bounds_lambda2 = lambda;\\n}\\n\\nfunction boundsLineStart() {\\n boundsStream.point = bounds_linePoint;\\n}\\n\\nfunction boundsLineEnd() {\\n bounds_range[0] = bounds_lambda0, bounds_range[1] = bounds_lambda1;\\n boundsStream.point = boundsPoint;\\n bounds_p0 = null;\\n}\\n\\nfunction boundsRingPoint(lambda, phi) {\\n if (bounds_p0) {\\n var delta = lambda - bounds_lambda2;\\n deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\\n } else {\\n bounds_lambda00 = lambda, bounds_phi00 = phi;\\n }\\n areaStream.point(lambda, phi);\\n bounds_linePoint(lambda, phi);\\n}\\n\\nfunction boundsRingStart() {\\n areaStream.lineStart();\\n}\\n\\nfunction boundsRingEnd() {\\n boundsRingPoint(bounds_lambda00, bounds_phi00);\\n areaStream.lineEnd();\\n if (abs(deltaSum) > math_epsilon) bounds_lambda0 = -(bounds_lambda1 = 180);\\n bounds_range[0] = bounds_lambda0, bounds_range[1] = bounds_lambda1;\\n bounds_p0 = null;\\n}\\n\\n// Finds the left-right distance between two longitudes.\\n// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want\\n// the distance between ±180° to be 360°.\\nfunction bounds_angle(lambda0, lambda1) {\\n return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;\\n}\\n\\nfunction rangeCompare(a, b) {\\n return a[0] - b[0];\\n}\\n\\nfunction rangeContains(range, x) {\\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\\n}\\n\\n/* harmony default export */ var bounds = (function(feature) {\\n var i, n, a, b, merged, deltaMax, delta;\\n\\n bounds_phi1 = bounds_lambda1 = -(bounds_lambda0 = bounds_phi0 = Infinity);\\n ranges = [];\\n src_stream(feature, boundsStream);\\n\\n // First, sort ranges by their minimum longitudes.\\n if (n = ranges.length) {\\n ranges.sort(rangeCompare);\\n\\n // Then, merge any ranges that overlap.\\n for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {\\n b = ranges[i];\\n if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {\\n if (bounds_angle(a[0], b[1]) > bounds_angle(a[0], a[1])) a[1] = b[1];\\n if (bounds_angle(b[0], a[1]) > bounds_angle(a[0], a[1])) a[0] = b[0];\\n } else {\\n merged.push(a = b);\\n }\\n }\\n\\n // Finally, find the largest gap between the merged ranges.\\n // The final bounding box will be the inverse of this gap.\\n for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {\\n b = merged[i];\\n if ((delta = bounds_angle(a[1], b[0])) > deltaMax) deltaMax = delta, bounds_lambda0 = b[0], bounds_lambda1 = a[1];\\n }\\n }\\n\\n ranges = bounds_range = null;\\n\\n return bounds_lambda0 === Infinity || bounds_phi0 === Infinity\\n ? [[NaN, NaN], [NaN, NaN]]\\n : [[bounds_lambda0, bounds_phi0], [bounds_lambda1, bounds_phi1]];\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/centroid.js\\n\\n\\n\\n\\nvar W0, W1,\\n centroid_X0, centroid_Y0, Z0,\\n centroid_X1, centroid_Y1, Z1,\\n X2, Y2, Z2,\\n centroid_lambda00, centroid_phi00, // first point\\n centroid_x0, centroid_y0, z0; // previous point\\n\\nvar centroidStream = {\\n sphere: noop_noop,\\n point: centroidPoint,\\n lineStart: centroidLineStart,\\n lineEnd: centroidLineEnd,\\n polygonStart: function() {\\n centroidStream.lineStart = centroidRingStart;\\n centroidStream.lineEnd = centroidRingEnd;\\n },\\n polygonEnd: function() {\\n centroidStream.lineStart = centroidLineStart;\\n centroidStream.lineEnd = centroidLineEnd;\\n }\\n};\\n\\n// Arithmetic mean of Cartesian vectors.\\nfunction centroidPoint(lambda, phi) {\\n lambda *= radians, phi *= radians;\\n var cosPhi = math_cos(phi);\\n centroidPointCartesian(cosPhi * math_cos(lambda), cosPhi * math_sin(lambda), math_sin(phi));\\n}\\n\\nfunction centroidPointCartesian(x, y, z) {\\n ++W0;\\n centroid_X0 += (x - centroid_X0) / W0;\\n centroid_Y0 += (y - centroid_Y0) / W0;\\n Z0 += (z - Z0) / W0;\\n}\\n\\nfunction centroidLineStart() {\\n centroidStream.point = centroidLinePointFirst;\\n}\\n\\nfunction centroidLinePointFirst(lambda, phi) {\\n lambda *= radians, phi *= radians;\\n var cosPhi = math_cos(phi);\\n centroid_x0 = cosPhi * math_cos(lambda);\\n centroid_y0 = cosPhi * math_sin(lambda);\\n z0 = math_sin(phi);\\n centroidStream.point = centroidLinePoint;\\n centroidPointCartesian(centroid_x0, centroid_y0, z0);\\n}\\n\\nfunction centroidLinePoint(lambda, phi) {\\n lambda *= radians, phi *= radians;\\n var cosPhi = math_cos(phi),\\n x = cosPhi * math_cos(lambda),\\n y = cosPhi * math_sin(lambda),\\n z = math_sin(phi),\\n w = atan2(sqrt((w = centroid_y0 * z - z0 * y) * w + (w = z0 * x - centroid_x0 * z) * w + (w = centroid_x0 * y - centroid_y0 * x) * w), centroid_x0 * x + centroid_y0 * y + z0 * z);\\n W1 += w;\\n centroid_X1 += w * (centroid_x0 + (centroid_x0 = x));\\n centroid_Y1 += w * (centroid_y0 + (centroid_y0 = y));\\n Z1 += w * (z0 + (z0 = z));\\n centroidPointCartesian(centroid_x0, centroid_y0, z0);\\n}\\n\\nfunction centroidLineEnd() {\\n centroidStream.point = centroidPoint;\\n}\\n\\n// See J. E. Brock, The Inertia Tensor for a Spherical Triangle,\\n// J. Applied Mechanics 42, 239 (1975).\\nfunction centroidRingStart() {\\n centroidStream.point = centroidRingPointFirst;\\n}\\n\\nfunction centroidRingEnd() {\\n centroidRingPoint(centroid_lambda00, centroid_phi00);\\n centroidStream.point = centroidPoint;\\n}\\n\\nfunction centroidRingPointFirst(lambda, phi) {\\n centroid_lambda00 = lambda, centroid_phi00 = phi;\\n lambda *= radians, phi *= radians;\\n centroidStream.point = centroidRingPoint;\\n var cosPhi = math_cos(phi);\\n centroid_x0 = cosPhi * math_cos(lambda);\\n centroid_y0 = cosPhi * math_sin(lambda);\\n z0 = math_sin(phi);\\n centroidPointCartesian(centroid_x0, centroid_y0, z0);\\n}\\n\\nfunction centroidRingPoint(lambda, phi) {\\n lambda *= radians, phi *= radians;\\n var cosPhi = math_cos(phi),\\n x = cosPhi * math_cos(lambda),\\n y = cosPhi * math_sin(lambda),\\n z = math_sin(phi),\\n cx = centroid_y0 * z - z0 * y,\\n cy = z0 * x - centroid_x0 * z,\\n cz = centroid_x0 * y - centroid_y0 * x,\\n m = sqrt(cx * cx + cy * cy + cz * cz),\\n w = asin(m), // line weight = angle\\n v = m && -w / m; // area weight multiplier\\n X2 += v * cx;\\n Y2 += v * cy;\\n Z2 += v * cz;\\n W1 += w;\\n centroid_X1 += w * (centroid_x0 + (centroid_x0 = x));\\n centroid_Y1 += w * (centroid_y0 + (centroid_y0 = y));\\n Z1 += w * (z0 + (z0 = z));\\n centroidPointCartesian(centroid_x0, centroid_y0, z0);\\n}\\n\\n/* harmony default export */ var src_centroid = (function(object) {\\n W0 = W1 =\\n centroid_X0 = centroid_Y0 = Z0 =\\n centroid_X1 = centroid_Y1 = Z1 =\\n X2 = Y2 = Z2 = 0;\\n src_stream(object, centroidStream);\\n\\n var x = X2,\\n y = Y2,\\n z = Z2,\\n m = x * x + y * y + z * z;\\n\\n // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.\\n if (m < epsilon2) {\\n x = centroid_X1, y = centroid_Y1, z = Z1;\\n // If the feature has zero length, fall back to arithmetic mean of point vectors.\\n if (W1 < math_epsilon) x = centroid_X0, y = centroid_Y0, z = Z0;\\n m = x * x + y * y + z * z;\\n // If the feature still has an undefined ccentroid, then return.\\n if (m < epsilon2) return [NaN, NaN];\\n }\\n\\n return [atan2(y, x) * math_degrees, asin(z / sqrt(m)) * math_degrees];\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/constant.js\\n/* harmony default export */ var d3_geo_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/compose.js\\n/* harmony default export */ var compose = (function(a, b) {\\n\\n function compose(x, y) {\\n return x = a(x, y), b(x[0], x[1]);\\n }\\n\\n if (a.invert && b.invert) compose.invert = function(x, y) {\\n return x = b.invert(x, y), x && a.invert(x[0], x[1]);\\n };\\n\\n return compose;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/rotation.js\\n\\n\\n\\nfunction rotationIdentity(lambda, phi) {\\n return [abs(lambda) > math_pi ? lambda + Math.round(-lambda / math_tau) * math_tau : lambda, phi];\\n}\\n\\nrotationIdentity.invert = rotationIdentity;\\n\\nfunction rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\\n return (deltaLambda %= math_tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))\\n : rotationLambda(deltaLambda))\\n : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)\\n : rotationIdentity);\\n}\\n\\nfunction forwardRotationLambda(deltaLambda) {\\n return function(lambda, phi) {\\n return lambda += deltaLambda, [lambda > math_pi ? lambda - math_tau : lambda < -math_pi ? lambda + math_tau : lambda, phi];\\n };\\n}\\n\\nfunction rotationLambda(deltaLambda) {\\n var rotation = forwardRotationLambda(deltaLambda);\\n rotation.invert = forwardRotationLambda(-deltaLambda);\\n return rotation;\\n}\\n\\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\\n var cosDeltaPhi = math_cos(deltaPhi),\\n sinDeltaPhi = math_sin(deltaPhi),\\n cosDeltaGamma = math_cos(deltaGamma),\\n sinDeltaGamma = math_sin(deltaGamma);\\n\\n function rotation(lambda, phi) {\\n var cosPhi = math_cos(phi),\\n x = math_cos(lambda) * cosPhi,\\n y = math_sin(lambda) * cosPhi,\\n z = math_sin(phi),\\n k = z * cosDeltaPhi + x * sinDeltaPhi;\\n return [\\n atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),\\n asin(k * cosDeltaGamma + y * sinDeltaGamma)\\n ];\\n }\\n\\n rotation.invert = function(lambda, phi) {\\n var cosPhi = math_cos(phi),\\n x = math_cos(lambda) * cosPhi,\\n y = math_sin(lambda) * cosPhi,\\n z = math_sin(phi),\\n k = z * cosDeltaGamma - y * sinDeltaGamma;\\n return [\\n atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),\\n asin(k * cosDeltaPhi - x * sinDeltaPhi)\\n ];\\n };\\n\\n return rotation;\\n}\\n\\n/* harmony default export */ var src_rotation = (function(rotate) {\\n rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);\\n\\n function forward(coordinates) {\\n coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);\\n return coordinates[0] *= math_degrees, coordinates[1] *= math_degrees, coordinates;\\n }\\n\\n forward.invert = function(coordinates) {\\n coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);\\n return coordinates[0] *= math_degrees, coordinates[1] *= math_degrees, coordinates;\\n };\\n\\n return forward;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/circle.js\\n\\n\\n\\n\\n\\n// Generates a circle centered at [0°, 0°], with a given radius and precision.\\nfunction circleStream(stream, radius, delta, direction, t0, t1) {\\n if (!delta) return;\\n var cosRadius = math_cos(radius),\\n sinRadius = math_sin(radius),\\n step = direction * delta;\\n if (t0 == null) {\\n t0 = radius + direction * math_tau;\\n t1 = radius - step / 2;\\n } else {\\n t0 = circleRadius(cosRadius, t0);\\n t1 = circleRadius(cosRadius, t1);\\n if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * math_tau;\\n }\\n for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {\\n point = cartesian_spherical([cosRadius, -sinRadius * math_cos(t), -sinRadius * math_sin(t)]);\\n stream.point(point[0], point[1]);\\n }\\n}\\n\\n// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\\nfunction circleRadius(cosRadius, point) {\\n point = cartesian_cartesian(point), point[0] -= cosRadius;\\n cartesianNormalizeInPlace(point);\\n var radius = acos(-point[1]);\\n return ((-point[2] < 0 ? -radius : radius) + math_tau - math_epsilon) % math_tau;\\n}\\n\\n/* harmony default export */ var src_circle = (function() {\\n var center = d3_geo_src_constant([0, 0]),\\n radius = d3_geo_src_constant(90),\\n precision = d3_geo_src_constant(6),\\n ring,\\n rotate,\\n stream = {point: point};\\n\\n function point(x, y) {\\n ring.push(x = rotate(x, y));\\n x[0] *= math_degrees, x[1] *= math_degrees;\\n }\\n\\n function circle() {\\n var c = center.apply(this, arguments),\\n r = radius.apply(this, arguments) * radians,\\n p = precision.apply(this, arguments) * radians;\\n ring = [];\\n rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;\\n circleStream(stream, r, p, 1);\\n c = {type: \"Polygon\", coordinates: [ring]};\\n ring = rotate = null;\\n return c;\\n }\\n\\n circle.center = function(_) {\\n return arguments.length ? (center = typeof _ === \"function\" ? _ : d3_geo_src_constant([+_[0], +_[1]]), circle) : center;\\n };\\n\\n circle.radius = function(_) {\\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : d3_geo_src_constant(+_), circle) : radius;\\n };\\n\\n circle.precision = function(_) {\\n return arguments.length ? (precision = typeof _ === \"function\" ? _ : d3_geo_src_constant(+_), circle) : precision;\\n };\\n\\n return circle;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/clip/buffer.js\\n\\n\\n/* harmony default export */ var clip_buffer = (function() {\\n var lines = [],\\n line;\\n return {\\n point: function(x, y, m) {\\n line.push([x, y, m]);\\n },\\n lineStart: function() {\\n lines.push(line = []);\\n },\\n lineEnd: noop_noop,\\n rejoin: function() {\\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\\n },\\n result: function() {\\n var result = lines;\\n lines = [];\\n line = null;\\n return result;\\n }\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/pointEqual.js\\n\\n\\n/* harmony default export */ var pointEqual = (function(a, b) {\\n return abs(a[0] - b[0]) < math_epsilon && abs(a[1] - b[1]) < math_epsilon;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/clip/rejoin.js\\n\\n\\n\\nfunction Intersection(point, points, other, entry) {\\n this.x = point;\\n this.z = points;\\n this.o = other; // another intersection\\n this.e = entry; // is an entry?\\n this.v = false; // visited\\n this.n = this.p = null; // next & previous\\n}\\n\\n// A generalized polygon clipping algorithm: given a polygon that has been cut\\n// into its visible line segments, and rejoins the segments by interpolating\\n// along the clip edge.\\n/* harmony default export */ var rejoin = (function(segments, compareIntersection, startInside, interpolate, stream) {\\n var subject = [],\\n clip = [],\\n i,\\n n;\\n\\n segments.forEach(function(segment) {\\n if ((n = segment.length - 1) <= 0) return;\\n var n, p0 = segment[0], p1 = segment[n], x;\\n\\n if (pointEqual(p0, p1)) {\\n if (!p0[2] && !p1[2]) {\\n stream.lineStart();\\n for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);\\n stream.lineEnd();\\n return;\\n }\\n // handle degenerate cases by moving the point\\n p1[0] += 2 * math_epsilon;\\n }\\n\\n subject.push(x = new Intersection(p0, segment, null, true));\\n clip.push(x.o = new Intersection(p0, null, x, false));\\n subject.push(x = new Intersection(p1, segment, null, false));\\n clip.push(x.o = new Intersection(p1, null, x, true));\\n });\\n\\n if (!subject.length) return;\\n\\n clip.sort(compareIntersection);\\n rejoin_link(subject);\\n rejoin_link(clip);\\n\\n for (i = 0, n = clip.length; i < n; ++i) {\\n clip[i].e = startInside = !startInside;\\n }\\n\\n var start = subject[0],\\n points,\\n point;\\n\\n while (1) {\\n // Find first unvisited intersection.\\n var current = start,\\n isSubject = true;\\n while (current.v) if ((current = current.n) === start) return;\\n points = current.z;\\n stream.lineStart();\\n do {\\n current.v = current.o.v = true;\\n if (current.e) {\\n if (isSubject) {\\n for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);\\n } else {\\n interpolate(current.x, current.n.x, 1, stream);\\n }\\n current = current.n;\\n } else {\\n if (isSubject) {\\n points = current.p.z;\\n for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);\\n } else {\\n interpolate(current.x, current.p.x, -1, stream);\\n }\\n current = current.p;\\n }\\n current = current.o;\\n points = current.z;\\n isSubject = !isSubject;\\n } while (!current.v);\\n stream.lineEnd();\\n }\\n});\\n\\nfunction rejoin_link(array) {\\n if (!(n = array.length)) return;\\n var n,\\n i = 0,\\n a = array[0],\\n b;\\n while (++i < n) {\\n a.n = b = array[i];\\n b.p = a;\\n a = b;\\n }\\n a.n = b = array[0];\\n b.p = a;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/polygonContains.js\\n\\n\\n\\n\\nvar polygonContains_sum = adder();\\n\\nfunction longitude(point) {\\n if (abs(point[0]) <= math_pi)\\n return point[0];\\n else\\n return math_sign(point[0]) * ((abs(point[0]) + math_pi) % math_tau - math_pi);\\n}\\n\\n/* harmony default export */ var polygonContains = (function(polygon, point) {\\n var lambda = longitude(point),\\n phi = point[1],\\n sinPhi = math_sin(phi),\\n normal = [math_sin(lambda), -math_cos(lambda), 0],\\n angle = 0,\\n winding = 0;\\n\\n polygonContains_sum.reset();\\n\\n if (sinPhi === 1) phi = math_halfPi + math_epsilon;\\n else if (sinPhi === -1) phi = -math_halfPi - math_epsilon;\\n\\n for (var i = 0, n = polygon.length; i < n; ++i) {\\n if (!(m = (ring = polygon[i]).length)) continue;\\n var ring,\\n m,\\n point0 = ring[m - 1],\\n lambda0 = longitude(point0),\\n phi0 = point0[1] / 2 + quarterPi,\\n sinPhi0 = math_sin(phi0),\\n cosPhi0 = math_cos(phi0);\\n\\n for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {\\n var point1 = ring[j],\\n lambda1 = longitude(point1),\\n phi1 = point1[1] / 2 + quarterPi,\\n sinPhi1 = math_sin(phi1),\\n cosPhi1 = math_cos(phi1),\\n delta = lambda1 - lambda0,\\n sign = delta >= 0 ? 1 : -1,\\n absDelta = sign * delta,\\n antimeridian = absDelta > math_pi,\\n k = sinPhi0 * sinPhi1;\\n\\n polygonContains_sum.add(atan2(k * sign * math_sin(absDelta), cosPhi0 * cosPhi1 + k * math_cos(absDelta)));\\n angle += antimeridian ? delta + sign * math_tau : delta;\\n\\n // Are the longitudes either side of the points meridian (lambda),\\n // and are the latitudes smaller than the parallel (phi)?\\n if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\\n var arc = cartesianCross(cartesian_cartesian(point0), cartesian_cartesian(point1));\\n cartesianNormalizeInPlace(arc);\\n var intersection = cartesianCross(normal, arc);\\n cartesianNormalizeInPlace(intersection);\\n var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);\\n if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {\\n winding += antimeridian ^ delta >= 0 ? 1 : -1;\\n }\\n }\\n }\\n }\\n\\n // First, determine whether the South pole is inside or outside:\\n //\\n // It is inside if:\\n // * the polygon winds around it in a clockwise direction.\\n // * the polygon does not (cumulatively) wind around it, but has a negative\\n // (counter-clockwise) area.\\n //\\n // Second, count the (signed) number of times a segment crosses a lambda\\n // from the point to the South pole. If it is zero, then the point is the\\n // same side as the South pole.\\n\\n return (angle < -math_epsilon || angle < math_epsilon && polygonContains_sum < -math_epsilon) ^ (winding & 1);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/clip/index.js\\n\\n\\n\\n\\n\\n\\n/* harmony default export */ var src_clip = (function(pointVisible, clipLine, interpolate, start) {\\n return function(sink) {\\n var line = clipLine(sink),\\n ringBuffer = clip_buffer(),\\n ringSink = clipLine(ringBuffer),\\n polygonStarted = false,\\n polygon,\\n segments,\\n ring;\\n\\n var clip = {\\n point: point,\\n lineStart: lineStart,\\n lineEnd: lineEnd,\\n polygonStart: function() {\\n clip.point = pointRing;\\n clip.lineStart = ringStart;\\n clip.lineEnd = ringEnd;\\n segments = [];\\n polygon = [];\\n },\\n polygonEnd: function() {\\n clip.point = point;\\n clip.lineStart = lineStart;\\n clip.lineEnd = lineEnd;\\n segments = src_merge(segments);\\n var startInside = polygonContains(polygon, start);\\n if (segments.length) {\\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\\n rejoin(segments, clip_compareIntersection, startInside, interpolate, sink);\\n } else if (startInside) {\\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\\n sink.lineStart();\\n interpolate(null, null, 1, sink);\\n sink.lineEnd();\\n }\\n if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\\n segments = polygon = null;\\n },\\n sphere: function() {\\n sink.polygonStart();\\n sink.lineStart();\\n interpolate(null, null, 1, sink);\\n sink.lineEnd();\\n sink.polygonEnd();\\n }\\n };\\n\\n function point(lambda, phi) {\\n if (pointVisible(lambda, phi)) sink.point(lambda, phi);\\n }\\n\\n function pointLine(lambda, phi) {\\n line.point(lambda, phi);\\n }\\n\\n function lineStart() {\\n clip.point = pointLine;\\n line.lineStart();\\n }\\n\\n function lineEnd() {\\n clip.point = point;\\n line.lineEnd();\\n }\\n\\n function pointRing(lambda, phi) {\\n ring.push([lambda, phi]);\\n ringSink.point(lambda, phi);\\n }\\n\\n function ringStart() {\\n ringSink.lineStart();\\n ring = [];\\n }\\n\\n function ringEnd() {\\n pointRing(ring[0][0], ring[0][1]);\\n ringSink.lineEnd();\\n\\n var clean = ringSink.clean(),\\n ringSegments = ringBuffer.result(),\\n i, n = ringSegments.length, m,\\n segment,\\n point;\\n\\n ring.pop();\\n polygon.push(ring);\\n ring = null;\\n\\n if (!n) return;\\n\\n // No intersections.\\n if (clean & 1) {\\n segment = ringSegments[0];\\n if ((m = segment.length - 1) > 0) {\\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\\n sink.lineStart();\\n for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);\\n sink.lineEnd();\\n }\\n return;\\n }\\n\\n // Rejoin connected segments.\\n // TODO reuse ringBuffer.rejoin()?\\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\\n\\n segments.push(ringSegments.filter(validSegment));\\n }\\n\\n return clip;\\n };\\n});\\n\\nfunction validSegment(segment) {\\n return segment.length > 1;\\n}\\n\\n// Intersections are sorted along the clip edge. For both antimeridian cutting\\n// and circle clipping, the same comparison is used.\\nfunction clip_compareIntersection(a, b) {\\n return ((a = a.x)[0] < 0 ? a[1] - math_halfPi - math_epsilon : math_halfPi - a[1])\\n - ((b = b.x)[0] < 0 ? b[1] - math_halfPi - math_epsilon : math_halfPi - b[1]);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/clip/antimeridian.js\\n\\n\\n\\n/* harmony default export */ var clip_antimeridian = (src_clip(\\n function() { return true; },\\n clipAntimeridianLine,\\n clipAntimeridianInterpolate,\\n [-math_pi, -math_halfPi]\\n));\\n\\n// Takes a line and cuts into visible segments. Return values: 0 - there were\\n// intersections or the line was empty; 1 - no intersections; 2 - there were\\n// intersections, and the first and last segments should be rejoined.\\nfunction clipAntimeridianLine(stream) {\\n var lambda0 = NaN,\\n phi0 = NaN,\\n sign0 = NaN,\\n clean; // no intersections\\n\\n return {\\n lineStart: function() {\\n stream.lineStart();\\n clean = 1;\\n },\\n point: function(lambda1, phi1) {\\n var sign1 = lambda1 > 0 ? math_pi : -math_pi,\\n delta = abs(lambda1 - lambda0);\\n if (abs(delta - math_pi) < math_epsilon) { // line crosses a pole\\n stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? math_halfPi : -math_halfPi);\\n stream.point(sign0, phi0);\\n stream.lineEnd();\\n stream.lineStart();\\n stream.point(sign1, phi0);\\n stream.point(lambda1, phi0);\\n clean = 0;\\n } else if (sign0 !== sign1 && delta >= math_pi) { // line crosses antimeridian\\n if (abs(lambda0 - sign0) < math_epsilon) lambda0 -= sign0 * math_epsilon; // handle degeneracies\\n if (abs(lambda1 - sign1) < math_epsilon) lambda1 -= sign1 * math_epsilon;\\n phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\\n stream.point(sign0, phi0);\\n stream.lineEnd();\\n stream.lineStart();\\n stream.point(sign1, phi0);\\n clean = 0;\\n }\\n stream.point(lambda0 = lambda1, phi0 = phi1);\\n sign0 = sign1;\\n },\\n lineEnd: function() {\\n stream.lineEnd();\\n lambda0 = phi0 = NaN;\\n },\\n clean: function() {\\n return 2 - clean; // if intersections, rejoin first and last segments\\n }\\n };\\n}\\n\\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\\n var cosPhi0,\\n cosPhi1,\\n sinLambda0Lambda1 = math_sin(lambda0 - lambda1);\\n return abs(sinLambda0Lambda1) > math_epsilon\\n ? atan((math_sin(phi0) * (cosPhi1 = math_cos(phi1)) * math_sin(lambda1)\\n - math_sin(phi1) * (cosPhi0 = math_cos(phi0)) * math_sin(lambda0))\\n / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))\\n : (phi0 + phi1) / 2;\\n}\\n\\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\\n var phi;\\n if (from == null) {\\n phi = direction * math_halfPi;\\n stream.point(-math_pi, phi);\\n stream.point(0, phi);\\n stream.point(math_pi, phi);\\n stream.point(math_pi, 0);\\n stream.point(math_pi, -phi);\\n stream.point(0, -phi);\\n stream.point(-math_pi, -phi);\\n stream.point(-math_pi, 0);\\n stream.point(-math_pi, phi);\\n } else if (abs(from[0] - to[0]) > math_epsilon) {\\n var lambda = from[0] < to[0] ? math_pi : -math_pi;\\n phi = direction * lambda / 2;\\n stream.point(-lambda, phi);\\n stream.point(0, phi);\\n stream.point(lambda, phi);\\n } else {\\n stream.point(to[0], to[1]);\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/clip/circle.js\\n\\n\\n\\n\\n\\n\\n/* harmony default export */ var clip_circle = (function(radius) {\\n var cr = math_cos(radius),\\n delta = 6 * radians,\\n smallRadius = cr > 0,\\n notHemisphere = abs(cr) > math_epsilon; // TODO optimise for this common case\\n\\n function interpolate(from, to, direction, stream) {\\n circleStream(stream, radius, delta, direction, from, to);\\n }\\n\\n function visible(lambda, phi) {\\n return math_cos(lambda) * math_cos(phi) > cr;\\n }\\n\\n // Takes a line and cuts into visible segments. Return values used for polygon\\n // clipping: 0 - there were intersections or the line was empty; 1 - no\\n // intersections 2 - there were intersections, and the first and last segments\\n // should be rejoined.\\n function clipLine(stream) {\\n var point0, // previous point\\n c0, // code for previous point\\n v0, // visibility of previous point\\n v00, // visibility of first point\\n clean; // no intersections\\n return {\\n lineStart: function() {\\n v00 = v0 = false;\\n clean = 1;\\n },\\n point: function(lambda, phi) {\\n var point1 = [lambda, phi],\\n point2,\\n v = visible(lambda, phi),\\n c = smallRadius\\n ? v ? 0 : code(lambda, phi)\\n : v ? code(lambda + (lambda < 0 ? math_pi : -math_pi), phi) : 0;\\n if (!point0 && (v00 = v0 = v)) stream.lineStart();\\n if (v !== v0) {\\n point2 = intersect(point0, point1);\\n if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2))\\n point1[2] = 1;\\n }\\n if (v !== v0) {\\n clean = 0;\\n if (v) {\\n // outside going in\\n stream.lineStart();\\n point2 = intersect(point1, point0);\\n stream.point(point2[0], point2[1]);\\n } else {\\n // inside going out\\n point2 = intersect(point0, point1);\\n stream.point(point2[0], point2[1], 2);\\n stream.lineEnd();\\n }\\n point0 = point2;\\n } else if (notHemisphere && point0 && smallRadius ^ v) {\\n var t;\\n // If the codes for two points are different, or are both zero,\\n // and there this segment intersects with the small circle.\\n if (!(c & c0) && (t = intersect(point1, point0, true))) {\\n clean = 0;\\n if (smallRadius) {\\n stream.lineStart();\\n stream.point(t[0][0], t[0][1]);\\n stream.point(t[1][0], t[1][1]);\\n stream.lineEnd();\\n } else {\\n stream.point(t[1][0], t[1][1]);\\n stream.lineEnd();\\n stream.lineStart();\\n stream.point(t[0][0], t[0][1], 3);\\n }\\n }\\n }\\n if (v && (!point0 || !pointEqual(point0, point1))) {\\n stream.point(point1[0], point1[1]);\\n }\\n point0 = point1, v0 = v, c0 = c;\\n },\\n lineEnd: function() {\\n if (v0) stream.lineEnd();\\n point0 = null;\\n },\\n // Rejoin first and last segments if there were intersections and the first\\n // and last points were visible.\\n clean: function() {\\n return clean | ((v00 && v0) << 1);\\n }\\n };\\n }\\n\\n // Intersects the great circle between a and b with the clip circle.\\n function intersect(a, b, two) {\\n var pa = cartesian_cartesian(a),\\n pb = cartesian_cartesian(b);\\n\\n // We have two planes, n1.p = d1 and n2.p = d2.\\n // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 n2).\\n var n1 = [1, 0, 0], // normal\\n n2 = cartesianCross(pa, pb),\\n n2n2 = cartesianDot(n2, n2),\\n n1n2 = n2[0], // cartesianDot(n1, n2),\\n determinant = n2n2 - n1n2 * n1n2;\\n\\n // Two polar points.\\n if (!determinant) return !two && a;\\n\\n var c1 = cr * n2n2 / determinant,\\n c2 = -cr * n1n2 / determinant,\\n n1xn2 = cartesianCross(n1, n2),\\n A = cartesianScale(n1, c1),\\n B = cartesianScale(n2, c2);\\n cartesianAddInPlace(A, B);\\n\\n // Solve |p(t)|^2 = 1.\\n var u = n1xn2,\\n w = cartesianDot(A, u),\\n uu = cartesianDot(u, u),\\n t2 = w * w - uu * (cartesianDot(A, A) - 1);\\n\\n if (t2 < 0) return;\\n\\n var t = sqrt(t2),\\n q = cartesianScale(u, (-w - t) / uu);\\n cartesianAddInPlace(q, A);\\n q = cartesian_spherical(q);\\n\\n if (!two) return q;\\n\\n // Two intersection points.\\n var lambda0 = a[0],\\n lambda1 = b[0],\\n phi0 = a[1],\\n phi1 = b[1],\\n z;\\n\\n if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;\\n\\n var delta = lambda1 - lambda0,\\n polar = abs(delta - math_pi) < math_epsilon,\\n meridian = polar || delta < math_epsilon;\\n\\n if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;\\n\\n // Check that the first point is between a and b.\\n if (meridian\\n ? polar\\n ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < math_epsilon ? phi0 : phi1)\\n : phi0 <= q[1] && q[1] <= phi1\\n : delta > math_pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) {\\n var q1 = cartesianScale(u, (-w + t) / uu);\\n cartesianAddInPlace(q1, A);\\n return [q, cartesian_spherical(q1)];\\n }\\n }\\n\\n // Generates a 4-bit vector representing the location of a point relative to\\n // the small circle\\'s bounding box.\\n function code(lambda, phi) {\\n var r = smallRadius ? radius : math_pi - radius,\\n code = 0;\\n if (lambda < -r) code |= 1; // left\\n else if (lambda > r) code |= 2; // right\\n if (phi < -r) code |= 4; // below\\n else if (phi > r) code |= 8; // above\\n return code;\\n }\\n\\n return src_clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-math_pi, radius - math_pi]);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/clip/line.js\\n/* harmony default export */ var clip_line = (function(a, b, x0, y0, x1, y1) {\\n var ax = a[0],\\n ay = a[1],\\n bx = b[0],\\n by = b[1],\\n t0 = 0,\\n t1 = 1,\\n dx = bx - ax,\\n dy = by - ay,\\n r;\\n\\n r = x0 - ax;\\n if (!dx && r > 0) return;\\n r /= dx;\\n if (dx < 0) {\\n if (r < t0) return;\\n if (r < t1) t1 = r;\\n } else if (dx > 0) {\\n if (r > t1) return;\\n if (r > t0) t0 = r;\\n }\\n\\n r = x1 - ax;\\n if (!dx && r < 0) return;\\n r /= dx;\\n if (dx < 0) {\\n if (r > t1) return;\\n if (r > t0) t0 = r;\\n } else if (dx > 0) {\\n if (r < t0) return;\\n if (r < t1) t1 = r;\\n }\\n\\n r = y0 - ay;\\n if (!dy && r > 0) return;\\n r /= dy;\\n if (dy < 0) {\\n if (r < t0) return;\\n if (r < t1) t1 = r;\\n } else if (dy > 0) {\\n if (r > t1) return;\\n if (r > t0) t0 = r;\\n }\\n\\n r = y1 - ay;\\n if (!dy && r < 0) return;\\n r /= dy;\\n if (dy < 0) {\\n if (r > t1) return;\\n if (r > t0) t0 = r;\\n } else if (dy > 0) {\\n if (r < t0) return;\\n if (r < t1) t1 = r;\\n }\\n\\n if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;\\n if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;\\n return true;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/clip/rectangle.js\\n\\n\\n\\n\\n\\n\\nvar clipMax = 1e9, clipMin = -clipMax;\\n\\n// TODO Use d3-polygons polygonContains here for the ring check?\\n// TODO Eliminate duplicate buffering in clipBuffer and polygon.push?\\n\\nfunction clipRectangle(x0, y0, x1, y1) {\\n\\n function visible(x, y) {\\n return x0 <= x && x <= x1 && y0 <= y && y <= y1;\\n }\\n\\n function interpolate(from, to, direction, stream) {\\n var a = 0, a1 = 0;\\n if (from == null\\n || (a = corner(from, direction)) !== (a1 = corner(to, direction))\\n || comparePoint(from, to) < 0 ^ direction > 0) {\\n do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\\n while ((a = (a + direction + 4) % 4) !== a1);\\n } else {\\n stream.point(to[0], to[1]);\\n }\\n }\\n\\n function corner(p, direction) {\\n return abs(p[0] - x0) < math_epsilon ? direction > 0 ? 0 : 3\\n : abs(p[0] - x1) < math_epsilon ? direction > 0 ? 2 : 1\\n : abs(p[1] - y0) < math_epsilon ? direction > 0 ? 1 : 0\\n : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon\\n }\\n\\n function compareIntersection(a, b) {\\n return comparePoint(a.x, b.x);\\n }\\n\\n function comparePoint(a, b) {\\n var ca = corner(a, 1),\\n cb = corner(b, 1);\\n return ca !== cb ? ca - cb\\n : ca === 0 ? b[1] - a[1]\\n : ca === 1 ? a[0] - b[0]\\n : ca === 2 ? a[1] - b[1]\\n : b[0] - a[0];\\n }\\n\\n return function(stream) {\\n var activeStream = stream,\\n bufferStream = clip_buffer(),\\n segments,\\n polygon,\\n ring,\\n x__, y__, v__, // first point\\n x_, y_, v_, // previous point\\n first,\\n clean;\\n\\n var clipStream = {\\n point: point,\\n lineStart: lineStart,\\n lineEnd: lineEnd,\\n polygonStart: polygonStart,\\n polygonEnd: polygonEnd\\n };\\n\\n function point(x, y) {\\n if (visible(x, y)) activeStream.point(x, y);\\n }\\n\\n function polygonInside() {\\n var winding = 0;\\n\\n for (var i = 0, n = polygon.length; i < n; ++i) {\\n for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {\\n a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];\\n if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }\\n else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }\\n }\\n }\\n\\n return winding;\\n }\\n\\n // Buffer geometry within a polygon and then clip it en masse.\\n function polygonStart() {\\n activeStream = bufferStream, segments = [], polygon = [], clean = true;\\n }\\n\\n function polygonEnd() {\\n var startInside = polygonInside(),\\n cleanInside = clean && startInside,\\n visible = (segments = src_merge(segments)).length;\\n if (cleanInside || visible) {\\n stream.polygonStart();\\n if (cleanInside) {\\n stream.lineStart();\\n interpolate(null, null, 1, stream);\\n stream.lineEnd();\\n }\\n if (visible) {\\n rejoin(segments, compareIntersection, startInside, interpolate, stream);\\n }\\n stream.polygonEnd();\\n }\\n activeStream = stream, segments = polygon = ring = null;\\n }\\n\\n function lineStart() {\\n clipStream.point = linePoint;\\n if (polygon) polygon.push(ring = []);\\n first = true;\\n v_ = false;\\n x_ = y_ = NaN;\\n }\\n\\n // TODO rather than special-case polygons, simply handle them separately.\\n // Ideally, coincident intersection points should be jittered to avoid\\n // clipping issues.\\n function lineEnd() {\\n if (segments) {\\n linePoint(x__, y__);\\n if (v__ && v_) bufferStream.rejoin();\\n segments.push(bufferStream.result());\\n }\\n clipStream.point = point;\\n if (v_) activeStream.lineEnd();\\n }\\n\\n function linePoint(x, y) {\\n var v = visible(x, y);\\n if (polygon) ring.push([x, y]);\\n if (first) {\\n x__ = x, y__ = y, v__ = v;\\n first = false;\\n if (v) {\\n activeStream.lineStart();\\n activeStream.point(x, y);\\n }\\n } else {\\n if (v && v_) activeStream.point(x, y);\\n else {\\n var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],\\n b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];\\n if (clip_line(a, b, x0, y0, x1, y1)) {\\n if (!v_) {\\n activeStream.lineStart();\\n activeStream.point(a[0], a[1]);\\n }\\n activeStream.point(b[0], b[1]);\\n if (!v) activeStream.lineEnd();\\n clean = false;\\n } else if (v) {\\n activeStream.lineStart();\\n activeStream.point(x, y);\\n clean = false;\\n }\\n }\\n }\\n x_ = x, y_ = y, v_ = v;\\n }\\n\\n return clipStream;\\n };\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/clip/extent.js\\n\\n\\n/* harmony default export */ var clip_extent = (function() {\\n var x0 = 0,\\n y0 = 0,\\n x1 = 960,\\n y1 = 500,\\n cache,\\n cacheStream,\\n clip;\\n\\n return clip = {\\n stream: function(stream) {\\n return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);\\n },\\n extent: function(_) {\\n return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];\\n }\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/length.js\\n\\n\\n\\n\\n\\nvar lengthSum = adder(),\\n length_lambda0,\\n length_sinPhi0,\\n length_cosPhi0;\\n\\nvar lengthStream = {\\n sphere: noop_noop,\\n point: noop_noop,\\n lineStart: lengthLineStart,\\n lineEnd: noop_noop,\\n polygonStart: noop_noop,\\n polygonEnd: noop_noop\\n};\\n\\nfunction lengthLineStart() {\\n lengthStream.point = lengthPointFirst;\\n lengthStream.lineEnd = lengthLineEnd;\\n}\\n\\nfunction lengthLineEnd() {\\n lengthStream.point = lengthStream.lineEnd = noop_noop;\\n}\\n\\nfunction lengthPointFirst(lambda, phi) {\\n lambda *= radians, phi *= radians;\\n length_lambda0 = lambda, length_sinPhi0 = math_sin(phi), length_cosPhi0 = math_cos(phi);\\n lengthStream.point = lengthPoint;\\n}\\n\\nfunction lengthPoint(lambda, phi) {\\n lambda *= radians, phi *= radians;\\n var sinPhi = math_sin(phi),\\n cosPhi = math_cos(phi),\\n delta = abs(lambda - length_lambda0),\\n cosDelta = math_cos(delta),\\n sinDelta = math_sin(delta),\\n x = cosPhi * sinDelta,\\n y = length_cosPhi0 * sinPhi - length_sinPhi0 * cosPhi * cosDelta,\\n z = length_sinPhi0 * sinPhi + length_cosPhi0 * cosPhi * cosDelta;\\n lengthSum.add(atan2(sqrt(x * x + y * y), z));\\n length_lambda0 = lambda, length_sinPhi0 = sinPhi, length_cosPhi0 = cosPhi;\\n}\\n\\n/* harmony default export */ var src_length = (function(object) {\\n lengthSum.reset();\\n src_stream(object, lengthStream);\\n return +lengthSum;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/distance.js\\n\\n\\nvar distance_coordinates = [null, null],\\n distance_object = {type: \"LineString\", coordinates: distance_coordinates};\\n\\n/* harmony default export */ var src_distance = (function(a, b) {\\n distance_coordinates[0] = a;\\n distance_coordinates[1] = b;\\n return src_length(distance_object);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/contains.js\\n\\n\\n\\n\\nvar containsObjectType = {\\n Feature: function(object, point) {\\n return containsGeometry(object.geometry, point);\\n },\\n FeatureCollection: function(object, point) {\\n var features = object.features, i = -1, n = features.length;\\n while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;\\n return false;\\n }\\n};\\n\\nvar containsGeometryType = {\\n Sphere: function() {\\n return true;\\n },\\n Point: function(object, point) {\\n return containsPoint(object.coordinates, point);\\n },\\n MultiPoint: function(object, point) {\\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\\n while (++i < n) if (containsPoint(coordinates[i], point)) return true;\\n return false;\\n },\\n LineString: function(object, point) {\\n return containsLine(object.coordinates, point);\\n },\\n MultiLineString: function(object, point) {\\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\\n while (++i < n) if (containsLine(coordinates[i], point)) return true;\\n return false;\\n },\\n Polygon: function(object, point) {\\n return containsPolygon(object.coordinates, point);\\n },\\n MultiPolygon: function(object, point) {\\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\\n while (++i < n) if (containsPolygon(coordinates[i], point)) return true;\\n return false;\\n },\\n GeometryCollection: function(object, point) {\\n var geometries = object.geometries, i = -1, n = geometries.length;\\n while (++i < n) if (containsGeometry(geometries[i], point)) return true;\\n return false;\\n }\\n};\\n\\nfunction containsGeometry(geometry, point) {\\n return geometry && containsGeometryType.hasOwnProperty(geometry.type)\\n ? containsGeometryType[geometry.type](geometry, point)\\n : false;\\n}\\n\\nfunction containsPoint(coordinates, point) {\\n return src_distance(coordinates, point) === 0;\\n}\\n\\nfunction containsLine(coordinates, point) {\\n var ao, bo, ab;\\n for (var i = 0, n = coordinates.length; i < n; i++) {\\n bo = src_distance(coordinates[i], point);\\n if (bo === 0) return true;\\n if (i > 0) {\\n ab = src_distance(coordinates[i], coordinates[i - 1]);\\n if (\\n ab > 0 &&\\n ao <= ab &&\\n bo <= ab &&\\n (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab\\n )\\n return true;\\n }\\n ao = bo;\\n }\\n return false;\\n}\\n\\nfunction containsPolygon(coordinates, point) {\\n return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));\\n}\\n\\nfunction ringRadians(ring) {\\n return ring = ring.map(pointRadians), ring.pop(), ring;\\n}\\n\\nfunction pointRadians(point) {\\n return [point[0] * radians, point[1] * radians];\\n}\\n\\n/* harmony default export */ var src_contains = (function(object, point) {\\n return (object && containsObjectType.hasOwnProperty(object.type)\\n ? containsObjectType[object.type]\\n : containsGeometry)(object, point);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/graticule.js\\n\\n\\n\\nfunction graticuleX(y0, y1, dy) {\\n var y = src_range(y0, y1 - math_epsilon, dy).concat(y1);\\n return function(x) { return y.map(function(y) { return [x, y]; }); };\\n}\\n\\nfunction graticuleY(x0, x1, dx) {\\n var x = src_range(x0, x1 - math_epsilon, dx).concat(x1);\\n return function(y) { return x.map(function(x) { return [x, y]; }); };\\n}\\n\\nfunction graticule_graticule() {\\n var x1, x0, X1, X0,\\n y1, y0, Y1, Y0,\\n dx = 10, dy = dx, DX = 90, DY = 360,\\n x, y, X, Y,\\n precision = 2.5;\\n\\n function graticule() {\\n return {type: \"MultiLineString\", coordinates: lines()};\\n }\\n\\n function lines() {\\n return src_range(ceil(X0 / DX) * DX, X1, DX).map(X)\\n .concat(src_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))\\n .concat(src_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > math_epsilon; }).map(x))\\n .concat(src_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > math_epsilon; }).map(y));\\n }\\n\\n graticule.lines = function() {\\n return lines().map(function(coordinates) { return {type: \"LineString\", coordinates: coordinates}; });\\n };\\n\\n graticule.outline = function() {\\n return {\\n type: \"Polygon\",\\n coordinates: [\\n X(X0).concat(\\n Y(Y1).slice(1),\\n X(X1).reverse().slice(1),\\n Y(Y0).reverse().slice(1))\\n ]\\n };\\n };\\n\\n graticule.extent = function(_) {\\n if (!arguments.length) return graticule.extentMinor();\\n return graticule.extentMajor(_).extentMinor(_);\\n };\\n\\n graticule.extentMajor = function(_) {\\n if (!arguments.length) return [[X0, Y0], [X1, Y1]];\\n X0 = +_[0][0], X1 = +_[1][0];\\n Y0 = +_[0][1], Y1 = +_[1][1];\\n if (X0 > X1) _ = X0, X0 = X1, X1 = _;\\n if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\\n return graticule.precision(precision);\\n };\\n\\n graticule.extentMinor = function(_) {\\n if (!arguments.length) return [[x0, y0], [x1, y1]];\\n x0 = +_[0][0], x1 = +_[1][0];\\n y0 = +_[0][1], y1 = +_[1][1];\\n if (x0 > x1) _ = x0, x0 = x1, x1 = _;\\n if (y0 > y1) _ = y0, y0 = y1, y1 = _;\\n return graticule.precision(precision);\\n };\\n\\n graticule.step = function(_) {\\n if (!arguments.length) return graticule.stepMinor();\\n return graticule.stepMajor(_).stepMinor(_);\\n };\\n\\n graticule.stepMajor = function(_) {\\n if (!arguments.length) return [DX, DY];\\n DX = +_[0], DY = +_[1];\\n return graticule;\\n };\\n\\n graticule.stepMinor = function(_) {\\n if (!arguments.length) return [dx, dy];\\n dx = +_[0], dy = +_[1];\\n return graticule;\\n };\\n\\n graticule.precision = function(_) {\\n if (!arguments.length) return precision;\\n precision = +_;\\n x = graticuleX(y0, y1, 90);\\n y = graticuleY(x0, x1, precision);\\n X = graticuleX(Y0, Y1, 90);\\n Y = graticuleY(X0, X1, precision);\\n return graticule;\\n };\\n\\n return graticule\\n .extentMajor([[-180, -90 + math_epsilon], [180, 90 - math_epsilon]])\\n .extentMinor([[-180, -80 - math_epsilon], [180, 80 + math_epsilon]]);\\n}\\n\\nfunction graticule10() {\\n return graticule_graticule()();\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/interpolate.js\\n\\n\\n/* harmony default export */ var src_interpolate = (function(a, b) {\\n var x0 = a[0] * radians,\\n y0 = a[1] * radians,\\n x1 = b[0] * radians,\\n y1 = b[1] * radians,\\n cy0 = math_cos(y0),\\n sy0 = math_sin(y0),\\n cy1 = math_cos(y1),\\n sy1 = math_sin(y1),\\n kx0 = cy0 * math_cos(x0),\\n ky0 = cy0 * math_sin(x0),\\n kx1 = cy1 * math_cos(x1),\\n ky1 = cy1 * math_sin(x1),\\n d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),\\n k = math_sin(d);\\n\\n var interpolate = d ? function(t) {\\n var B = math_sin(t *= d) / k,\\n A = math_sin(d - t) / k,\\n x = A * kx0 + B * kx1,\\n y = A * ky0 + B * ky1,\\n z = A * sy0 + B * sy1;\\n return [\\n atan2(y, x) * math_degrees,\\n atan2(z, sqrt(x * x + y * y)) * math_degrees\\n ];\\n } : function() {\\n return [x0 * math_degrees, y0 * math_degrees];\\n };\\n\\n interpolate.distance = d;\\n\\n return interpolate;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/identity.js\\n/* harmony default export */ var d3_geo_src_identity = (function(x) {\\n return x;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/path/area.js\\n\\n\\n\\n\\nvar area_areaSum = adder(),\\n area_areaRingSum = adder(),\\n area_x00,\\n area_y00,\\n area_x0,\\n area_y0;\\n\\nvar area_areaStream = {\\n point: noop_noop,\\n lineStart: noop_noop,\\n lineEnd: noop_noop,\\n polygonStart: function() {\\n area_areaStream.lineStart = area_areaRingStart;\\n area_areaStream.lineEnd = area_areaRingEnd;\\n },\\n polygonEnd: function() {\\n area_areaStream.lineStart = area_areaStream.lineEnd = area_areaStream.point = noop_noop;\\n area_areaSum.add(abs(area_areaRingSum));\\n area_areaRingSum.reset();\\n },\\n result: function() {\\n var area = area_areaSum / 2;\\n area_areaSum.reset();\\n return area;\\n }\\n};\\n\\nfunction area_areaRingStart() {\\n area_areaStream.point = area_areaPointFirst;\\n}\\n\\nfunction area_areaPointFirst(x, y) {\\n area_areaStream.point = area_areaPoint;\\n area_x00 = area_x0 = x, area_y00 = area_y0 = y;\\n}\\n\\nfunction area_areaPoint(x, y) {\\n area_areaRingSum.add(area_y0 * x - area_x0 * y);\\n area_x0 = x, area_y0 = y;\\n}\\n\\nfunction area_areaRingEnd() {\\n area_areaPoint(area_x00, area_y00);\\n}\\n\\n/* harmony default export */ var path_area = (area_areaStream);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/path/bounds.js\\n\\n\\nvar bounds_x0 = Infinity,\\n bounds_y0 = bounds_x0,\\n bounds_x1 = -bounds_x0,\\n bounds_y1 = bounds_x1;\\n\\nvar bounds_boundsStream = {\\n point: bounds_boundsPoint,\\n lineStart: noop_noop,\\n lineEnd: noop_noop,\\n polygonStart: noop_noop,\\n polygonEnd: noop_noop,\\n result: function() {\\n var bounds = [[bounds_x0, bounds_y0], [bounds_x1, bounds_y1]];\\n bounds_x1 = bounds_y1 = -(bounds_y0 = bounds_x0 = Infinity);\\n return bounds;\\n }\\n};\\n\\nfunction bounds_boundsPoint(x, y) {\\n if (x < bounds_x0) bounds_x0 = x;\\n if (x > bounds_x1) bounds_x1 = x;\\n if (y < bounds_y0) bounds_y0 = y;\\n if (y > bounds_y1) bounds_y1 = y;\\n}\\n\\n/* harmony default export */ var path_bounds = (bounds_boundsStream);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/path/centroid.js\\n\\n\\n// TODO Enforce positive area for exterior, negative area for interior?\\n\\nvar path_centroid_X0 = 0,\\n path_centroid_Y0 = 0,\\n centroid_Z0 = 0,\\n path_centroid_X1 = 0,\\n path_centroid_Y1 = 0,\\n centroid_Z1 = 0,\\n centroid_X2 = 0,\\n centroid_Y2 = 0,\\n centroid_Z2 = 0,\\n centroid_x00,\\n centroid_y00,\\n path_centroid_x0,\\n path_centroid_y0;\\n\\nvar centroid_centroidStream = {\\n point: centroid_centroidPoint,\\n lineStart: centroid_centroidLineStart,\\n lineEnd: centroid_centroidLineEnd,\\n polygonStart: function() {\\n centroid_centroidStream.lineStart = centroid_centroidRingStart;\\n centroid_centroidStream.lineEnd = centroid_centroidRingEnd;\\n },\\n polygonEnd: function() {\\n centroid_centroidStream.point = centroid_centroidPoint;\\n centroid_centroidStream.lineStart = centroid_centroidLineStart;\\n centroid_centroidStream.lineEnd = centroid_centroidLineEnd;\\n },\\n result: function() {\\n var centroid = centroid_Z2 ? [centroid_X2 / centroid_Z2, centroid_Y2 / centroid_Z2]\\n : centroid_Z1 ? [path_centroid_X1 / centroid_Z1, path_centroid_Y1 / centroid_Z1]\\n : centroid_Z0 ? [path_centroid_X0 / centroid_Z0, path_centroid_Y0 / centroid_Z0]\\n : [NaN, NaN];\\n path_centroid_X0 = path_centroid_Y0 = centroid_Z0 =\\n path_centroid_X1 = path_centroid_Y1 = centroid_Z1 =\\n centroid_X2 = centroid_Y2 = centroid_Z2 = 0;\\n return centroid;\\n }\\n};\\n\\nfunction centroid_centroidPoint(x, y) {\\n path_centroid_X0 += x;\\n path_centroid_Y0 += y;\\n ++centroid_Z0;\\n}\\n\\nfunction centroid_centroidLineStart() {\\n centroid_centroidStream.point = centroidPointFirstLine;\\n}\\n\\nfunction centroidPointFirstLine(x, y) {\\n centroid_centroidStream.point = centroidPointLine;\\n centroid_centroidPoint(path_centroid_x0 = x, path_centroid_y0 = y);\\n}\\n\\nfunction centroidPointLine(x, y) {\\n var dx = x - path_centroid_x0, dy = y - path_centroid_y0, z = sqrt(dx * dx + dy * dy);\\n path_centroid_X1 += z * (path_centroid_x0 + x) / 2;\\n path_centroid_Y1 += z * (path_centroid_y0 + y) / 2;\\n centroid_Z1 += z;\\n centroid_centroidPoint(path_centroid_x0 = x, path_centroid_y0 = y);\\n}\\n\\nfunction centroid_centroidLineEnd() {\\n centroid_centroidStream.point = centroid_centroidPoint;\\n}\\n\\nfunction centroid_centroidRingStart() {\\n centroid_centroidStream.point = centroidPointFirstRing;\\n}\\n\\nfunction centroid_centroidRingEnd() {\\n centroidPointRing(centroid_x00, centroid_y00);\\n}\\n\\nfunction centroidPointFirstRing(x, y) {\\n centroid_centroidStream.point = centroidPointRing;\\n centroid_centroidPoint(centroid_x00 = path_centroid_x0 = x, centroid_y00 = path_centroid_y0 = y);\\n}\\n\\nfunction centroidPointRing(x, y) {\\n var dx = x - path_centroid_x0,\\n dy = y - path_centroid_y0,\\n z = sqrt(dx * dx + dy * dy);\\n\\n path_centroid_X1 += z * (path_centroid_x0 + x) / 2;\\n path_centroid_Y1 += z * (path_centroid_y0 + y) / 2;\\n centroid_Z1 += z;\\n\\n z = path_centroid_y0 * x - path_centroid_x0 * y;\\n centroid_X2 += z * (path_centroid_x0 + x);\\n centroid_Y2 += z * (path_centroid_y0 + y);\\n centroid_Z2 += z * 3;\\n centroid_centroidPoint(path_centroid_x0 = x, path_centroid_y0 = y);\\n}\\n\\n/* harmony default export */ var path_centroid = (centroid_centroidStream);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/path/context.js\\n\\n\\n\\nfunction PathContext(context) {\\n this._context = context;\\n}\\n\\nPathContext.prototype = {\\n _radius: 4.5,\\n pointRadius: function(_) {\\n return this._radius = _, this;\\n },\\n polygonStart: function() {\\n this._line = 0;\\n },\\n polygonEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._point = 0;\\n },\\n lineEnd: function() {\\n if (this._line === 0) this._context.closePath();\\n this._point = NaN;\\n },\\n point: function(x, y) {\\n switch (this._point) {\\n case 0: {\\n this._context.moveTo(x, y);\\n this._point = 1;\\n break;\\n }\\n case 1: {\\n this._context.lineTo(x, y);\\n break;\\n }\\n default: {\\n this._context.moveTo(x + this._radius, y);\\n this._context.arc(x, y, this._radius, 0, math_tau);\\n break;\\n }\\n }\\n },\\n result: noop_noop\\n};\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/path/measure.js\\n\\n\\n\\n\\nvar measure_lengthSum = adder(),\\n lengthRing,\\n measure_x00,\\n measure_y00,\\n measure_x0,\\n measure_y0;\\n\\nvar measure_lengthStream = {\\n point: noop_noop,\\n lineStart: function() {\\n measure_lengthStream.point = measure_lengthPointFirst;\\n },\\n lineEnd: function() {\\n if (lengthRing) measure_lengthPoint(measure_x00, measure_y00);\\n measure_lengthStream.point = noop_noop;\\n },\\n polygonStart: function() {\\n lengthRing = true;\\n },\\n polygonEnd: function() {\\n lengthRing = null;\\n },\\n result: function() {\\n var length = +measure_lengthSum;\\n measure_lengthSum.reset();\\n return length;\\n }\\n};\\n\\nfunction measure_lengthPointFirst(x, y) {\\n measure_lengthStream.point = measure_lengthPoint;\\n measure_x00 = measure_x0 = x, measure_y00 = measure_y0 = y;\\n}\\n\\nfunction measure_lengthPoint(x, y) {\\n measure_x0 -= x, measure_y0 -= y;\\n measure_lengthSum.add(sqrt(measure_x0 * measure_x0 + measure_y0 * measure_y0));\\n measure_x0 = x, measure_y0 = y;\\n}\\n\\n/* harmony default export */ var measure = (measure_lengthStream);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/path/string.js\\nfunction PathString() {\\n this._string = [];\\n}\\n\\nPathString.prototype = {\\n _radius: 4.5,\\n _circle: string_circle(4.5),\\n pointRadius: function(_) {\\n if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;\\n return this;\\n },\\n polygonStart: function() {\\n this._line = 0;\\n },\\n polygonEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._point = 0;\\n },\\n lineEnd: function() {\\n if (this._line === 0) this._string.push(\"Z\");\\n this._point = NaN;\\n },\\n point: function(x, y) {\\n switch (this._point) {\\n case 0: {\\n this._string.push(\"M\", x, \",\", y);\\n this._point = 1;\\n break;\\n }\\n case 1: {\\n this._string.push(\"L\", x, \",\", y);\\n break;\\n }\\n default: {\\n if (this._circle == null) this._circle = string_circle(this._radius);\\n this._string.push(\"M\", x, \",\", y, this._circle);\\n break;\\n }\\n }\\n },\\n result: function() {\\n if (this._string.length) {\\n var result = this._string.join(\"\");\\n this._string = [];\\n return result;\\n } else {\\n return null;\\n }\\n }\\n};\\n\\nfunction string_circle(radius) {\\n return \"m0,\" + radius\\n + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius\\n + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius\\n + \"z\";\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/path/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n/* harmony default export */ var d3_geo_src_path = (function(projection, context) {\\n var pointRadius = 4.5,\\n projectionStream,\\n contextStream;\\n\\n function path(object) {\\n if (object) {\\n if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\\n src_stream(object, projectionStream(contextStream));\\n }\\n return contextStream.result();\\n }\\n\\n path.area = function(object) {\\n src_stream(object, projectionStream(path_area));\\n return path_area.result();\\n };\\n\\n path.measure = function(object) {\\n src_stream(object, projectionStream(measure));\\n return measure.result();\\n };\\n\\n path.bounds = function(object) {\\n src_stream(object, projectionStream(path_bounds));\\n return path_bounds.result();\\n };\\n\\n path.centroid = function(object) {\\n src_stream(object, projectionStream(path_centroid));\\n return path_centroid.result();\\n };\\n\\n path.projection = function(_) {\\n return arguments.length ? (projectionStream = _ == null ? (projection = null, d3_geo_src_identity) : (projection = _).stream, path) : projection;\\n };\\n\\n path.context = function(_) {\\n if (!arguments.length) return context;\\n contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);\\n if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\\n return path;\\n };\\n\\n path.pointRadius = function(_) {\\n if (!arguments.length) return pointRadius;\\n pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\\n return path;\\n };\\n\\n return path.projection(projection).context(context);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/transform.js\\n/* harmony default export */ var src_transform = (function(methods) {\\n return {\\n stream: transformer(methods)\\n };\\n});\\n\\nfunction transformer(methods) {\\n return function(stream) {\\n var s = new TransformStream;\\n for (var key in methods) s[key] = methods[key];\\n s.stream = stream;\\n return s;\\n };\\n}\\n\\nfunction TransformStream() {}\\n\\nTransformStream.prototype = {\\n constructor: TransformStream,\\n point: function(x, y) { this.stream.point(x, y); },\\n sphere: function() { this.stream.sphere(); },\\n lineStart: function() { this.stream.lineStart(); },\\n lineEnd: function() { this.stream.lineEnd(); },\\n polygonStart: function() { this.stream.polygonStart(); },\\n polygonEnd: function() { this.stream.polygonEnd(); }\\n};\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/fit.js\\n\\n\\n\\nfunction fit(projection, fitBounds, object) {\\n var clip = projection.clipExtent && projection.clipExtent();\\n projection.scale(150).translate([0, 0]);\\n if (clip != null) projection.clipExtent(null);\\n src_stream(object, projection.stream(path_bounds));\\n fitBounds(path_bounds.result());\\n if (clip != null) projection.clipExtent(clip);\\n return projection;\\n}\\n\\nfunction fitExtent(projection, extent, object) {\\n return fit(projection, function(b) {\\n var w = extent[1][0] - extent[0][0],\\n h = extent[1][1] - extent[0][1],\\n k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),\\n x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,\\n y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;\\n projection.scale(150 * k).translate([x, y]);\\n }, object);\\n}\\n\\nfunction fitSize(projection, size, object) {\\n return fitExtent(projection, [[0, 0], size], object);\\n}\\n\\nfunction fitWidth(projection, width, object) {\\n return fit(projection, function(b) {\\n var w = +width,\\n k = w / (b[1][0] - b[0][0]),\\n x = (w - k * (b[1][0] + b[0][0])) / 2,\\n y = -k * b[0][1];\\n projection.scale(150 * k).translate([x, y]);\\n }, object);\\n}\\n\\nfunction fitHeight(projection, height, object) {\\n return fit(projection, function(b) {\\n var h = +height,\\n k = h / (b[1][1] - b[0][1]),\\n x = -k * b[0][0],\\n y = (h - k * (b[1][1] + b[0][1])) / 2;\\n projection.scale(150 * k).translate([x, y]);\\n }, object);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/resample.js\\n\\n\\n\\n\\nvar maxDepth = 16, // maximum depth of subdivision\\n cosMinDistance = math_cos(30 * radians); // cos(minimum angular distance)\\n\\n/* harmony default export */ var resample = (function(project, delta2) {\\n return +delta2 ? resample_resample(project, delta2) : resampleNone(project);\\n});\\n\\nfunction resampleNone(project) {\\n return transformer({\\n point: function(x, y) {\\n x = project(x, y);\\n this.stream.point(x[0], x[1]);\\n }\\n });\\n}\\n\\nfunction resample_resample(project, delta2) {\\n\\n function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\\n var dx = x1 - x0,\\n dy = y1 - y0,\\n d2 = dx * dx + dy * dy;\\n if (d2 > 4 * delta2 && depth--) {\\n var a = a0 + a1,\\n b = b0 + b1,\\n c = c0 + c1,\\n m = sqrt(a * a + b * b + c * c),\\n phi2 = asin(c /= m),\\n lambda2 = abs(abs(c) - 1) < math_epsilon || abs(lambda0 - lambda1) < math_epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a),\\n p = project(lambda2, phi2),\\n x2 = p[0],\\n y2 = p[1],\\n dx2 = x2 - x0,\\n dy2 = y2 - y0,\\n dz = dy * dx2 - dx * dy2;\\n if (dz * dz / d2 > delta2 // perpendicular projected distance\\n || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\\n || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance\\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\\n stream.point(x2, y2);\\n resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\\n }\\n }\\n }\\n return function(stream) {\\n var lambda00, x00, y00, a00, b00, c00, // first point\\n lambda0, x0, y0, a0, b0, c0; // previous point\\n\\n var resampleStream = {\\n point: point,\\n lineStart: lineStart,\\n lineEnd: lineEnd,\\n polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },\\n polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }\\n };\\n\\n function point(x, y) {\\n x = project(x, y);\\n stream.point(x[0], x[1]);\\n }\\n\\n function lineStart() {\\n x0 = NaN;\\n resampleStream.point = linePoint;\\n stream.lineStart();\\n }\\n\\n function linePoint(lambda, phi) {\\n var c = cartesian_cartesian([lambda, phi]), p = project(lambda, phi);\\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\\n stream.point(x0, y0);\\n }\\n\\n function lineEnd() {\\n resampleStream.point = point;\\n stream.lineEnd();\\n }\\n\\n function ringStart() {\\n lineStart();\\n resampleStream.point = ringPoint;\\n resampleStream.lineEnd = ringEnd;\\n }\\n\\n function ringPoint(lambda, phi) {\\n linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\\n resampleStream.point = linePoint;\\n }\\n\\n function ringEnd() {\\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\\n resampleStream.lineEnd = lineEnd;\\n lineEnd();\\n }\\n\\n return resampleStream;\\n };\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nvar transformRadians = transformer({\\n point: function(x, y) {\\n this.stream.point(x * radians, y * radians);\\n }\\n});\\n\\nfunction transformRotate(rotate) {\\n return transformer({\\n point: function(x, y) {\\n var r = rotate(x, y);\\n return this.stream.point(r[0], r[1]);\\n }\\n });\\n}\\n\\nfunction scaleTranslate(k, dx, dy, sx, sy) {\\n function transform(x, y) {\\n x *= sx; y *= sy;\\n return [dx + k * x, dy - k * y];\\n }\\n transform.invert = function(x, y) {\\n return [(x - dx) / k * sx, (dy - y) / k * sy];\\n };\\n return transform;\\n}\\n\\nfunction scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {\\n var cosAlpha = math_cos(alpha),\\n sinAlpha = math_sin(alpha),\\n a = cosAlpha * k,\\n b = sinAlpha * k,\\n ai = cosAlpha / k,\\n bi = sinAlpha / k,\\n ci = (sinAlpha * dy - cosAlpha * dx) / k,\\n fi = (sinAlpha * dx + cosAlpha * dy) / k;\\n function transform(x, y) {\\n x *= sx; y *= sy;\\n return [a * x - b * y + dx, dy - b * x - a * y];\\n }\\n transform.invert = function(x, y) {\\n return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)];\\n };\\n return transform;\\n}\\n\\nfunction projection_projection(project) {\\n return projectionMutator(function() { return project; })();\\n}\\n\\nfunction projectionMutator(projectAt) {\\n var project,\\n k = 150, // scale\\n x = 480, y = 250, // translate\\n lambda = 0, phi = 0, // center\\n deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate\\n alpha = 0, // post-rotate angle\\n sx = 1, // reflectX\\n sy = 1, // reflectX\\n theta = null, preclip = clip_antimeridian, // pre-clip angle\\n x0 = null, y0, x1, y1, postclip = d3_geo_src_identity, // post-clip extent\\n delta2 = 0.5, // precision\\n projectResample,\\n projectTransform,\\n projectRotateTransform,\\n cache,\\n cacheStream;\\n\\n function projection(point) {\\n return projectRotateTransform(point[0] * radians, point[1] * radians);\\n }\\n\\n function invert(point) {\\n point = projectRotateTransform.invert(point[0], point[1]);\\n return point && [point[0] * math_degrees, point[1] * math_degrees];\\n }\\n\\n projection.stream = function(stream) {\\n return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\\n };\\n\\n projection.preclip = function(_) {\\n return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\\n };\\n\\n projection.postclip = function(_) {\\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\\n };\\n\\n projection.clipAngle = function(_) {\\n return arguments.length ? (preclip = +_ ? clip_circle(theta = _ * radians) : (theta = null, clip_antimeridian), reset()) : theta * math_degrees;\\n };\\n\\n projection.clipExtent = function(_) {\\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, d3_geo_src_identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\\n };\\n\\n projection.scale = function(_) {\\n return arguments.length ? (k = +_, recenter()) : k;\\n };\\n\\n projection.translate = function(_) {\\n return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];\\n };\\n\\n projection.center = function(_) {\\n return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * math_degrees, phi * math_degrees];\\n };\\n\\n projection.rotate = function(_) {\\n return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * math_degrees, deltaPhi * math_degrees, deltaGamma * math_degrees];\\n };\\n\\n projection.angle = function(_) {\\n return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * math_degrees;\\n };\\n\\n projection.reflectX = function(_) {\\n return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;\\n };\\n\\n projection.reflectY = function(_) {\\n return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;\\n };\\n\\n projection.precision = function(_) {\\n return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);\\n };\\n\\n projection.fitExtent = function(extent, object) {\\n return fitExtent(projection, extent, object);\\n };\\n\\n projection.fitSize = function(size, object) {\\n return fitSize(projection, size, object);\\n };\\n\\n projection.fitWidth = function(width, object) {\\n return fitWidth(projection, width, object);\\n };\\n\\n projection.fitHeight = function(height, object) {\\n return fitHeight(projection, height, object);\\n };\\n\\n function recenter() {\\n var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)),\\n transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], sx, sy, alpha);\\n rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\\n projectTransform = compose(project, transform);\\n projectRotateTransform = compose(rotate, projectTransform);\\n projectResample = resample(projectTransform, delta2);\\n return reset();\\n }\\n\\n function reset() {\\n cache = cacheStream = null;\\n return projection;\\n }\\n\\n return function() {\\n project = projectAt.apply(this, arguments);\\n projection.invert = project.invert && invert;\\n return recenter();\\n };\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/conic.js\\n\\n\\n\\nfunction conicProjection(projectAt) {\\n var phi0 = 0,\\n phi1 = math_pi / 3,\\n m = projectionMutator(projectAt),\\n p = m(phi0, phi1);\\n\\n p.parallels = function(_) {\\n return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * math_degrees, phi1 * math_degrees];\\n };\\n\\n return p;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/cylindricalEqualArea.js\\n\\n\\nfunction cylindricalEqualAreaRaw(phi0) {\\n var cosPhi0 = math_cos(phi0);\\n\\n function forward(lambda, phi) {\\n return [lambda * cosPhi0, math_sin(phi) / cosPhi0];\\n }\\n\\n forward.invert = function(x, y) {\\n return [x / cosPhi0, asin(y * cosPhi0)];\\n };\\n\\n return forward;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/conicEqualArea.js\\n\\n\\n\\n\\nfunction conicEqualAreaRaw(y0, y1) {\\n var sy0 = math_sin(y0), n = (sy0 + math_sin(y1)) / 2;\\n\\n // Are the parallels symmetrical around the Equator?\\n if (abs(n) < math_epsilon) return cylindricalEqualAreaRaw(y0);\\n\\n var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;\\n\\n function project(x, y) {\\n var r = sqrt(c - 2 * n * math_sin(y)) / n;\\n return [r * math_sin(x *= n), r0 - r * math_cos(x)];\\n }\\n\\n project.invert = function(x, y) {\\n var r0y = r0 - y,\\n l = atan2(x, abs(r0y)) * math_sign(r0y);\\n if (r0y * n < 0)\\n l -= math_pi * math_sign(x) * math_sign(r0y);\\n return [l / n, asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];\\n };\\n\\n return project;\\n}\\n\\n/* harmony default export */ var conicEqualArea = (function() {\\n return conicProjection(conicEqualAreaRaw)\\n .scale(155.424)\\n .center([0, 33.6442]);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/albers.js\\n\\n\\n/* harmony default export */ var albers = (function() {\\n return conicEqualArea()\\n .parallels([29.5, 45.5])\\n .scale(1070)\\n .translate([480, 250])\\n .rotate([96, 0])\\n .center([-0.6, 38.7]);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/albersUsa.js\\n\\n\\n\\n\\n\\n// The projections must have mutually exclusive clip regions on the sphere,\\n// as this will avoid emitting interleaving lines and polygons.\\nfunction multiplex(streams) {\\n var n = streams.length;\\n return {\\n point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },\\n sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },\\n lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },\\n lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },\\n polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },\\n polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }\\n };\\n}\\n\\n// A composite projection for the United States, configured by default for\\n// 960×500. The projection also works quite well at 960×600 if you change the\\n// scale to 1285 and adjust the translate accordingly. The set of standard\\n// parallels for each region comes from USGS, which is published here:\\n// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers\\n/* harmony default export */ var projection_albersUsa = (function() {\\n var cache,\\n cacheStream,\\n lower48 = albers(), lower48Point,\\n alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338\\n hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007\\n point, pointStream = {point: function(x, y) { point = [x, y]; }};\\n\\n function albersUsa(coordinates) {\\n var x = coordinates[0], y = coordinates[1];\\n return point = null,\\n (lower48Point.point(x, y), point)\\n || (alaskaPoint.point(x, y), point)\\n || (hawaiiPoint.point(x, y), point);\\n }\\n\\n albersUsa.invert = function(coordinates) {\\n var k = lower48.scale(),\\n t = lower48.translate(),\\n x = (coordinates[0] - t[0]) / k,\\n y = (coordinates[1] - t[1]) / k;\\n return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska\\n : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii\\n : lower48).invert(coordinates);\\n };\\n\\n albersUsa.stream = function(stream) {\\n return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);\\n };\\n\\n albersUsa.precision = function(_) {\\n if (!arguments.length) return lower48.precision();\\n lower48.precision(_), alaska.precision(_), hawaii.precision(_);\\n return reset();\\n };\\n\\n albersUsa.scale = function(_) {\\n if (!arguments.length) return lower48.scale();\\n lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);\\n return albersUsa.translate(lower48.translate());\\n };\\n\\n albersUsa.translate = function(_) {\\n if (!arguments.length) return lower48.translate();\\n var k = lower48.scale(), x = +_[0], y = +_[1];\\n\\n lower48Point = lower48\\n .translate(_)\\n .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])\\n .stream(pointStream);\\n\\n alaskaPoint = alaska\\n .translate([x - 0.307 * k, y + 0.201 * k])\\n .clipExtent([[x - 0.425 * k + math_epsilon, y + 0.120 * k + math_epsilon], [x - 0.214 * k - math_epsilon, y + 0.234 * k - math_epsilon]])\\n .stream(pointStream);\\n\\n hawaiiPoint = hawaii\\n .translate([x - 0.205 * k, y + 0.212 * k])\\n .clipExtent([[x - 0.214 * k + math_epsilon, y + 0.166 * k + math_epsilon], [x - 0.115 * k - math_epsilon, y + 0.234 * k - math_epsilon]])\\n .stream(pointStream);\\n\\n return reset();\\n };\\n\\n albersUsa.fitExtent = function(extent, object) {\\n return fitExtent(albersUsa, extent, object);\\n };\\n\\n albersUsa.fitSize = function(size, object) {\\n return fitSize(albersUsa, size, object);\\n };\\n\\n albersUsa.fitWidth = function(width, object) {\\n return fitWidth(albersUsa, width, object);\\n };\\n\\n albersUsa.fitHeight = function(height, object) {\\n return fitHeight(albersUsa, height, object);\\n };\\n\\n function reset() {\\n cache = cacheStream = null;\\n return albersUsa;\\n }\\n\\n return albersUsa.scale(1070);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/azimuthal.js\\n\\n\\nfunction azimuthalRaw(scale) {\\n return function(x, y) {\\n var cx = math_cos(x),\\n cy = math_cos(y),\\n k = scale(cx * cy);\\n return [\\n k * cy * math_sin(x),\\n k * math_sin(y)\\n ];\\n }\\n}\\n\\nfunction azimuthalInvert(angle) {\\n return function(x, y) {\\n var z = sqrt(x * x + y * y),\\n c = angle(z),\\n sc = math_sin(c),\\n cc = math_cos(c);\\n return [\\n atan2(x * sc, z * cc),\\n asin(z && y * sc / z)\\n ];\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/azimuthalEqualArea.js\\n\\n\\n\\n\\nvar azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {\\n return sqrt(2 / (1 + cxcy));\\n});\\n\\nazimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {\\n return 2 * asin(z / 2);\\n});\\n\\n/* harmony default export */ var azimuthalEqualArea = (function() {\\n return projection_projection(azimuthalEqualAreaRaw)\\n .scale(124.75)\\n .clipAngle(180 - 1e-3);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/azimuthalEquidistant.js\\n\\n\\n\\n\\nvar azimuthalEquidistantRaw = azimuthalRaw(function(c) {\\n return (c = acos(c)) && c / math_sin(c);\\n});\\n\\nazimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {\\n return z;\\n});\\n\\n/* harmony default export */ var azimuthalEquidistant = (function() {\\n return projection_projection(azimuthalEquidistantRaw)\\n .scale(79.4188)\\n .clipAngle(180 - 1e-3);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/mercator.js\\n\\n\\n\\n\\nfunction mercatorRaw(lambda, phi) {\\n return [lambda, log(tan((math_halfPi + phi) / 2))];\\n}\\n\\nmercatorRaw.invert = function(x, y) {\\n return [x, 2 * atan(exp(y)) - math_halfPi];\\n};\\n\\n/* harmony default export */ var mercator = (function() {\\n return mercatorProjection(mercatorRaw)\\n .scale(961 / math_tau);\\n});\\n\\nfunction mercatorProjection(project) {\\n var m = projection_projection(project),\\n center = m.center,\\n scale = m.scale,\\n translate = m.translate,\\n clipExtent = m.clipExtent,\\n x0 = null, y0, x1, y1; // clip extent\\n\\n m.scale = function(_) {\\n return arguments.length ? (scale(_), reclip()) : scale();\\n };\\n\\n m.translate = function(_) {\\n return arguments.length ? (translate(_), reclip()) : translate();\\n };\\n\\n m.center = function(_) {\\n return arguments.length ? (center(_), reclip()) : center();\\n };\\n\\n m.clipExtent = function(_) {\\n return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];\\n };\\n\\n function reclip() {\\n var k = math_pi * scale(),\\n t = m(src_rotation(m.rotate()).invert([0, 0]));\\n return clipExtent(x0 == null\\n ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw\\n ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]\\n : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);\\n }\\n\\n return reclip();\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/conicConformal.js\\n\\n\\n\\n\\nfunction tany(y) {\\n return tan((math_halfPi + y) / 2);\\n}\\n\\nfunction conicConformalRaw(y0, y1) {\\n var cy0 = math_cos(y0),\\n n = y0 === y1 ? math_sin(y0) : log(cy0 / math_cos(y1)) / log(tany(y1) / tany(y0)),\\n f = cy0 * pow(tany(y0), n) / n;\\n\\n if (!n) return mercatorRaw;\\n\\n function project(x, y) {\\n if (f > 0) { if (y < -math_halfPi + math_epsilon) y = -math_halfPi + math_epsilon; }\\n else { if (y > math_halfPi - math_epsilon) y = math_halfPi - math_epsilon; }\\n var r = f / pow(tany(y), n);\\n return [r * math_sin(n * x), f - r * math_cos(n * x)];\\n }\\n\\n project.invert = function(x, y) {\\n var fy = f - y, r = math_sign(n) * sqrt(x * x + fy * fy),\\n l = atan2(x, abs(fy)) * math_sign(fy);\\n if (fy * n < 0)\\n l -= math_pi * math_sign(x) * math_sign(fy);\\n return [l / n, 2 * atan(pow(f / r, 1 / n)) - math_halfPi];\\n };\\n\\n return project;\\n}\\n\\n/* harmony default export */ var conicConformal = (function() {\\n return conicProjection(conicConformalRaw)\\n .scale(109.5)\\n .parallels([30, 30]);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/equirectangular.js\\n\\n\\nfunction equirectangularRaw(lambda, phi) {\\n return [lambda, phi];\\n}\\n\\nequirectangularRaw.invert = equirectangularRaw;\\n\\n/* harmony default export */ var equirectangular = (function() {\\n return projection_projection(equirectangularRaw)\\n .scale(152.63);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/conicEquidistant.js\\n\\n\\n\\n\\nfunction conicEquidistantRaw(y0, y1) {\\n var cy0 = math_cos(y0),\\n n = y0 === y1 ? math_sin(y0) : (cy0 - math_cos(y1)) / (y1 - y0),\\n g = cy0 / n + y0;\\n\\n if (abs(n) < math_epsilon) return equirectangularRaw;\\n\\n function project(x, y) {\\n var gy = g - y, nx = n * x;\\n return [gy * math_sin(nx), g - gy * math_cos(nx)];\\n }\\n\\n project.invert = function(x, y) {\\n var gy = g - y,\\n l = atan2(x, abs(gy)) * math_sign(gy);\\n if (gy * n < 0)\\n l -= math_pi * math_sign(x) * math_sign(gy);\\n return [l / n, g - math_sign(n) * sqrt(x * x + gy * gy)];\\n };\\n\\n return project;\\n}\\n\\n/* harmony default export */ var conicEquidistant = (function() {\\n return conicProjection(conicEquidistantRaw)\\n .scale(131.154)\\n .center([0, 13.9389]);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/equalEarth.js\\n\\n\\n\\nvar A1 = 1.340264,\\n A2 = -0.081106,\\n A3 = 0.000893,\\n A4 = 0.003796,\\n M = sqrt(3) / 2,\\n equalEarth_iterations = 12;\\n\\nfunction equalEarthRaw(lambda, phi) {\\n var l = asin(M * math_sin(phi)), l2 = l * l, l6 = l2 * l2 * l2;\\n return [\\n lambda * math_cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\\n l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\\n ];\\n}\\n\\nequalEarthRaw.invert = function(x, y) {\\n var l = y, l2 = l * l, l6 = l2 * l2 * l2;\\n for (var i = 0, delta, fy, fpy; i < equalEarth_iterations; ++i) {\\n fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;\\n fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\\n l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\\n if (abs(delta) < epsilon2) break;\\n }\\n return [\\n M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / math_cos(l),\\n asin(math_sin(l) / M)\\n ];\\n};\\n\\n/* harmony default export */ var equalEarth = (function() {\\n return projection_projection(equalEarthRaw)\\n .scale(177.158);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/gnomonic.js\\n\\n\\n\\n\\nfunction gnomonicRaw(x, y) {\\n var cy = math_cos(y), k = math_cos(x) * cy;\\n return [cy * math_sin(x) / k, math_sin(y) / k];\\n}\\n\\ngnomonicRaw.invert = azimuthalInvert(atan);\\n\\n/* harmony default export */ var gnomonic = (function() {\\n return projection_projection(gnomonicRaw)\\n .scale(144.049)\\n .clipAngle(60);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/identity.js\\n\\n\\n\\n\\n\\n\\n/* harmony default export */ var projection_identity = (function() {\\n var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect\\n alpha = 0, ca, sa, // angle\\n x0 = null, y0, x1, y1, // clip extent\\n kx = 1, ky = 1,\\n transform = transformer({\\n point: function(x, y) {\\n var p = projection([x, y])\\n this.stream.point(p[0], p[1]);\\n }\\n }),\\n postclip = d3_geo_src_identity,\\n cache,\\n cacheStream;\\n\\n function reset() {\\n kx = k * sx;\\n ky = k * sy;\\n cache = cacheStream = null;\\n return projection;\\n }\\n\\n function projection (p) {\\n var x = p[0] * kx, y = p[1] * ky;\\n if (alpha) {\\n var t = y * ca - x * sa;\\n x = x * ca + y * sa;\\n y = t;\\n } \\n return [x + tx, y + ty];\\n }\\n projection.invert = function(p) {\\n var x = p[0] - tx, y = p[1] - ty;\\n if (alpha) {\\n var t = y * ca + x * sa;\\n x = x * ca - y * sa;\\n y = t;\\n }\\n return [x / kx, y / ky];\\n };\\n projection.stream = function(stream) {\\n return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));\\n };\\n projection.postclip = function(_) {\\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\\n };\\n projection.clipExtent = function(_) {\\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, d3_geo_src_identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\\n };\\n projection.scale = function(_) {\\n return arguments.length ? (k = +_, reset()) : k;\\n };\\n projection.translate = function(_) {\\n return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty];\\n }\\n projection.angle = function(_) {\\n return arguments.length ? (alpha = _ % 360 * radians, sa = math_sin(alpha), ca = math_cos(alpha), reset()) : alpha * math_degrees;\\n };\\n projection.reflectX = function(_) {\\n return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0;\\n };\\n projection.reflectY = function(_) {\\n return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0;\\n };\\n projection.fitExtent = function(extent, object) {\\n return fitExtent(projection, extent, object);\\n };\\n projection.fitSize = function(size, object) {\\n return fitSize(projection, size, object);\\n };\\n projection.fitWidth = function(width, object) {\\n return fitWidth(projection, width, object);\\n };\\n projection.fitHeight = function(height, object) {\\n return fitHeight(projection, height, object);\\n };\\n\\n return projection;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/naturalEarth1.js\\n\\n\\n\\nfunction naturalEarth1Raw(lambda, phi) {\\n var phi2 = phi * phi, phi4 = phi2 * phi2;\\n return [\\n lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),\\n phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))\\n ];\\n}\\n\\nnaturalEarth1Raw.invert = function(x, y) {\\n var phi = y, i = 25, delta;\\n do {\\n var phi2 = phi * phi, phi4 = phi2 * phi2;\\n phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /\\n (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));\\n } while (abs(delta) > math_epsilon && --i > 0);\\n return [\\n x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),\\n phi\\n ];\\n};\\n\\n/* harmony default export */ var naturalEarth1 = (function() {\\n return projection_projection(naturalEarth1Raw)\\n .scale(175.295);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/orthographic.js\\n\\n\\n\\n\\nfunction orthographicRaw(x, y) {\\n return [math_cos(y) * math_sin(x), math_sin(y)];\\n}\\n\\northographicRaw.invert = azimuthalInvert(asin);\\n\\n/* harmony default export */ var orthographic = (function() {\\n return projection_projection(orthographicRaw)\\n .scale(249.5)\\n .clipAngle(90 + math_epsilon);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/stereographic.js\\n\\n\\n\\n\\nfunction stereographicRaw(x, y) {\\n var cy = math_cos(y), k = 1 + math_cos(x) * cy;\\n return [cy * math_sin(x) / k, math_sin(y) / k];\\n}\\n\\nstereographicRaw.invert = azimuthalInvert(function(z) {\\n return 2 * atan(z);\\n});\\n\\n/* harmony default export */ var stereographic = (function() {\\n return projection_projection(stereographicRaw)\\n .scale(250)\\n .clipAngle(142);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/projection/transverseMercator.js\\n\\n\\n\\nfunction transverseMercatorRaw(lambda, phi) {\\n return [log(tan((math_halfPi + phi) / 2)), -lambda];\\n}\\n\\ntransverseMercatorRaw.invert = function(x, y) {\\n return [-y, 2 * atan(exp(x)) - math_halfPi];\\n};\\n\\n/* harmony default export */ var transverseMercator = (function() {\\n var m = mercatorProjection(transverseMercatorRaw),\\n center = m.center,\\n rotate = m.rotate;\\n\\n m.center = function(_) {\\n return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);\\n };\\n\\n m.rotate = function(_) {\\n return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);\\n };\\n\\n return rotate([0, 0, 90])\\n .scale(159.155);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-geo/src/index.js\\n\\n\\n\\n\\n\\n\\n // DEPRECATED! Use d3.geoIdentity().clipExtent(…).\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/cluster.js\\nfunction defaultSeparation(a, b) {\\n return a.parent === b.parent ? 1 : 2;\\n}\\n\\nfunction meanX(children) {\\n return children.reduce(meanXReduce, 0) / children.length;\\n}\\n\\nfunction meanXReduce(x, c) {\\n return x + c.x;\\n}\\n\\nfunction maxY(children) {\\n return 1 + children.reduce(maxYReduce, 0);\\n}\\n\\nfunction maxYReduce(y, c) {\\n return Math.max(y, c.y);\\n}\\n\\nfunction leafLeft(node) {\\n var children;\\n while (children = node.children) node = children[0];\\n return node;\\n}\\n\\nfunction leafRight(node) {\\n var children;\\n while (children = node.children) node = children[children.length - 1];\\n return node;\\n}\\n\\n/* harmony default export */ var cluster = (function() {\\n var separation = defaultSeparation,\\n dx = 1,\\n dy = 1,\\n nodeSize = false;\\n\\n function cluster(root) {\\n var previousNode,\\n x = 0;\\n\\n // First walk, computing the initial x & y values.\\n root.eachAfter(function(node) {\\n var children = node.children;\\n if (children) {\\n node.x = meanX(children);\\n node.y = maxY(children);\\n } else {\\n node.x = previousNode ? x += separation(node, previousNode) : 0;\\n node.y = 0;\\n previousNode = node;\\n }\\n });\\n\\n var left = leafLeft(root),\\n right = leafRight(root),\\n x0 = left.x - separation(left, right) / 2,\\n x1 = right.x + separation(right, left) / 2;\\n\\n // Second walk, normalizing x & y to the desired size.\\n return root.eachAfter(nodeSize ? function(node) {\\n node.x = (node.x - root.x) * dx;\\n node.y = (root.y - node.y) * dy;\\n } : function(node) {\\n node.x = (node.x - x0) / (x1 - x0) * dx;\\n node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\\n });\\n }\\n\\n cluster.separation = function(x) {\\n return arguments.length ? (separation = x, cluster) : separation;\\n };\\n\\n cluster.size = function(x) {\\n return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);\\n };\\n\\n cluster.nodeSize = function(x) {\\n return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);\\n };\\n\\n return cluster;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/count.js\\nfunction count_count(node) {\\n var sum = 0,\\n children = node.children,\\n i = children && children.length;\\n if (!i) sum = 1;\\n else while (--i >= 0) sum += children[i].value;\\n node.value = sum;\\n}\\n\\n/* harmony default export */ var hierarchy_count = (function() {\\n return this.eachAfter(count_count);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/each.js\\n/* harmony default export */ var hierarchy_each = (function(callback) {\\n var node = this, current, next = [node], children, i, n;\\n do {\\n current = next.reverse(), next = [];\\n while (node = current.pop()) {\\n callback(node), children = node.children;\\n if (children) for (i = 0, n = children.length; i < n; ++i) {\\n next.push(children[i]);\\n }\\n }\\n } while (next.length);\\n return this;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/eachBefore.js\\n/* harmony default export */ var eachBefore = (function(callback) {\\n var node = this, nodes = [node], children, i;\\n while (node = nodes.pop()) {\\n callback(node), children = node.children;\\n if (children) for (i = children.length - 1; i >= 0; --i) {\\n nodes.push(children[i]);\\n }\\n }\\n return this;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/eachAfter.js\\n/* harmony default export */ var eachAfter = (function(callback) {\\n var node = this, nodes = [node], next = [], children, i, n;\\n while (node = nodes.pop()) {\\n next.push(node), children = node.children;\\n if (children) for (i = 0, n = children.length; i < n; ++i) {\\n nodes.push(children[i]);\\n }\\n }\\n while (node = next.pop()) {\\n callback(node);\\n }\\n return this;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/sum.js\\n/* harmony default export */ var hierarchy_sum = (function(value) {\\n return this.eachAfter(function(node) {\\n var sum = +value(node.data) || 0,\\n children = node.children,\\n i = children && children.length;\\n while (--i >= 0) sum += children[i].value;\\n node.value = sum;\\n });\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/sort.js\\n/* harmony default export */ var hierarchy_sort = (function(compare) {\\n return this.eachBefore(function(node) {\\n if (node.children) {\\n node.children.sort(compare);\\n }\\n });\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/path.js\\n/* harmony default export */ var hierarchy_path = (function(end) {\\n var start = this,\\n ancestor = leastCommonAncestor(start, end),\\n nodes = [start];\\n while (start !== ancestor) {\\n start = start.parent;\\n nodes.push(start);\\n }\\n var k = nodes.length;\\n while (end !== ancestor) {\\n nodes.splice(k, 0, end);\\n end = end.parent;\\n }\\n return nodes;\\n});\\n\\nfunction leastCommonAncestor(a, b) {\\n if (a === b) return a;\\n var aNodes = a.ancestors(),\\n bNodes = b.ancestors(),\\n c = null;\\n a = aNodes.pop();\\n b = bNodes.pop();\\n while (a === b) {\\n c = a;\\n a = aNodes.pop();\\n b = bNodes.pop();\\n }\\n return c;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/ancestors.js\\n/* harmony default export */ var ancestors = (function() {\\n var node = this, nodes = [node];\\n while (node = node.parent) {\\n nodes.push(node);\\n }\\n return nodes;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/descendants.js\\n/* harmony default export */ var descendants = (function() {\\n var nodes = [];\\n this.each(function(node) {\\n nodes.push(node);\\n });\\n return nodes;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/leaves.js\\n/* harmony default export */ var leaves = (function() {\\n var leaves = [];\\n this.eachBefore(function(node) {\\n if (!node.children) {\\n leaves.push(node);\\n }\\n });\\n return leaves;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/links.js\\n/* harmony default export */ var hierarchy_links = (function() {\\n var root = this, links = [];\\n root.each(function(node) {\\n if (node !== root) { // Dont include the roots parent, if any.\\n links.push({source: node.parent, target: node});\\n }\\n });\\n return links;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/hierarchy/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nfunction hierarchy(data, children) {\\n var root = new Node(data),\\n valued = +data.value && (root.value = data.value),\\n node,\\n nodes = [root],\\n child,\\n childs,\\n i,\\n n;\\n\\n if (children == null) children = defaultChildren;\\n\\n while (node = nodes.pop()) {\\n if (valued) node.value = +node.data.value;\\n if ((childs = children(node.data)) && (n = childs.length)) {\\n node.children = new Array(n);\\n for (i = n - 1; i >= 0; --i) {\\n nodes.push(child = node.children[i] = new Node(childs[i]));\\n child.parent = node;\\n child.depth = node.depth + 1;\\n }\\n }\\n }\\n\\n return root.eachBefore(computeHeight);\\n}\\n\\nfunction node_copy() {\\n return hierarchy(this).eachBefore(copyData);\\n}\\n\\nfunction defaultChildren(d) {\\n return d.children;\\n}\\n\\nfunction copyData(node) {\\n node.data = node.data.data;\\n}\\n\\nfunction computeHeight(node) {\\n var height = 0;\\n do node.height = height;\\n while ((node = node.parent) && (node.height < ++height));\\n}\\n\\nfunction Node(data) {\\n this.data = data;\\n this.depth =\\n this.height = 0;\\n this.parent = null;\\n}\\n\\nNode.prototype = hierarchy.prototype = {\\n constructor: Node,\\n count: hierarchy_count,\\n each: hierarchy_each,\\n eachAfter: eachAfter,\\n eachBefore: eachBefore,\\n sum: hierarchy_sum,\\n sort: hierarchy_sort,\\n path: hierarchy_path,\\n ancestors: ancestors,\\n descendants: descendants,\\n leaves: leaves,\\n links: hierarchy_links,\\n copy: node_copy\\n};\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/array.js\\nvar d3_hierarchy_src_array_slice = Array.prototype.slice;\\n\\nfunction array_shuffle(array) {\\n var m = array.length,\\n t,\\n i;\\n\\n while (m) {\\n i = Math.random() * m-- | 0;\\n t = array[m];\\n array[m] = array[i];\\n array[i] = t;\\n }\\n\\n return array;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/pack/enclose.js\\n\\n\\n/* harmony default export */ var enclose = (function(circles) {\\n var i = 0, n = (circles = array_shuffle(d3_hierarchy_src_array_slice.call(circles))).length, B = [], p, e;\\n\\n while (i < n) {\\n p = circles[i];\\n if (e && enclosesWeak(e, p)) ++i;\\n else e = encloseBasis(B = extendBasis(B, p)), i = 0;\\n }\\n\\n return e;\\n});\\n\\nfunction extendBasis(B, p) {\\n var i, j;\\n\\n if (enclosesWeakAll(p, B)) return [p];\\n\\n // If we get here then B must have at least one element.\\n for (i = 0; i < B.length; ++i) {\\n if (enclosesNot(p, B[i])\\n && enclosesWeakAll(encloseBasis2(B[i], p), B)) {\\n return [B[i], p];\\n }\\n }\\n\\n // If we get here then B must have at least two elements.\\n for (i = 0; i < B.length - 1; ++i) {\\n for (j = i + 1; j < B.length; ++j) {\\n if (enclosesNot(encloseBasis2(B[i], B[j]), p)\\n && enclosesNot(encloseBasis2(B[i], p), B[j])\\n && enclosesNot(encloseBasis2(B[j], p), B[i])\\n && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {\\n return [B[i], B[j], p];\\n }\\n }\\n }\\n\\n // If we get here then something is very wrong.\\n throw new Error;\\n}\\n\\nfunction enclosesNot(a, b) {\\n var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;\\n return dr < 0 || dr * dr < dx * dx + dy * dy;\\n}\\n\\nfunction enclosesWeak(a, b) {\\n var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;\\n return dr > 0 && dr * dr > dx * dx + dy * dy;\\n}\\n\\nfunction enclosesWeakAll(a, B) {\\n for (var i = 0; i < B.length; ++i) {\\n if (!enclosesWeak(a, B[i])) {\\n return false;\\n }\\n }\\n return true;\\n}\\n\\nfunction encloseBasis(B) {\\n switch (B.length) {\\n case 1: return encloseBasis1(B[0]);\\n case 2: return encloseBasis2(B[0], B[1]);\\n case 3: return encloseBasis3(B[0], B[1], B[2]);\\n }\\n}\\n\\nfunction encloseBasis1(a) {\\n return {\\n x: a.x,\\n y: a.y,\\n r: a.r\\n };\\n}\\n\\nfunction encloseBasis2(a, b) {\\n var x1 = a.x, y1 = a.y, r1 = a.r,\\n x2 = b.x, y2 = b.y, r2 = b.r,\\n x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,\\n l = Math.sqrt(x21 * x21 + y21 * y21);\\n return {\\n x: (x1 + x2 + x21 / l * r21) / 2,\\n y: (y1 + y2 + y21 / l * r21) / 2,\\n r: (l + r1 + r2) / 2\\n };\\n}\\n\\nfunction encloseBasis3(a, b, c) {\\n var x1 = a.x, y1 = a.y, r1 = a.r,\\n x2 = b.x, y2 = b.y, r2 = b.r,\\n x3 = c.x, y3 = c.y, r3 = c.r,\\n a2 = x1 - x2,\\n a3 = x1 - x3,\\n b2 = y1 - y2,\\n b3 = y1 - y3,\\n c2 = r2 - r1,\\n c3 = r3 - r1,\\n d1 = x1 * x1 + y1 * y1 - r1 * r1,\\n d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,\\n d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,\\n ab = a3 * b2 - a2 * b3,\\n xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,\\n xb = (b3 * c2 - b2 * c3) / ab,\\n ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,\\n yb = (a2 * c3 - a3 * c2) / ab,\\n A = xb * xb + yb * yb - 1,\\n B = 2 * (r1 + xa * xb + ya * yb),\\n C = xa * xa + ya * ya - r1 * r1,\\n r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);\\n return {\\n x: x1 + xa + xb * r,\\n y: y1 + ya + yb * r,\\n r: r\\n };\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/pack/siblings.js\\n\\n\\nfunction place(b, a, c) {\\n var dx = b.x - a.x, x, a2,\\n dy = b.y - a.y, y, b2,\\n d2 = dx * dx + dy * dy;\\n if (d2) {\\n a2 = a.r + c.r, a2 *= a2;\\n b2 = b.r + c.r, b2 *= b2;\\n if (a2 > b2) {\\n x = (d2 + b2 - a2) / (2 * d2);\\n y = Math.sqrt(Math.max(0, b2 / d2 - x * x));\\n c.x = b.x - x * dx - y * dy;\\n c.y = b.y - x * dy + y * dx;\\n } else {\\n x = (d2 + a2 - b2) / (2 * d2);\\n y = Math.sqrt(Math.max(0, a2 / d2 - x * x));\\n c.x = a.x + x * dx - y * dy;\\n c.y = a.y + x * dy + y * dx;\\n }\\n } else {\\n c.x = a.x + c.r;\\n c.y = a.y;\\n }\\n}\\n\\nfunction intersects(a, b) {\\n var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;\\n return dr > 0 && dr * dr > dx * dx + dy * dy;\\n}\\n\\nfunction score(node) {\\n var a = node._,\\n b = node.next._,\\n ab = a.r + b.r,\\n dx = (a.x * b.r + b.x * a.r) / ab,\\n dy = (a.y * b.r + b.y * a.r) / ab;\\n return dx * dx + dy * dy;\\n}\\n\\nfunction siblings_Node(circle) {\\n this._ = circle;\\n this.next = null;\\n this.previous = null;\\n}\\n\\nfunction packEnclose(circles) {\\n if (!(n = circles.length)) return 0;\\n\\n var a, b, c, n, aa, ca, i, j, k, sj, sk;\\n\\n // Place the first circle.\\n a = circles[0], a.x = 0, a.y = 0;\\n if (!(n > 1)) return a.r;\\n\\n // Place the second circle.\\n b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;\\n if (!(n > 2)) return a.r + b.r;\\n\\n // Place the third circle.\\n place(b, a, c = circles[2]);\\n\\n // Initialize the front-chain using the first three circles a, b and c.\\n a = new siblings_Node(a), b = new siblings_Node(b), c = new siblings_Node(c);\\n a.next = c.previous = b;\\n b.next = a.previous = c;\\n c.next = b.previous = a;\\n\\n // Attempt to place each remaining circle…\\n pack: for (i = 3; i < n; ++i) {\\n place(a._, b._, c = circles[i]), c = new siblings_Node(c);\\n\\n // Find the closest intersecting circle on the front-chain, if any.\\n // “Closeness” is determined by linear distance along the front-chain.\\n // “Ahead” or “behind” is likewise determined by linear distance.\\n j = b.next, k = a.previous, sj = b._.r, sk = a._.r;\\n do {\\n if (sj <= sk) {\\n if (intersects(j._, c._)) {\\n b = j, a.next = b, b.previous = a, --i;\\n continue pack;\\n }\\n sj += j._.r, j = j.next;\\n } else {\\n if (intersects(k._, c._)) {\\n a = k, a.next = b, b.previous = a, --i;\\n continue pack;\\n }\\n sk += k._.r, k = k.previous;\\n }\\n } while (j !== k.next);\\n\\n // Success! Insert the new circle c between a and b.\\n c.previous = a, c.next = b, a.next = b.previous = b = c;\\n\\n // Compute the new closest circle pair to the centroid.\\n aa = score(a);\\n while ((c = c.next) !== b) {\\n if ((ca = score(c)) < aa) {\\n a = c, aa = ca;\\n }\\n }\\n b = a.next;\\n }\\n\\n // Compute the enclosing circle of the front chain.\\n a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);\\n\\n // Translate the circles to put the enclosing circle around the origin.\\n for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;\\n\\n return c.r;\\n}\\n\\n/* harmony default export */ var siblings = (function(circles) {\\n packEnclose(circles);\\n return circles;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/accessors.js\\nfunction optional(f) {\\n return f == null ? null : required(f);\\n}\\n\\nfunction required(f) {\\n if (typeof f !== \"function\") throw new Error;\\n return f;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/constant.js\\nfunction constantZero() {\\n return 0;\\n}\\n\\n/* harmony default export */ var d3_hierarchy_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/pack/index.js\\n\\n\\n\\n\\nfunction pack_defaultRadius(d) {\\n return Math.sqrt(d.value);\\n}\\n\\n/* harmony default export */ var src_pack = (function() {\\n var radius = null,\\n dx = 1,\\n dy = 1,\\n padding = constantZero;\\n\\n function pack(root) {\\n root.x = dx / 2, root.y = dy / 2;\\n if (radius) {\\n root.eachBefore(radiusLeaf(radius))\\n .eachAfter(packChildren(padding, 0.5))\\n .eachBefore(translateChild(1));\\n } else {\\n root.eachBefore(radiusLeaf(pack_defaultRadius))\\n .eachAfter(packChildren(constantZero, 1))\\n .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))\\n .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));\\n }\\n return root;\\n }\\n\\n pack.radius = function(x) {\\n return arguments.length ? (radius = optional(x), pack) : radius;\\n };\\n\\n pack.size = function(x) {\\n return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];\\n };\\n\\n pack.padding = function(x) {\\n return arguments.length ? (padding = typeof x === \"function\" ? x : d3_hierarchy_src_constant(+x), pack) : padding;\\n };\\n\\n return pack;\\n});\\n\\nfunction radiusLeaf(radius) {\\n return function(node) {\\n if (!node.children) {\\n node.r = Math.max(0, +radius(node) || 0);\\n }\\n };\\n}\\n\\nfunction packChildren(padding, k) {\\n return function(node) {\\n if (children = node.children) {\\n var children,\\n i,\\n n = children.length,\\n r = padding(node) * k || 0,\\n e;\\n\\n if (r) for (i = 0; i < n; ++i) children[i].r += r;\\n e = packEnclose(children);\\n if (r) for (i = 0; i < n; ++i) children[i].r -= r;\\n node.r = e + r;\\n }\\n };\\n}\\n\\nfunction translateChild(k) {\\n return function(node) {\\n var parent = node.parent;\\n node.r *= k;\\n if (parent) {\\n node.x = parent.x + k * node.x;\\n node.y = parent.y + k * node.y;\\n }\\n };\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/treemap/round.js\\n/* harmony default export */ var treemap_round = (function(node) {\\n node.x0 = Math.round(node.x0);\\n node.y0 = Math.round(node.y0);\\n node.x1 = Math.round(node.x1);\\n node.y1 = Math.round(node.y1);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/treemap/dice.js\\n/* harmony default export */ var dice = (function(parent, x0, y0, x1, y1) {\\n var nodes = parent.children,\\n node,\\n i = -1,\\n n = nodes.length,\\n k = parent.value && (x1 - x0) / parent.value;\\n\\n while (++i < n) {\\n node = nodes[i], node.y0 = y0, node.y1 = y1;\\n node.x0 = x0, node.x1 = x0 += node.value * k;\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/partition.js\\n\\n\\n\\n/* harmony default export */ var src_partition = (function() {\\n var dx = 1,\\n dy = 1,\\n padding = 0,\\n round = false;\\n\\n function partition(root) {\\n var n = root.height + 1;\\n root.x0 =\\n root.y0 = padding;\\n root.x1 = dx;\\n root.y1 = dy / n;\\n root.eachBefore(positionNode(dy, n));\\n if (round) root.eachBefore(treemap_round);\\n return root;\\n }\\n\\n function positionNode(dy, n) {\\n return function(node) {\\n if (node.children) {\\n dice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);\\n }\\n var x0 = node.x0,\\n y0 = node.y0,\\n x1 = node.x1 - padding,\\n y1 = node.y1 - padding;\\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\\n node.x0 = x0;\\n node.y0 = y0;\\n node.x1 = x1;\\n node.y1 = y1;\\n };\\n }\\n\\n partition.round = function(x) {\\n return arguments.length ? (round = !!x, partition) : round;\\n };\\n\\n partition.size = function(x) {\\n return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];\\n };\\n\\n partition.padding = function(x) {\\n return arguments.length ? (padding = +x, partition) : padding;\\n };\\n\\n return partition;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/stratify.js\\n\\n\\n\\nvar stratify_keyPrefix = \"$\", // Protect against keys like “__proto__”.\\n preroot = {depth: -1},\\n ambiguous = {};\\n\\nfunction defaultId(d) {\\n return d.id;\\n}\\n\\nfunction defaultParentId(d) {\\n return d.parentId;\\n}\\n\\n/* harmony default export */ var src_stratify = (function() {\\n var id = defaultId,\\n parentId = defaultParentId;\\n\\n function stratify(data) {\\n var d,\\n i,\\n n = data.length,\\n root,\\n parent,\\n node,\\n nodes = new Array(n),\\n nodeId,\\n nodeKey,\\n nodeByKey = {};\\n\\n for (i = 0; i < n; ++i) {\\n d = data[i], node = nodes[i] = new Node(d);\\n if ((nodeId = id(d, i, data)) != null && (nodeId += \"\")) {\\n nodeKey = stratify_keyPrefix + (node.id = nodeId);\\n nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;\\n }\\n }\\n\\n for (i = 0; i < n; ++i) {\\n node = nodes[i], nodeId = parentId(data[i], i, data);\\n if (nodeId == null || !(nodeId += \"\")) {\\n if (root) throw new Error(\"multiple roots\");\\n root = node;\\n } else {\\n parent = nodeByKey[stratify_keyPrefix + nodeId];\\n if (!parent) throw new Error(\"missing: \" + nodeId);\\n if (parent === ambiguous) throw new Error(\"ambiguous: \" + nodeId);\\n if (parent.children) parent.children.push(node);\\n else parent.children = [node];\\n node.parent = parent;\\n }\\n }\\n\\n if (!root) throw new Error(\"no root\");\\n root.parent = preroot;\\n root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);\\n root.parent = null;\\n if (n > 0) throw new Error(\"cycle\");\\n\\n return root;\\n }\\n\\n stratify.id = function(x) {\\n return arguments.length ? (id = required(x), stratify) : id;\\n };\\n\\n stratify.parentId = function(x) {\\n return arguments.length ? (parentId = required(x), stratify) : parentId;\\n };\\n\\n return stratify;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/tree.js\\n\\n\\nfunction tree_defaultSeparation(a, b) {\\n return a.parent === b.parent ? 1 : 2;\\n}\\n\\n// function radialSeparation(a, b) {\\n// return (a.parent === b.parent ? 1 : 2) / a.depth;\\n// }\\n\\n// This function is used to traverse the left contour of a subtree (or\\n// subforest). It returns the successor of v on this contour. This successor is\\n// either given by the leftmost child of v or by the thread of v. The function\\n// returns null if and only if v is on the highest level of its subtree.\\nfunction nextLeft(v) {\\n var children = v.children;\\n return children ? children[0] : v.t;\\n}\\n\\n// This function works analogously to nextLeft.\\nfunction nextRight(v) {\\n var children = v.children;\\n return children ? children[children.length - 1] : v.t;\\n}\\n\\n// Shifts the current subtree rooted at w+. This is done by increasing\\n// prelim(w+) and mod(w+) by shift.\\nfunction moveSubtree(wm, wp, shift) {\\n var change = shift / (wp.i - wm.i);\\n wp.c -= change;\\n wp.s += shift;\\n wm.c += change;\\n wp.z += shift;\\n wp.m += shift;\\n}\\n\\n// All other shifts, applied to the smaller subtrees between w- and w+, are\\n// performed by this function. To prepare the shifts, we have to adjust\\n// change(w+), shift(w+), and change(w-).\\nfunction executeShifts(v) {\\n var shift = 0,\\n change = 0,\\n children = v.children,\\n i = children.length,\\n w;\\n while (--i >= 0) {\\n w = children[i];\\n w.z += shift;\\n w.m += shift;\\n shift += w.s + (change += w.c);\\n }\\n}\\n\\n// If vi-s ancestor is a sibling of v, returns vi-s ancestor. Otherwise,\\n// returns the specified (default) ancestor.\\nfunction nextAncestor(vim, v, ancestor) {\\n return vim.a.parent === v.parent ? vim.a : ancestor;\\n}\\n\\nfunction TreeNode(node, i) {\\n this._ = node;\\n this.parent = null;\\n this.children = null;\\n this.A = null; // default ancestor\\n this.a = this; // ancestor\\n this.z = 0; // prelim\\n this.m = 0; // mod\\n this.c = 0; // change\\n this.s = 0; // shift\\n this.t = null; // thread\\n this.i = i; // number\\n}\\n\\nTreeNode.prototype = Object.create(Node.prototype);\\n\\nfunction treeRoot(root) {\\n var tree = new TreeNode(root, 0),\\n node,\\n nodes = [tree],\\n child,\\n children,\\n i,\\n n;\\n\\n while (node = nodes.pop()) {\\n if (children = node._.children) {\\n node.children = new Array(n = children.length);\\n for (i = n - 1; i >= 0; --i) {\\n nodes.push(child = node.children[i] = new TreeNode(children[i], i));\\n child.parent = node;\\n }\\n }\\n }\\n\\n (tree.parent = new TreeNode(null, 0)).children = [tree];\\n return tree;\\n}\\n\\n// Node-link tree diagram using the Reingold-Tilford \"tidy\" algorithm\\n/* harmony default export */ var src_tree = (function() {\\n var separation = tree_defaultSeparation,\\n dx = 1,\\n dy = 1,\\n nodeSize = null;\\n\\n function tree(root) {\\n var t = treeRoot(root);\\n\\n // Compute the layout using Buchheim et al.s algorithm.\\n t.eachAfter(firstWalk), t.parent.m = -t.z;\\n t.eachBefore(secondWalk);\\n\\n // If a fixed node size is specified, scale x and y.\\n if (nodeSize) root.eachBefore(sizeNode);\\n\\n // If a fixed tree size is specified, scale x and y based on the extent.\\n // Compute the left-most, right-most, and depth-most nodes for extents.\\n else {\\n var left = root,\\n right = root,\\n bottom = root;\\n root.eachBefore(function(node) {\\n if (node.x < left.x) left = node;\\n if (node.x > right.x) right = node;\\n if (node.depth > bottom.depth) bottom = node;\\n });\\n var s = left === right ? 1 : separation(left, right) / 2,\\n tx = s - left.x,\\n kx = dx / (right.x + s + tx),\\n ky = dy / (bottom.depth || 1);\\n root.eachBefore(function(node) {\\n node.x = (node.x + tx) * kx;\\n node.y = node.depth * ky;\\n });\\n }\\n\\n return root;\\n }\\n\\n // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is\\n // applied recursively to the children of v, as well as the function\\n // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the\\n // node v is placed to the midpoint of its outermost children.\\n function firstWalk(v) {\\n var children = v.children,\\n siblings = v.parent.children,\\n w = v.i ? siblings[v.i - 1] : null;\\n if (children) {\\n executeShifts(v);\\n var midpoint = (children[0].z + children[children.length - 1].z) / 2;\\n if (w) {\\n v.z = w.z + separation(v._, w._);\\n v.m = v.z - midpoint;\\n } else {\\n v.z = midpoint;\\n }\\n } else if (w) {\\n v.z = w.z + separation(v._, w._);\\n }\\n v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\\n }\\n\\n // Computes all real x-coordinates by summing up the modifiers recursively.\\n function secondWalk(v) {\\n v._.x = v.z + v.parent.m;\\n v.m += v.parent.m;\\n }\\n\\n // The core of the algorithm. Here, a new subtree is combined with the\\n // previous subtrees. Threads are used to traverse the inside and outside\\n // contours of the left and right subtree up to the highest common level. The\\n // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the\\n // superscript o means outside and i means inside, the subscript - means left\\n // subtree and + means right subtree. For summing up the modifiers along the\\n // contour, we use respective variables si+, si-, so-, and so+. Whenever two\\n // nodes of the inside contours conflict, we compute the left one of the\\n // greatest uncommon ancestors using the function ANCESTOR and call MOVE\\n // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.\\n // Finally, we add a new thread (if necessary).\\n function apportion(v, w, ancestor) {\\n if (w) {\\n var vip = v,\\n vop = v,\\n vim = w,\\n vom = vip.parent.children[0],\\n sip = vip.m,\\n sop = vop.m,\\n sim = vim.m,\\n som = vom.m,\\n shift;\\n while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {\\n vom = nextLeft(vom);\\n vop = nextRight(vop);\\n vop.a = v;\\n shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\\n if (shift > 0) {\\n moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\\n sip += shift;\\n sop += shift;\\n }\\n sim += vim.m;\\n sip += vip.m;\\n som += vom.m;\\n sop += vop.m;\\n }\\n if (vim && !nextRight(vop)) {\\n vop.t = vim;\\n vop.m += sim - sop;\\n }\\n if (vip && !nextLeft(vom)) {\\n vom.t = vip;\\n vom.m += sip - som;\\n ancestor = v;\\n }\\n }\\n return ancestor;\\n }\\n\\n function sizeNode(node) {\\n node.x *= dx;\\n node.y = node.depth * dy;\\n }\\n\\n tree.separation = function(x) {\\n return arguments.length ? (separation = x, tree) : separation;\\n };\\n\\n tree.size = function(x) {\\n return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);\\n };\\n\\n tree.nodeSize = function(x) {\\n return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);\\n };\\n\\n return tree;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/treemap/slice.js\\n/* harmony default export */ var treemap_slice = (function(parent, x0, y0, x1, y1) {\\n var nodes = parent.children,\\n node,\\n i = -1,\\n n = nodes.length,\\n k = parent.value && (y1 - y0) / parent.value;\\n\\n while (++i < n) {\\n node = nodes[i], node.x0 = x0, node.x1 = x1;\\n node.y0 = y0, node.y1 = y0 += node.value * k;\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/treemap/squarify.js\\n\\n\\n\\nvar squarify_phi = (1 + Math.sqrt(5)) / 2;\\n\\nfunction squarifyRatio(ratio, parent, x0, y0, x1, y1) {\\n var rows = [],\\n nodes = parent.children,\\n row,\\n nodeValue,\\n i0 = 0,\\n i1 = 0,\\n n = nodes.length,\\n dx, dy,\\n value = parent.value,\\n sumValue,\\n minValue,\\n maxValue,\\n newRatio,\\n minRatio,\\n alpha,\\n beta;\\n\\n while (i0 < n) {\\n dx = x1 - x0, dy = y1 - y0;\\n\\n // Find the next non-empty node.\\n do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);\\n minValue = maxValue = sumValue;\\n alpha = Math.max(dy / dx, dx / dy) / (value * ratio);\\n beta = sumValue * sumValue * alpha;\\n minRatio = Math.max(maxValue / beta, beta / minValue);\\n\\n // Keep adding nodes while the aspect ratio maintains or improves.\\n for (; i1 < n; ++i1) {\\n sumValue += nodeValue = nodes[i1].value;\\n if (nodeValue < minValue) minValue = nodeValue;\\n if (nodeValue > maxValue) maxValue = nodeValue;\\n beta = sumValue * sumValue * alpha;\\n newRatio = Math.max(maxValue / beta, beta / minValue);\\n if (newRatio > minRatio) { sumValue -= nodeValue; break; }\\n minRatio = newRatio;\\n }\\n\\n // Position and record the row orientation.\\n rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});\\n if (row.dice) dice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);\\n else treemap_slice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);\\n value -= sumValue, i0 = i1;\\n }\\n\\n return rows;\\n}\\n\\n/* harmony default export */ var squarify = ((function custom(ratio) {\\n\\n function squarify(parent, x0, y0, x1, y1) {\\n squarifyRatio(ratio, parent, x0, y0, x1, y1);\\n }\\n\\n squarify.ratio = function(x) {\\n return custom((x = +x) > 1 ? x : 1);\\n };\\n\\n return squarify;\\n})(squarify_phi));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/treemap/index.js\\n\\n\\n\\n\\n\\n/* harmony default export */ var src_treemap = (function() {\\n var tile = squarify,\\n round = false,\\n dx = 1,\\n dy = 1,\\n paddingStack = [0],\\n paddingInner = constantZero,\\n paddingTop = constantZero,\\n paddingRight = constantZero,\\n paddingBottom = constantZero,\\n paddingLeft = constantZero;\\n\\n function treemap(root) {\\n root.x0 =\\n root.y0 = 0;\\n root.x1 = dx;\\n root.y1 = dy;\\n root.eachBefore(positionNode);\\n paddingStack = [0];\\n if (round) root.eachBefore(treemap_round);\\n return root;\\n }\\n\\n function positionNode(node) {\\n var p = paddingStack[node.depth],\\n x0 = node.x0 + p,\\n y0 = node.y0 + p,\\n x1 = node.x1 - p,\\n y1 = node.y1 - p;\\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\\n node.x0 = x0;\\n node.y0 = y0;\\n node.x1 = x1;\\n node.y1 = y1;\\n if (node.children) {\\n p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\\n x0 += paddingLeft(node) - p;\\n y0 += paddingTop(node) - p;\\n x1 -= paddingRight(node) - p;\\n y1 -= paddingBottom(node) - p;\\n if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\\n if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\\n tile(node, x0, y0, x1, y1);\\n }\\n }\\n\\n treemap.round = function(x) {\\n return arguments.length ? (round = !!x, treemap) : round;\\n };\\n\\n treemap.size = function(x) {\\n return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];\\n };\\n\\n treemap.tile = function(x) {\\n return arguments.length ? (tile = required(x), treemap) : tile;\\n };\\n\\n treemap.padding = function(x) {\\n return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();\\n };\\n\\n treemap.paddingInner = function(x) {\\n return arguments.length ? (paddingInner = typeof x === \"function\" ? x : d3_hierarchy_src_constant(+x), treemap) : paddingInner;\\n };\\n\\n treemap.paddingOuter = function(x) {\\n return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();\\n };\\n\\n treemap.paddingTop = function(x) {\\n return arguments.length ? (paddingTop = typeof x === \"function\" ? x : d3_hierarchy_src_constant(+x), treemap) : paddingTop;\\n };\\n\\n treemap.paddingRight = function(x) {\\n return arguments.length ? (paddingRight = typeof x === \"function\" ? x : d3_hierarchy_src_constant(+x), treemap) : paddingRight;\\n };\\n\\n treemap.paddingBottom = function(x) {\\n return arguments.length ? (paddingBottom = typeof x === \"function\" ? x : d3_hierarchy_src_constant(+x), treemap) : paddingBottom;\\n };\\n\\n treemap.paddingLeft = function(x) {\\n return arguments.length ? (paddingLeft = typeof x === \"function\" ? x : d3_hierarchy_src_constant(+x), treemap) : paddingLeft;\\n };\\n\\n return treemap;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/treemap/binary.js\\n/* harmony default export */ var binary = (function(parent, x0, y0, x1, y1) {\\n var nodes = parent.children,\\n i, n = nodes.length,\\n sum, sums = new Array(n + 1);\\n\\n for (sums[0] = sum = i = 0; i < n; ++i) {\\n sums[i + 1] = sum += nodes[i].value;\\n }\\n\\n partition(0, n, parent.value, x0, y0, x1, y1);\\n\\n function partition(i, j, value, x0, y0, x1, y1) {\\n if (i >= j - 1) {\\n var node = nodes[i];\\n node.x0 = x0, node.y0 = y0;\\n node.x1 = x1, node.y1 = y1;\\n return;\\n }\\n\\n var valueOffset = sums[i],\\n valueTarget = (value / 2) + valueOffset,\\n k = i + 1,\\n hi = j - 1;\\n\\n while (k < hi) {\\n var mid = k + hi >>> 1;\\n if (sums[mid] < valueTarget) k = mid + 1;\\n else hi = mid;\\n }\\n\\n if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;\\n\\n var valueLeft = sums[k] - valueOffset,\\n valueRight = value - valueLeft;\\n\\n if ((x1 - x0) > (y1 - y0)) {\\n var xk = (x0 * valueRight + x1 * valueLeft) / value;\\n partition(i, k, valueLeft, x0, y0, xk, y1);\\n partition(k, j, valueRight, xk, y0, x1, y1);\\n } else {\\n var yk = (y0 * valueRight + y1 * valueLeft) / value;\\n partition(i, k, valueLeft, x0, y0, x1, yk);\\n partition(k, j, valueRight, x0, yk, x1, y1);\\n }\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/treemap/sliceDice.js\\n\\n\\n\\n/* harmony default export */ var sliceDice = (function(parent, x0, y0, x1, y1) {\\n (parent.depth & 1 ? treemap_slice : dice)(parent, x0, y0, x1, y1);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/treemap/resquarify.js\\n\\n\\n\\n\\n/* harmony default export */ var treemap_resquarify = ((function custom(ratio) {\\n\\n function resquarify(parent, x0, y0, x1, y1) {\\n if ((rows = parent._squarify) && (rows.ratio === ratio)) {\\n var rows,\\n row,\\n nodes,\\n i,\\n j = -1,\\n n,\\n m = rows.length,\\n value = parent.value;\\n\\n while (++j < m) {\\n row = rows[j], nodes = row.children;\\n for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;\\n if (row.dice) dice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);\\n else treemap_slice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);\\n value -= row.value;\\n }\\n } else {\\n parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);\\n rows.ratio = ratio;\\n }\\n }\\n\\n resquarify.ratio = function(x) {\\n return custom((x = +x) > 1 ? x : 1);\\n };\\n\\n return resquarify;\\n})(squarify_phi));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-hierarchy/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/discrete.js\\n/* harmony default export */ var discrete = (function(range) {\\n var n = range.length;\\n return function(t) {\\n return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/hue.js\\n\\n\\n/* harmony default export */ var src_hue = (function(a, b) {\\n var i = color_hue(+a, +b);\\n return function(t) {\\n var x = i(t);\\n return x - 360 * Math.floor(x / 360);\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/round.js\\n/* harmony default export */ var src_round = (function(a, b) {\\n return a = +a, b = +b, function(t) {\\n return Math.round(a * (1 - t) + b * t);\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/zoom.js\\nvar rho = Math.SQRT2,\\n rho2 = 2,\\n rho4 = 4,\\n zoom_epsilon2 = 1e-12;\\n\\nfunction zoom_cosh(x) {\\n return ((x = Math.exp(x)) + 1 / x) / 2;\\n}\\n\\nfunction zoom_sinh(x) {\\n return ((x = Math.exp(x)) - 1 / x) / 2;\\n}\\n\\nfunction tanh(x) {\\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\\n}\\n\\n// p0 = [ux0, uy0, w0]\\n// p1 = [ux1, uy1, w1]\\n/* harmony default export */ var src_zoom = (function(p0, p1) {\\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\\n dx = ux1 - ux0,\\n dy = uy1 - uy0,\\n d2 = dx * dx + dy * dy,\\n i,\\n S;\\n\\n // Special case for u0 ≅ u1.\\n if (d2 < zoom_epsilon2) {\\n S = Math.log(w1 / w0) / rho;\\n i = function(t) {\\n return [\\n ux0 + t * dx,\\n uy0 + t * dy,\\n w0 * Math.exp(rho * t * S)\\n ];\\n }\\n }\\n\\n // General case.\\n else {\\n var d1 = Math.sqrt(d2),\\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\\n S = (r1 - r0) / rho;\\n i = function(t) {\\n var s = t * S,\\n coshr0 = zoom_cosh(r0),\\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - zoom_sinh(r0));\\n return [\\n ux0 + u * dx,\\n uy0 + u * dy,\\n w0 * coshr0 / zoom_cosh(rho * s + r0)\\n ];\\n }\\n }\\n\\n i.duration = S * 1000;\\n\\n return i;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/hsl.js\\n\\n\\n\\nfunction hsl_hsl(hue) {\\n return function(start, end) {\\n var h = hue((start = hsl(start)).h, (end = hsl(end)).h),\\n s = nogamma(start.s, end.s),\\n l = nogamma(start.l, end.l),\\n opacity = nogamma(start.opacity, end.opacity);\\n return function(t) {\\n start.h = h(t);\\n start.s = s(t);\\n start.l = l(t);\\n start.opacity = opacity(t);\\n return start + \"\";\\n };\\n }\\n}\\n\\n/* harmony default export */ var src_hsl = (hsl_hsl(color_hue));\\nvar hslLong = hsl_hsl(nogamma);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/lab.js\\n\\n\\n\\nfunction lab_lab(start, end) {\\n var l = nogamma((start = lab(start)).l, (end = lab(end)).l),\\n a = nogamma(start.a, end.a),\\n b = nogamma(start.b, end.b),\\n opacity = nogamma(start.opacity, end.opacity);\\n return function(t) {\\n start.l = l(t);\\n start.a = a(t);\\n start.b = b(t);\\n start.opacity = opacity(t);\\n return start + \"\";\\n };\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/hcl.js\\n\\n\\n\\nfunction hcl_hcl(hue) {\\n return function(start, end) {\\n var h = hue((start = hcl(start)).h, (end = hcl(end)).h),\\n c = nogamma(start.c, end.c),\\n l = nogamma(start.l, end.l),\\n opacity = nogamma(start.opacity, end.opacity);\\n return function(t) {\\n start.h = h(t);\\n start.c = c(t);\\n start.l = l(t);\\n start.opacity = opacity(t);\\n return start + \"\";\\n };\\n }\\n}\\n\\n/* harmony default export */ var src_hcl = (hcl_hcl(color_hue));\\nvar hclLong = hcl_hcl(nogamma);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/cubehelix.js\\n\\n\\n\\nfunction src_cubehelix_cubehelix(hue) {\\n return (function cubehelixGamma(y) {\\n y = +y;\\n\\n function cubehelix(start, end) {\\n var h = hue((start = cubehelix_cubehelix(start)).h, (end = cubehelix_cubehelix(end)).h),\\n s = nogamma(start.s, end.s),\\n l = nogamma(start.l, end.l),\\n opacity = nogamma(start.opacity, end.opacity);\\n return function(t) {\\n start.h = h(t);\\n start.s = s(t);\\n start.l = l(Math.pow(t, y));\\n start.opacity = opacity(t);\\n return start + \"\";\\n };\\n }\\n\\n cubehelix.gamma = cubehelixGamma;\\n\\n return cubehelix;\\n })(1);\\n}\\n\\n/* harmony default export */ var src_cubehelix = (src_cubehelix_cubehelix(color_hue));\\nvar cubehelixLong = src_cubehelix_cubehelix(nogamma);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/piecewise.js\\nfunction piecewise_piecewise(interpolate, values) {\\n var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);\\n while (i < n) I[i] = interpolate(v, v = values[++i]);\\n return function(t) {\\n var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\\n return I[i](t - i);\\n };\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/quantize.js\\n/* harmony default export */ var quantize = (function(interpolator, n) {\\n var samples = new Array(n);\\n for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\\n return samples;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-path/src/index.js\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-polygon/src/area.js\\n/* harmony default export */ var d3_polygon_src_area = (function(polygon) {\\n var i = -1,\\n n = polygon.length,\\n a,\\n b = polygon[n - 1],\\n area = 0;\\n\\n while (++i < n) {\\n a = b;\\n b = polygon[i];\\n area += a[1] * b[0] - a[0] * b[1];\\n }\\n\\n return area / 2;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-polygon/src/centroid.js\\n/* harmony default export */ var d3_polygon_src_centroid = (function(polygon) {\\n var i = -1,\\n n = polygon.length,\\n x = 0,\\n y = 0,\\n a,\\n b = polygon[n - 1],\\n c,\\n k = 0;\\n\\n while (++i < n) {\\n a = b;\\n b = polygon[i];\\n k += c = a[0] * b[1] - b[0] * a[1];\\n x += (a[0] + b[0]) * c;\\n y += (a[1] + b[1]) * c;\\n }\\n\\n return k *= 3, [x / k, y / k];\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-polygon/src/cross.js\\n// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of\\n// the 3D cross product in a quadrant I Cartesian coordinate system (+x is\\n// right, +y is up). Returns a positive value if ABC is counter-clockwise,\\n// negative if clockwise, and zero if the points are collinear.\\n/* harmony default export */ var src_cross = (function(a, b, c) {\\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-polygon/src/hull.js\\n\\n\\nfunction lexicographicOrder(a, b) {\\n return a[0] - b[0] || a[1] - b[1];\\n}\\n\\n// Computes the upper convex hull per the monotone chain algorithm.\\n// Assumes points.length >= 3, is sorted by x, unique in y.\\n// Returns an array of indices into points in left-to-right order.\\nfunction computeUpperHullIndexes(points) {\\n var n = points.length,\\n indexes = [0, 1],\\n size = 2;\\n\\n for (var i = 2; i < n; ++i) {\\n while (size > 1 && src_cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;\\n indexes[size++] = i;\\n }\\n\\n return indexes.slice(0, size); // remove popped points\\n}\\n\\n/* harmony default export */ var hull = (function(points) {\\n if ((n = points.length) < 3) return null;\\n\\n var i,\\n n,\\n sortedPoints = new Array(n),\\n flippedPoints = new Array(n);\\n\\n for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];\\n sortedPoints.sort(lexicographicOrder);\\n for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];\\n\\n var upperIndexes = computeUpperHullIndexes(sortedPoints),\\n lowerIndexes = computeUpperHullIndexes(flippedPoints);\\n\\n // Construct the hull polygon, removing possible duplicate endpoints.\\n var skipLeft = lowerIndexes[0] === upperIndexes[0],\\n skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],\\n hull = [];\\n\\n // Add upper hull in right-to-l order.\\n // Then add lower hull in left-to-right order.\\n for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);\\n for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);\\n\\n return hull;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-polygon/src/contains.js\\n/* harmony default export */ var d3_polygon_src_contains = (function(polygon, point) {\\n var n = polygon.length,\\n p = polygon[n - 1],\\n x = point[0], y = point[1],\\n x0 = p[0], y0 = p[1],\\n x1, y1,\\n inside = false;\\n\\n for (var i = 0; i < n; ++i) {\\n p = polygon[i], x1 = p[0], y1 = p[1];\\n if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;\\n x0 = x1, y0 = y1;\\n }\\n\\n return inside;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-polygon/src/length.js\\n/* harmony default export */ var d3_polygon_src_length = (function(polygon) {\\n var i = -1,\\n n = polygon.length,\\n b = polygon[n - 1],\\n xa,\\n ya,\\n xb = b[0],\\n yb = b[1],\\n perimeter = 0;\\n\\n while (++i < n) {\\n xa = xb;\\n ya = yb;\\n b = polygon[i];\\n xb = b[0];\\n yb = b[1];\\n xa -= xb;\\n ya -= yb;\\n perimeter += Math.sqrt(xa * xa + ya * ya);\\n }\\n\\n return perimeter;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-polygon/src/index.js\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/index.js\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-random/src/defaultSource.js\\n/* harmony default export */ var src_defaultSource = (function() {\\n return Math.random();\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-random/src/uniform.js\\n\\n\\n/* harmony default export */ var uniform = ((function sourceRandomUniform(source) {\\n function randomUniform(min, max) {\\n min = min == null ? 0 : +min;\\n max = max == null ? 1 : +max;\\n if (arguments.length === 1) max = min, min = 0;\\n else max -= min;\\n return function() {\\n return source() * max + min;\\n };\\n }\\n\\n randomUniform.source = sourceRandomUniform;\\n\\n return randomUniform;\\n})(src_defaultSource));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-random/src/normal.js\\n\\n\\n/* harmony default export */ var src_normal = ((function sourceRandomNormal(source) {\\n function randomNormal(mu, sigma) {\\n var x, r;\\n mu = mu == null ? 0 : +mu;\\n sigma = sigma == null ? 1 : +sigma;\\n return function() {\\n var y;\\n\\n // If available, use the second previously-generated uniform random.\\n if (x != null) y = x, x = null;\\n\\n // Otherwise, generate a new x and y.\\n else do {\\n x = source() * 2 - 1;\\n y = source() * 2 - 1;\\n r = x * x + y * y;\\n } while (!r || r > 1);\\n\\n return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);\\n };\\n }\\n\\n randomNormal.source = sourceRandomNormal;\\n\\n return randomNormal;\\n})(src_defaultSource));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-random/src/logNormal.js\\n\\n\\n\\n/* harmony default export */ var logNormal = ((function sourceRandomLogNormal(source) {\\n function randomLogNormal() {\\n var randomNormal = src_normal.source(source).apply(this, arguments);\\n return function() {\\n return Math.exp(randomNormal());\\n };\\n }\\n\\n randomLogNormal.source = sourceRandomLogNormal;\\n\\n return randomLogNormal;\\n})(src_defaultSource));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-random/src/irwinHall.js\\n\\n\\n/* harmony default export */ var irwinHall = ((function sourceRandomIrwinHall(source) {\\n function randomIrwinHall(n) {\\n return function() {\\n for (var sum = 0, i = 0; i < n; ++i) sum += source();\\n return sum;\\n };\\n }\\n\\n randomIrwinHall.source = sourceRandomIrwinHall;\\n\\n return randomIrwinHall;\\n})(src_defaultSource));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-random/src/bates.js\\n\\n\\n\\n/* harmony default export */ var bates = ((function sourceRandomBates(source) {\\n function randomBates(n) {\\n var randomIrwinHall = irwinHall.source(source)(n);\\n return function() {\\n return randomIrwinHall() / n;\\n };\\n }\\n\\n randomBates.source = sourceRandomBates;\\n\\n return randomBates;\\n})(src_defaultSource));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-random/src/exponential.js\\n\\n\\n/* harmony default export */ var src_exponential = ((function sourceRandomExponential(source) {\\n function randomExponential(lambda) {\\n return function() {\\n return -Math.log(1 - source()) / lambda;\\n };\\n }\\n\\n randomExponential.source = sourceRandomExponential;\\n\\n return randomExponential;\\n})(src_defaultSource));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-random/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/init.js\\nfunction initRange(domain, range) {\\n switch (arguments.length) {\\n case 0: break;\\n case 1: this.range(domain); break;\\n default: this.range(range).domain(domain); break;\\n }\\n return this;\\n}\\n\\nfunction initInterpolator(domain, interpolator) {\\n switch (arguments.length) {\\n case 0: break;\\n case 1: this.interpolator(domain); break;\\n default: this.interpolator(interpolator).domain(domain); break;\\n }\\n return this;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/array.js\\nvar d3_scale_src_array_array = Array.prototype;\\n\\nvar array_map = d3_scale_src_array_array.map;\\nvar d3_scale_src_array_slice = d3_scale_src_array_array.slice;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/ordinal.js\\n\\n\\n\\n\\nvar implicit = {name: \"implicit\"};\\n\\nfunction ordinal() {\\n var index = src_map(),\\n domain = [],\\n range = [],\\n unknown = implicit;\\n\\n function scale(d) {\\n var key = d + \"\", i = index.get(key);\\n if (!i) {\\n if (unknown !== implicit) return unknown;\\n index.set(key, i = domain.push(d));\\n }\\n return range[(i - 1) % range.length];\\n }\\n\\n scale.domain = function(_) {\\n if (!arguments.length) return domain.slice();\\n domain = [], index = src_map();\\n var i = -1, n = _.length, d, key;\\n while (++i < n) if (!index.has(key = (d = _[i]) + \"\")) index.set(key, domain.push(d));\\n return scale;\\n };\\n\\n scale.range = function(_) {\\n return arguments.length ? (range = d3_scale_src_array_slice.call(_), scale) : range.slice();\\n };\\n\\n scale.unknown = function(_) {\\n return arguments.length ? (unknown = _, scale) : unknown;\\n };\\n\\n scale.copy = function() {\\n return ordinal(domain, range).unknown(unknown);\\n };\\n\\n initRange.apply(scale, arguments);\\n\\n return scale;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/band.js\\n\\n\\n\\n\\nfunction band() {\\n var scale = ordinal().unknown(undefined),\\n domain = scale.domain,\\n ordinalRange = scale.range,\\n range = [0, 1],\\n step,\\n bandwidth,\\n round = false,\\n paddingInner = 0,\\n paddingOuter = 0,\\n align = 0.5;\\n\\n delete scale.unknown;\\n\\n function rescale() {\\n var n = domain().length,\\n reverse = range[1] < range[0],\\n start = range[reverse - 0],\\n stop = range[1 - reverse];\\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\\n if (round) step = Math.floor(step);\\n start += (stop - start - step * (n - paddingInner)) * align;\\n bandwidth = step * (1 - paddingInner);\\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\\n var values = src_range(n).map(function(i) { return start + step * i; });\\n return ordinalRange(reverse ? values.reverse() : values);\\n }\\n\\n scale.domain = function(_) {\\n return arguments.length ? (domain(_), rescale()) : domain();\\n };\\n\\n scale.range = function(_) {\\n return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();\\n };\\n\\n scale.rangeRound = function(_) {\\n return range = [+_[0], +_[1]], round = true, rescale();\\n };\\n\\n scale.bandwidth = function() {\\n return bandwidth;\\n };\\n\\n scale.step = function() {\\n return step;\\n };\\n\\n scale.round = function(_) {\\n return arguments.length ? (round = !!_, rescale()) : round;\\n };\\n\\n scale.padding = function(_) {\\n return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\\n };\\n\\n scale.paddingInner = function(_) {\\n return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\\n };\\n\\n scale.paddingOuter = function(_) {\\n return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\\n };\\n\\n scale.align = function(_) {\\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\\n };\\n\\n scale.copy = function() {\\n return band(domain(), range)\\n .round(round)\\n .paddingInner(paddingInner)\\n .paddingOuter(paddingOuter)\\n .align(align);\\n };\\n\\n return initRange.apply(rescale(), arguments);\\n}\\n\\nfunction pointish(scale) {\\n var copy = scale.copy;\\n\\n scale.padding = scale.paddingOuter;\\n delete scale.paddingInner;\\n delete scale.paddingOuter;\\n\\n scale.copy = function() {\\n return pointish(copy());\\n };\\n\\n return scale;\\n}\\n\\nfunction band_point() {\\n return pointish(band.apply(null, arguments).paddingInner(1));\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/constant.js\\n/* harmony default export */ var d3_scale_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/number.js\\n/* harmony default export */ var d3_scale_src_number = (function(x) {\\n return +x;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/continuous.js\\n\\n\\n\\n\\n\\n\\nvar unit = [0, 1];\\n\\nfunction continuous_identity(x) {\\n return x;\\n}\\n\\nfunction normalize(a, b) {\\n return (b -= (a = +a))\\n ? function(x) { return (x - a) / b; }\\n : d3_scale_src_constant(isNaN(b) ? NaN : 0.5);\\n}\\n\\nfunction clamper(domain) {\\n var a = domain[0], b = domain[domain.length - 1], t;\\n if (a > b) t = a, a = b, b = t;\\n return function(x) { return Math.max(a, Math.min(b, x)); };\\n}\\n\\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\\nfunction bimap(domain, range, interpolate) {\\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\\n return function(x) { return r0(d0(x)); };\\n}\\n\\nfunction polymap(domain, range, interpolate) {\\n var j = Math.min(domain.length, range.length) - 1,\\n d = new Array(j),\\n r = new Array(j),\\n i = -1;\\n\\n // Reverse descending domains.\\n if (domain[j] < domain[0]) {\\n domain = domain.slice().reverse();\\n range = range.slice().reverse();\\n }\\n\\n while (++i < j) {\\n d[i] = normalize(domain[i], domain[i + 1]);\\n r[i] = interpolate(range[i], range[i + 1]);\\n }\\n\\n return function(x) {\\n var i = bisect(domain, x, 1, j) - 1;\\n return r[i](d[i](x));\\n };\\n}\\n\\nfunction copy(source, target) {\\n return target\\n .domain(source.domain())\\n .range(source.range())\\n .interpolate(source.interpolate())\\n .clamp(source.clamp())\\n .unknown(source.unknown());\\n}\\n\\nfunction continuous_transformer() {\\n var domain = unit,\\n range = unit,\\n interpolate = src_value,\\n transform,\\n untransform,\\n unknown,\\n clamp = continuous_identity,\\n piecewise,\\n output,\\n input;\\n\\n function rescale() {\\n piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\\n output = input = null;\\n return scale;\\n }\\n\\n function scale(x) {\\n return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\\n }\\n\\n scale.invert = function(y) {\\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), src_number)))(y)));\\n };\\n\\n scale.domain = function(_) {\\n return arguments.length ? (domain = array_map.call(_, d3_scale_src_number), clamp === continuous_identity || (clamp = clamper(domain)), rescale()) : domain.slice();\\n };\\n\\n scale.range = function(_) {\\n return arguments.length ? (range = d3_scale_src_array_slice.call(_), rescale()) : range.slice();\\n };\\n\\n scale.rangeRound = function(_) {\\n return range = d3_scale_src_array_slice.call(_), interpolate = src_round, rescale();\\n };\\n\\n scale.clamp = function(_) {\\n return arguments.length ? (clamp = _ ? clamper(domain) : continuous_identity, scale) : clamp !== continuous_identity;\\n };\\n\\n scale.interpolate = function(_) {\\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\\n };\\n\\n scale.unknown = function(_) {\\n return arguments.length ? (unknown = _, scale) : unknown;\\n };\\n\\n return function(t, u) {\\n transform = t, untransform = u;\\n return rescale();\\n };\\n}\\n\\nfunction continuous(transform, untransform) {\\n return continuous_transformer()(transform, untransform);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/tickFormat.js\\n\\n\\n\\n/* harmony default export */ var src_tickFormat = (function(start, stop, count, specifier) {\\n var step = tickStep(start, stop, count),\\n precision;\\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\\n switch (specifier.type) {\\n case \"s\": {\\n var value = Math.max(Math.abs(start), Math.abs(stop));\\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\\n return defaultLocale_formatPrefix(specifier, value);\\n }\\n case \"\":\\n case \"e\":\\n case \"g\":\\n case \"p\":\\n case \"r\": {\\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\\n break;\\n }\\n case \"f\":\\n case \"%\": {\\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\\n break;\\n }\\n }\\n return defaultLocale_format(specifier);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/linear.js\\n\\n\\n\\n\\n\\nfunction linearish(scale) {\\n var domain = scale.domain;\\n\\n scale.ticks = function(count) {\\n var d = domain();\\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\\n };\\n\\n scale.tickFormat = function(count, specifier) {\\n var d = domain();\\n return src_tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\\n };\\n\\n scale.nice = function(count) {\\n if (count == null) count = 10;\\n\\n var d = domain(),\\n i0 = 0,\\n i1 = d.length - 1,\\n start = d[i0],\\n stop = d[i1],\\n step;\\n\\n if (stop < start) {\\n step = start, start = stop, stop = step;\\n step = i0, i0 = i1, i1 = step;\\n }\\n\\n step = tickIncrement(start, stop, count);\\n\\n if (step > 0) {\\n start = Math.floor(start / step) * step;\\n stop = Math.ceil(stop / step) * step;\\n step = tickIncrement(start, stop, count);\\n } else if (step < 0) {\\n start = Math.ceil(start * step) / step;\\n stop = Math.floor(stop * step) / step;\\n step = tickIncrement(start, stop, count);\\n }\\n\\n if (step > 0) {\\n d[i0] = Math.floor(start / step) * step;\\n d[i1] = Math.ceil(stop / step) * step;\\n domain(d);\\n } else if (step < 0) {\\n d[i0] = Math.ceil(start * step) / step;\\n d[i1] = Math.floor(stop * step) / step;\\n domain(d);\\n }\\n\\n return scale;\\n };\\n\\n return scale;\\n}\\n\\nfunction src_linear_linear() {\\n var scale = continuous(continuous_identity, continuous_identity);\\n\\n scale.copy = function() {\\n return copy(scale, src_linear_linear());\\n };\\n\\n initRange.apply(scale, arguments);\\n\\n return linearish(scale);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/identity.js\\n\\n\\n\\n\\nfunction identity_identity(domain) {\\n var unknown;\\n\\n function scale(x) {\\n return isNaN(x = +x) ? unknown : x;\\n }\\n\\n scale.invert = scale;\\n\\n scale.domain = scale.range = function(_) {\\n return arguments.length ? (domain = array_map.call(_, d3_scale_src_number), scale) : domain.slice();\\n };\\n\\n scale.unknown = function(_) {\\n return arguments.length ? (unknown = _, scale) : unknown;\\n };\\n\\n scale.copy = function() {\\n return identity_identity(domain).unknown(unknown);\\n };\\n\\n domain = arguments.length ? array_map.call(domain, d3_scale_src_number) : [0, 1];\\n\\n return linearish(scale);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/nice.js\\n/* harmony default export */ var nice = (function(domain, interval) {\\n domain = domain.slice();\\n\\n var i0 = 0,\\n i1 = domain.length - 1,\\n x0 = domain[i0],\\n x1 = domain[i1],\\n t;\\n\\n if (x1 < x0) {\\n t = i0, i0 = i1, i1 = t;\\n t = x0, x0 = x1, x1 = t;\\n }\\n\\n domain[i0] = interval.floor(x0);\\n domain[i1] = interval.ceil(x1);\\n return domain;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/log.js\\n\\n\\n\\n\\n\\n\\nfunction transformLog(x) {\\n return Math.log(x);\\n}\\n\\nfunction transformExp(x) {\\n return Math.exp(x);\\n}\\n\\nfunction transformLogn(x) {\\n return -Math.log(-x);\\n}\\n\\nfunction transformExpn(x) {\\n return -Math.exp(-x);\\n}\\n\\nfunction pow10(x) {\\n return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\\n}\\n\\nfunction powp(base) {\\n return base === 10 ? pow10\\n : base === Math.E ? Math.exp\\n : function(x) { return Math.pow(base, x); };\\n}\\n\\nfunction logp(base) {\\n return base === Math.E ? Math.log\\n : base === 10 && Math.log10\\n || base === 2 && Math.log2\\n || (base = Math.log(base), function(x) { return Math.log(x) / base; });\\n}\\n\\nfunction reflect(f) {\\n return function(x) {\\n return -f(-x);\\n };\\n}\\n\\nfunction loggish(transform) {\\n var scale = transform(transformLog, transformExp),\\n domain = scale.domain,\\n base = 10,\\n logs,\\n pows;\\n\\n function rescale() {\\n logs = logp(base), pows = powp(base);\\n if (domain()[0] < 0) {\\n logs = reflect(logs), pows = reflect(pows);\\n transform(transformLogn, transformExpn);\\n } else {\\n transform(transformLog, transformExp);\\n }\\n return scale;\\n }\\n\\n scale.base = function(_) {\\n return arguments.length ? (base = +_, rescale()) : base;\\n };\\n\\n scale.domain = function(_) {\\n return arguments.length ? (domain(_), rescale()) : domain();\\n };\\n\\n scale.ticks = function(count) {\\n var d = domain(),\\n u = d[0],\\n v = d[d.length - 1],\\n r;\\n\\n if (r = v < u) i = u, u = v, v = i;\\n\\n var i = logs(u),\\n j = logs(v),\\n p,\\n k,\\n t,\\n n = count == null ? 10 : +count,\\n z = [];\\n\\n if (!(base % 1) && j - i < n) {\\n i = Math.round(i) - 1, j = Math.round(j) + 1;\\n if (u > 0) for (; i < j; ++i) {\\n for (k = 1, p = pows(i); k < base; ++k) {\\n t = p * k;\\n if (t < u) continue;\\n if (t > v) break;\\n z.push(t);\\n }\\n } else for (; i < j; ++i) {\\n for (k = base - 1, p = pows(i); k >= 1; --k) {\\n t = p * k;\\n if (t < u) continue;\\n if (t > v) break;\\n z.push(t);\\n }\\n }\\n } else {\\n z = ticks(i, j, Math.min(j - i, n)).map(pows);\\n }\\n\\n return r ? z.reverse() : z;\\n };\\n\\n scale.tickFormat = function(count, specifier) {\\n if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\\n if (typeof specifier !== \"function\") specifier = defaultLocale_format(specifier);\\n if (count === Infinity) return specifier;\\n if (count == null) count = 10;\\n var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\\n return function(d) {\\n var i = d / pows(Math.round(logs(d)));\\n if (i * base < base - 0.5) i *= base;\\n return i <= k ? specifier(d) : \"\";\\n };\\n };\\n\\n scale.nice = function() {\\n return domain(nice(domain(), {\\n floor: function(x) { return pows(Math.floor(logs(x))); },\\n ceil: function(x) { return pows(Math.ceil(logs(x))); }\\n }));\\n };\\n\\n return scale;\\n}\\n\\nfunction log_log() {\\n var scale = loggish(continuous_transformer()).domain([1, 10]);\\n\\n scale.copy = function() {\\n return copy(scale, log_log()).base(scale.base());\\n };\\n\\n initRange.apply(scale, arguments);\\n\\n return scale;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/symlog.js\\n\\n\\n\\n\\nfunction transformSymlog(c) {\\n return function(x) {\\n return Math.sign(x) * Math.log1p(Math.abs(x / c));\\n };\\n}\\n\\nfunction transformSymexp(c) {\\n return function(x) {\\n return Math.sign(x) * Math.expm1(Math.abs(x)) * c;\\n };\\n}\\n\\nfunction symlogish(transform) {\\n var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));\\n\\n scale.constant = function(_) {\\n return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;\\n };\\n\\n return linearish(scale);\\n}\\n\\nfunction symlog() {\\n var scale = symlogish(continuous_transformer());\\n\\n scale.copy = function() {\\n return copy(scale, symlog()).constant(scale.constant());\\n };\\n\\n return initRange.apply(scale, arguments);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/pow.js\\n\\n\\n\\n\\nfunction transformPow(exponent) {\\n return function(x) {\\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\\n };\\n}\\n\\nfunction transformSqrt(x) {\\n return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\\n}\\n\\nfunction transformSquare(x) {\\n return x < 0 ? -x * x : x * x;\\n}\\n\\nfunction powish(transform) {\\n var scale = transform(continuous_identity, continuous_identity),\\n exponent = 1;\\n\\n function rescale() {\\n return exponent === 1 ? transform(continuous_identity, continuous_identity)\\n : exponent === 0.5 ? transform(transformSqrt, transformSquare)\\n : transform(transformPow(exponent), transformPow(1 / exponent));\\n }\\n\\n scale.exponent = function(_) {\\n return arguments.length ? (exponent = +_, rescale()) : exponent;\\n };\\n\\n return linearish(scale);\\n}\\n\\nfunction pow_pow() {\\n var scale = powish(continuous_transformer());\\n\\n scale.copy = function() {\\n return copy(scale, pow_pow()).exponent(scale.exponent());\\n };\\n\\n initRange.apply(scale, arguments);\\n\\n return scale;\\n}\\n\\nfunction pow_sqrt() {\\n return pow_pow.apply(null, arguments).exponent(0.5);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/quantile.js\\n\\n\\n\\n\\nfunction quantile_quantile() {\\n var domain = [],\\n range = [],\\n thresholds = [],\\n unknown;\\n\\n function rescale() {\\n var i = 0, n = Math.max(1, range.length);\\n thresholds = new Array(n - 1);\\n while (++i < n) thresholds[i - 1] = quantile(domain, i / n);\\n return scale;\\n }\\n\\n function scale(x) {\\n return isNaN(x = +x) ? unknown : range[bisect(thresholds, x)];\\n }\\n\\n scale.invertExtent = function(y) {\\n var i = range.indexOf(y);\\n return i < 0 ? [NaN, NaN] : [\\n i > 0 ? thresholds[i - 1] : domain[0],\\n i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\\n ];\\n };\\n\\n scale.domain = function(_) {\\n if (!arguments.length) return domain.slice();\\n domain = [];\\n for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);\\n domain.sort(ascending);\\n return rescale();\\n };\\n\\n scale.range = function(_) {\\n return arguments.length ? (range = d3_scale_src_array_slice.call(_), rescale()) : range.slice();\\n };\\n\\n scale.unknown = function(_) {\\n return arguments.length ? (unknown = _, scale) : unknown;\\n };\\n\\n scale.quantiles = function() {\\n return thresholds.slice();\\n };\\n\\n scale.copy = function() {\\n return quantile_quantile()\\n .domain(domain)\\n .range(range)\\n .unknown(unknown);\\n };\\n\\n return initRange.apply(scale, arguments);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/quantize.js\\n\\n\\n\\n\\n\\nfunction quantize_quantize() {\\n var x0 = 0,\\n x1 = 1,\\n n = 1,\\n domain = [0.5],\\n range = [0, 1],\\n unknown;\\n\\n function scale(x) {\\n return x <= x ? range[bisect(domain, x, 0, n)] : unknown;\\n }\\n\\n function rescale() {\\n var i = -1;\\n domain = new Array(n);\\n while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\\n return scale;\\n }\\n\\n scale.domain = function(_) {\\n return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];\\n };\\n\\n scale.range = function(_) {\\n return arguments.length ? (n = (range = d3_scale_src_array_slice.call(_)).length - 1, rescale()) : range.slice();\\n };\\n\\n scale.invertExtent = function(y) {\\n var i = range.indexOf(y);\\n return i < 0 ? [NaN, NaN]\\n : i < 1 ? [x0, domain[0]]\\n : i >= n ? [domain[n - 1], x1]\\n : [domain[i - 1], domain[i]];\\n };\\n\\n scale.unknown = function(_) {\\n return arguments.length ? (unknown = _, scale) : scale;\\n };\\n\\n scale.thresholds = function() {\\n return domain.slice();\\n };\\n\\n scale.copy = function() {\\n return quantize_quantize()\\n .domain([x0, x1])\\n .range(range)\\n .unknown(unknown);\\n };\\n\\n return initRange.apply(linearish(scale), arguments);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/threshold.js\\n\\n\\n\\n\\nfunction threshold_threshold() {\\n var domain = [0.5],\\n range = [0, 1],\\n unknown,\\n n = 1;\\n\\n function scale(x) {\\n return x <= x ? range[bisect(domain, x, 0, n)] : unknown;\\n }\\n\\n scale.domain = function(_) {\\n return arguments.length ? (domain = d3_scale_src_array_slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\\n };\\n\\n scale.range = function(_) {\\n return arguments.length ? (range = d3_scale_src_array_slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\\n };\\n\\n scale.invertExtent = function(y) {\\n var i = range.indexOf(y);\\n return [domain[i - 1], domain[i]];\\n };\\n\\n scale.unknown = function(_) {\\n return arguments.length ? (unknown = _, scale) : unknown;\\n };\\n\\n scale.copy = function() {\\n return threshold_threshold()\\n .domain(domain)\\n .range(range)\\n .unknown(unknown);\\n };\\n\\n return initRange.apply(scale, arguments);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/interval.js\\nvar interval_t0 = new Date,\\n interval_t1 = new Date;\\n\\nfunction newInterval(floori, offseti, count, field) {\\n\\n function interval(date) {\\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\\n }\\n\\n interval.floor = function(date) {\\n return floori(date = new Date(+date)), date;\\n };\\n\\n interval.ceil = function(date) {\\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\\n };\\n\\n interval.round = function(date) {\\n var d0 = interval(date),\\n d1 = interval.ceil(date);\\n return date - d0 < d1 - date ? d0 : d1;\\n };\\n\\n interval.offset = function(date, step) {\\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\\n };\\n\\n interval.range = function(start, stop, step) {\\n var range = [], previous;\\n start = interval.ceil(start);\\n step = step == null ? 1 : Math.floor(step);\\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\\n while (previous < start && start < stop);\\n return range;\\n };\\n\\n interval.filter = function(test) {\\n return newInterval(function(date) {\\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\\n }, function(date, step) {\\n if (date >= date) {\\n if (step < 0) while (++step <= 0) {\\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\\n } else while (--step >= 0) {\\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\\n }\\n }\\n });\\n };\\n\\n if (count) {\\n interval.count = function(start, end) {\\n interval_t0.setTime(+start), interval_t1.setTime(+end);\\n floori(interval_t0), floori(interval_t1);\\n return Math.floor(count(interval_t0, interval_t1));\\n };\\n\\n interval.every = function(step) {\\n step = Math.floor(step);\\n return !isFinite(step) || !(step > 0) ? null\\n : !(step > 1) ? interval\\n : interval.filter(field\\n ? function(d) { return field(d) % step === 0; }\\n : function(d) { return interval.count(0, d) % step === 0; });\\n };\\n }\\n\\n return interval;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/year.js\\n\\n\\nvar year_year = newInterval(function(date) {\\n date.setMonth(0, 1);\\n date.setHours(0, 0, 0, 0);\\n}, function(date, step) {\\n date.setFullYear(date.getFullYear() + step);\\n}, function(start, end) {\\n return end.getFullYear() - start.getFullYear();\\n}, function(date) {\\n return date.getFullYear();\\n});\\n\\n// An optimized implementation for this simple case.\\nyear_year.every = function(k) {\\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {\\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\\n date.setMonth(0, 1);\\n date.setHours(0, 0, 0, 0);\\n }, function(date, step) {\\n date.setFullYear(date.getFullYear() + step * k);\\n });\\n};\\n\\n/* harmony default export */ var src_year = (year_year);\\nvar years = year_year.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/month.js\\n\\n\\nvar month_month = newInterval(function(date) {\\n date.setDate(1);\\n date.setHours(0, 0, 0, 0);\\n}, function(date, step) {\\n date.setMonth(date.getMonth() + step);\\n}, function(start, end) {\\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\\n}, function(date) {\\n return date.getMonth();\\n});\\n\\n/* harmony default export */ var src_month = (month_month);\\nvar months = month_month.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/duration.js\\nvar durationSecond = 1e3;\\nvar durationMinute = 6e4;\\nvar durationHour = 36e5;\\nvar durationDay = 864e5;\\nvar durationWeek = 6048e5;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/week.js\\n\\n\\n\\nfunction weekday(i) {\\n return newInterval(function(date) {\\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\\n date.setHours(0, 0, 0, 0);\\n }, function(date, step) {\\n date.setDate(date.getDate() + step * 7);\\n }, function(start, end) {\\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\\n });\\n}\\n\\nvar sunday = weekday(0);\\nvar monday = weekday(1);\\nvar tuesday = weekday(2);\\nvar wednesday = weekday(3);\\nvar thursday = weekday(4);\\nvar friday = weekday(5);\\nvar saturday = weekday(6);\\n\\nvar sundays = sunday.range;\\nvar mondays = monday.range;\\nvar tuesdays = tuesday.range;\\nvar wednesdays = wednesday.range;\\nvar thursdays = thursday.range;\\nvar fridays = friday.range;\\nvar saturdays = saturday.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/day.js\\n\\n\\n\\nvar day_day = newInterval(function(date) {\\n date.setHours(0, 0, 0, 0);\\n}, function(date, step) {\\n date.setDate(date.getDate() + step);\\n}, function(start, end) {\\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\\n}, function(date) {\\n return date.getDate() - 1;\\n});\\n\\n/* harmony default export */ var src_day = (day_day);\\nvar days = day_day.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/hour.js\\n\\n\\n\\nvar hour_hour = newInterval(function(date) {\\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\\n}, function(date, step) {\\n date.setTime(+date + step * durationHour);\\n}, function(start, end) {\\n return (end - start) / durationHour;\\n}, function(date) {\\n return date.getHours();\\n});\\n\\n/* harmony default export */ var src_hour = (hour_hour);\\nvar hours = hour_hour.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/minute.js\\n\\n\\n\\nvar minute_minute = newInterval(function(date) {\\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\\n}, function(date, step) {\\n date.setTime(+date + step * durationMinute);\\n}, function(start, end) {\\n return (end - start) / durationMinute;\\n}, function(date) {\\n return date.getMinutes();\\n});\\n\\n/* harmony default export */ var src_minute = (minute_minute);\\nvar minutes = minute_minute.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/second.js\\n\\n\\n\\nvar second_second = newInterval(function(date) {\\n date.setTime(date - date.getMilliseconds());\\n}, function(date, step) {\\n date.setTime(+date + step * durationSecond);\\n}, function(start, end) {\\n return (end - start) / durationSecond;\\n}, function(date) {\\n return date.getUTCSeconds();\\n});\\n\\n/* harmony default export */ var src_second = (second_second);\\nvar seconds = second_second.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/millisecond.js\\n\\n\\nvar millisecond_millisecond = newInterval(function() {\\n // noop\\n}, function(date, step) {\\n date.setTime(+date + step);\\n}, function(start, end) {\\n return end - start;\\n});\\n\\n// An optimized implementation for this simple case.\\nmillisecond_millisecond.every = function(k) {\\n k = Math.floor(k);\\n if (!isFinite(k) || !(k > 0)) return null;\\n if (!(k > 1)) return millisecond_millisecond;\\n return newInterval(function(date) {\\n date.setTime(Math.floor(date / k) * k);\\n }, function(date, step) {\\n date.setTime(+date + step * k);\\n }, function(start, end) {\\n return (end - start) / k;\\n });\\n};\\n\\n/* harmony default export */ var src_millisecond = (millisecond_millisecond);\\nvar milliseconds = millisecond_millisecond.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/utcWeek.js\\n\\n\\n\\nfunction utcWeekday(i) {\\n return newInterval(function(date) {\\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\\n date.setUTCHours(0, 0, 0, 0);\\n }, function(date, step) {\\n date.setUTCDate(date.getUTCDate() + step * 7);\\n }, function(start, end) {\\n return (end - start) / durationWeek;\\n });\\n}\\n\\nvar utcSunday = utcWeekday(0);\\nvar utcMonday = utcWeekday(1);\\nvar utcTuesday = utcWeekday(2);\\nvar utcWednesday = utcWeekday(3);\\nvar utcThursday = utcWeekday(4);\\nvar utcFriday = utcWeekday(5);\\nvar utcSaturday = utcWeekday(6);\\n\\nvar utcSundays = utcSunday.range;\\nvar utcMondays = utcMonday.range;\\nvar utcTuesdays = utcTuesday.range;\\nvar utcWednesdays = utcWednesday.range;\\nvar utcThursdays = utcThursday.range;\\nvar utcFridays = utcFriday.range;\\nvar utcSaturdays = utcSaturday.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/utcDay.js\\n\\n\\n\\nvar utcDay = newInterval(function(date) {\\n date.setUTCHours(0, 0, 0, 0);\\n}, function(date, step) {\\n date.setUTCDate(date.getUTCDate() + step);\\n}, function(start, end) {\\n return (end - start) / durationDay;\\n}, function(date) {\\n return date.getUTCDate() - 1;\\n});\\n\\n/* harmony default export */ var src_utcDay = (utcDay);\\nvar utcDays = utcDay.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/utcYear.js\\n\\n\\nvar utcYear = newInterval(function(date) {\\n date.setUTCMonth(0, 1);\\n date.setUTCHours(0, 0, 0, 0);\\n}, function(date, step) {\\n date.setUTCFullYear(date.getUTCFullYear() + step);\\n}, function(start, end) {\\n return end.getUTCFullYear() - start.getUTCFullYear();\\n}, function(date) {\\n return date.getUTCFullYear();\\n});\\n\\n// An optimized implementation for this simple case.\\nutcYear.every = function(k) {\\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {\\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\\n date.setUTCMonth(0, 1);\\n date.setUTCHours(0, 0, 0, 0);\\n }, function(date, step) {\\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\\n });\\n};\\n\\n/* harmony default export */ var src_utcYear = (utcYear);\\nvar utcYears = utcYear.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time-format/src/locale.js\\n\\n\\nfunction localDate(d) {\\n if (0 <= d.y && d.y < 100) {\\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\\n date.setFullYear(d.y);\\n return date;\\n }\\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\\n}\\n\\nfunction utcDate(d) {\\n if (0 <= d.y && d.y < 100) {\\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\\n date.setUTCFullYear(d.y);\\n return date;\\n }\\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\\n}\\n\\nfunction newDate(y, m, d) {\\n return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\\n}\\n\\nfunction formatLocale(locale) {\\n var locale_dateTime = locale.dateTime,\\n locale_date = locale.date,\\n locale_time = locale.time,\\n locale_periods = locale.periods,\\n locale_weekdays = locale.days,\\n locale_shortWeekdays = locale.shortDays,\\n locale_months = locale.months,\\n locale_shortMonths = locale.shortMonths;\\n\\n var periodRe = formatRe(locale_periods),\\n periodLookup = formatLookup(locale_periods),\\n weekdayRe = formatRe(locale_weekdays),\\n weekdayLookup = formatLookup(locale_weekdays),\\n shortWeekdayRe = formatRe(locale_shortWeekdays),\\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\\n monthRe = formatRe(locale_months),\\n monthLookup = formatLookup(locale_months),\\n shortMonthRe = formatRe(locale_shortMonths),\\n shortMonthLookup = formatLookup(locale_shortMonths);\\n\\n var formats = {\\n \"a\": formatShortWeekday,\\n \"A\": formatWeekday,\\n \"b\": formatShortMonth,\\n \"B\": formatMonth,\\n \"c\": null,\\n \"d\": formatDayOfMonth,\\n \"e\": formatDayOfMonth,\\n \"f\": formatMicroseconds,\\n \"H\": formatHour24,\\n \"I\": formatHour12,\\n \"j\": formatDayOfYear,\\n \"L\": formatMilliseconds,\\n \"m\": formatMonthNumber,\\n \"M\": formatMinutes,\\n \"p\": formatPeriod,\\n \"q\": formatQuarter,\\n \"Q\": formatUnixTimestamp,\\n \"s\": formatUnixTimestampSeconds,\\n \"S\": formatSeconds,\\n \"u\": formatWeekdayNumberMonday,\\n \"U\": formatWeekNumberSunday,\\n \"V\": formatWeekNumberISO,\\n \"w\": formatWeekdayNumberSunday,\\n \"W\": formatWeekNumberMonday,\\n \"x\": null,\\n \"X\": null,\\n \"y\": locale_formatYear,\\n \"Y\": formatFullYear,\\n \"Z\": formatZone,\\n \"%\": formatLiteralPercent\\n };\\n\\n var utcFormats = {\\n \"a\": formatUTCShortWeekday,\\n \"A\": formatUTCWeekday,\\n \"b\": formatUTCShortMonth,\\n \"B\": formatUTCMonth,\\n \"c\": null,\\n \"d\": formatUTCDayOfMonth,\\n \"e\": formatUTCDayOfMonth,\\n \"f\": formatUTCMicroseconds,\\n \"H\": formatUTCHour24,\\n \"I\": formatUTCHour12,\\n \"j\": formatUTCDayOfYear,\\n \"L\": formatUTCMilliseconds,\\n \"m\": formatUTCMonthNumber,\\n \"M\": formatUTCMinutes,\\n \"p\": formatUTCPeriod,\\n \"q\": formatUTCQuarter,\\n \"Q\": formatUnixTimestamp,\\n \"s\": formatUnixTimestampSeconds,\\n \"S\": formatUTCSeconds,\\n \"u\": formatUTCWeekdayNumberMonday,\\n \"U\": formatUTCWeekNumberSunday,\\n \"V\": formatUTCWeekNumberISO,\\n \"w\": formatUTCWeekdayNumberSunday,\\n \"W\": formatUTCWeekNumberMonday,\\n \"x\": null,\\n \"X\": null,\\n \"y\": formatUTCYear,\\n \"Y\": formatUTCFullYear,\\n \"Z\": formatUTCZone,\\n \"%\": formatLiteralPercent\\n };\\n\\n var parses = {\\n \"a\": parseShortWeekday,\\n \"A\": parseWeekday,\\n \"b\": parseShortMonth,\\n \"B\": parseMonth,\\n \"c\": parseLocaleDateTime,\\n \"d\": parseDayOfMonth,\\n \"e\": parseDayOfMonth,\\n \"f\": parseMicroseconds,\\n \"H\": parseHour24,\\n \"I\": parseHour24,\\n \"j\": parseDayOfYear,\\n \"L\": parseMilliseconds,\\n \"m\": parseMonthNumber,\\n \"M\": parseMinutes,\\n \"p\": parsePeriod,\\n \"q\": parseQuarter,\\n \"Q\": parseUnixTimestamp,\\n \"s\": parseUnixTimestampSeconds,\\n \"S\": parseSeconds,\\n \"u\": parseWeekdayNumberMonday,\\n \"U\": parseWeekNumberSunday,\\n \"V\": parseWeekNumberISO,\\n \"w\": parseWeekdayNumberSunday,\\n \"W\": parseWeekNumberMonday,\\n \"x\": parseLocaleDate,\\n \"X\": parseLocaleTime,\\n \"y\": parseYear,\\n \"Y\": parseFullYear,\\n \"Z\": parseZone,\\n \"%\": parseLiteralPercent\\n };\\n\\n // These recursive directive definitions must be deferred.\\n formats.x = newFormat(locale_date, formats);\\n formats.X = newFormat(locale_time, formats);\\n formats.c = newFormat(locale_dateTime, formats);\\n utcFormats.x = newFormat(locale_date, utcFormats);\\n utcFormats.X = newFormat(locale_time, utcFormats);\\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\\n\\n function newFormat(specifier, formats) {\\n return function(date) {\\n var string = [],\\n i = -1,\\n j = 0,\\n n = specifier.length,\\n c,\\n pad,\\n format;\\n\\n if (!(date instanceof Date)) date = new Date(+date);\\n\\n while (++i < n) {\\n if (specifier.charCodeAt(i) === 37) {\\n string.push(specifier.slice(j, i));\\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\\n else pad = c === \"e\" ? \" \" : \"0\";\\n if (format = formats[c]) c = format(date, pad);\\n string.push(c);\\n j = i + 1;\\n }\\n }\\n\\n string.push(specifier.slice(j, i));\\n return string.join(\"\");\\n };\\n }\\n\\n function newParse(specifier, Z) {\\n return function(string) {\\n var d = newDate(1900, undefined, 1),\\n i = parseSpecifier(d, specifier, string += \"\", 0),\\n week, day;\\n if (i != string.length) return null;\\n\\n // If a UNIX timestamp is specified, return it.\\n if (\"Q\" in d) return new Date(d.Q);\\n if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\\n\\n // If this is utcParse, never use the local timezone.\\n if (Z && !(\"Z\" in d)) d.Z = 0;\\n\\n // The am-pm flag is 0 for AM, and 1 for PM.\\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\\n\\n // If the month was not specified, inherit from the quarter.\\n if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\\n\\n // Convert day-of-week and week-of-year to day-of-year.\\n if (\"V\" in d) {\\n if (d.V < 1 || d.V > 53) return null;\\n if (!(\"w\" in d)) d.w = 1;\\n if (\"Z\" in d) {\\n week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\\n week = src_utcDay.offset(week, (d.V - 1) * 7);\\n d.y = week.getUTCFullYear();\\n d.m = week.getUTCMonth();\\n d.d = week.getUTCDate() + (d.w + 6) % 7;\\n } else {\\n week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\\n week = day > 4 || day === 0 ? monday.ceil(week) : monday(week);\\n week = src_day.offset(week, (d.V - 1) * 7);\\n d.y = week.getFullYear();\\n d.m = week.getMonth();\\n d.d = week.getDate() + (d.w + 6) % 7;\\n }\\n } else if (\"W\" in d || \"U\" in d) {\\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\\n day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\\n d.m = 0;\\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\\n }\\n\\n // If a time zone is specified, all fields are interpreted as UTC and then\\n // offset according to the specified time zone.\\n if (\"Z\" in d) {\\n d.H += d.Z / 100 | 0;\\n d.M += d.Z % 100;\\n return utcDate(d);\\n }\\n\\n // Otherwise, all fields are in local time.\\n return localDate(d);\\n };\\n }\\n\\n function parseSpecifier(d, specifier, string, j) {\\n var i = 0,\\n n = specifier.length,\\n m = string.length,\\n c,\\n parse;\\n\\n while (i < n) {\\n if (j >= m) return -1;\\n c = specifier.charCodeAt(i++);\\n if (c === 37) {\\n c = specifier.charAt(i++);\\n parse = parses[c in pads ? specifier.charAt(i++) : c];\\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\\n } else if (c != string.charCodeAt(j++)) {\\n return -1;\\n }\\n }\\n\\n return j;\\n }\\n\\n function parsePeriod(d, string, i) {\\n var n = periodRe.exec(string.slice(i));\\n return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\\n }\\n\\n function parseShortWeekday(d, string, i) {\\n var n = shortWeekdayRe.exec(string.slice(i));\\n return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\\n }\\n\\n function parseWeekday(d, string, i) {\\n var n = weekdayRe.exec(string.slice(i));\\n return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\\n }\\n\\n function parseShortMonth(d, string, i) {\\n var n = shortMonthRe.exec(string.slice(i));\\n return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\\n }\\n\\n function parseMonth(d, string, i) {\\n var n = monthRe.exec(string.slice(i));\\n return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\\n }\\n\\n function parseLocaleDateTime(d, string, i) {\\n return parseSpecifier(d, locale_dateTime, string, i);\\n }\\n\\n function parseLocaleDate(d, string, i) {\\n return parseSpecifier(d, locale_date, string, i);\\n }\\n\\n function parseLocaleTime(d, string, i) {\\n return parseSpecifier(d, locale_time, string, i);\\n }\\n\\n function formatShortWeekday(d) {\\n return locale_shortWeekdays[d.getDay()];\\n }\\n\\n function formatWeekday(d) {\\n return locale_weekdays[d.getDay()];\\n }\\n\\n function formatShortMonth(d) {\\n return locale_shortMonths[d.getMonth()];\\n }\\n\\n function formatMonth(d) {\\n return locale_months[d.getMonth()];\\n }\\n\\n function formatPeriod(d) {\\n return locale_periods[+(d.getHours() >= 12)];\\n }\\n\\n function formatQuarter(d) {\\n return 1 + ~~(d.getMonth() / 3);\\n }\\n\\n function formatUTCShortWeekday(d) {\\n return locale_shortWeekdays[d.getUTCDay()];\\n }\\n\\n function formatUTCWeekday(d) {\\n return locale_weekdays[d.getUTCDay()];\\n }\\n\\n function formatUTCShortMonth(d) {\\n return locale_shortMonths[d.getUTCMonth()];\\n }\\n\\n function formatUTCMonth(d) {\\n return locale_months[d.getUTCMonth()];\\n }\\n\\n function formatUTCPeriod(d) {\\n return locale_periods[+(d.getUTCHours() >= 12)];\\n }\\n\\n function formatUTCQuarter(d) {\\n return 1 + ~~(d.getUTCMonth() / 3);\\n }\\n\\n return {\\n format: function(specifier) {\\n var f = newFormat(specifier += \"\", formats);\\n f.toString = function() { return specifier; };\\n return f;\\n },\\n parse: function(specifier) {\\n var p = newParse(specifier += \"\", false);\\n p.toString = function() { return specifier; };\\n return p;\\n },\\n utcFormat: function(specifier) {\\n var f = newFormat(specifier += \"\", utcFormats);\\n f.toString = function() { return specifier; };\\n return f;\\n },\\n utcParse: function(specifier) {\\n var p = newParse(specifier += \"\", true);\\n p.toString = function() { return specifier; };\\n return p;\\n }\\n };\\n}\\n\\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\\n numberRe = /^\\\\s*\\\\d+/, // note: ignores next directive\\n percentRe = /^%/,\\n requoteRe = /[\\\\\\\\^$*+?|[\\\\]().{}]/g;\\n\\nfunction locale_pad(value, fill, width) {\\n var sign = value < 0 ? \"-\" : \"\",\\n string = (sign ? -value : value) + \"\",\\n length = string.length;\\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\\n}\\n\\nfunction requote(s) {\\n return s.replace(requoteRe, \"\\\\\\\\$&\");\\n}\\n\\nfunction formatRe(names) {\\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\\n}\\n\\nfunction formatLookup(names) {\\n var map = {}, i = -1, n = names.length;\\n while (++i < n) map[names[i].toLowerCase()] = i;\\n return map;\\n}\\n\\nfunction parseWeekdayNumberSunday(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 1));\\n return n ? (d.w = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseWeekdayNumberMonday(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 1));\\n return n ? (d.u = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseWeekNumberSunday(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 2));\\n return n ? (d.U = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseWeekNumberISO(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 2));\\n return n ? (d.V = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseWeekNumberMonday(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 2));\\n return n ? (d.W = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseFullYear(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 4));\\n return n ? (d.y = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseYear(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 2));\\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\\n}\\n\\nfunction parseZone(d, string, i) {\\n var n = /^(Z)|([+-]\\\\d\\\\d)(?::?(\\\\d\\\\d))?/.exec(string.slice(i, i + 6));\\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\\n}\\n\\nfunction parseQuarter(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 1));\\n return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\\n}\\n\\nfunction parseMonthNumber(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 2));\\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\\n}\\n\\nfunction parseDayOfMonth(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 2));\\n return n ? (d.d = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseDayOfYear(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 3));\\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseHour24(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 2));\\n return n ? (d.H = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseMinutes(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 2));\\n return n ? (d.M = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseSeconds(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 2));\\n return n ? (d.S = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseMilliseconds(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 3));\\n return n ? (d.L = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseMicroseconds(d, string, i) {\\n var n = numberRe.exec(string.slice(i, i + 6));\\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\\n}\\n\\nfunction parseLiteralPercent(d, string, i) {\\n var n = percentRe.exec(string.slice(i, i + 1));\\n return n ? i + n[0].length : -1;\\n}\\n\\nfunction parseUnixTimestamp(d, string, i) {\\n var n = numberRe.exec(string.slice(i));\\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction parseUnixTimestampSeconds(d, string, i) {\\n var n = numberRe.exec(string.slice(i));\\n return n ? (d.s = +n[0], i + n[0].length) : -1;\\n}\\n\\nfunction formatDayOfMonth(d, p) {\\n return locale_pad(d.getDate(), p, 2);\\n}\\n\\nfunction formatHour24(d, p) {\\n return locale_pad(d.getHours(), p, 2);\\n}\\n\\nfunction formatHour12(d, p) {\\n return locale_pad(d.getHours() % 12 || 12, p, 2);\\n}\\n\\nfunction formatDayOfYear(d, p) {\\n return locale_pad(1 + src_day.count(src_year(d), d), p, 3);\\n}\\n\\nfunction formatMilliseconds(d, p) {\\n return locale_pad(d.getMilliseconds(), p, 3);\\n}\\n\\nfunction formatMicroseconds(d, p) {\\n return formatMilliseconds(d, p) + \"000\";\\n}\\n\\nfunction formatMonthNumber(d, p) {\\n return locale_pad(d.getMonth() + 1, p, 2);\\n}\\n\\nfunction formatMinutes(d, p) {\\n return locale_pad(d.getMinutes(), p, 2);\\n}\\n\\nfunction formatSeconds(d, p) {\\n return locale_pad(d.getSeconds(), p, 2);\\n}\\n\\nfunction formatWeekdayNumberMonday(d) {\\n var day = d.getDay();\\n return day === 0 ? 7 : day;\\n}\\n\\nfunction formatWeekNumberSunday(d, p) {\\n return locale_pad(sunday.count(src_year(d) - 1, d), p, 2);\\n}\\n\\nfunction formatWeekNumberISO(d, p) {\\n var day = d.getDay();\\n d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d);\\n return locale_pad(thursday.count(src_year(d), d) + (src_year(d).getDay() === 4), p, 2);\\n}\\n\\nfunction formatWeekdayNumberSunday(d) {\\n return d.getDay();\\n}\\n\\nfunction formatWeekNumberMonday(d, p) {\\n return locale_pad(monday.count(src_year(d) - 1, d), p, 2);\\n}\\n\\nfunction locale_formatYear(d, p) {\\n return locale_pad(d.getFullYear() % 100, p, 2);\\n}\\n\\nfunction formatFullYear(d, p) {\\n return locale_pad(d.getFullYear() % 10000, p, 4);\\n}\\n\\nfunction formatZone(d) {\\n var z = d.getTimezoneOffset();\\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\\n + locale_pad(z / 60 | 0, \"0\", 2)\\n + locale_pad(z % 60, \"0\", 2);\\n}\\n\\nfunction formatUTCDayOfMonth(d, p) {\\n return locale_pad(d.getUTCDate(), p, 2);\\n}\\n\\nfunction formatUTCHour24(d, p) {\\n return locale_pad(d.getUTCHours(), p, 2);\\n}\\n\\nfunction formatUTCHour12(d, p) {\\n return locale_pad(d.getUTCHours() % 12 || 12, p, 2);\\n}\\n\\nfunction formatUTCDayOfYear(d, p) {\\n return locale_pad(1 + src_utcDay.count(src_utcYear(d), d), p, 3);\\n}\\n\\nfunction formatUTCMilliseconds(d, p) {\\n return locale_pad(d.getUTCMilliseconds(), p, 3);\\n}\\n\\nfunction formatUTCMicroseconds(d, p) {\\n return formatUTCMilliseconds(d, p) + \"000\";\\n}\\n\\nfunction formatUTCMonthNumber(d, p) {\\n return locale_pad(d.getUTCMonth() + 1, p, 2);\\n}\\n\\nfunction formatUTCMinutes(d, p) {\\n return locale_pad(d.getUTCMinutes(), p, 2);\\n}\\n\\nfunction formatUTCSeconds(d, p) {\\n return locale_pad(d.getUTCSeconds(), p, 2);\\n}\\n\\nfunction formatUTCWeekdayNumberMonday(d) {\\n var dow = d.getUTCDay();\\n return dow === 0 ? 7 : dow;\\n}\\n\\nfunction formatUTCWeekNumberSunday(d, p) {\\n return locale_pad(utcSunday.count(src_utcYear(d) - 1, d), p, 2);\\n}\\n\\nfunction formatUTCWeekNumberISO(d, p) {\\n var day = d.getUTCDay();\\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\\n return locale_pad(utcThursday.count(src_utcYear(d), d) + (src_utcYear(d).getUTCDay() === 4), p, 2);\\n}\\n\\nfunction formatUTCWeekdayNumberSunday(d) {\\n return d.getUTCDay();\\n}\\n\\nfunction formatUTCWeekNumberMonday(d, p) {\\n return locale_pad(utcMonday.count(src_utcYear(d) - 1, d), p, 2);\\n}\\n\\nfunction formatUTCYear(d, p) {\\n return locale_pad(d.getUTCFullYear() % 100, p, 2);\\n}\\n\\nfunction formatUTCFullYear(d, p) {\\n return locale_pad(d.getUTCFullYear() % 10000, p, 4);\\n}\\n\\nfunction formatUTCZone() {\\n return \"+0000\";\\n}\\n\\nfunction formatLiteralPercent() {\\n return \"%\";\\n}\\n\\nfunction formatUnixTimestamp(d) {\\n return +d;\\n}\\n\\nfunction formatUnixTimestampSeconds(d) {\\n return Math.floor(+d / 1000);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time-format/src/defaultLocale.js\\n\\n\\nvar src_defaultLocale_locale;\\nvar timeFormat;\\nvar timeParse;\\nvar utcFormat;\\nvar utcParse;\\n\\ndefaultLocale_defaultLocale({\\n dateTime: \"%x, %X\",\\n date: \"%-m/%-d/%Y\",\\n time: \"%-I:%M:%S %p\",\\n periods: [\"AM\", \"PM\"],\\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\\n});\\n\\nfunction defaultLocale_defaultLocale(definition) {\\n src_defaultLocale_locale = formatLocale(definition);\\n timeFormat = src_defaultLocale_locale.format;\\n timeParse = src_defaultLocale_locale.parse;\\n utcFormat = src_defaultLocale_locale.utcFormat;\\n utcParse = src_defaultLocale_locale.utcParse;\\n return src_defaultLocale_locale;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/time.js\\n\\n\\n\\n\\n\\n\\n\\n\\nvar time_durationSecond = 1000,\\n time_durationMinute = time_durationSecond * 60,\\n time_durationHour = time_durationMinute * 60,\\n time_durationDay = time_durationHour * 24,\\n time_durationWeek = time_durationDay * 7,\\n durationMonth = time_durationDay * 30,\\n durationYear = time_durationDay * 365;\\n\\nfunction time_date(t) {\\n return new Date(t);\\n}\\n\\nfunction time_number(t) {\\n return t instanceof Date ? +t : +new Date(+t);\\n}\\n\\nfunction calendar(year, month, week, day, hour, minute, second, millisecond, format) {\\n var scale = continuous(continuous_identity, continuous_identity),\\n invert = scale.invert,\\n domain = scale.domain;\\n\\n var formatMillisecond = format(\".%L\"),\\n formatSecond = format(\":%S\"),\\n formatMinute = format(\"%I:%M\"),\\n formatHour = format(\"%I %p\"),\\n formatDay = format(\"%a %d\"),\\n formatWeek = format(\"%b %d\"),\\n formatMonth = format(\"%B\"),\\n formatYear = format(\"%Y\");\\n\\n var tickIntervals = [\\n [second, 1, time_durationSecond],\\n [second, 5, 5 * time_durationSecond],\\n [second, 15, 15 * time_durationSecond],\\n [second, 30, 30 * time_durationSecond],\\n [minute, 1, time_durationMinute],\\n [minute, 5, 5 * time_durationMinute],\\n [minute, 15, 15 * time_durationMinute],\\n [minute, 30, 30 * time_durationMinute],\\n [ hour, 1, time_durationHour ],\\n [ hour, 3, 3 * time_durationHour ],\\n [ hour, 6, 6 * time_durationHour ],\\n [ hour, 12, 12 * time_durationHour ],\\n [ day, 1, time_durationDay ],\\n [ day, 2, 2 * time_durationDay ],\\n [ week, 1, time_durationWeek ],\\n [ month, 1, durationMonth ],\\n [ month, 3, 3 * durationMonth ],\\n [ year, 1, durationYear ]\\n ];\\n\\n function tickFormat(date) {\\n return (second(date) < date ? formatMillisecond\\n : minute(date) < date ? formatSecond\\n : hour(date) < date ? formatMinute\\n : day(date) < date ? formatHour\\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\\n : year(date) < date ? formatMonth\\n : formatYear)(date);\\n }\\n\\n function tickInterval(interval, start, stop, step) {\\n if (interval == null) interval = 10;\\n\\n // If a desired tick count is specified, pick a reasonable tick interval\\n // based on the extent of the domain and a rough estimate of tick size.\\n // Otherwise, assume interval is already a time interval and use it.\\n if (typeof interval === \"number\") {\\n var target = Math.abs(stop - start) / interval,\\n i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);\\n if (i === tickIntervals.length) {\\n step = tickStep(start / durationYear, stop / durationYear, interval);\\n interval = year;\\n } else if (i) {\\n i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\\n step = i[1];\\n interval = i[0];\\n } else {\\n step = Math.max(tickStep(start, stop, interval), 1);\\n interval = millisecond;\\n }\\n }\\n\\n return step == null ? interval : interval.every(step);\\n }\\n\\n scale.invert = function(y) {\\n return new Date(invert(y));\\n };\\n\\n scale.domain = function(_) {\\n return arguments.length ? domain(array_map.call(_, time_number)) : domain().map(time_date);\\n };\\n\\n scale.ticks = function(interval, step) {\\n var d = domain(),\\n t0 = d[0],\\n t1 = d[d.length - 1],\\n r = t1 < t0,\\n t;\\n if (r) t = t0, t0 = t1, t1 = t;\\n t = tickInterval(interval, t0, t1, step);\\n t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\\n return r ? t.reverse() : t;\\n };\\n\\n scale.tickFormat = function(count, specifier) {\\n return specifier == null ? tickFormat : format(specifier);\\n };\\n\\n scale.nice = function(interval, step) {\\n var d = domain();\\n return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\\n ? domain(nice(d, interval))\\n : scale;\\n };\\n\\n scale.copy = function() {\\n return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\\n };\\n\\n return scale;\\n}\\n\\n/* harmony default export */ var src_time = (function() {\\n return initRange.apply(calendar(src_year, src_month, sunday, src_day, src_hour, src_minute, src_second, src_millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/utcMonth.js\\n\\n\\nvar utcMonth = newInterval(function(date) {\\n date.setUTCDate(1);\\n date.setUTCHours(0, 0, 0, 0);\\n}, function(date, step) {\\n date.setUTCMonth(date.getUTCMonth() + step);\\n}, function(start, end) {\\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\\n}, function(date) {\\n return date.getUTCMonth();\\n});\\n\\n/* harmony default export */ var src_utcMonth = (utcMonth);\\nvar utcMonths = utcMonth.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/utcHour.js\\n\\n\\n\\nvar utcHour = newInterval(function(date) {\\n date.setUTCMinutes(0, 0, 0);\\n}, function(date, step) {\\n date.setTime(+date + step * durationHour);\\n}, function(start, end) {\\n return (end - start) / durationHour;\\n}, function(date) {\\n return date.getUTCHours();\\n});\\n\\n/* harmony default export */ var src_utcHour = (utcHour);\\nvar utcHours = utcHour.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/utcMinute.js\\n\\n\\n\\nvar utcMinute = newInterval(function(date) {\\n date.setUTCSeconds(0, 0);\\n}, function(date, step) {\\n date.setTime(+date + step * durationMinute);\\n}, function(start, end) {\\n return (end - start) / durationMinute;\\n}, function(date) {\\n return date.getUTCMinutes();\\n});\\n\\n/* harmony default export */ var src_utcMinute = (utcMinute);\\nvar utcMinutes = utcMinute.range;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/utcTime.js\\n\\n\\n\\n\\n\\n/* harmony default export */ var utcTime = (function() {\\n return initRange.apply(calendar(src_utcYear, src_utcMonth, utcSunday, src_utcDay, src_utcHour, src_utcMinute, src_second, src_millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/sequential.js\\n\\n\\n\\n\\n\\n\\n\\nfunction sequential_transformer() {\\n var x0 = 0,\\n x1 = 1,\\n t0,\\n t1,\\n k10,\\n transform,\\n interpolator = continuous_identity,\\n clamp = false,\\n unknown;\\n\\n function scale(x) {\\n return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));\\n }\\n\\n scale.domain = function(_) {\\n return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];\\n };\\n\\n scale.clamp = function(_) {\\n return arguments.length ? (clamp = !!_, scale) : clamp;\\n };\\n\\n scale.interpolator = function(_) {\\n return arguments.length ? (interpolator = _, scale) : interpolator;\\n };\\n\\n scale.unknown = function(_) {\\n return arguments.length ? (unknown = _, scale) : unknown;\\n };\\n\\n return function(t) {\\n transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);\\n return scale;\\n };\\n}\\n\\nfunction sequential_copy(source, target) {\\n return target\\n .domain(source.domain())\\n .interpolator(source.interpolator())\\n .clamp(source.clamp())\\n .unknown(source.unknown());\\n}\\n\\nfunction sequential() {\\n var scale = linearish(sequential_transformer()(continuous_identity));\\n\\n scale.copy = function() {\\n return sequential_copy(scale, sequential());\\n };\\n\\n return initInterpolator.apply(scale, arguments);\\n}\\n\\nfunction sequentialLog() {\\n var scale = loggish(sequential_transformer()).domain([1, 10]);\\n\\n scale.copy = function() {\\n return sequential_copy(scale, sequentialLog()).base(scale.base());\\n };\\n\\n return initInterpolator.apply(scale, arguments);\\n}\\n\\nfunction sequentialSymlog() {\\n var scale = symlogish(sequential_transformer());\\n\\n scale.copy = function() {\\n return sequential_copy(scale, sequentialSymlog()).constant(scale.constant());\\n };\\n\\n return initInterpolator.apply(scale, arguments);\\n}\\n\\nfunction sequentialPow() {\\n var scale = powish(sequential_transformer());\\n\\n scale.copy = function() {\\n return sequential_copy(scale, sequentialPow()).exponent(scale.exponent());\\n };\\n\\n return initInterpolator.apply(scale, arguments);\\n}\\n\\nfunction sequentialSqrt() {\\n return sequentialPow.apply(null, arguments).exponent(0.5);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/sequentialQuantile.js\\n\\n\\n\\n\\nfunction sequentialQuantile() {\\n var domain = [],\\n interpolator = continuous_identity;\\n\\n function scale(x) {\\n if (!isNaN(x = +x)) return interpolator((bisect(domain, x) - 1) / (domain.length - 1));\\n }\\n\\n scale.domain = function(_) {\\n if (!arguments.length) return domain.slice();\\n domain = [];\\n for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);\\n domain.sort(ascending);\\n return scale;\\n };\\n\\n scale.interpolator = function(_) {\\n return arguments.length ? (interpolator = _, scale) : interpolator;\\n };\\n\\n scale.copy = function() {\\n return sequentialQuantile(interpolator).domain(domain);\\n };\\n\\n return initInterpolator.apply(scale, arguments);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/diverging.js\\n\\n\\n\\n\\n\\n\\n\\n\\nfunction diverging_transformer() {\\n var x0 = 0,\\n x1 = 0.5,\\n x2 = 1,\\n t0,\\n t1,\\n t2,\\n k10,\\n k21,\\n interpolator = continuous_identity,\\n transform,\\n clamp = false,\\n unknown;\\n\\n function scale(x) {\\n return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));\\n }\\n\\n scale.domain = function(_) {\\n return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2];\\n };\\n\\n scale.clamp = function(_) {\\n return arguments.length ? (clamp = !!_, scale) : clamp;\\n };\\n\\n scale.interpolator = function(_) {\\n return arguments.length ? (interpolator = _, scale) : interpolator;\\n };\\n\\n scale.unknown = function(_) {\\n return arguments.length ? (unknown = _, scale) : unknown;\\n };\\n\\n return function(t) {\\n transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1);\\n return scale;\\n };\\n}\\n\\nfunction diverging() {\\n var scale = linearish(diverging_transformer()(continuous_identity));\\n\\n scale.copy = function() {\\n return sequential_copy(scale, diverging());\\n };\\n\\n return initInterpolator.apply(scale, arguments);\\n}\\n\\nfunction divergingLog() {\\n var scale = loggish(diverging_transformer()).domain([0.1, 1, 10]);\\n\\n scale.copy = function() {\\n return sequential_copy(scale, divergingLog()).base(scale.base());\\n };\\n\\n return initInterpolator.apply(scale, arguments);\\n}\\n\\nfunction divergingSymlog() {\\n var scale = symlogish(diverging_transformer());\\n\\n scale.copy = function() {\\n return sequential_copy(scale, divergingSymlog()).constant(scale.constant());\\n };\\n\\n return initInterpolator.apply(scale, arguments);\\n}\\n\\nfunction divergingPow() {\\n var scale = powish(diverging_transformer());\\n\\n scale.copy = function() {\\n return sequential_copy(scale, divergingPow()).exponent(scale.exponent());\\n };\\n\\n return initInterpolator.apply(scale, arguments);\\n}\\n\\nfunction divergingSqrt() {\\n return divergingPow.apply(null, arguments).exponent(0.5);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/colors.js\\n/* harmony default export */ var src_colors = (function(specifier) {\\n var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;\\n while (i < n) colors[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\\n return colors;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/categorical/category10.js\\n\\n\\n/* harmony default export */ var category10 = (src_colors(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/categorical/Accent.js\\n\\n\\n/* harmony default export */ var Accent = (src_colors(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/categorical/Dark2.js\\n\\n\\n/* harmony default export */ var Dark2 = (src_colors(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/categorical/Paired.js\\n\\n\\n/* harmony default export */ var Paired = (src_colors(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/categorical/Pastel1.js\\n\\n\\n/* harmony default export */ var Pastel1 = (src_colors(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/categorical/Pastel2.js\\n\\n\\n/* harmony default export */ var Pastel2 = (src_colors(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/categorical/Set1.js\\n\\n\\n/* harmony default export */ var Set1 = (src_colors(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/categorical/Set2.js\\n\\n\\n/* harmony default export */ var Set2 = (src_colors(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/categorical/Set3.js\\n\\n\\n/* harmony default export */ var Set3 = (src_colors(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/categorical/Tableau10.js\\n\\n\\n/* harmony default export */ var Tableau10 = (src_colors(\"4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/ramp.js\\n\\n\\n/* harmony default export */ var ramp = (function(scheme) {\\n return rgbBasis(scheme[scheme.length - 1]);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/diverging/BrBG.js\\n\\n\\n\\nvar BrBG_scheme = new Array(3).concat(\\n \"d8b365f5f5f55ab4ac\",\\n \"a6611adfc27d80cdc1018571\",\\n \"a6611adfc27df5f5f580cdc1018571\",\\n \"8c510ad8b365f6e8c3c7eae55ab4ac01665e\",\\n \"8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e\",\\n \"8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e\",\\n \"8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e\",\\n \"5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30\",\\n \"5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30\"\\n).map(src_colors);\\n\\n/* harmony default export */ var BrBG = (ramp(BrBG_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/diverging/PRGn.js\\n\\n\\n\\nvar PRGn_scheme = new Array(3).concat(\\n \"af8dc3f7f7f77fbf7b\",\\n \"7b3294c2a5cfa6dba0008837\",\\n \"7b3294c2a5cff7f7f7a6dba0008837\",\\n \"762a83af8dc3e7d4e8d9f0d37fbf7b1b7837\",\\n \"762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837\",\\n \"762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837\",\\n \"762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837\",\\n \"40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b\",\\n \"40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b\"\\n).map(src_colors);\\n\\n/* harmony default export */ var PRGn = (ramp(PRGn_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/diverging/PiYG.js\\n\\n\\n\\nvar PiYG_scheme = new Array(3).concat(\\n \"e9a3c9f7f7f7a1d76a\",\\n \"d01c8bf1b6dab8e1864dac26\",\\n \"d01c8bf1b6daf7f7f7b8e1864dac26\",\\n \"c51b7de9a3c9fde0efe6f5d0a1d76a4d9221\",\\n \"c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221\",\\n \"c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221\",\\n \"c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221\",\\n \"8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419\",\\n \"8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419\"\\n).map(src_colors);\\n\\n/* harmony default export */ var PiYG = (ramp(PiYG_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/diverging/PuOr.js\\n\\n\\n\\nvar PuOr_scheme = new Array(3).concat(\\n \"998ec3f7f7f7f1a340\",\\n \"5e3c99b2abd2fdb863e66101\",\\n \"5e3c99b2abd2f7f7f7fdb863e66101\",\\n \"542788998ec3d8daebfee0b6f1a340b35806\",\\n \"542788998ec3d8daebf7f7f7fee0b6f1a340b35806\",\\n \"5427888073acb2abd2d8daebfee0b6fdb863e08214b35806\",\\n \"5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806\",\\n \"2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08\",\\n \"2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08\"\\n).map(src_colors);\\n\\n/* harmony default export */ var PuOr = (ramp(PuOr_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/diverging/RdBu.js\\n\\n\\n\\nvar RdBu_scheme = new Array(3).concat(\\n \"ef8a62f7f7f767a9cf\",\\n \"ca0020f4a58292c5de0571b0\",\\n \"ca0020f4a582f7f7f792c5de0571b0\",\\n \"b2182bef8a62fddbc7d1e5f067a9cf2166ac\",\\n \"b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac\",\\n \"b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac\",\\n \"b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac\",\\n \"67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061\",\\n \"67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061\"\\n).map(src_colors);\\n\\n/* harmony default export */ var RdBu = (ramp(RdBu_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/diverging/RdGy.js\\n\\n\\n\\nvar RdGy_scheme = new Array(3).concat(\\n \"ef8a62ffffff999999\",\\n \"ca0020f4a582bababa404040\",\\n \"ca0020f4a582ffffffbababa404040\",\\n \"b2182bef8a62fddbc7e0e0e09999994d4d4d\",\\n \"b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d\",\\n \"b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d\",\\n \"b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d\",\\n \"67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a\",\\n \"67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a\"\\n).map(src_colors);\\n\\n/* harmony default export */ var RdGy = (ramp(RdGy_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js\\n\\n\\n\\nvar RdYlBu_scheme = new Array(3).concat(\\n \"fc8d59ffffbf91bfdb\",\\n \"d7191cfdae61abd9e92c7bb6\",\\n \"d7191cfdae61ffffbfabd9e92c7bb6\",\\n \"d73027fc8d59fee090e0f3f891bfdb4575b4\",\\n \"d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4\",\\n \"d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4\",\\n \"d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4\",\\n \"a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695\",\\n \"a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695\"\\n).map(src_colors);\\n\\n/* harmony default export */ var RdYlBu = (ramp(RdYlBu_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js\\n\\n\\n\\nvar RdYlGn_scheme = new Array(3).concat(\\n \"fc8d59ffffbf91cf60\",\\n \"d7191cfdae61a6d96a1a9641\",\\n \"d7191cfdae61ffffbfa6d96a1a9641\",\\n \"d73027fc8d59fee08bd9ef8b91cf601a9850\",\\n \"d73027fc8d59fee08bffffbfd9ef8b91cf601a9850\",\\n \"d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850\",\\n \"d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850\",\\n \"a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837\",\\n \"a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837\"\\n).map(src_colors);\\n\\n/* harmony default export */ var RdYlGn = (ramp(RdYlGn_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/diverging/Spectral.js\\n\\n\\n\\nvar Spectral_scheme = new Array(3).concat(\\n \"fc8d59ffffbf99d594\",\\n \"d7191cfdae61abdda42b83ba\",\\n \"d7191cfdae61ffffbfabdda42b83ba\",\\n \"d53e4ffc8d59fee08be6f59899d5943288bd\",\\n \"d53e4ffc8d59fee08bffffbfe6f59899d5943288bd\",\\n \"d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd\",\\n \"d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd\",\\n \"9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2\",\\n \"9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2\"\\n).map(src_colors);\\n\\n/* harmony default export */ var Spectral = (ramp(Spectral_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js\\n\\n\\n\\nvar BuGn_scheme = new Array(3).concat(\\n \"e5f5f999d8c92ca25f\",\\n \"edf8fbb2e2e266c2a4238b45\",\\n \"edf8fbb2e2e266c2a42ca25f006d2c\",\\n \"edf8fbccece699d8c966c2a42ca25f006d2c\",\\n \"edf8fbccece699d8c966c2a441ae76238b45005824\",\\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824\",\\n \"f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b\"\\n).map(src_colors);\\n\\n/* harmony default export */ var BuGn = (ramp(BuGn_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js\\n\\n\\n\\nvar BuPu_scheme = new Array(3).concat(\\n \"e0ecf49ebcda8856a7\",\\n \"edf8fbb3cde38c96c688419d\",\\n \"edf8fbb3cde38c96c68856a7810f7c\",\\n \"edf8fbbfd3e69ebcda8c96c68856a7810f7c\",\\n \"edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b\",\\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b\",\\n \"f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b\"\\n).map(src_colors);\\n\\n/* harmony default export */ var BuPu = (ramp(BuPu_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js\\n\\n\\n\\nvar GnBu_scheme = new Array(3).concat(\\n \"e0f3dba8ddb543a2ca\",\\n \"f0f9e8bae4bc7bccc42b8cbe\",\\n \"f0f9e8bae4bc7bccc443a2ca0868ac\",\\n \"f0f9e8ccebc5a8ddb57bccc443a2ca0868ac\",\\n \"f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e\",\\n \"f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081\"\\n).map(src_colors);\\n\\n/* harmony default export */ var GnBu = (ramp(GnBu_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js\\n\\n\\n\\nvar OrRd_scheme = new Array(3).concat(\\n \"fee8c8fdbb84e34a33\",\\n \"fef0d9fdcc8afc8d59d7301f\",\\n \"fef0d9fdcc8afc8d59e34a33b30000\",\\n \"fef0d9fdd49efdbb84fc8d59e34a33b30000\",\\n \"fef0d9fdd49efdbb84fc8d59ef6548d7301f990000\",\\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000\",\\n \"fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000\"\\n).map(src_colors);\\n\\n/* harmony default export */ var OrRd = (ramp(OrRd_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js\\n\\n\\n\\nvar PuBuGn_scheme = new Array(3).concat(\\n \"ece2f0a6bddb1c9099\",\\n \"f6eff7bdc9e167a9cf02818a\",\\n \"f6eff7bdc9e167a9cf1c9099016c59\",\\n \"f6eff7d0d1e6a6bddb67a9cf1c9099016c59\",\\n \"f6eff7d0d1e6a6bddb67a9cf3690c002818a016450\",\\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450\",\\n \"fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636\"\\n).map(src_colors);\\n\\n/* harmony default export */ var PuBuGn = (ramp(PuBuGn_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js\\n\\n\\n\\nvar PuBu_scheme = new Array(3).concat(\\n \"ece7f2a6bddb2b8cbe\",\\n \"f1eef6bdc9e174a9cf0570b0\",\\n \"f1eef6bdc9e174a9cf2b8cbe045a8d\",\\n \"f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d\",\\n \"f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b\",\\n \"fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858\"\\n).map(src_colors);\\n\\n/* harmony default export */ var PuBu = (ramp(PuBu_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js\\n\\n\\n\\nvar PuRd_scheme = new Array(3).concat(\\n \"e7e1efc994c7dd1c77\",\\n \"f1eef6d7b5d8df65b0ce1256\",\\n \"f1eef6d7b5d8df65b0dd1c77980043\",\\n \"f1eef6d4b9dac994c7df65b0dd1c77980043\",\\n \"f1eef6d4b9dac994c7df65b0e7298ace125691003f\",\\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f\",\\n \"f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f\"\\n).map(src_colors);\\n\\n/* harmony default export */ var PuRd = (ramp(PuRd_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js\\n\\n\\n\\nvar RdPu_scheme = new Array(3).concat(\\n \"fde0ddfa9fb5c51b8a\",\\n \"feebe2fbb4b9f768a1ae017e\",\\n \"feebe2fbb4b9f768a1c51b8a7a0177\",\\n \"feebe2fcc5c0fa9fb5f768a1c51b8a7a0177\",\\n \"feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177\",\\n \"fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a\"\\n).map(src_colors);\\n\\n/* harmony default export */ var RdPu = (ramp(RdPu_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js\\n\\n\\n\\nvar YlGnBu_scheme = new Array(3).concat(\\n \"edf8b17fcdbb2c7fb8\",\\n \"ffffcca1dab441b6c4225ea8\",\\n \"ffffcca1dab441b6c42c7fb8253494\",\\n \"ffffccc7e9b47fcdbb41b6c42c7fb8253494\",\\n \"ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84\",\\n \"ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58\"\\n).map(src_colors);\\n\\n/* harmony default export */ var YlGnBu = (ramp(YlGnBu_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js\\n\\n\\n\\nvar YlGn_scheme = new Array(3).concat(\\n \"f7fcb9addd8e31a354\",\\n \"ffffccc2e69978c679238443\",\\n \"ffffccc2e69978c67931a354006837\",\\n \"ffffccd9f0a3addd8e78c67931a354006837\",\\n \"ffffccd9f0a3addd8e78c67941ab5d238443005a32\",\\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32\",\\n \"ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529\"\\n).map(src_colors);\\n\\n/* harmony default export */ var YlGn = (ramp(YlGn_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js\\n\\n\\n\\nvar YlOrBr_scheme = new Array(3).concat(\\n \"fff7bcfec44fd95f0e\",\\n \"ffffd4fed98efe9929cc4c02\",\\n \"ffffd4fed98efe9929d95f0e993404\",\\n \"ffffd4fee391fec44ffe9929d95f0e993404\",\\n \"ffffd4fee391fec44ffe9929ec7014cc4c028c2d04\",\\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04\",\\n \"ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506\"\\n).map(src_colors);\\n\\n/* harmony default export */ var YlOrBr = (ramp(YlOrBr_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js\\n\\n\\n\\nvar YlOrRd_scheme = new Array(3).concat(\\n \"ffeda0feb24cf03b20\",\\n \"ffffb2fecc5cfd8d3ce31a1c\",\\n \"ffffb2fecc5cfd8d3cf03b20bd0026\",\\n \"ffffb2fed976feb24cfd8d3cf03b20bd0026\",\\n \"ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026\",\\n \"ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026\"\\n).map(src_colors);\\n\\n/* harmony default export */ var YlOrRd = (ramp(YlOrRd_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-single/Blues.js\\n\\n\\n\\nvar Blues_scheme = new Array(3).concat(\\n \"deebf79ecae13182bd\",\\n \"eff3ffbdd7e76baed62171b5\",\\n \"eff3ffbdd7e76baed63182bd08519c\",\\n \"eff3ffc6dbef9ecae16baed63182bd08519c\",\\n \"eff3ffc6dbef9ecae16baed64292c62171b5084594\",\\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594\",\\n \"f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b\"\\n).map(src_colors);\\n\\n/* harmony default export */ var Blues = (ramp(Blues_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-single/Greens.js\\n\\n\\n\\nvar Greens_scheme = new Array(3).concat(\\n \"e5f5e0a1d99b31a354\",\\n \"edf8e9bae4b374c476238b45\",\\n \"edf8e9bae4b374c47631a354006d2c\",\\n \"edf8e9c7e9c0a1d99b74c47631a354006d2c\",\\n \"edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32\",\\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32\",\\n \"f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b\"\\n).map(src_colors);\\n\\n/* harmony default export */ var Greens = (ramp(Greens_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-single/Greys.js\\n\\n\\n\\nvar Greys_scheme = new Array(3).concat(\\n \"f0f0f0bdbdbd636363\",\\n \"f7f7f7cccccc969696525252\",\\n \"f7f7f7cccccc969696636363252525\",\\n \"f7f7f7d9d9d9bdbdbd969696636363252525\",\\n \"f7f7f7d9d9d9bdbdbd969696737373525252252525\",\\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525\",\\n \"fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000\"\\n).map(src_colors);\\n\\n/* harmony default export */ var Greys = (ramp(Greys_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-single/Purples.js\\n\\n\\n\\nvar Purples_scheme = new Array(3).concat(\\n \"efedf5bcbddc756bb1\",\\n \"f2f0f7cbc9e29e9ac86a51a3\",\\n \"f2f0f7cbc9e29e9ac8756bb154278f\",\\n \"f2f0f7dadaebbcbddc9e9ac8756bb154278f\",\\n \"f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486\",\\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486\",\\n \"fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d\"\\n).map(src_colors);\\n\\n/* harmony default export */ var Purples = (ramp(Purples_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-single/Reds.js\\n\\n\\n\\nvar Reds_scheme = new Array(3).concat(\\n \"fee0d2fc9272de2d26\",\\n \"fee5d9fcae91fb6a4acb181d\",\\n \"fee5d9fcae91fb6a4ade2d26a50f15\",\\n \"fee5d9fcbba1fc9272fb6a4ade2d26a50f15\",\\n \"fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d\",\\n \"fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d\"\\n).map(src_colors);\\n\\n/* harmony default export */ var Reds = (ramp(Reds_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js\\n\\n\\n\\nvar Oranges_scheme = new Array(3).concat(\\n \"fee6cefdae6be6550d\",\\n \"feeddefdbe85fd8d3cd94701\",\\n \"feeddefdbe85fd8d3ce6550da63603\",\\n \"feeddefdd0a2fdae6bfd8d3ce6550da63603\",\\n \"feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04\",\\n \"fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704\"\\n).map(src_colors);\\n\\n/* harmony default export */ var Oranges = (ramp(Oranges_scheme));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/cividis.js\\n/* harmony default export */ var cividis = (function(t) {\\n t = Math.max(0, Math.min(1, t));\\n return \"rgb(\"\\n + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + \", \"\\n + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + \", \"\\n + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67)))))))\\n + \")\";\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js\\n\\n\\n\\n/* harmony default export */ var sequential_multi_cubehelix = (cubehelixLong(cubehelix_cubehelix(300, 0.5, 0.0), cubehelix_cubehelix(-240, 0.5, 1.0)));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js\\n\\n\\n\\nvar warm = cubehelixLong(cubehelix_cubehelix(-100, 0.75, 0.35), cubehelix_cubehelix(80, 1.50, 0.8));\\n\\nvar cool = cubehelixLong(cubehelix_cubehelix(260, 0.75, 0.35), cubehelix_cubehelix(80, 1.50, 0.8));\\n\\nvar rainbow_c = cubehelix_cubehelix();\\n\\n/* harmony default export */ var rainbow = (function(t) {\\n if (t < 0 || t > 1) t -= Math.floor(t);\\n var ts = Math.abs(t - 0.5);\\n rainbow_c.h = 360 * t - 100;\\n rainbow_c.s = 1.5 - 1.5 * ts;\\n rainbow_c.l = 0.8 - 0.9 * ts;\\n return rainbow_c + \"\";\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js\\n\\n\\nvar sinebow_c = color_rgb(),\\n pi_1_3 = Math.PI / 3,\\n pi_2_3 = Math.PI * 2 / 3;\\n\\n/* harmony default export */ var sinebow = (function(t) {\\n var x;\\n t = (0.5 - t) * Math.PI;\\n sinebow_c.r = 255 * (x = Math.sin(t)) * x;\\n sinebow_c.g = 255 * (x = Math.sin(t + pi_1_3)) * x;\\n sinebow_c.b = 255 * (x = Math.sin(t + pi_2_3)) * x;\\n return sinebow_c + \"\";\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/turbo.js\\n/* harmony default export */ var turbo = (function(t) {\\n t = Math.max(0, Math.min(1, t));\\n return \"rgb(\"\\n + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + \", \"\\n + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + \", \"\\n + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66)))))))\\n + \")\";\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js\\n\\n\\nfunction viridis_ramp(range) {\\n var n = range.length;\\n return function(t) {\\n return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\\n };\\n}\\n\\n/* harmony default export */ var viridis = (viridis_ramp(src_colors(\"44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725\")));\\n\\nvar magma = viridis_ramp(src_colors(\"00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf\"));\\n\\nvar inferno = viridis_ramp(src_colors(\"00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4\"));\\n\\nvar plasma = viridis_ramp(src_colors(\"0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921\"));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-scale-chromatic/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/create.js\\n\\n\\n\\n/* harmony default export */ var src_create = (function(name) {\\n return src_select(creator(name).call(document.documentElement));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/local.js\\nvar nextId = 0;\\n\\nfunction local_local() {\\n return new Local;\\n}\\n\\nfunction Local() {\\n this._ = \"@\" + (++nextId).toString(36);\\n}\\n\\nLocal.prototype = local_local.prototype = {\\n constructor: Local,\\n get: function(node) {\\n var id = this._;\\n while (!(id in node)) if (!(node = node.parentNode)) return;\\n return node[id];\\n },\\n set: function(node, value) {\\n return node[this._] = value;\\n },\\n remove: function(node) {\\n return this._ in node && delete node[this._];\\n },\\n toString: function() {\\n return this._;\\n }\\n};\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/selectAll.js\\n\\n\\n/* harmony default export */ var src_selectAll = (function(selector) {\\n return typeof selector === \"string\"\\n ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\\n : new Selection([selector == null ? [] : selector], selection_root);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/touches.js\\n\\n\\n\\n/* harmony default export */ var src_touches = (function(node, touches) {\\n if (touches == null) touches = sourceEvent().touches;\\n\\n for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {\\n points[i] = src_point(node, touches[i]);\\n }\\n\\n return points;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-selection/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/constant.js\\n/* harmony default export */ var d3_shape_src_constant = (function(x) {\\n return function constant() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/math.js\\nvar math_abs = Math.abs;\\nvar math_atan2 = Math.atan2;\\nvar src_math_cos = Math.cos;\\nvar src_math_max = Math.max;\\nvar math_min = Math.min;\\nvar src_math_sin = Math.sin;\\nvar math_sqrt = Math.sqrt;\\n\\nvar src_math_epsilon = 1e-12;\\nvar src_math_pi = Math.PI;\\nvar src_math_halfPi = src_math_pi / 2;\\nvar src_math_tau = 2 * src_math_pi;\\n\\nfunction math_acos(x) {\\n return x > 1 ? 0 : x < -1 ? src_math_pi : Math.acos(x);\\n}\\n\\nfunction math_asin(x) {\\n return x >= 1 ? src_math_halfPi : x <= -1 ? -src_math_halfPi : Math.asin(x);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/arc.js\\n\\n\\n\\n\\nfunction arcInnerRadius(d) {\\n return d.innerRadius;\\n}\\n\\nfunction arcOuterRadius(d) {\\n return d.outerRadius;\\n}\\n\\nfunction arcStartAngle(d) {\\n return d.startAngle;\\n}\\n\\nfunction arcEndAngle(d) {\\n return d.endAngle;\\n}\\n\\nfunction arcPadAngle(d) {\\n return d && d.padAngle; // Note: optional!\\n}\\n\\nfunction arc_intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\\n var x10 = x1 - x0, y10 = y1 - y0,\\n x32 = x3 - x2, y32 = y3 - y2,\\n t = y32 * x10 - x32 * y10;\\n if (t * t < src_math_epsilon) return;\\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\\n return [x0 + t * x10, y0 + t * y10];\\n}\\n\\n// Compute perpendicular offset line of length rc.\\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\\n var x01 = x0 - x1,\\n y01 = y0 - y1,\\n lo = (cw ? rc : -rc) / math_sqrt(x01 * x01 + y01 * y01),\\n ox = lo * y01,\\n oy = -lo * x01,\\n x11 = x0 + ox,\\n y11 = y0 + oy,\\n x10 = x1 + ox,\\n y10 = y1 + oy,\\n x00 = (x11 + x10) / 2,\\n y00 = (y11 + y10) / 2,\\n dx = x10 - x11,\\n dy = y10 - y11,\\n d2 = dx * dx + dy * dy,\\n r = r1 - rc,\\n D = x11 * y10 - x10 * y11,\\n d = (dy < 0 ? -1 : 1) * math_sqrt(src_math_max(0, r * r * d2 - D * D)),\\n cx0 = (D * dy - dx * d) / d2,\\n cy0 = (-D * dx - dy * d) / d2,\\n cx1 = (D * dy + dx * d) / d2,\\n cy1 = (-D * dx + dy * d) / d2,\\n dx0 = cx0 - x00,\\n dy0 = cy0 - y00,\\n dx1 = cx1 - x00,\\n dy1 = cy1 - y00;\\n\\n // Pick the closer of the two intersection points.\\n // TODO Is there a faster way to determine which intersection to use?\\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\\n\\n return {\\n cx: cx0,\\n cy: cy0,\\n x01: -ox,\\n y01: -oy,\\n x11: cx0 * (r1 / r - 1),\\n y11: cy0 * (r1 / r - 1)\\n };\\n}\\n\\n/* harmony default export */ var src_arc = (function() {\\n var innerRadius = arcInnerRadius,\\n outerRadius = arcOuterRadius,\\n cornerRadius = d3_shape_src_constant(0),\\n padRadius = null,\\n startAngle = arcStartAngle,\\n endAngle = arcEndAngle,\\n padAngle = arcPadAngle,\\n context = null;\\n\\n function arc() {\\n var buffer,\\n r,\\n r0 = +innerRadius.apply(this, arguments),\\n r1 = +outerRadius.apply(this, arguments),\\n a0 = startAngle.apply(this, arguments) - src_math_halfPi,\\n a1 = endAngle.apply(this, arguments) - src_math_halfPi,\\n da = math_abs(a1 - a0),\\n cw = a1 > a0;\\n\\n if (!context) context = buffer = src_path();\\n\\n // Ensure that the outer radius is always larger than the inner radius.\\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\\n\\n // Is it a point?\\n if (!(r1 > src_math_epsilon)) context.moveTo(0, 0);\\n\\n // Or is it a circle or annulus?\\n else if (da > src_math_tau - src_math_epsilon) {\\n context.moveTo(r1 * src_math_cos(a0), r1 * src_math_sin(a0));\\n context.arc(0, 0, r1, a0, a1, !cw);\\n if (r0 > src_math_epsilon) {\\n context.moveTo(r0 * src_math_cos(a1), r0 * src_math_sin(a1));\\n context.arc(0, 0, r0, a1, a0, cw);\\n }\\n }\\n\\n // Or is it a circular or annular sector?\\n else {\\n var a01 = a0,\\n a11 = a1,\\n a00 = a0,\\n a10 = a1,\\n da0 = da,\\n da1 = da,\\n ap = padAngle.apply(this, arguments) / 2,\\n rp = (ap > src_math_epsilon) && (padRadius ? +padRadius.apply(this, arguments) : math_sqrt(r0 * r0 + r1 * r1)),\\n rc = math_min(math_abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\\n rc0 = rc,\\n rc1 = rc,\\n t0,\\n t1;\\n\\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\\n if (rp > src_math_epsilon) {\\n var p0 = math_asin(rp / r0 * src_math_sin(ap)),\\n p1 = math_asin(rp / r1 * src_math_sin(ap));\\n if ((da0 -= p0 * 2) > src_math_epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\\n if ((da1 -= p1 * 2) > src_math_epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\\n }\\n\\n var x01 = r1 * src_math_cos(a01),\\n y01 = r1 * src_math_sin(a01),\\n x10 = r0 * src_math_cos(a10),\\n y10 = r0 * src_math_sin(a10);\\n\\n // Apply rounded corners?\\n if (rc > src_math_epsilon) {\\n var x11 = r1 * src_math_cos(a11),\\n y11 = r1 * src_math_sin(a11),\\n x00 = r0 * src_math_cos(a00),\\n y00 = r0 * src_math_sin(a00),\\n oc;\\n\\n // Restrict the corner radius according to the sector angle.\\n if (da < src_math_pi && (oc = arc_intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\\n var ax = x01 - oc[0],\\n ay = y01 - oc[1],\\n bx = x11 - oc[0],\\n by = y11 - oc[1],\\n kc = 1 / src_math_sin(math_acos((ax * bx + ay * by) / (math_sqrt(ax * ax + ay * ay) * math_sqrt(bx * bx + by * by))) / 2),\\n lc = math_sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\\n rc0 = math_min(rc, (r0 - lc) / (kc - 1));\\n rc1 = math_min(rc, (r1 - lc) / (kc + 1));\\n }\\n }\\n\\n // Is the sector collapsed to a line?\\n if (!(da1 > src_math_epsilon)) context.moveTo(x01, y01);\\n\\n // Does the sectors outer ring have rounded corners?\\n else if (rc1 > src_math_epsilon) {\\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\\n\\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\\n\\n // Have the corners merged?\\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, math_atan2(t0.y01, t0.x01), math_atan2(t1.y01, t1.x01), !cw);\\n\\n // Otherwise, draw the two corners and the ring.\\n else {\\n context.arc(t0.cx, t0.cy, rc1, math_atan2(t0.y01, t0.x01), math_atan2(t0.y11, t0.x11), !cw);\\n context.arc(0, 0, r1, math_atan2(t0.cy + t0.y11, t0.cx + t0.x11), math_atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\\n context.arc(t1.cx, t1.cy, rc1, math_atan2(t1.y11, t1.x11), math_atan2(t1.y01, t1.x01), !cw);\\n }\\n }\\n\\n // Or is the outer ring just a circular arc?\\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\\n\\n // Is there no inner ring, and its a circular sector?\\n // Or perhaps its an annular sector collapsed due to padding?\\n if (!(r0 > src_math_epsilon) || !(da0 > src_math_epsilon)) context.lineTo(x10, y10);\\n\\n // Does the sectors inner ring (or point) have rounded corners?\\n else if (rc0 > src_math_epsilon) {\\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\\n\\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\\n\\n // Have the corners merged?\\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, math_atan2(t0.y01, t0.x01), math_atan2(t1.y01, t1.x01), !cw);\\n\\n // Otherwise, draw the two corners and the ring.\\n else {\\n context.arc(t0.cx, t0.cy, rc0, math_atan2(t0.y01, t0.x01), math_atan2(t0.y11, t0.x11), !cw);\\n context.arc(0, 0, r0, math_atan2(t0.cy + t0.y11, t0.cx + t0.x11), math_atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\\n context.arc(t1.cx, t1.cy, rc0, math_atan2(t1.y11, t1.x11), math_atan2(t1.y01, t1.x01), !cw);\\n }\\n }\\n\\n // Or is the inner ring just a circular arc?\\n else context.arc(0, 0, r0, a10, a00, cw);\\n }\\n\\n context.closePath();\\n\\n if (buffer) return context = null, buffer + \"\" || null;\\n }\\n\\n arc.centroid = function() {\\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - src_math_pi / 2;\\n return [src_math_cos(a) * r, src_math_sin(a) * r];\\n };\\n\\n arc.innerRadius = function(_) {\\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), arc) : innerRadius;\\n };\\n\\n arc.outerRadius = function(_) {\\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), arc) : outerRadius;\\n };\\n\\n arc.cornerRadius = function(_) {\\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), arc) : cornerRadius;\\n };\\n\\n arc.padRadius = function(_) {\\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), arc) : padRadius;\\n };\\n\\n arc.startAngle = function(_) {\\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), arc) : startAngle;\\n };\\n\\n arc.endAngle = function(_) {\\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), arc) : endAngle;\\n };\\n\\n arc.padAngle = function(_) {\\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), arc) : padAngle;\\n };\\n\\n arc.context = function(_) {\\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\\n };\\n\\n return arc;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/linear.js\\nfunction Linear(context) {\\n this._context = context;\\n}\\n\\nLinear.prototype = {\\n areaStart: function() {\\n this._line = 0;\\n },\\n areaEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._point = 0;\\n },\\n lineEnd: function() {\\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\\n this._line = 1 - this._line;\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n switch (this._point) {\\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\\n case 1: this._point = 2; // proceed\\n default: this._context.lineTo(x, y); break;\\n }\\n }\\n};\\n\\n/* harmony default export */ var curve_linear = (function(context) {\\n return new Linear(context);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/point.js\\nfunction point_x(p) {\\n return p[0];\\n}\\n\\nfunction point_y(p) {\\n return p[1];\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/line.js\\n\\n\\n\\n\\n\\n/* harmony default export */ var src_line = (function() {\\n var x = point_x,\\n y = point_y,\\n defined = d3_shape_src_constant(true),\\n context = null,\\n curve = curve_linear,\\n output = null;\\n\\n function line(data) {\\n var i,\\n n = data.length,\\n d,\\n defined0 = false,\\n buffer;\\n\\n if (context == null) output = curve(buffer = src_path());\\n\\n for (i = 0; i <= n; ++i) {\\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\\n if (defined0 = !defined0) output.lineStart();\\n else output.lineEnd();\\n }\\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\\n }\\n\\n if (buffer) return output = null, buffer + \"\" || null;\\n }\\n\\n line.x = function(_) {\\n return arguments.length ? (x = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), line) : x;\\n };\\n\\n line.y = function(_) {\\n return arguments.length ? (y = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), line) : y;\\n };\\n\\n line.defined = function(_) {\\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : d3_shape_src_constant(!!_), line) : defined;\\n };\\n\\n line.curve = function(_) {\\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\\n };\\n\\n line.context = function(_) {\\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\\n };\\n\\n return line;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/area.js\\n\\n\\n\\n\\n\\n\\n/* harmony default export */ var d3_shape_src_area = (function() {\\n var x0 = point_x,\\n x1 = null,\\n y0 = d3_shape_src_constant(0),\\n y1 = point_y,\\n defined = d3_shape_src_constant(true),\\n context = null,\\n curve = curve_linear,\\n output = null;\\n\\n function area(data) {\\n var i,\\n j,\\n k,\\n n = data.length,\\n d,\\n defined0 = false,\\n buffer,\\n x0z = new Array(n),\\n y0z = new Array(n);\\n\\n if (context == null) output = curve(buffer = src_path());\\n\\n for (i = 0; i <= n; ++i) {\\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\\n if (defined0 = !defined0) {\\n j = i;\\n output.areaStart();\\n output.lineStart();\\n } else {\\n output.lineEnd();\\n output.lineStart();\\n for (k = i - 1; k >= j; --k) {\\n output.point(x0z[k], y0z[k]);\\n }\\n output.lineEnd();\\n output.areaEnd();\\n }\\n }\\n if (defined0) {\\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\\n }\\n }\\n\\n if (buffer) return output = null, buffer + \"\" || null;\\n }\\n\\n function arealine() {\\n return src_line().defined(defined).curve(curve).context(context);\\n }\\n\\n area.x = function(_) {\\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), x1 = null, area) : x0;\\n };\\n\\n area.x0 = function(_) {\\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), area) : x0;\\n };\\n\\n area.x1 = function(_) {\\n return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), area) : x1;\\n };\\n\\n area.y = function(_) {\\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), y1 = null, area) : y0;\\n };\\n\\n area.y0 = function(_) {\\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), area) : y0;\\n };\\n\\n area.y1 = function(_) {\\n return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), area) : y1;\\n };\\n\\n area.lineX0 =\\n area.lineY0 = function() {\\n return arealine().x(x0).y(y0);\\n };\\n\\n area.lineY1 = function() {\\n return arealine().x(x0).y(y1);\\n };\\n\\n area.lineX1 = function() {\\n return arealine().x(x1).y(y0);\\n };\\n\\n area.defined = function(_) {\\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : d3_shape_src_constant(!!_), area) : defined;\\n };\\n\\n area.curve = function(_) {\\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\\n };\\n\\n area.context = function(_) {\\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\\n };\\n\\n return area;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/descending.js\\n/* harmony default export */ var src_descending = (function(a, b) {\\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/identity.js\\n/* harmony default export */ var d3_shape_src_identity = (function(d) {\\n return d;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/pie.js\\n\\n\\n\\n\\n\\n/* harmony default export */ var src_pie = (function() {\\n var value = d3_shape_src_identity,\\n sortValues = src_descending,\\n sort = null,\\n startAngle = d3_shape_src_constant(0),\\n endAngle = d3_shape_src_constant(src_math_tau),\\n padAngle = d3_shape_src_constant(0);\\n\\n function pie(data) {\\n var i,\\n n = data.length,\\n j,\\n k,\\n sum = 0,\\n index = new Array(n),\\n arcs = new Array(n),\\n a0 = +startAngle.apply(this, arguments),\\n da = Math.min(src_math_tau, Math.max(-src_math_tau, endAngle.apply(this, arguments) - a0)),\\n a1,\\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\\n pa = p * (da < 0 ? -1 : 1),\\n v;\\n\\n for (i = 0; i < n; ++i) {\\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\\n sum += v;\\n }\\n }\\n\\n // Optionally sort the arcs by previously-computed values or by data.\\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\\n\\n // Compute the arcs! They are stored in the original data\\'s order.\\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\\n data: data[j],\\n index: i,\\n value: v,\\n startAngle: a0,\\n endAngle: a1,\\n padAngle: p\\n };\\n }\\n\\n return arcs;\\n }\\n\\n pie.value = function(_) {\\n return arguments.length ? (value = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), pie) : value;\\n };\\n\\n pie.sortValues = function(_) {\\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\\n };\\n\\n pie.sort = function(_) {\\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\\n };\\n\\n pie.startAngle = function(_) {\\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), pie) : startAngle;\\n };\\n\\n pie.endAngle = function(_) {\\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), pie) : endAngle;\\n };\\n\\n pie.padAngle = function(_) {\\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), pie) : padAngle;\\n };\\n\\n return pie;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/radial.js\\n\\n\\nvar curveRadialLinear = curveRadial(curve_linear);\\n\\nfunction Radial(curve) {\\n this._curve = curve;\\n}\\n\\nRadial.prototype = {\\n areaStart: function() {\\n this._curve.areaStart();\\n },\\n areaEnd: function() {\\n this._curve.areaEnd();\\n },\\n lineStart: function() {\\n this._curve.lineStart();\\n },\\n lineEnd: function() {\\n this._curve.lineEnd();\\n },\\n point: function(a, r) {\\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\\n }\\n};\\n\\nfunction curveRadial(curve) {\\n\\n function radial(context) {\\n return new Radial(curve(context));\\n }\\n\\n radial._curve = curve;\\n\\n return radial;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/lineRadial.js\\n\\n\\n\\nfunction lineRadial(l) {\\n var c = l.curve;\\n\\n l.angle = l.x, delete l.x;\\n l.radius = l.y, delete l.y;\\n\\n l.curve = function(_) {\\n return arguments.length ? c(curveRadial(_)) : c()._curve;\\n };\\n\\n return l;\\n}\\n\\n/* harmony default export */ var src_lineRadial = (function() {\\n return lineRadial(src_line().curve(curveRadialLinear));\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/areaRadial.js\\n\\n\\n\\n\\n/* harmony default export */ var areaRadial = (function() {\\n var a = d3_shape_src_area().curve(curveRadialLinear),\\n c = a.curve,\\n x0 = a.lineX0,\\n x1 = a.lineX1,\\n y0 = a.lineY0,\\n y1 = a.lineY1;\\n\\n a.angle = a.x, delete a.x;\\n a.startAngle = a.x0, delete a.x0;\\n a.endAngle = a.x1, delete a.x1;\\n a.radius = a.y, delete a.y;\\n a.innerRadius = a.y0, delete a.y0;\\n a.outerRadius = a.y1, delete a.y1;\\n a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;\\n a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;\\n a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;\\n a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;\\n\\n a.curve = function(_) {\\n return arguments.length ? c(curveRadial(_)) : c()._curve;\\n };\\n\\n return a;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/pointRadial.js\\n/* harmony default export */ var pointRadial = (function(x, y) {\\n return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/array.js\\nvar d3_shape_src_array_slice = Array.prototype.slice;\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/link/index.js\\n\\n\\n\\n\\n\\n\\nfunction linkSource(d) {\\n return d.source;\\n}\\n\\nfunction linkTarget(d) {\\n return d.target;\\n}\\n\\nfunction link_link(curve) {\\n var source = linkSource,\\n target = linkTarget,\\n x = point_x,\\n y = point_y,\\n context = null;\\n\\n function link() {\\n var buffer, argv = d3_shape_src_array_slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);\\n if (!context) context = buffer = src_path();\\n curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));\\n if (buffer) return context = null, buffer + \"\" || null;\\n }\\n\\n link.source = function(_) {\\n return arguments.length ? (source = _, link) : source;\\n };\\n\\n link.target = function(_) {\\n return arguments.length ? (target = _, link) : target;\\n };\\n\\n link.x = function(_) {\\n return arguments.length ? (x = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), link) : x;\\n };\\n\\n link.y = function(_) {\\n return arguments.length ? (y = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), link) : y;\\n };\\n\\n link.context = function(_) {\\n return arguments.length ? ((context = _ == null ? null : _), link) : context;\\n };\\n\\n return link;\\n}\\n\\nfunction curveHorizontal(context, x0, y0, x1, y1) {\\n context.moveTo(x0, y0);\\n context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);\\n}\\n\\nfunction curveVertical(context, x0, y0, x1, y1) {\\n context.moveTo(x0, y0);\\n context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);\\n}\\n\\nfunction link_curveRadial(context, x0, y0, x1, y1) {\\n var p0 = pointRadial(x0, y0),\\n p1 = pointRadial(x0, y0 = (y0 + y1) / 2),\\n p2 = pointRadial(x1, y0),\\n p3 = pointRadial(x1, y1);\\n context.moveTo(p0[0], p0[1]);\\n context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\\n}\\n\\nfunction linkHorizontal() {\\n return link_link(curveHorizontal);\\n}\\n\\nfunction linkVertical() {\\n return link_link(curveVertical);\\n}\\n\\nfunction linkRadial() {\\n var l = link_link(link_curveRadial);\\n l.angle = l.x, delete l.x;\\n l.radius = l.y, delete l.y;\\n return l;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/circle.js\\n\\n\\n/* harmony default export */ var symbol_circle = ({\\n draw: function(context, size) {\\n var r = Math.sqrt(size / src_math_pi);\\n context.moveTo(r, 0);\\n context.arc(0, 0, r, 0, src_math_tau);\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/cross.js\\n/* harmony default export */ var symbol_cross = ({\\n draw: function(context, size) {\\n var r = Math.sqrt(size / 5) / 2;\\n context.moveTo(-3 * r, -r);\\n context.lineTo(-r, -r);\\n context.lineTo(-r, -3 * r);\\n context.lineTo(r, -3 * r);\\n context.lineTo(r, -r);\\n context.lineTo(3 * r, -r);\\n context.lineTo(3 * r, r);\\n context.lineTo(r, r);\\n context.lineTo(r, 3 * r);\\n context.lineTo(-r, 3 * r);\\n context.lineTo(-r, r);\\n context.lineTo(-3 * r, r);\\n context.closePath();\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/diamond.js\\nvar tan30 = Math.sqrt(1 / 3),\\n tan30_2 = tan30 * 2;\\n\\n/* harmony default export */ var diamond = ({\\n draw: function(context, size) {\\n var y = Math.sqrt(size / tan30_2),\\n x = y * tan30;\\n context.moveTo(0, -y);\\n context.lineTo(x, 0);\\n context.lineTo(0, y);\\n context.lineTo(-x, 0);\\n context.closePath();\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/star.js\\n\\n\\nvar ka = 0.89081309152928522810,\\n kr = Math.sin(src_math_pi / 10) / Math.sin(7 * src_math_pi / 10),\\n star_kx = Math.sin(src_math_tau / 10) * kr,\\n star_ky = -Math.cos(src_math_tau / 10) * kr;\\n\\n/* harmony default export */ var star = ({\\n draw: function(context, size) {\\n var r = Math.sqrt(size * ka),\\n x = star_kx * r,\\n y = star_ky * r;\\n context.moveTo(0, -r);\\n context.lineTo(x, y);\\n for (var i = 1; i < 5; ++i) {\\n var a = src_math_tau * i / 5,\\n c = Math.cos(a),\\n s = Math.sin(a);\\n context.lineTo(s * r, -c * r);\\n context.lineTo(c * x - s * y, s * x + c * y);\\n }\\n context.closePath();\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/square.js\\n/* harmony default export */ var square = ({\\n draw: function(context, size) {\\n var w = Math.sqrt(size),\\n x = -w / 2;\\n context.rect(x, x, w, w);\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/triangle.js\\nvar sqrt3 = Math.sqrt(3);\\n\\n/* harmony default export */ var triangle = ({\\n draw: function(context, size) {\\n var y = -Math.sqrt(size / (sqrt3 * 3));\\n context.moveTo(0, y * 2);\\n context.lineTo(-sqrt3 * y, -y);\\n context.lineTo(sqrt3 * y, -y);\\n context.closePath();\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/wye.js\\nvar wye_c = -0.5,\\n wye_s = Math.sqrt(3) / 2,\\n wye_k = 1 / Math.sqrt(12),\\n wye_a = (wye_k / 2 + 1) * 3;\\n\\n/* harmony default export */ var wye = ({\\n draw: function(context, size) {\\n var r = Math.sqrt(size / wye_a),\\n x0 = r / 2,\\n y0 = r * wye_k,\\n x1 = x0,\\n y1 = r * wye_k + r,\\n x2 = -x1,\\n y2 = y1;\\n context.moveTo(x0, y0);\\n context.lineTo(x1, y1);\\n context.lineTo(x2, y2);\\n context.lineTo(wye_c * x0 - wye_s * y0, wye_s * x0 + wye_c * y0);\\n context.lineTo(wye_c * x1 - wye_s * y1, wye_s * x1 + wye_c * y1);\\n context.lineTo(wye_c * x2 - wye_s * y2, wye_s * x2 + wye_c * y2);\\n context.lineTo(wye_c * x0 + wye_s * y0, wye_c * y0 - wye_s * x0);\\n context.lineTo(wye_c * x1 + wye_s * y1, wye_c * y1 - wye_s * x1);\\n context.lineTo(wye_c * x2 + wye_s * y2, wye_c * y2 - wye_s * x2);\\n context.closePath();\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nvar symbols = [\\n symbol_circle,\\n symbol_cross,\\n diamond,\\n square,\\n star,\\n triangle,\\n wye\\n];\\n\\n/* harmony default export */ var src_symbol = (function() {\\n var type = d3_shape_src_constant(symbol_circle),\\n size = d3_shape_src_constant(64),\\n context = null;\\n\\n function symbol() {\\n var buffer;\\n if (!context) context = buffer = src_path();\\n type.apply(this, arguments).draw(context, +size.apply(this, arguments));\\n if (buffer) return context = null, buffer + \"\" || null;\\n }\\n\\n symbol.type = function(_) {\\n return arguments.length ? (type = typeof _ === \"function\" ? _ : d3_shape_src_constant(_), symbol) : type;\\n };\\n\\n symbol.size = function(_) {\\n return arguments.length ? (size = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), symbol) : size;\\n };\\n\\n symbol.context = function(_) {\\n return arguments.length ? (context = _ == null ? null : _, symbol) : context;\\n };\\n\\n return symbol;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/noop.js\\n/* harmony default export */ var d3_shape_src_noop = (function() {});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/basis.js\\nfunction basis_point(that, x, y) {\\n that._context.bezierCurveTo(\\n (2 * that._x0 + that._x1) / 3,\\n (2 * that._y0 + that._y1) / 3,\\n (that._x0 + 2 * that._x1) / 3,\\n (that._y0 + 2 * that._y1) / 3,\\n (that._x0 + 4 * that._x1 + x) / 6,\\n (that._y0 + 4 * that._y1 + y) / 6\\n );\\n}\\n\\nfunction Basis(context) {\\n this._context = context;\\n}\\n\\nBasis.prototype = {\\n areaStart: function() {\\n this._line = 0;\\n },\\n areaEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._x0 = this._x1 =\\n this._y0 = this._y1 = NaN;\\n this._point = 0;\\n },\\n lineEnd: function() {\\n switch (this._point) {\\n case 3: basis_point(this, this._x1, this._y1); // proceed\\n case 2: this._context.lineTo(this._x1, this._y1); break;\\n }\\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\\n this._line = 1 - this._line;\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n switch (this._point) {\\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\\n case 1: this._point = 2; break;\\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\\n default: basis_point(this, x, y); break;\\n }\\n this._x0 = this._x1, this._x1 = x;\\n this._y0 = this._y1, this._y1 = y;\\n }\\n};\\n\\n/* harmony default export */ var curve_basis = (function(context) {\\n return new Basis(context);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/basisClosed.js\\n\\n\\n\\nfunction BasisClosed(context) {\\n this._context = context;\\n}\\n\\nBasisClosed.prototype = {\\n areaStart: d3_shape_src_noop,\\n areaEnd: d3_shape_src_noop,\\n lineStart: function() {\\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\\n this._point = 0;\\n },\\n lineEnd: function() {\\n switch (this._point) {\\n case 1: {\\n this._context.moveTo(this._x2, this._y2);\\n this._context.closePath();\\n break;\\n }\\n case 2: {\\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\\n this._context.closePath();\\n break;\\n }\\n case 3: {\\n this.point(this._x2, this._y2);\\n this.point(this._x3, this._y3);\\n this.point(this._x4, this._y4);\\n break;\\n }\\n }\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n switch (this._point) {\\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\\n default: basis_point(this, x, y); break;\\n }\\n this._x0 = this._x1, this._x1 = x;\\n this._y0 = this._y1, this._y1 = y;\\n }\\n};\\n\\n/* harmony default export */ var curve_basisClosed = (function(context) {\\n return new BasisClosed(context);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/basisOpen.js\\n\\n\\nfunction BasisOpen(context) {\\n this._context = context;\\n}\\n\\nBasisOpen.prototype = {\\n areaStart: function() {\\n this._line = 0;\\n },\\n areaEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._x0 = this._x1 =\\n this._y0 = this._y1 = NaN;\\n this._point = 0;\\n },\\n lineEnd: function() {\\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\\n this._line = 1 - this._line;\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n switch (this._point) {\\n case 0: this._point = 1; break;\\n case 1: this._point = 2; break;\\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\\n case 3: this._point = 4; // proceed\\n default: basis_point(this, x, y); break;\\n }\\n this._x0 = this._x1, this._x1 = x;\\n this._y0 = this._y1, this._y1 = y;\\n }\\n};\\n\\n/* harmony default export */ var basisOpen = (function(context) {\\n return new BasisOpen(context);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/bundle.js\\n\\n\\nfunction Bundle(context, beta) {\\n this._basis = new Basis(context);\\n this._beta = beta;\\n}\\n\\nBundle.prototype = {\\n lineStart: function() {\\n this._x = [];\\n this._y = [];\\n this._basis.lineStart();\\n },\\n lineEnd: function() {\\n var x = this._x,\\n y = this._y,\\n j = x.length - 1;\\n\\n if (j > 0) {\\n var x0 = x[0],\\n y0 = y[0],\\n dx = x[j] - x0,\\n dy = y[j] - y0,\\n i = -1,\\n t;\\n\\n while (++i <= j) {\\n t = i / j;\\n this._basis.point(\\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\\n );\\n }\\n }\\n\\n this._x = this._y = null;\\n this._basis.lineEnd();\\n },\\n point: function(x, y) {\\n this._x.push(+x);\\n this._y.push(+y);\\n }\\n};\\n\\n/* harmony default export */ var curve_bundle = ((function custom(beta) {\\n\\n function bundle(context) {\\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\\n }\\n\\n bundle.beta = function(beta) {\\n return custom(+beta);\\n };\\n\\n return bundle;\\n})(0.85));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/cardinal.js\\nfunction cardinal_point(that, x, y) {\\n that._context.bezierCurveTo(\\n that._x1 + that._k * (that._x2 - that._x0),\\n that._y1 + that._k * (that._y2 - that._y0),\\n that._x2 + that._k * (that._x1 - x),\\n that._y2 + that._k * (that._y1 - y),\\n that._x2,\\n that._y2\\n );\\n}\\n\\nfunction Cardinal(context, tension) {\\n this._context = context;\\n this._k = (1 - tension) / 6;\\n}\\n\\nCardinal.prototype = {\\n areaStart: function() {\\n this._line = 0;\\n },\\n areaEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._x0 = this._x1 = this._x2 =\\n this._y0 = this._y1 = this._y2 = NaN;\\n this._point = 0;\\n },\\n lineEnd: function() {\\n switch (this._point) {\\n case 2: this._context.lineTo(this._x2, this._y2); break;\\n case 3: cardinal_point(this, this._x1, this._y1); break;\\n }\\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\\n this._line = 1 - this._line;\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n switch (this._point) {\\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\\n case 2: this._point = 3; // proceed\\n default: cardinal_point(this, x, y); break;\\n }\\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\\n }\\n};\\n\\n/* harmony default export */ var cardinal = ((function custom(tension) {\\n\\n function cardinal(context) {\\n return new Cardinal(context, tension);\\n }\\n\\n cardinal.tension = function(tension) {\\n return custom(+tension);\\n };\\n\\n return cardinal;\\n})(0));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/cardinalClosed.js\\n\\n\\n\\nfunction CardinalClosed(context, tension) {\\n this._context = context;\\n this._k = (1 - tension) / 6;\\n}\\n\\nCardinalClosed.prototype = {\\n areaStart: d3_shape_src_noop,\\n areaEnd: d3_shape_src_noop,\\n lineStart: function() {\\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\\n this._point = 0;\\n },\\n lineEnd: function() {\\n switch (this._point) {\\n case 1: {\\n this._context.moveTo(this._x3, this._y3);\\n this._context.closePath();\\n break;\\n }\\n case 2: {\\n this._context.lineTo(this._x3, this._y3);\\n this._context.closePath();\\n break;\\n }\\n case 3: {\\n this.point(this._x3, this._y3);\\n this.point(this._x4, this._y4);\\n this.point(this._x5, this._y5);\\n break;\\n }\\n }\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n switch (this._point) {\\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\\n default: cardinal_point(this, x, y); break;\\n }\\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\\n }\\n};\\n\\n/* harmony default export */ var cardinalClosed = ((function custom(tension) {\\n\\n function cardinal(context) {\\n return new CardinalClosed(context, tension);\\n }\\n\\n cardinal.tension = function(tension) {\\n return custom(+tension);\\n };\\n\\n return cardinal;\\n})(0));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/cardinalOpen.js\\n\\n\\nfunction CardinalOpen(context, tension) {\\n this._context = context;\\n this._k = (1 - tension) / 6;\\n}\\n\\nCardinalOpen.prototype = {\\n areaStart: function() {\\n this._line = 0;\\n },\\n areaEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._x0 = this._x1 = this._x2 =\\n this._y0 = this._y1 = this._y2 = NaN;\\n this._point = 0;\\n },\\n lineEnd: function() {\\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\\n this._line = 1 - this._line;\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n switch (this._point) {\\n case 0: this._point = 1; break;\\n case 1: this._point = 2; break;\\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\\n case 3: this._point = 4; // proceed\\n default: cardinal_point(this, x, y); break;\\n }\\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\\n }\\n};\\n\\n/* harmony default export */ var cardinalOpen = ((function custom(tension) {\\n\\n function cardinal(context) {\\n return new CardinalOpen(context, tension);\\n }\\n\\n cardinal.tension = function(tension) {\\n return custom(+tension);\\n };\\n\\n return cardinal;\\n})(0));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/catmullRom.js\\n\\n\\n\\nfunction catmullRom_point(that, x, y) {\\n var x1 = that._x1,\\n y1 = that._y1,\\n x2 = that._x2,\\n y2 = that._y2;\\n\\n if (that._l01_a > src_math_epsilon) {\\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\\n }\\n\\n if (that._l23_a > src_math_epsilon) {\\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\\n }\\n\\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\\n}\\n\\nfunction CatmullRom(context, alpha) {\\n this._context = context;\\n this._alpha = alpha;\\n}\\n\\nCatmullRom.prototype = {\\n areaStart: function() {\\n this._line = 0;\\n },\\n areaEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._x0 = this._x1 = this._x2 =\\n this._y0 = this._y1 = this._y2 = NaN;\\n this._l01_a = this._l12_a = this._l23_a =\\n this._l01_2a = this._l12_2a = this._l23_2a =\\n this._point = 0;\\n },\\n lineEnd: function() {\\n switch (this._point) {\\n case 2: this._context.lineTo(this._x2, this._y2); break;\\n case 3: this.point(this._x2, this._y2); break;\\n }\\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\\n this._line = 1 - this._line;\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n\\n if (this._point) {\\n var x23 = this._x2 - x,\\n y23 = this._y2 - y;\\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\\n }\\n\\n switch (this._point) {\\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\\n case 1: this._point = 2; break;\\n case 2: this._point = 3; // proceed\\n default: catmullRom_point(this, x, y); break;\\n }\\n\\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\\n }\\n};\\n\\n/* harmony default export */ var curve_catmullRom = ((function custom(alpha) {\\n\\n function catmullRom(context) {\\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\\n }\\n\\n catmullRom.alpha = function(alpha) {\\n return custom(+alpha);\\n };\\n\\n return catmullRom;\\n})(0.5));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/catmullRomClosed.js\\n\\n\\n\\n\\nfunction CatmullRomClosed(context, alpha) {\\n this._context = context;\\n this._alpha = alpha;\\n}\\n\\nCatmullRomClosed.prototype = {\\n areaStart: d3_shape_src_noop,\\n areaEnd: d3_shape_src_noop,\\n lineStart: function() {\\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\\n this._l01_a = this._l12_a = this._l23_a =\\n this._l01_2a = this._l12_2a = this._l23_2a =\\n this._point = 0;\\n },\\n lineEnd: function() {\\n switch (this._point) {\\n case 1: {\\n this._context.moveTo(this._x3, this._y3);\\n this._context.closePath();\\n break;\\n }\\n case 2: {\\n this._context.lineTo(this._x3, this._y3);\\n this._context.closePath();\\n break;\\n }\\n case 3: {\\n this.point(this._x3, this._y3);\\n this.point(this._x4, this._y4);\\n this.point(this._x5, this._y5);\\n break;\\n }\\n }\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n\\n if (this._point) {\\n var x23 = this._x2 - x,\\n y23 = this._y2 - y;\\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\\n }\\n\\n switch (this._point) {\\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\\n default: catmullRom_point(this, x, y); break;\\n }\\n\\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\\n }\\n};\\n\\n/* harmony default export */ var catmullRomClosed = ((function custom(alpha) {\\n\\n function catmullRom(context) {\\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\\n }\\n\\n catmullRom.alpha = function(alpha) {\\n return custom(+alpha);\\n };\\n\\n return catmullRom;\\n})(0.5));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/catmullRomOpen.js\\n\\n\\n\\nfunction CatmullRomOpen(context, alpha) {\\n this._context = context;\\n this._alpha = alpha;\\n}\\n\\nCatmullRomOpen.prototype = {\\n areaStart: function() {\\n this._line = 0;\\n },\\n areaEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._x0 = this._x1 = this._x2 =\\n this._y0 = this._y1 = this._y2 = NaN;\\n this._l01_a = this._l12_a = this._l23_a =\\n this._l01_2a = this._l12_2a = this._l23_2a =\\n this._point = 0;\\n },\\n lineEnd: function() {\\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\\n this._line = 1 - this._line;\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n\\n if (this._point) {\\n var x23 = this._x2 - x,\\n y23 = this._y2 - y;\\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\\n }\\n\\n switch (this._point) {\\n case 0: this._point = 1; break;\\n case 1: this._point = 2; break;\\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\\n case 3: this._point = 4; // proceed\\n default: catmullRom_point(this, x, y); break;\\n }\\n\\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\\n }\\n};\\n\\n/* harmony default export */ var catmullRomOpen = ((function custom(alpha) {\\n\\n function catmullRom(context) {\\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\\n }\\n\\n catmullRom.alpha = function(alpha) {\\n return custom(+alpha);\\n };\\n\\n return catmullRom;\\n})(0.5));\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/linearClosed.js\\n\\n\\nfunction LinearClosed(context) {\\n this._context = context;\\n}\\n\\nLinearClosed.prototype = {\\n areaStart: d3_shape_src_noop,\\n areaEnd: d3_shape_src_noop,\\n lineStart: function() {\\n this._point = 0;\\n },\\n lineEnd: function() {\\n if (this._point) this._context.closePath();\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n if (this._point) this._context.lineTo(x, y);\\n else this._point = 1, this._context.moveTo(x, y);\\n }\\n};\\n\\n/* harmony default export */ var linearClosed = (function(context) {\\n return new LinearClosed(context);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/monotone.js\\nfunction monotone_sign(x) {\\n return x < 0 ? -1 : 1;\\n}\\n\\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\\n// NOV(II), P. 443, 1990.\\nfunction slope3(that, x2, y2) {\\n var h0 = that._x1 - that._x0,\\n h1 = x2 - that._x1,\\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\\n return (monotone_sign(s0) + monotone_sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\\n}\\n\\n// Calculate a one-sided slope.\\nfunction slope2(that, t) {\\n var h = that._x1 - that._x0;\\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\\n}\\n\\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\\nfunction monotone_point(that, t0, t1) {\\n var x0 = that._x0,\\n y0 = that._y0,\\n x1 = that._x1,\\n y1 = that._y1,\\n dx = (x1 - x0) / 3;\\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\\n}\\n\\nfunction MonotoneX(context) {\\n this._context = context;\\n}\\n\\nMonotoneX.prototype = {\\n areaStart: function() {\\n this._line = 0;\\n },\\n areaEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._x0 = this._x1 =\\n this._y0 = this._y1 =\\n this._t0 = NaN;\\n this._point = 0;\\n },\\n lineEnd: function() {\\n switch (this._point) {\\n case 2: this._context.lineTo(this._x1, this._y1); break;\\n case 3: monotone_point(this, this._t0, slope2(this, this._t0)); break;\\n }\\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\\n this._line = 1 - this._line;\\n },\\n point: function(x, y) {\\n var t1 = NaN;\\n\\n x = +x, y = +y;\\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\\n switch (this._point) {\\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\\n case 1: this._point = 2; break;\\n case 2: this._point = 3; monotone_point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\\n default: monotone_point(this, this._t0, t1 = slope3(this, x, y)); break;\\n }\\n\\n this._x0 = this._x1, this._x1 = x;\\n this._y0 = this._y1, this._y1 = y;\\n this._t0 = t1;\\n }\\n}\\n\\nfunction MonotoneY(context) {\\n this._context = new ReflectContext(context);\\n}\\n\\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\\n MonotoneX.prototype.point.call(this, y, x);\\n};\\n\\nfunction ReflectContext(context) {\\n this._context = context;\\n}\\n\\nReflectContext.prototype = {\\n moveTo: function(x, y) { this._context.moveTo(y, x); },\\n closePath: function() { this._context.closePath(); },\\n lineTo: function(x, y) { this._context.lineTo(y, x); },\\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\\n};\\n\\nfunction monotoneX(context) {\\n return new MonotoneX(context);\\n}\\n\\nfunction monotoneY(context) {\\n return new MonotoneY(context);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/natural.js\\nfunction Natural(context) {\\n this._context = context;\\n}\\n\\nNatural.prototype = {\\n areaStart: function() {\\n this._line = 0;\\n },\\n areaEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._x = [];\\n this._y = [];\\n },\\n lineEnd: function() {\\n var x = this._x,\\n y = this._y,\\n n = x.length;\\n\\n if (n) {\\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\\n if (n === 2) {\\n this._context.lineTo(x[1], y[1]);\\n } else {\\n var px = controlPoints(x),\\n py = controlPoints(y);\\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\\n }\\n }\\n }\\n\\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\\n this._line = 1 - this._line;\\n this._x = this._y = null;\\n },\\n point: function(x, y) {\\n this._x.push(+x);\\n this._y.push(+y);\\n }\\n};\\n\\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\\nfunction controlPoints(x) {\\n var i,\\n n = x.length - 1,\\n m,\\n a = new Array(n),\\n b = new Array(n),\\n r = new Array(n);\\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\\n a[n - 1] = r[n - 1] / b[n - 1];\\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\\n b[n - 1] = (x[n] + a[n - 1]) / 2;\\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\\n return [a, b];\\n}\\n\\n/* harmony default export */ var natural = (function(context) {\\n return new Natural(context);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/step.js\\nfunction Step(context, t) {\\n this._context = context;\\n this._t = t;\\n}\\n\\nStep.prototype = {\\n areaStart: function() {\\n this._line = 0;\\n },\\n areaEnd: function() {\\n this._line = NaN;\\n },\\n lineStart: function() {\\n this._x = this._y = NaN;\\n this._point = 0;\\n },\\n lineEnd: function() {\\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\\n },\\n point: function(x, y) {\\n x = +x, y = +y;\\n switch (this._point) {\\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\\n case 1: this._point = 2; // proceed\\n default: {\\n if (this._t <= 0) {\\n this._context.lineTo(this._x, y);\\n this._context.lineTo(x, y);\\n } else {\\n var x1 = this._x * (1 - this._t) + x * this._t;\\n this._context.lineTo(x1, this._y);\\n this._context.lineTo(x1, y);\\n }\\n break;\\n }\\n }\\n this._x = x, this._y = y;\\n }\\n};\\n\\n/* harmony default export */ var curve_step = (function(context) {\\n return new Step(context, 0.5);\\n});\\n\\nfunction stepBefore(context) {\\n return new Step(context, 0);\\n}\\n\\nfunction stepAfter(context) {\\n return new Step(context, 1);\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/offset/none.js\\n/* harmony default export */ var offset_none = (function(series, order) {\\n if (!((n = series.length) > 1)) return;\\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\\n s0 = s1, s1 = series[order[i]];\\n for (j = 0; j < m; ++j) {\\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\\n }\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/none.js\\n/* harmony default export */ var order_none = (function(series) {\\n var n = series.length, o = new Array(n);\\n while (--n >= 0) o[n] = n;\\n return o;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/stack.js\\n\\n\\n\\n\\n\\nfunction stackValue(d, key) {\\n return d[key];\\n}\\n\\n/* harmony default export */ var src_stack = (function() {\\n var keys = d3_shape_src_constant([]),\\n order = order_none,\\n offset = offset_none,\\n value = stackValue;\\n\\n function stack(data) {\\n var kz = keys.apply(this, arguments),\\n i,\\n m = data.length,\\n n = kz.length,\\n sz = new Array(n),\\n oz;\\n\\n for (i = 0; i < n; ++i) {\\n for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\\n si[j] = sij = [0, +value(data[j], ki, j, data)];\\n sij.data = data[j];\\n }\\n si.key = ki;\\n }\\n\\n for (i = 0, oz = order(sz); i < n; ++i) {\\n sz[oz[i]].index = i;\\n }\\n\\n offset(sz, oz);\\n return sz;\\n }\\n\\n stack.keys = function(_) {\\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : d3_shape_src_constant(d3_shape_src_array_slice.call(_)), stack) : keys;\\n };\\n\\n stack.value = function(_) {\\n return arguments.length ? (value = typeof _ === \"function\" ? _ : d3_shape_src_constant(+_), stack) : value;\\n };\\n\\n stack.order = function(_) {\\n return arguments.length ? (order = _ == null ? order_none : typeof _ === \"function\" ? _ : d3_shape_src_constant(d3_shape_src_array_slice.call(_)), stack) : order;\\n };\\n\\n stack.offset = function(_) {\\n return arguments.length ? (offset = _ == null ? offset_none : _, stack) : offset;\\n };\\n\\n return stack;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/offset/expand.js\\n\\n\\n/* harmony default export */ var expand = (function(series, order) {\\n if (!((n = series.length) > 0)) return;\\n for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\\n for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\\n if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\\n }\\n offset_none(series, order);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/offset/diverging.js\\n/* harmony default export */ var offset_diverging = (function(series, order) {\\n if (!((n = series.length) > 0)) return;\\n for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\\n for (yp = yn = 0, i = 0; i < n; ++i) {\\n if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) {\\n d[0] = yp, d[1] = yp += dy;\\n } else if (dy < 0) {\\n d[1] = yn, d[0] = yn += dy;\\n } else {\\n d[0] = 0, d[1] = dy;\\n }\\n }\\n }\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/offset/silhouette.js\\n\\n\\n/* harmony default export */ var silhouette = (function(series, order) {\\n if (!((n = series.length) > 0)) return;\\n for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\\n for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\\n s0[j][1] += s0[j][0] = -y / 2;\\n }\\n offset_none(series, order);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/offset/wiggle.js\\n\\n\\n/* harmony default export */ var wiggle = (function(series, order) {\\n if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\\n for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\\n for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\\n var si = series[order[i]],\\n sij0 = si[j][1] || 0,\\n sij1 = si[j - 1][1] || 0,\\n s3 = (sij0 - sij1) / 2;\\n for (var k = 0; k < i; ++k) {\\n var sk = series[order[k]],\\n skj0 = sk[j][1] || 0,\\n skj1 = sk[j - 1][1] || 0;\\n s3 += skj0 - skj1;\\n }\\n s1 += sij0, s2 += s3 * sij0;\\n }\\n s0[j - 1][1] += s0[j - 1][0] = y;\\n if (s1) y -= s2 / s1;\\n }\\n s0[j - 1][1] += s0[j - 1][0] = y;\\n offset_none(series, order);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/appearance.js\\n\\n\\n/* harmony default export */ var appearance = (function(series) {\\n var peaks = series.map(peak);\\n return order_none(series).sort(function(a, b) { return peaks[a] - peaks[b]; });\\n});\\n\\nfunction peak(series) {\\n var i = -1, j = 0, n = series.length, vi, vj = -Infinity;\\n while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;\\n return j;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/ascending.js\\n\\n\\n/* harmony default export */ var order_ascending = (function(series) {\\n var sums = series.map(ascending_sum);\\n return order_none(series).sort(function(a, b) { return sums[a] - sums[b]; });\\n});\\n\\nfunction ascending_sum(series) {\\n var s = 0, i = -1, n = series.length, v;\\n while (++i < n) if (v = +series[i][1]) s += v;\\n return s;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/descending.js\\n\\n\\n/* harmony default export */ var order_descending = (function(series) {\\n return order_ascending(series).reverse();\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/insideOut.js\\n\\n\\n\\n/* harmony default export */ var insideOut = (function(series) {\\n var n = series.length,\\n i,\\n j,\\n sums = series.map(ascending_sum),\\n order = appearance(series),\\n top = 0,\\n bottom = 0,\\n tops = [],\\n bottoms = [];\\n\\n for (i = 0; i < n; ++i) {\\n j = order[i];\\n if (top < bottom) {\\n top += sums[j];\\n tops.push(j);\\n } else {\\n bottom += sums[j];\\n bottoms.push(j);\\n }\\n }\\n\\n return bottoms.reverse().concat(tops);\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/reverse.js\\n\\n\\n/* harmony default export */ var order_reverse = (function(series) {\\n return order_none(series).reverse();\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-shape/src/index.js\\n\\n\\n\\n\\n // Note: radialArea is deprecated!\\n // Note: radialLine is deprecated!\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time/src/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time-format/src/isoFormat.js\\n\\n\\nvar isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\\n\\nfunction formatIsoNative(date) {\\n return date.toISOString();\\n}\\n\\nvar formatIso = Date.prototype.toISOString\\n ? formatIsoNative\\n : utcFormat(isoSpecifier);\\n\\n/* harmony default export */ var isoFormat = (formatIso);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time-format/src/isoParse.js\\n\\n\\n\\nfunction parseIsoNative(string) {\\n var date = new Date(string);\\n return isNaN(date) ? null : date;\\n}\\n\\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\\n ? parseIsoNative\\n : utcParse(isoSpecifier);\\n\\n/* harmony default export */ var isoParse = (parseIso);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-time-format/src/index.js\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-timer/src/interval.js\\n\\n\\n/* harmony default export */ var src_interval = (function(callback, delay, time) {\\n var t = new Timer, total = delay;\\n if (delay == null) return t.restart(callback, delay, time), t;\\n delay = +delay, time = time == null ? now() : +time;\\n t.restart(function tick(elapsed) {\\n elapsed += total;\\n t.restart(tick, total += delay, time);\\n callback(elapsed);\\n }, delay, time);\\n return t;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-timer/src/index.js\\n\\n\\n\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-voronoi/src/constant.js\\n/* harmony default export */ var d3_voronoi_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-voronoi/src/point.js\\nfunction src_point_x(d) {\\n return d[0];\\n}\\n\\nfunction src_point_y(d) {\\n return d[1];\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-voronoi/src/RedBlackTree.js\\nfunction RedBlackTree() {\\n this._ = null; // root node\\n}\\n\\nfunction RedBlackNode(node) {\\n node.U = // parent node\\n node.C = // color - true for red, false for black\\n node.L = // left node\\n node.R = // right node\\n node.P = // previous node\\n node.N = null; // next node\\n}\\n\\nRedBlackTree.prototype = {\\n constructor: RedBlackTree,\\n\\n insert: function(after, node) {\\n var parent, grandpa, uncle;\\n\\n if (after) {\\n node.P = after;\\n node.N = after.N;\\n if (after.N) after.N.P = node;\\n after.N = node;\\n if (after.R) {\\n after = after.R;\\n while (after.L) after = after.L;\\n after.L = node;\\n } else {\\n after.R = node;\\n }\\n parent = after;\\n } else if (this._) {\\n after = RedBlackFirst(this._);\\n node.P = null;\\n node.N = after;\\n after.P = after.L = node;\\n parent = after;\\n } else {\\n node.P = node.N = null;\\n this._ = node;\\n parent = null;\\n }\\n node.L = node.R = null;\\n node.U = parent;\\n node.C = true;\\n\\n after = node;\\n while (parent && parent.C) {\\n grandpa = parent.U;\\n if (parent === grandpa.L) {\\n uncle = grandpa.R;\\n if (uncle && uncle.C) {\\n parent.C = uncle.C = false;\\n grandpa.C = true;\\n after = grandpa;\\n } else {\\n if (after === parent.R) {\\n RedBlackRotateLeft(this, parent);\\n after = parent;\\n parent = after.U;\\n }\\n parent.C = false;\\n grandpa.C = true;\\n RedBlackRotateRight(this, grandpa);\\n }\\n } else {\\n uncle = grandpa.L;\\n if (uncle && uncle.C) {\\n parent.C = uncle.C = false;\\n grandpa.C = true;\\n after = grandpa;\\n } else {\\n if (after === parent.L) {\\n RedBlackRotateRight(this, parent);\\n after = parent;\\n parent = after.U;\\n }\\n parent.C = false;\\n grandpa.C = true;\\n RedBlackRotateLeft(this, grandpa);\\n }\\n }\\n parent = after.U;\\n }\\n this._.C = false;\\n },\\n\\n remove: function(node) {\\n if (node.N) node.N.P = node.P;\\n if (node.P) node.P.N = node.N;\\n node.N = node.P = null;\\n\\n var parent = node.U,\\n sibling,\\n left = node.L,\\n right = node.R,\\n next,\\n red;\\n\\n if (!left) next = right;\\n else if (!right) next = left;\\n else next = RedBlackFirst(right);\\n\\n if (parent) {\\n if (parent.L === node) parent.L = next;\\n else parent.R = next;\\n } else {\\n this._ = next;\\n }\\n\\n if (left && right) {\\n red = next.C;\\n next.C = node.C;\\n next.L = left;\\n left.U = next;\\n if (next !== right) {\\n parent = next.U;\\n next.U = node.U;\\n node = next.R;\\n parent.L = node;\\n next.R = right;\\n right.U = next;\\n } else {\\n next.U = parent;\\n parent = next;\\n node = next.R;\\n }\\n } else {\\n red = node.C;\\n node = next;\\n }\\n\\n if (node) node.U = parent;\\n if (red) return;\\n if (node && node.C) { node.C = false; return; }\\n\\n do {\\n if (node === this._) break;\\n if (node === parent.L) {\\n sibling = parent.R;\\n if (sibling.C) {\\n sibling.C = false;\\n parent.C = true;\\n RedBlackRotateLeft(this, parent);\\n sibling = parent.R;\\n }\\n if ((sibling.L && sibling.L.C)\\n || (sibling.R && sibling.R.C)) {\\n if (!sibling.R || !sibling.R.C) {\\n sibling.L.C = false;\\n sibling.C = true;\\n RedBlackRotateRight(this, sibling);\\n sibling = parent.R;\\n }\\n sibling.C = parent.C;\\n parent.C = sibling.R.C = false;\\n RedBlackRotateLeft(this, parent);\\n node = this._;\\n break;\\n }\\n } else {\\n sibling = parent.L;\\n if (sibling.C) {\\n sibling.C = false;\\n parent.C = true;\\n RedBlackRotateRight(this, parent);\\n sibling = parent.L;\\n }\\n if ((sibling.L && sibling.L.C)\\n || (sibling.R && sibling.R.C)) {\\n if (!sibling.L || !sibling.L.C) {\\n sibling.R.C = false;\\n sibling.C = true;\\n RedBlackRotateLeft(this, sibling);\\n sibling = parent.L;\\n }\\n sibling.C = parent.C;\\n parent.C = sibling.L.C = false;\\n RedBlackRotateRight(this, parent);\\n node = this._;\\n break;\\n }\\n }\\n sibling.C = true;\\n node = parent;\\n parent = parent.U;\\n } while (!node.C);\\n\\n if (node) node.C = false;\\n }\\n};\\n\\nfunction RedBlackRotateLeft(tree, node) {\\n var p = node,\\n q = node.R,\\n parent = p.U;\\n\\n if (parent) {\\n if (parent.L === p) parent.L = q;\\n else parent.R = q;\\n } else {\\n tree._ = q;\\n }\\n\\n q.U = parent;\\n p.U = q;\\n p.R = q.L;\\n if (p.R) p.R.U = p;\\n q.L = p;\\n}\\n\\nfunction RedBlackRotateRight(tree, node) {\\n var p = node,\\n q = node.L,\\n parent = p.U;\\n\\n if (parent) {\\n if (parent.L === p) parent.L = q;\\n else parent.R = q;\\n } else {\\n tree._ = q;\\n }\\n\\n q.U = parent;\\n p.U = q;\\n p.L = q.R;\\n if (p.L) p.L.U = p;\\n q.R = p;\\n}\\n\\nfunction RedBlackFirst(node) {\\n while (node.L) node = node.L;\\n return node;\\n}\\n\\n/* harmony default export */ var src_RedBlackTree = (RedBlackTree);\\n\\n// CONCATENATED MODULE: ./node_modules/d3-voronoi/src/Edge.js\\n\\n\\nfunction createEdge(left, right, v0, v1) {\\n var edge = [null, null],\\n index = Diagram_edges.push(edge) - 1;\\n edge.left = left;\\n edge.right = right;\\n if (v0) setEdgeEnd(edge, left, right, v0);\\n if (v1) setEdgeEnd(edge, right, left, v1);\\n cells[left.index].halfedges.push(index);\\n cells[right.index].halfedges.push(index);\\n return edge;\\n}\\n\\nfunction createBorderEdge(left, v0, v1) {\\n var edge = [v0, v1];\\n edge.left = left;\\n return edge;\\n}\\n\\nfunction setEdgeEnd(edge, left, right, vertex) {\\n if (!edge[0] && !edge[1]) {\\n edge[0] = vertex;\\n edge.left = left;\\n edge.right = right;\\n } else if (edge.left === right) {\\n edge[1] = vertex;\\n } else {\\n edge[0] = vertex;\\n }\\n}\\n\\n// Liang–Barsky line clipping.\\nfunction clipEdge(edge, x0, y0, x1, y1) {\\n var a = edge[0],\\n b = edge[1],\\n ax = a[0],\\n ay = a[1],\\n bx = b[0],\\n by = b[1],\\n t0 = 0,\\n t1 = 1,\\n dx = bx - ax,\\n dy = by - ay,\\n r;\\n\\n r = x0 - ax;\\n if (!dx && r > 0) return;\\n r /= dx;\\n if (dx < 0) {\\n if (r < t0) return;\\n if (r < t1) t1 = r;\\n } else if (dx > 0) {\\n if (r > t1) return;\\n if (r > t0) t0 = r;\\n }\\n\\n r = x1 - ax;\\n if (!dx && r < 0) return;\\n r /= dx;\\n if (dx < 0) {\\n if (r > t1) return;\\n if (r > t0) t0 = r;\\n } else if (dx > 0) {\\n if (r < t0) return;\\n if (r < t1) t1 = r;\\n }\\n\\n r = y0 - ay;\\n if (!dy && r > 0) return;\\n r /= dy;\\n if (dy < 0) {\\n if (r < t0) return;\\n if (r < t1) t1 = r;\\n } else if (dy > 0) {\\n if (r > t1) return;\\n if (r > t0) t0 = r;\\n }\\n\\n r = y1 - ay;\\n if (!dy && r < 0) return;\\n r /= dy;\\n if (dy < 0) {\\n if (r > t1) return;\\n if (r > t0) t0 = r;\\n } else if (dy > 0) {\\n if (r < t0) return;\\n if (r < t1) t1 = r;\\n }\\n\\n if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?\\n\\n if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];\\n if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];\\n return true;\\n}\\n\\nfunction connectEdge(edge, x0, y0, x1, y1) {\\n var v1 = edge[1];\\n if (v1) return true;\\n\\n var v0 = edge[0],\\n left = edge.left,\\n right = edge.right,\\n lx = left[0],\\n ly = left[1],\\n rx = right[0],\\n ry = right[1],\\n fx = (lx + rx) / 2,\\n fy = (ly + ry) / 2,\\n fm,\\n fb;\\n\\n if (ry === ly) {\\n if (fx < x0 || fx >= x1) return;\\n if (lx > rx) {\\n if (!v0) v0 = [fx, y0];\\n else if (v0[1] >= y1) return;\\n v1 = [fx, y1];\\n } else {\\n if (!v0) v0 = [fx, y1];\\n else if (v0[1] < y0) return;\\n v1 = [fx, y0];\\n }\\n } else {\\n fm = (lx - rx) / (ry - ly);\\n fb = fy - fm * fx;\\n if (fm < -1 || fm > 1) {\\n if (lx > rx) {\\n if (!v0) v0 = [(y0 - fb) / fm, y0];\\n else if (v0[1] >= y1) return;\\n v1 = [(y1 - fb) / fm, y1];\\n } else {\\n if (!v0) v0 = [(y1 - fb) / fm, y1];\\n else if (v0[1] < y0) return;\\n v1 = [(y0 - fb) / fm, y0];\\n }\\n } else {\\n if (ly < ry) {\\n if (!v0) v0 = [x0, fm * x0 + fb];\\n else if (v0[0] >= x1) return;\\n v1 = [x1, fm * x1 + fb];\\n } else {\\n if (!v0) v0 = [x1, fm * x1 + fb];\\n else if (v0[0] < x0) return;\\n v1 = [x0, fm * x0 + fb];\\n }\\n }\\n }\\n\\n edge[0] = v0;\\n edge[1] = v1;\\n return true;\\n}\\n\\nfunction clipEdges(x0, y0, x1, y1) {\\n var i = Diagram_edges.length,\\n edge;\\n\\n while (i--) {\\n if (!connectEdge(edge = Diagram_edges[i], x0, y0, x1, y1)\\n || !clipEdge(edge, x0, y0, x1, y1)\\n || !(Math.abs(edge[0][0] - edge[1][0]) > Diagram_epsilon\\n || Math.abs(edge[0][1] - edge[1][1]) > Diagram_epsilon)) {\\n delete Diagram_edges[i];\\n }\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-voronoi/src/Cell.js\\n\\n\\n\\nfunction createCell(site) {\\n return cells[site.index] = {\\n site: site,\\n halfedges: []\\n };\\n}\\n\\nfunction cellHalfedgeAngle(cell, edge) {\\n var site = cell.site,\\n va = edge.left,\\n vb = edge.right;\\n if (site === vb) vb = va, va = site;\\n if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);\\n if (site === va) va = edge[1], vb = edge[0];\\n else va = edge[0], vb = edge[1];\\n return Math.atan2(va[0] - vb[0], vb[1] - va[1]);\\n}\\n\\nfunction cellHalfedgeStart(cell, edge) {\\n return edge[+(edge.left !== cell.site)];\\n}\\n\\nfunction cellHalfedgeEnd(cell, edge) {\\n return edge[+(edge.left === cell.site)];\\n}\\n\\nfunction sortCellHalfedges() {\\n for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {\\n if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {\\n var index = new Array(m),\\n array = new Array(m);\\n for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, Diagram_edges[halfedges[j]]);\\n index.sort(function(i, j) { return array[j] - array[i]; });\\n for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];\\n for (j = 0; j < m; ++j) halfedges[j] = array[j];\\n }\\n }\\n}\\n\\nfunction clipCells(x0, y0, x1, y1) {\\n var nCells = cells.length,\\n iCell,\\n cell,\\n site,\\n iHalfedge,\\n halfedges,\\n nHalfedges,\\n start,\\n startX,\\n startY,\\n end,\\n endX,\\n endY,\\n cover = true;\\n\\n for (iCell = 0; iCell < nCells; ++iCell) {\\n if (cell = cells[iCell]) {\\n site = cell.site;\\n halfedges = cell.halfedges;\\n iHalfedge = halfedges.length;\\n\\n // Remove any dangling clipped edges.\\n while (iHalfedge--) {\\n if (!Diagram_edges[halfedges[iHalfedge]]) {\\n halfedges.splice(iHalfedge, 1);\\n }\\n }\\n\\n // Insert any border edges as necessary.\\n iHalfedge = 0, nHalfedges = halfedges.length;\\n while (iHalfedge < nHalfedges) {\\n end = cellHalfedgeEnd(cell, Diagram_edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];\\n start = cellHalfedgeStart(cell, Diagram_edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];\\n if (Math.abs(endX - startX) > Diagram_epsilon || Math.abs(endY - startY) > Diagram_epsilon) {\\n halfedges.splice(iHalfedge, 0, Diagram_edges.push(createBorderEdge(site, end,\\n Math.abs(endX - x0) < Diagram_epsilon && y1 - endY > Diagram_epsilon ? [x0, Math.abs(startX - x0) < Diagram_epsilon ? startY : y1]\\n : Math.abs(endY - y1) < Diagram_epsilon && x1 - endX > Diagram_epsilon ? [Math.abs(startY - y1) < Diagram_epsilon ? startX : x1, y1]\\n : Math.abs(endX - x1) < Diagram_epsilon && endY - y0 > Diagram_epsilon ? [x1, Math.abs(startX - x1) < Diagram_epsilon ? startY : y0]\\n : Math.abs(endY - y0) < Diagram_epsilon && endX - x0 > Diagram_epsilon ? [Math.abs(startY - y0) < Diagram_epsilon ? startX : x0, y0]\\n : null)) - 1);\\n ++nHalfedges;\\n }\\n }\\n\\n if (nHalfedges) cover = false;\\n }\\n }\\n\\n // If there werent any edges, have the closest site cover the extent.\\n // It doesnt matter which corner of the extent we measure!\\n if (cover) {\\n var dx, dy, d2, dc = Infinity;\\n\\n for (iCell = 0, cover = null; iCell < nCells; ++iCell) {\\n if (cell = cells[iCell]) {\\n site = cell.site;\\n dx = site[0] - x0;\\n dy = site[1] - y0;\\n d2 = dx * dx + dy * dy;\\n if (d2 < dc) dc = d2, cover = cell;\\n }\\n }\\n\\n if (cover) {\\n var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];\\n cover.halfedges.push(\\n Diagram_edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,\\n Diagram_edges.push(createBorderEdge(site, v01, v11)) - 1,\\n Diagram_edges.push(createBorderEdge(site, v11, v10)) - 1,\\n Diagram_edges.push(createBorderEdge(site, v10, v00)) - 1\\n );\\n }\\n }\\n\\n // Lastly delete any cells with no edges; these were entirely clipped.\\n for (iCell = 0; iCell < nCells; ++iCell) {\\n if (cell = cells[iCell]) {\\n if (!cell.halfedges.length) {\\n delete cells[iCell];\\n }\\n }\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-voronoi/src/Circle.js\\n\\n\\n\\nvar circlePool = [];\\n\\nvar firstCircle;\\n\\nfunction Circle() {\\n RedBlackNode(this);\\n this.x =\\n this.y =\\n this.arc =\\n this.site =\\n this.cy = null;\\n}\\n\\nfunction attachCircle(arc) {\\n var lArc = arc.P,\\n rArc = arc.N;\\n\\n if (!lArc || !rArc) return;\\n\\n var lSite = lArc.site,\\n cSite = arc.site,\\n rSite = rArc.site;\\n\\n if (lSite === rSite) return;\\n\\n var bx = cSite[0],\\n by = cSite[1],\\n ax = lSite[0] - bx,\\n ay = lSite[1] - by,\\n cx = rSite[0] - bx,\\n cy = rSite[1] - by;\\n\\n var d = 2 * (ax * cy - ay * cx);\\n if (d >= -Diagram_epsilon2) return;\\n\\n var ha = ax * ax + ay * ay,\\n hc = cx * cx + cy * cy,\\n x = (cy * ha - ay * hc) / d,\\n y = (ax * hc - cx * ha) / d;\\n\\n var circle = circlePool.pop() || new Circle;\\n circle.arc = arc;\\n circle.site = cSite;\\n circle.x = x + bx;\\n circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom\\n\\n arc.circle = circle;\\n\\n var before = null,\\n node = Diagram_circles._;\\n\\n while (node) {\\n if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {\\n if (node.L) node = node.L;\\n else { before = node.P; break; }\\n } else {\\n if (node.R) node = node.R;\\n else { before = node; break; }\\n }\\n }\\n\\n Diagram_circles.insert(before, circle);\\n if (!before) firstCircle = circle;\\n}\\n\\nfunction detachCircle(arc) {\\n var circle = arc.circle;\\n if (circle) {\\n if (!circle.P) firstCircle = circle.N;\\n Diagram_circles.remove(circle);\\n circlePool.push(circle);\\n RedBlackNode(circle);\\n arc.circle = null;\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-voronoi/src/Beach.js\\n\\n\\n\\n\\n\\n\\nvar beachPool = [];\\n\\nfunction Beach() {\\n RedBlackNode(this);\\n this.edge =\\n this.site =\\n this.circle = null;\\n}\\n\\nfunction createBeach(site) {\\n var beach = beachPool.pop() || new Beach;\\n beach.site = site;\\n return beach;\\n}\\n\\nfunction detachBeach(beach) {\\n detachCircle(beach);\\n beaches.remove(beach);\\n beachPool.push(beach);\\n RedBlackNode(beach);\\n}\\n\\nfunction removeBeach(beach) {\\n var circle = beach.circle,\\n x = circle.x,\\n y = circle.cy,\\n vertex = [x, y],\\n previous = beach.P,\\n next = beach.N,\\n disappearing = [beach];\\n\\n detachBeach(beach);\\n\\n var lArc = previous;\\n while (lArc.circle\\n && Math.abs(x - lArc.circle.x) < Diagram_epsilon\\n && Math.abs(y - lArc.circle.cy) < Diagram_epsilon) {\\n previous = lArc.P;\\n disappearing.unshift(lArc);\\n detachBeach(lArc);\\n lArc = previous;\\n }\\n\\n disappearing.unshift(lArc);\\n detachCircle(lArc);\\n\\n var rArc = next;\\n while (rArc.circle\\n && Math.abs(x - rArc.circle.x) < Diagram_epsilon\\n && Math.abs(y - rArc.circle.cy) < Diagram_epsilon) {\\n next = rArc.N;\\n disappearing.push(rArc);\\n detachBeach(rArc);\\n rArc = next;\\n }\\n\\n disappearing.push(rArc);\\n detachCircle(rArc);\\n\\n var nArcs = disappearing.length,\\n iArc;\\n for (iArc = 1; iArc < nArcs; ++iArc) {\\n rArc = disappearing[iArc];\\n lArc = disappearing[iArc - 1];\\n setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\\n }\\n\\n lArc = disappearing[0];\\n rArc = disappearing[nArcs - 1];\\n rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);\\n\\n attachCircle(lArc);\\n attachCircle(rArc);\\n}\\n\\nfunction addBeach(site) {\\n var x = site[0],\\n directrix = site[1],\\n lArc,\\n rArc,\\n dxl,\\n dxr,\\n node = beaches._;\\n\\n while (node) {\\n dxl = leftBreakPoint(node, directrix) - x;\\n if (dxl > Diagram_epsilon) node = node.L; else {\\n dxr = x - rightBreakPoint(node, directrix);\\n if (dxr > Diagram_epsilon) {\\n if (!node.R) {\\n lArc = node;\\n break;\\n }\\n node = node.R;\\n } else {\\n if (dxl > -Diagram_epsilon) {\\n lArc = node.P;\\n rArc = node;\\n } else if (dxr > -Diagram_epsilon) {\\n lArc = node;\\n rArc = node.N;\\n } else {\\n lArc = rArc = node;\\n }\\n break;\\n }\\n }\\n }\\n\\n createCell(site);\\n var newArc = createBeach(site);\\n beaches.insert(lArc, newArc);\\n\\n if (!lArc && !rArc) return;\\n\\n if (lArc === rArc) {\\n detachCircle(lArc);\\n rArc = createBeach(lArc.site);\\n beaches.insert(newArc, rArc);\\n newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);\\n attachCircle(lArc);\\n attachCircle(rArc);\\n return;\\n }\\n\\n if (!rArc) { // && lArc\\n newArc.edge = createEdge(lArc.site, newArc.site);\\n return;\\n }\\n\\n // else lArc !== rArc\\n detachCircle(lArc);\\n detachCircle(rArc);\\n\\n var lSite = lArc.site,\\n ax = lSite[0],\\n ay = lSite[1],\\n bx = site[0] - ax,\\n by = site[1] - ay,\\n rSite = rArc.site,\\n cx = rSite[0] - ax,\\n cy = rSite[1] - ay,\\n d = 2 * (bx * cy - by * cx),\\n hb = bx * bx + by * by,\\n hc = cx * cx + cy * cy,\\n vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];\\n\\n setEdgeEnd(rArc.edge, lSite, rSite, vertex);\\n newArc.edge = createEdge(lSite, site, null, vertex);\\n rArc.edge = createEdge(site, rSite, null, vertex);\\n attachCircle(lArc);\\n attachCircle(rArc);\\n}\\n\\nfunction leftBreakPoint(arc, directrix) {\\n var site = arc.site,\\n rfocx = site[0],\\n rfocy = site[1],\\n pby2 = rfocy - directrix;\\n\\n if (!pby2) return rfocx;\\n\\n var lArc = arc.P;\\n if (!lArc) return -Infinity;\\n\\n site = lArc.site;\\n var lfocx = site[0],\\n lfocy = site[1],\\n plby2 = lfocy - directrix;\\n\\n if (!plby2) return lfocx;\\n\\n var hl = lfocx - rfocx,\\n aby2 = 1 / pby2 - 1 / plby2,\\n b = hl / plby2;\\n\\n if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\\n\\n return (rfocx + lfocx) / 2;\\n}\\n\\nfunction rightBreakPoint(arc, directrix) {\\n var rArc = arc.N;\\n if (rArc) return leftBreakPoint(rArc, directrix);\\n var site = arc.site;\\n return site[1] === directrix ? site[0] : Infinity;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-voronoi/src/Diagram.js\\n\\n\\n\\n\\n\\n\\nvar Diagram_epsilon = 1e-6;\\nvar Diagram_epsilon2 = 1e-12;\\nvar beaches;\\nvar cells;\\nvar Diagram_circles;\\nvar Diagram_edges;\\n\\nfunction triangleArea(a, b, c) {\\n return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);\\n}\\n\\nfunction lexicographic(a, b) {\\n return b[1] - a[1]\\n || b[0] - a[0];\\n}\\n\\nfunction Diagram(sites, extent) {\\n var site = sites.sort(lexicographic).pop(),\\n x,\\n y,\\n circle;\\n\\n Diagram_edges = [];\\n cells = new Array(sites.length);\\n beaches = new src_RedBlackTree;\\n Diagram_circles = new src_RedBlackTree;\\n\\n while (true) {\\n circle = firstCircle;\\n if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {\\n if (site[0] !== x || site[1] !== y) {\\n addBeach(site);\\n x = site[0], y = site[1];\\n }\\n site = sites.pop();\\n } else if (circle) {\\n removeBeach(circle.arc);\\n } else {\\n break;\\n }\\n }\\n\\n sortCellHalfedges();\\n\\n if (extent) {\\n var x0 = +extent[0][0],\\n y0 = +extent[0][1],\\n x1 = +extent[1][0],\\n y1 = +extent[1][1];\\n clipEdges(x0, y0, x1, y1);\\n clipCells(x0, y0, x1, y1);\\n }\\n\\n this.edges = Diagram_edges;\\n this.cells = cells;\\n\\n beaches =\\n Diagram_circles =\\n Diagram_edges =\\n cells = null;\\n}\\n\\nDiagram.prototype = {\\n constructor: Diagram,\\n\\n polygons: function() {\\n var edges = this.edges;\\n\\n return this.cells.map(function(cell) {\\n var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });\\n polygon.data = cell.site.data;\\n return polygon;\\n });\\n },\\n\\n triangles: function() {\\n var triangles = [],\\n edges = this.edges;\\n\\n this.cells.forEach(function(cell, i) {\\n if (!(m = (halfedges = cell.halfedges).length)) return;\\n var site = cell.site,\\n halfedges,\\n j = -1,\\n m,\\n s0,\\n e1 = edges[halfedges[m - 1]],\\n s1 = e1.left === site ? e1.right : e1.left;\\n\\n while (++j < m) {\\n s0 = s1;\\n e1 = edges[halfedges[j]];\\n s1 = e1.left === site ? e1.right : e1.left;\\n if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {\\n triangles.push([site.data, s0.data, s1.data]);\\n }\\n }\\n });\\n\\n return triangles;\\n },\\n\\n links: function() {\\n return this.edges.filter(function(edge) {\\n return edge.right;\\n }).map(function(edge) {\\n return {\\n source: edge.left.data,\\n target: edge.right.data\\n };\\n });\\n },\\n\\n find: function(x, y, radius) {\\n var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;\\n\\n // Use the previously-found cell, or start with an arbitrary one.\\n while (!(cell = that.cells[i1])) if (++i1 >= n) return null;\\n var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;\\n\\n // Traverse the half-edges to find a closer cell, if any.\\n do {\\n cell = that.cells[i0 = i1], i1 = null;\\n cell.halfedges.forEach(function(e) {\\n var edge = that.edges[e], v = edge.left;\\n if ((v === cell.site || !v) && !(v = edge.right)) return;\\n var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;\\n if (v2 < d2) d2 = v2, i1 = v.index;\\n });\\n } while (i1 !== null);\\n\\n that._found = i0;\\n\\n return radius == null || d2 <= radius * radius ? cell.site : null;\\n }\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-voronoi/src/voronoi.js\\n\\n\\n\\n\\n/* harmony default export */ var src_voronoi = (function() {\\n var x = src_point_x,\\n y = src_point_y,\\n extent = null;\\n\\n function voronoi(data) {\\n return new Diagram(data.map(function(d, i) {\\n var s = [Math.round(x(d, i, data) / Diagram_epsilon) * Diagram_epsilon, Math.round(y(d, i, data) / Diagram_epsilon) * Diagram_epsilon];\\n s.index = i;\\n s.data = d;\\n return s;\\n }), extent);\\n }\\n\\n voronoi.polygons = function(data) {\\n return voronoi(data).polygons();\\n };\\n\\n voronoi.links = function(data) {\\n return voronoi(data).links();\\n };\\n\\n voronoi.triangles = function(data) {\\n return voronoi(data).triangles();\\n };\\n\\n voronoi.x = function(_) {\\n return arguments.length ? (x = typeof _ === \"function\" ? _ : d3_voronoi_src_constant(+_), voronoi) : x;\\n };\\n\\n voronoi.y = function(_) {\\n return arguments.length ? (y = typeof _ === \"function\" ? _ : d3_voronoi_src_constant(+_), voronoi) : y;\\n };\\n\\n voronoi.extent = function(_) {\\n return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];\\n };\\n\\n voronoi.size = function(_) {\\n return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];\\n };\\n\\n return voronoi;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-voronoi/src/index.js\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3-zoom/src/constant.js\\n/* harmony default export */ var d3_zoom_src_constant = (function(x) {\\n return function() {\\n return x;\\n };\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-zoom/src/event.js\\nfunction ZoomEvent(target, type, transform) {\\n this.target = target;\\n this.type = type;\\n this.transform = transform;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-zoom/src/transform.js\\nfunction Transform(k, x, y) {\\n this.k = k;\\n this.x = x;\\n this.y = y;\\n}\\n\\nTransform.prototype = {\\n constructor: Transform,\\n scale: function(k) {\\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\\n },\\n translate: function(x, y) {\\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\\n },\\n apply: function(point) {\\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\\n },\\n applyX: function(x) {\\n return x * this.k + this.x;\\n },\\n applyY: function(y) {\\n return y * this.k + this.y;\\n },\\n invert: function(location) {\\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\\n },\\n invertX: function(x) {\\n return (x - this.x) / this.k;\\n },\\n invertY: function(y) {\\n return (y - this.y) / this.k;\\n },\\n rescaleX: function(x) {\\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\\n },\\n rescaleY: function(y) {\\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\\n },\\n toString: function() {\\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\\n }\\n};\\n\\nvar transform_identity = new Transform(1, 0, 0);\\n\\ntransform_transform.prototype = Transform.prototype;\\n\\nfunction transform_transform(node) {\\n while (!node.__zoom) if (!(node = node.parentNode)) return transform_identity;\\n return node.__zoom;\\n}\\n\\n// CONCATENATED MODULE: ./node_modules/d3-zoom/src/noevent.js\\n\\n\\nfunction src_noevent_nopropagation() {\\n on_event.stopImmediatePropagation();\\n}\\n\\n/* harmony default export */ var d3_zoom_src_noevent = (function() {\\n on_event.preventDefault();\\n on_event.stopImmediatePropagation();\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-zoom/src/zoom.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n// Ignore right-click, since that should open the context menu.\\nfunction zoom_defaultFilter() {\\n return !on_event.ctrlKey && !on_event.button;\\n}\\n\\nfunction zoom_defaultExtent() {\\n var e = this;\\n if (e instanceof SVGElement) {\\n e = e.ownerSVGElement || e;\\n if (e.hasAttribute(\"viewBox\")) {\\n e = e.viewBox.baseVal;\\n return [[e.x, e.y], [e.x + e.width, e.y + e.height]];\\n }\\n return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];\\n }\\n return [[0, 0], [e.clientWidth, e.clientHeight]];\\n}\\n\\nfunction defaultTransform() {\\n return this.__zoom || transform_identity;\\n}\\n\\nfunction defaultWheelDelta() {\\n return -on_event.deltaY * (on_event.deltaMode === 1 ? 0.05 : on_event.deltaMode ? 1 : 0.002);\\n}\\n\\nfunction zoom_defaultTouchable() {\\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\\n}\\n\\nfunction defaultConstrain(transform, extent, translateExtent) {\\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\\n return transform.translate(\\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\\n );\\n}\\n\\n/* harmony default export */ var d3_zoom_src_zoom = (function() {\\n var filter = zoom_defaultFilter,\\n extent = zoom_defaultExtent,\\n constrain = defaultConstrain,\\n wheelDelta = defaultWheelDelta,\\n touchable = zoom_defaultTouchable,\\n scaleExtent = [0, Infinity],\\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\\n duration = 250,\\n interpolate = src_zoom,\\n listeners = src_dispatch(\"start\", \"zoom\", \"end\"),\\n touchstarting,\\n touchending,\\n touchDelay = 500,\\n wheelDelay = 150,\\n clickDistance2 = 0;\\n\\n function zoom(selection) {\\n selection\\n .property(\"__zoom\", defaultTransform)\\n .on(\"wheel.zoom\", wheeled)\\n .on(\"mousedown.zoom\", mousedowned)\\n .on(\"dblclick.zoom\", dblclicked)\\n .filter(touchable)\\n .on(\"touchstart.zoom\", touchstarted)\\n .on(\"touchmove.zoom\", touchmoved)\\n .on(\"touchend.zoom touchcancel.zoom\", touchended)\\n .style(\"touch-action\", \"none\")\\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\\n }\\n\\n zoom.transform = function(collection, transform, point) {\\n var selection = collection.selection ? collection.selection() : collection;\\n selection.property(\"__zoom\", defaultTransform);\\n if (collection !== selection) {\\n schedule(collection, transform, point);\\n } else {\\n selection.interrupt().each(function() {\\n gesture(this, arguments)\\n .start()\\n .zoom(null, typeof transform === \"function\" ? transform.apply(this, arguments) : transform)\\n .end();\\n });\\n }\\n };\\n\\n zoom.scaleBy = function(selection, k, p) {\\n zoom.scaleTo(selection, function() {\\n var k0 = this.__zoom.k,\\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\\n return k0 * k1;\\n }, p);\\n };\\n\\n zoom.scaleTo = function(selection, k, p) {\\n zoom.transform(selection, function() {\\n var e = extent.apply(this, arguments),\\n t0 = this.__zoom,\\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p,\\n p1 = t0.invert(p0),\\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\\n }, p);\\n };\\n\\n zoom.translateBy = function(selection, x, y) {\\n zoom.transform(selection, function() {\\n return constrain(this.__zoom.translate(\\n typeof x === \"function\" ? x.apply(this, arguments) : x,\\n typeof y === \"function\" ? y.apply(this, arguments) : y\\n ), extent.apply(this, arguments), translateExtent);\\n });\\n };\\n\\n zoom.translateTo = function(selection, x, y, p) {\\n zoom.transform(selection, function() {\\n var e = extent.apply(this, arguments),\\n t = this.__zoom,\\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p;\\n return constrain(transform_identity.translate(p0[0], p0[1]).scale(t.k).translate(\\n typeof x === \"function\" ? -x.apply(this, arguments) : -x,\\n typeof y === \"function\" ? -y.apply(this, arguments) : -y\\n ), e, translateExtent);\\n }, p);\\n };\\n\\n function scale(transform, k) {\\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\\n }\\n\\n function translate(transform, p0, p1) {\\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\\n }\\n\\n function centroid(extent) {\\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\\n }\\n\\n function schedule(transition, transform, point) {\\n transition\\n .on(\"start.zoom\", function() { gesture(this, arguments).start(); })\\n .on(\"interrupt.zoom end.zoom\", function() { gesture(this, arguments).end(); })\\n .tween(\"zoom\", function() {\\n var that = this,\\n args = arguments,\\n g = gesture(that, args),\\n e = extent.apply(that, args),\\n p = point == null ? centroid(e) : typeof point === \"function\" ? point.apply(that, args) : point,\\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\\n a = that.__zoom,\\n b = typeof transform === \"function\" ? transform.apply(that, args) : transform,\\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\\n return function(t) {\\n if (t === 1) t = b; // Avoid rounding error on end.\\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\\n g.zoom(null, t);\\n };\\n });\\n }\\n\\n function gesture(that, args, clean) {\\n return (!clean && that.__zooming) || new Gesture(that, args);\\n }\\n\\n function Gesture(that, args) {\\n this.that = that;\\n this.args = args;\\n this.active = 0;\\n this.extent = extent.apply(that, args);\\n this.taps = 0;\\n }\\n\\n Gesture.prototype = {\\n start: function() {\\n if (++this.active === 1) {\\n this.that.__zooming = this;\\n this.emit(\"start\");\\n }\\n return this;\\n },\\n zoom: function(key, transform) {\\n if (this.mouse && key !== \"mouse\") this.mouse[1] = transform.invert(this.mouse[0]);\\n if (this.touch0 && key !== \"touch\") this.touch0[1] = transform.invert(this.touch0[0]);\\n if (this.touch1 && key !== \"touch\") this.touch1[1] = transform.invert(this.touch1[0]);\\n this.that.__zoom = transform;\\n this.emit(\"zoom\");\\n return this;\\n },\\n end: function() {\\n if (--this.active === 0) {\\n delete this.that.__zooming;\\n this.emit(\"end\");\\n }\\n return this;\\n },\\n emit: function(type) {\\n customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);\\n }\\n };\\n\\n function wheeled() {\\n if (!filter.apply(this, arguments)) return;\\n var g = gesture(this, arguments),\\n t = this.__zoom,\\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\\n p = mouse(this);\\n\\n // If the mouse is in the same location as before, reuse it.\\n // If there were recent wheel events, reset the wheel idle timeout.\\n if (g.wheel) {\\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\\n g.mouse[1] = t.invert(g.mouse[0] = p);\\n }\\n clearTimeout(g.wheel);\\n }\\n\\n // If this wheel event wont trigger a transform change, ignore it.\\n else if (t.k === k) return;\\n\\n // Otherwise, capture the mouse point and location at the start.\\n else {\\n g.mouse = [p, t.invert(p)];\\n interrupt(this);\\n g.start();\\n }\\n\\n d3_zoom_src_noevent();\\n g.wheel = setTimeout(wheelidled, wheelDelay);\\n g.zoom(\"mouse\", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\\n\\n function wheelidled() {\\n g.wheel = null;\\n g.end();\\n }\\n }\\n\\n function mousedowned() {\\n if (touchending || !filter.apply(this, arguments)) return;\\n var g = gesture(this, arguments, true),\\n v = src_select(on_event.view).on(\"mousemove.zoom\", mousemoved, true).on(\"mouseup.zoom\", mouseupped, true),\\n p = mouse(this),\\n x0 = on_event.clientX,\\n y0 = on_event.clientY;\\n\\n nodrag(on_event.view);\\n src_noevent_nopropagation();\\n g.mouse = [p, this.__zoom.invert(p)];\\n interrupt(this);\\n g.start();\\n\\n function mousemoved() {\\n d3_zoom_src_noevent();\\n if (!g.moved) {\\n var dx = on_event.clientX - x0, dy = on_event.clientY - y0;\\n g.moved = dx * dx + dy * dy > clickDistance2;\\n }\\n g.zoom(\"mouse\", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));\\n }\\n\\n function mouseupped() {\\n v.on(\"mousemove.zoom mouseup.zoom\", null);\\n yesdrag(on_event.view, g.moved);\\n d3_zoom_src_noevent();\\n g.end();\\n }\\n }\\n\\n function dblclicked() {\\n if (!filter.apply(this, arguments)) return;\\n var t0 = this.__zoom,\\n p0 = mouse(this),\\n p1 = t0.invert(p0),\\n k1 = t0.k * (on_event.shiftKey ? 0.5 : 2),\\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);\\n\\n d3_zoom_src_noevent();\\n if (duration > 0) src_select(this).transition().duration(duration).call(schedule, t1, p0);\\n else src_select(this).call(zoom.transform, t1);\\n }\\n\\n function touchstarted() {\\n if (!filter.apply(this, arguments)) return;\\n var touches = on_event.touches,\\n n = touches.length,\\n g = gesture(this, arguments, on_event.changedTouches.length === n),\\n started, i, t, p;\\n\\n src_noevent_nopropagation();\\n for (i = 0; i < n; ++i) {\\n t = touches[i], p = src_touch(this, touches, t.identifier);\\n p = [p, this.__zoom.invert(p), t.identifier];\\n if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;\\n else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;\\n }\\n\\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\\n\\n if (started) {\\n if (g.taps < 2) touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\\n interrupt(this);\\n g.start();\\n }\\n }\\n\\n function touchmoved() {\\n if (!this.__zooming) return;\\n var g = gesture(this, arguments),\\n touches = on_event.changedTouches,\\n n = touches.length, i, t, p, l;\\n\\n d3_zoom_src_noevent();\\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\\n g.taps = 0;\\n for (i = 0; i < n; ++i) {\\n t = touches[i], p = src_touch(this, touches, t.identifier);\\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\\n }\\n t = g.that.__zoom;\\n if (g.touch1) {\\n var p0 = g.touch0[0], l0 = g.touch0[1],\\n p1 = g.touch1[0], l1 = g.touch1[1],\\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\\n t = scale(t, Math.sqrt(dp / dl));\\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\\n }\\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\\n else return;\\n g.zoom(\"touch\", constrain(translate(t, p, l), g.extent, translateExtent));\\n }\\n\\n function touchended() {\\n if (!this.__zooming) return;\\n var g = gesture(this, arguments),\\n touches = on_event.changedTouches,\\n n = touches.length, i, t;\\n\\n src_noevent_nopropagation();\\n if (touchending) clearTimeout(touchending);\\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\\n for (i = 0; i < n; ++i) {\\n t = touches[i];\\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\\n }\\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\\n else {\\n g.end();\\n // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.\\n if (g.taps === 2) {\\n var p = src_select(this).on(\"dblclick.zoom\");\\n if (p) p.apply(this, arguments);\\n }\\n }\\n }\\n\\n zoom.wheelDelta = function(_) {\\n return arguments.length ? (wheelDelta = typeof _ === \"function\" ? _ : d3_zoom_src_constant(+_), zoom) : wheelDelta;\\n };\\n\\n zoom.filter = function(_) {\\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : d3_zoom_src_constant(!!_), zoom) : filter;\\n };\\n\\n zoom.touchable = function(_) {\\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : d3_zoom_src_constant(!!_), zoom) : touchable;\\n };\\n\\n zoom.extent = function(_) {\\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : d3_zoom_src_constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\\n };\\n\\n zoom.scaleExtent = function(_) {\\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\\n };\\n\\n zoom.translateExtent = function(_) {\\n return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];\\n };\\n\\n zoom.constrain = function(_) {\\n return arguments.length ? (constrain = _, zoom) : constrain;\\n };\\n\\n zoom.duration = function(_) {\\n return arguments.length ? (duration = +_, zoom) : duration;\\n };\\n\\n zoom.interpolate = function(_) {\\n return arguments.length ? (interpolate = _, zoom) : interpolate;\\n };\\n\\n zoom.on = function() {\\n var value = listeners.on.apply(listeners, arguments);\\n return value === listeners ? zoom : value;\\n };\\n\\n zoom.clickDistance = function(_) {\\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\\n };\\n\\n return zoom;\\n});\\n\\n// CONCATENATED MODULE: ./node_modules/d3-zoom/src/index.js\\n\\n\\n\\n// CONCATENATED MODULE: ./node_modules/d3/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMvZGlzdC9wYWNrYWdlLmpzPzIxZjMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9hc2NlbmRpbmcuanM/YjJjNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Jpc2VjdG9yLmpzPzI3NDAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3QuanM/NjNlOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3BhaXJzLmpzP2ExOGMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9jcm9zcy5qcz8yNGY1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZGVzY2VuZGluZy5qcz8wNWMyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzPzRiNjQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy92YXJpYW5jZS5qcz9lYzA4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZGV2aWF0aW9uLmpzPzJmOTAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9leHRlbnQuanM/NmZmNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FycmF5LmpzPzI0Y2QiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9jb25zdGFudC5qcz9kZGJiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvaWRlbnRpdHkuanM/YjU0NSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3JhbmdlLmpzP2FiZTkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy90aWNrcy5qcz9jMmZkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvdGhyZXNob2xkL3N0dXJnZXMuanM/NWU4MCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2hpc3RvZ3JhbS5qcz9iOTI2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVhbnRpbGUuanM/YjNiMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3RocmVzaG9sZC9mcmVlZG1hbkRpYWNvbmlzLmpzPzg2MjUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy90aHJlc2hvbGQvc2NvdHQuanM/YTQwYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21heC5qcz83OTgwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWVhbi5qcz9mYThlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWVkaWFuLmpzPzYwMGMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZXJnZS5qcz8zNjBmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWluLmpzPzVhMjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9wZXJtdXRlLmpzPzg4MTAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zY2FuLmpzPzgwNTMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zaHVmZmxlLmpzPzRjMzAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zdW0uanM/ZDc0YSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3RyYW5zcG9zZS5qcz9mNWJkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvemlwLmpzPzFmMTYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9pbmRleC5qcz9iM2IzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1heGlzL3NyYy9hcnJheS5qcz81YzE0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1heGlzL3NyYy9pZGVudGl0eS5qcz9hZTI5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1heGlzL3NyYy9heGlzLmpzP2U2OWQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWF4aXMvc3JjL2luZGV4LmpzP2I1OGUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWRpc3BhdGNoL3NyYy9kaXNwYXRjaC5qcz9jZmIxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yLmpzP2Q1OGMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdC5qcz8xODU2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzP2I2NjMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcz9lYjQ2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanM/MTBhMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZmlsdGVyLmpzPzZmMTAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcz84NGRjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcz83YTRiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzP2U4NDMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanM/NDllYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcz85Yzg4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9qb2luLmpzP2NjOWYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzPzBjNjEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzP2E3ODMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanM/YzU3OCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcz8xMzUzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2Rlcy5qcz84MDliIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzPzhmYWEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanM/ZWZhYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanM/MDhlMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZWFjaC5qcz8wYWM5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZXMuanM/NWRjZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2UuanM/MTcyNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXR0ci5qcz9jM2FhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3dpbmRvdy5qcz83YmJiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zdHlsZS5qcz8xMTlmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9wcm9wZXJ0eS5qcz8wNjA1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbGFzc2VkLmpzP2E4ODMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3RleHQuanM/Mjg3NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaHRtbC5qcz9kMjNmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yYWlzZS5qcz8xZjI0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9sb3dlci5qcz82NTM2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanM/Mzk4MiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXBwZW5kLmpzPzQ0YmEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luc2VydC5qcz9mY2Q3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanM/YjRiZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xvbmUuanM/OGVhNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0dW0uanM/YTJlZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanM/MmU4NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGlzcGF0Y2guanM/MTBmMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanM/YWNhZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3QuanM/M2ViZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9ldmVudC5qcz9mYzk3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2RyYWcuanM/ODYwZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2RlZmluZS5qcz80NDU0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanM/OTVkNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Jhc2lzLmpzP2VhMmUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcz9jMDI1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29uc3RhbnQuanM/ODg0MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbG9yLmpzP2UwNjgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanM/MzE0OSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlckFycmF5LmpzPzZjMDUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9hcnJheS5qcz8xZTE0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvZGF0ZS5qcz85Yzg0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzP2Q4YjEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9vYmplY3QuanM/MzVmNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcz9iZTVkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdmFsdWUuanM/YTBjZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zb3VyY2VFdmVudC5qcz9jZTk3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50LmpzP2IwZWQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvdG91Y2guanM/ZTI3OCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9tb3VzZS5qcz9mMWQ2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanM/ODBjMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVvdXQuanM/MGY3ZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zY2hlZHVsZS5qcz82MWM0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanM/OTk5MyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2ludGVycnVwdC5qcz80YmJmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2RlY29tcG9zZS5qcz9lZjNhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzP2Y0MzkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vaW5kZXguanM/MWIzOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90d2Vlbi5qcz8wZDQ5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ludGVycG9sYXRlLmpzPzNiOTUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcz9lYzI2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHJUd2Vlbi5qcz9lNzU4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2RlbGF5LmpzP2Q0YzkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanM/YTk0YSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlLmpzPzVlNDQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZmlsdGVyLmpzP2RkZWEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanM/N2EzNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9vbi5qcz8wNWMwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3JlbW92ZS5qcz9jNjRkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcz85NmFiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcz9lZmRjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdGlvbi5qcz9lNTQ3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzP2FjN2QiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcz85YjRlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHQuanM/ZDljYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanM/MWFjMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzPzcyODQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZW5kLmpzPzczZDAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanM/YzEwNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanM/MjM2ZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanM/YzU5YiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzPzg1MzEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2FjdGl2ZS5qcz83NmJjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbmRleC5qcz8yZDU1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1icnVzaC9zcmMvY29uc3RhbnQuanM/ZTZkOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtYnJ1c2gvc3JjL2V2ZW50LmpzPzY2NzgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWJydXNoL3NyYy9ub2V2ZW50LmpzPzEyNGQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWJydXNoL3NyYy9icnVzaC5qcz9lMjNiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1icnVzaC9zcmMvaW5kZXguanM/MDdlNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtY2hvcmQvc3JjL21hdGguanM/MjNmZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtY2hvcmQvc3JjL2Nob3JkLmpzPzhhYjQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWNob3JkL3NyYy9hcnJheS5qcz85NTI2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jaG9yZC9zcmMvY29uc3RhbnQuanM/YzM3ZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcGF0aC9zcmMvcGF0aC5qcz9kYzE1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jaG9yZC9zcmMvcmliYm9uLmpzPzczNGYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWNob3JkL3NyYy9pbmRleC5qcz9mMjIyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jb2xsZWN0aW9uL3NyYy9tYXAuanM/ZDA4YyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtY29sbGVjdGlvbi9zcmMvbmVzdC5qcz9iZmMxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jb2xsZWN0aW9uL3NyYy9zZXQuanM/NDNkYiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtY29sbGVjdGlvbi9zcmMva2V5cy5qcz9mZTQ2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jb2xsZWN0aW9uL3NyYy92YWx1ZXMuanM/ZmMwYiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtY29sbGVjdGlvbi9zcmMvZW50cmllcy5qcz83OTdjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jb2xsZWN0aW9uL3NyYy9pbmRleC5qcz80NmNkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvbWF0aC5qcz83ZmIxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvbGFiLmpzP2RmNjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jdWJlaGVsaXguanM/OWQ1NCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2luZGV4LmpzP2FlZDgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWNvbnRvdXIvc3JjL2FycmF5LmpzP2E4YTMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWNvbnRvdXIvc3JjL2FzY2VuZGluZy5qcz9lNDVhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jb250b3VyL3NyYy9hcmVhLmpzP2VmNjYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWNvbnRvdXIvc3JjL2NvbnN0YW50LmpzP2U2OTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWNvbnRvdXIvc3JjL2NvbnRhaW5zLmpzPzdmMWEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWNvbnRvdXIvc3JjL25vb3AuanM/NmE0NCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtY29udG91ci9zcmMvY29udG91cnMuanM/NmFhOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtY29udG91ci9zcmMvYmx1ci5qcz85NDBhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jb250b3VyL3NyYy9kZW5zaXR5LmpzPzQ1YjYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWNvbnRvdXIvc3JjL2luZGV4LmpzP2QwYTciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWRpc3BhdGNoL3NyYy9pbmRleC5qcz9mNDZiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9jb25zdGFudC5qcz9kNzI4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ldmVudC5qcz82MjI2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9kcmFnLmpzPzg2NWQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL2luZGV4LmpzP2I0OTciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvZHN2LmpzP2ZkMmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvY3N2LmpzP2Q4YzYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvdHN2LmpzPzkxMGIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvYXV0b1R5cGUuanM/NmQyZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9pbmRleC5qcz8yNDYxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9saW5lYXIuanM/ZTJjNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvcXVhZC5qcz82OTY1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9wb2x5LmpzPzRjZTAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL3Npbi5qcz80NmU1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9leHAuanM/Yjg4YiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY2lyY2xlLmpzP2ViM2IiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2JvdW5jZS5qcz8yMzE4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9iYWNrLmpzPzRiODUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2VsYXN0aWMuanM/NTVjYiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvaW5kZXguanM/MGIxYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2Jsb2IuanM/MjY2MyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2J1ZmZlci5qcz9lM2JmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvdGV4dC5qcz82YWEzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvZHN2LmpzPzQxMzYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy9pbWFnZS5qcz9kMGZjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvanNvbi5qcz9iNjU3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMveG1sLmpzPzEwYzMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy9pbmRleC5qcz81MmZiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvY2VudGVyLmpzP2M5NmMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9jb25zdGFudC5qcz9hZWExIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvamlnZ2xlLmpzPzRhYmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9hZGQuanM/YzMyOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2NvdmVyLmpzPzlmMzUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9kYXRhLmpzPzM4M2IiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9leHRlbnQuanM/Zjk4MyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3F1YWQuanM/YjM4NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2ZpbmQuanM/MWZmNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3JlbW92ZS5qcz84YTE3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvcm9vdC5qcz82ZDcyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvc2l6ZS5qcz9iYjI4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvdmlzaXQuanM/MjYyZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3Zpc2l0QWZ0ZXIuanM/NGZmMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3guanM/YzRmYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3kuanM/ZWU2YyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3F1YWR0cmVlLmpzP2RjYjAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9jb2xsaWRlLmpzP2Q5MjciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9saW5rLmpzP2NmNzIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9zaW11bGF0aW9uLmpzP2E5MzkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9tYW55Qm9keS5qcz9jZGJkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvcmFkaWFsLmpzPzQxOWEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy94LmpzPzJkNzAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy95LmpzPzg4NmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9pbmRleC5qcz9kNWMyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdERlY2ltYWwuanM/MjBjMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9leHBvbmVudC5qcz8zNGJmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdEdyb3VwLmpzPzc4YTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0TnVtZXJhbHMuanM/MDg2OCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRTcGVjaWZpZXIuanM/YWZlMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUcmltLmpzPzlhZWEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0UHJlZml4QXV0by5qcz8wNGUwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanM/MzdjOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUeXBlcy5qcz85ODVjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2lkZW50aXR5LmpzP2EwNjAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvbG9jYWxlLmpzPzcwOWMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZGVmYXVsdExvY2FsZS5qcz84ZTNiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL3ByZWNpc2lvbkZpeGVkLmpzP2NiMGEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uUHJlZml4LmpzP2FiMzMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uUm91bmQuanM/NjM2MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9pbmRleC5qcz9lZTViIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2FkZGVyLmpzPzE3YWMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvbWF0aC5qcz82OTY0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL25vb3AuanM/YjYxYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9zdHJlYW0uanM/NzFkZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9hcmVhLmpzPzY4ZDQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2FydGVzaWFuLmpzPzI4YmIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvYm91bmRzLmpzP2Q5ZTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2VudHJvaWQuanM/YzNiMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jb25zdGFudC5qcz83MGY1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NvbXBvc2UuanM/OTU4YSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9yb3RhdGlvbi5qcz84NGE1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NpcmNsZS5qcz8wZTk1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvYnVmZmVyLmpzP2ZjZWYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcG9pbnRFcXVhbC5qcz8yMjQ1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvcmVqb2luLmpzPzE4ZDciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcG9seWdvbkNvbnRhaW5zLmpzPzdhODkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2xpcC9pbmRleC5qcz8yODgxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvYW50aW1lcmlkaWFuLmpzPzgxZjAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvY2xpcC9jaXJjbGUuanM/OWNkNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL2xpbmUuanM/ZDAwOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jbGlwL3JlY3RhbmdsZS5qcz85ZjI2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2NsaXAvZXh0ZW50LmpzP2FkOTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvbGVuZ3RoLmpzP2NmYWUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvZGlzdGFuY2UuanM/ZjNkOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9jb250YWlucy5qcz9mY2ZiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2dyYXRpY3VsZS5qcz84ZGNlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2ludGVycG9sYXRlLmpzPzBmNzAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvaWRlbnRpdHkuanM/Y2E0YSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wYXRoL2FyZWEuanM/M2U5MyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wYXRoL2JvdW5kcy5qcz8xZDc5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3BhdGgvY2VudHJvaWQuanM/ZDUyYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wYXRoL2NvbnRleHQuanM/ZDEyZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wYXRoL21lYXN1cmUuanM/NDZhNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wYXRoL3N0cmluZy5qcz9jZDY3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3BhdGgvaW5kZXguanM/N2Q3OSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy90cmFuc2Zvcm0uanM/YTE2NiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2ZpdC5qcz8yNGIwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vcmVzYW1wbGUuanM/ZWIzNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2luZGV4LmpzPzMzNDIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcHJvamVjdGlvbi9jb25pYy5qcz8yMzU2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vY3lsaW5kcmljYWxFcXVhbEFyZWEuanM/YzNiMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2NvbmljRXF1YWxBcmVhLmpzPzQ5YmYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcHJvamVjdGlvbi9hbGJlcnMuanM/M2E4YiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2FsYmVyc1VzYS5qcz8xZGMzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vYXppbXV0aGFsLmpzPzI0MzUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcHJvamVjdGlvbi9hemltdXRoYWxFcXVhbEFyZWEuanM/OTMyYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2F6aW11dGhhbEVxdWlkaXN0YW50LmpzPzJkNDAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcHJvamVjdGlvbi9tZXJjYXRvci5qcz9lNGFiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vY29uaWNDb25mb3JtYWwuanM/ZjM0MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2VxdWlyZWN0YW5ndWxhci5qcz81ZGVkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vY29uaWNFcXVpZGlzdGFudC5qcz9kMDg4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vZXF1YWxFYXJ0aC5qcz9iMzQzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL3Byb2plY3Rpb24vZ25vbW9uaWMuanM/MmI0ZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL2lkZW50aXR5LmpzP2YyNjAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcHJvamVjdGlvbi9uYXR1cmFsRWFydGgxLmpzP2FkYWMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWdlby9zcmMvcHJvamVjdGlvbi9vcnRob2dyYXBoaWMuanM/OWFlNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL3N0ZXJlb2dyYXBoaWMuanM/MTg3OCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZ2VvL3NyYy9wcm9qZWN0aW9uL3RyYW5zdmVyc2VNZXJjYXRvci5qcz8yYjQzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1nZW8vc3JjL2luZGV4LmpzP2NmZGYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvY2x1c3Rlci5qcz9hYmRmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9jb3VudC5qcz85NjY1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoLmpzPzM4MDMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2VhY2hCZWZvcmUuanM/OTMwZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvZWFjaEFmdGVyLmpzP2EzNGIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L3N1bS5qcz84MWUxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9zb3J0LmpzP2M0YmUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L3BhdGguanM/NjUyNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvYW5jZXN0b3JzLmpzPzdhNTQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2Rlc2NlbmRhbnRzLmpzPzA4NTkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2xlYXZlcy5qcz80ZjVjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9saW5rcy5qcz9hOTgxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9pbmRleC5qcz8xNDRjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2FycmF5LmpzPzMyMTkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvcGFjay9lbmNsb3NlLmpzPzIyNGIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvcGFjay9zaWJsaW5ncy5qcz85ZjYxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2FjY2Vzc29ycy5qcz9kNGJlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2NvbnN0YW50LmpzPzFhYmYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvcGFjay9pbmRleC5qcz8wNzI3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvcm91bmQuanM/OTdlMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL2RpY2UuanM/MDk2YyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9wYXJ0aXRpb24uanM/MDM5ZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9zdHJhdGlmeS5qcz84N2FmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWUuanM/YjRjNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL3NsaWNlLmpzPzI5MGYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZW1hcC9zcXVhcmlmeS5qcz85Yzk5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvaW5kZXguanM/ZjI2MiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL2JpbmFyeS5qcz9kYmI4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvc2xpY2VEaWNlLmpzPzk2ZmUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZW1hcC9yZXNxdWFyaWZ5LmpzPzQ1ZDkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaW5kZXguanM/ZTA2MiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Rpc2NyZXRlLmpzP2Q2NjMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9odWUuanM/MDA3ZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JvdW5kLmpzP2NlMmEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy96b29tLmpzPzAzYjciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9oc2wuanM/ZTFmNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2xhYi5qcz84YzI0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvaGNsLmpzPzI3NTQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jdWJlaGVsaXguanM/ZGJhNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3BpZWNld2lzZS5qcz81ZWI0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcXVhbnRpemUuanM/YjcwNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2luZGV4LmpzP2Q0ZWYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXBhdGgvc3JjL2luZGV4LmpzP2VkZjYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXBvbHlnb24vc3JjL2FyZWEuanM/OGQzYiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcG9seWdvbi9zcmMvY2VudHJvaWQuanM/NGVlMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcG9seWdvbi9zcmMvY3Jvc3MuanM/YTUxYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcG9seWdvbi9zcmMvaHVsbC5qcz9hYzE5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1wb2x5Z29uL3NyYy9jb250YWlucy5qcz84YmJjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1wb2x5Z29uL3NyYy9sZW5ndGguanM/YmRiNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcG9seWdvbi9zcmMvaW5kZXguanM/NTEwYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2luZGV4LmpzP2Q5YTQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXJhbmRvbS9zcmMvZGVmYXVsdFNvdXJjZS5qcz84YjZmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL3VuaWZvcm0uanM/ZmI0MiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcmFuZG9tL3NyYy9ub3JtYWwuanM/ZmUyMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcmFuZG9tL3NyYy9sb2dOb3JtYWwuanM/Nzk2NiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcmFuZG9tL3NyYy9pcndpbkhhbGwuanM/ZWRhMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcmFuZG9tL3NyYy9iYXRlcy5qcz9jMGNhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL2V4cG9uZW50aWFsLmpzPzliMzQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXJhbmRvbS9zcmMvaW5kZXguanM/M2QyYiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2luaXQuanM/YzVhZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2FycmF5LmpzPzAzMzQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9vcmRpbmFsLmpzPzQ4YTMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9iYW5kLmpzPzM0OWIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9jb25zdGFudC5qcz9mZWZmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvbnVtYmVyLmpzP2I1ZDgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9jb250aW51b3VzLmpzPzkwZDQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy90aWNrRm9ybWF0LmpzP2NjNmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9saW5lYXIuanM/YjdkMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2lkZW50aXR5LmpzP2MyYzkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9uaWNlLmpzP2ZlZDUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9sb2cuanM/ZDZlZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3N5bWxvZy5qcz8xY2FkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvcG93LmpzP2Q3MGMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9xdWFudGlsZS5qcz84ZWFkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvcXVhbnRpemUuanM/NWUxMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3RocmVzaG9sZC5qcz9kODg0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy9pbnRlcnZhbC5qcz9kZjZjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy95ZWFyLmpzPzcyMTAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL21vbnRoLmpzPzczNDIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL2R1cmF0aW9uLmpzPzRjZDAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL3dlZWsuanM/NGJhNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvZGF5LmpzPzAzZDAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL2hvdXIuanM/NTAxMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvbWludXRlLmpzPzVkODYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL3NlY29uZC5qcz9jYmNkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy9taWxsaXNlY29uZC5qcz8xMGQ5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy91dGNXZWVrLmpzP2Y3NDgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL3V0Y0RheS5qcz8wZDlmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy91dGNZZWFyLmpzP2E5YzAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRpbWUtZm9ybWF0L3NyYy9sb2NhbGUuanM/NjE5NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdGltZS1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanM/ZmNhZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3RpbWUuanM/NjQ3MiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvdXRjTW9udGguanM/ZDhmMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvdXRjSG91ci5qcz81Y2Y2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy91dGNNaW51dGUuanM/NmI1NiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3V0Y1RpbWUuanM/OWVjZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3NlcXVlbnRpYWwuanM/ODExZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3NlcXVlbnRpYWxRdWFudGlsZS5qcz83OTQ2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvZGl2ZXJnaW5nLmpzPzM2NGMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9pbmRleC5qcz8zYjU2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2NvbG9ycy5qcz80OTI5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2NhdGVnb3JpY2FsL2NhdGVnb3J5MTAuanM/YjZiNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9jYXRlZ29yaWNhbC9BY2NlbnQuanM/ZGFmNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9jYXRlZ29yaWNhbC9EYXJrMi5qcz84ZGQ1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2NhdGVnb3JpY2FsL1BhaXJlZC5qcz82MjE2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2NhdGVnb3JpY2FsL1Bhc3RlbDEuanM/NDk3ZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9jYXRlZ29yaWNhbC9QYXN0ZWwyLmpzP2JmNDQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvY2F0ZWdvcmljYWwvU2V0MS5qcz9kYTE2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2NhdGVnb3JpY2FsL1NldDIuanM/N2FlMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9jYXRlZ29yaWNhbC9TZXQzLmpzPzEzYTciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvY2F0ZWdvcmljYWwvVGFibGVhdTEwLmpzPzIyMDgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvcmFtcC5qcz81NzkwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2RpdmVyZ2luZy9CckJHLmpzPzJmNGIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvZGl2ZXJnaW5nL1BSR24uanM/YmNhNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9kaXZlcmdpbmcvUGlZRy5qcz8xZmZkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2RpdmVyZ2luZy9QdU9yLmpzP2Y0OWMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvZGl2ZXJnaW5nL1JkQnUuanM/YjgxMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9kaXZlcmdpbmcvUmRHeS5qcz8xYzFlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2RpdmVyZ2luZy9SZFlsQnUuanM/YmU3NCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9kaXZlcmdpbmcvUmRZbEduLmpzPzNiYWYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvZGl2ZXJnaW5nL1NwZWN0cmFsLmpzPzgzY2QiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9CdUduLmpzP2ViODciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9CdVB1LmpzP2Q2NWQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9HbkJ1LmpzP2MwZmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9PclJkLmpzP2M1ZTIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9QdUJ1R24uanM/OGEzNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9zZXF1ZW50aWFsLW11bHRpL1B1QnUuanM/ZjQ3NiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9zZXF1ZW50aWFsLW11bHRpL1B1UmQuanM/ODBhOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9zZXF1ZW50aWFsLW11bHRpL1JkUHUuanM/YWU2MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9zZXF1ZW50aWFsLW11bHRpL1lsR25CdS5qcz8wYmE1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL3NlcXVlbnRpYWwtbXVsdGkvWWxHbi5qcz9jNjFjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL3NlcXVlbnRpYWwtbXVsdGkvWWxPckJyLmpzP2QzMDkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9ZbE9yUmQuanM/YTEzNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9zZXF1ZW50aWFsLXNpbmdsZS9CbHVlcy5qcz9mMmUwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL3NlcXVlbnRpYWwtc2luZ2xlL0dyZWVucy5qcz9kN2RiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL3NlcXVlbnRpYWwtc2luZ2xlL0dyZXlzLmpzP2VjNzQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1zaW5nbGUvUHVycGxlcy5qcz8zYTNlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL3NlcXVlbnRpYWwtc2luZ2xlL1JlZHMuanM/MTljOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9zZXF1ZW50aWFsLXNpbmdsZS9PcmFuZ2VzLmpzP2U1NzgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9jaXZpZGlzLmpzPzQ0ZTQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9jdWJlaGVsaXguanM/NGMxNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9zZXF1ZW50aWFsLW11bHRpL3JhaW5ib3cuanM/YWMyMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9zZXF1ZW50aWFsLW11bHRpL3NpbmVib3cuanM/N2I2MCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUtY2hyb21hdGljL3NyYy9zZXF1ZW50aWFsLW11bHRpL3R1cmJvLmpzP2RiZDgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS92aXJpZGlzLmpzP2U0YWEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvaW5kZXguanM/ZGI4YyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jcmVhdGUuanM/M2U0NSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9sb2NhbC5qcz9hYmM3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdEFsbC5qcz85ZWNmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3RvdWNoZXMuanM/YTY2MyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9pbmRleC5qcz8zNTE5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY29uc3RhbnQuanM/NzZmYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL21hdGguanM/Y2Y1NSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2FyYy5qcz9kMDA4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvbGluZWFyLmpzPzdiMjgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9wb2ludC5qcz8xMGNkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvbGluZS5qcz9iZWM1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJlYS5qcz82YjcxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvZGVzY2VuZGluZy5qcz85ZDg2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvaWRlbnRpdHkuanM/YWRiZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3BpZS5qcz84MWJjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvcmFkaWFsLmpzPzg1YzQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9saW5lUmFkaWFsLmpzPzlhZjQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9hcmVhUmFkaWFsLmpzPzgzNGUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9wb2ludFJhZGlhbC5qcz8xMjk0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJyYXkuanM/OTcyOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2xpbmsvaW5kZXguanM/MWVjOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC9jaXJjbGUuanM/ODhiNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC9jcm9zcy5qcz84MWFmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvc3ltYm9sL2RpYW1vbmQuanM/Nzk2NSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC9zdGFyLmpzPzgyY2UiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9zeW1ib2wvc3F1YXJlLmpzP2EwZDUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9zeW1ib2wvdHJpYW5nbGUuanM/NWFiOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC93eWUuanM/OGVhMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC5qcz9jMTZiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvbm9vcC5qcz80ZGRlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvYmFzaXMuanM/YmM1ZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2Jhc2lzQ2xvc2VkLmpzPzJkNGMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9iYXNpc09wZW4uanM/NTliZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2J1bmRsZS5qcz8wNTAwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvY2FyZGluYWwuanM/M2Q0OCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2NhcmRpbmFsQ2xvc2VkLmpzPzVkMTAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9jYXJkaW5hbE9wZW4uanM/NTZhYiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2NhdG11bGxSb20uanM/MTliNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2NhdG11bGxSb21DbG9zZWQuanM/NDhlZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2NhdG11bGxSb21PcGVuLmpzPzkyMDEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9saW5lYXJDbG9zZWQuanM/YzY1MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL21vbm90b25lLmpzP2QzZmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9uYXR1cmFsLmpzP2I3YTciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9zdGVwLmpzPzEzZWQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vZmZzZXQvbm9uZS5qcz9kZjFiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvb3JkZXIvbm9uZS5qcz8wNTdjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvc3RhY2suanM/ODRhOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29mZnNldC9leHBhbmQuanM/NTExZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29mZnNldC9kaXZlcmdpbmcuanM/NzljMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29mZnNldC9zaWxob3VldHRlLmpzPzdmYmYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vZmZzZXQvd2lnZ2xlLmpzP2U0MTEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vcmRlci9hcHBlYXJhbmNlLmpzPzA0OTIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vcmRlci9hc2NlbmRpbmcuanM/YzMwNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29yZGVyL2Rlc2NlbmRpbmcuanM/OTgwZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29yZGVyL2luc2lkZU91dC5qcz8wNzNiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvb3JkZXIvcmV2ZXJzZS5qcz83YWNjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvaW5kZXguanM/ZmM1MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvaW5kZXguanM/YWNhYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdGltZS1mb3JtYXQvc3JjL2lzb0Zvcm1hdC5qcz9mMDMwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10aW1lLWZvcm1hdC9zcmMvaXNvUGFyc2UuanM/OTZjMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdGltZS1mb3JtYXQvc3JjL2luZGV4LmpzPzU0ZDQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy9pbnRlcnZhbC5qcz9mYTZlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvaW5kZXguanM/ODg3NSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdm9yb25vaS9zcmMvY29uc3RhbnQuanM/N2JlYiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdm9yb25vaS9zcmMvcG9pbnQuanM/M2RiMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdm9yb25vaS9zcmMvUmVkQmxhY2tUcmVlLmpzPzFjMmUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXZvcm9ub2kvc3JjL0VkZ2UuanM/ZmI1NCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdm9yb25vaS9zcmMvQ2VsbC5qcz82M2QxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy12b3Jvbm9pL3NyYy9DaXJjbGUuanM/ZmJmZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdm9yb25vaS9zcmMvQmVhY2guanM/ZTRkZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtdm9yb25vaS9zcmMvRGlhZ3JhbS5qcz8wMTk3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy12b3Jvbm9pL3NyYy92b3Jvbm9pLmpzPzRjZDciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXZvcm9ub2kvc3JjL2luZGV4LmpzP2I1ODkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2NvbnN0YW50LmpzP2M3YTciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2V2ZW50LmpzPzEyZjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcz9kNjAwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ub2V2ZW50LmpzP2U1NmEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3pvb20uanM/YmQ2MiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvaW5kZXguanM/YjRjNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMvaW5kZXguanM/YmI1MCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFPLElBQUksWUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsSUFBSSxjQUFNO0FBQ1Ysa0JBQWtCO0FBQ2xCO0FBQ0EsZUFBZSwrV0FBK1csb0JBQW9CLHNNQUFzTSxvQkFBb0Isc0JB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Q0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUN4RGM7QUFDZjtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLENBQUM7OztBQ0ptQzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFTTtBQUNQO0FBQ0EsU0FBUyxVQUFXO0FBQ3BCOzs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FDM0JEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQzFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUN4QkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7O0FDM0JlO0FBQ2Y7QUFDQTtBQUNBLENBQUM7O0FBRU07QUFDUDtBQUNBO0FBQ0E7QUFDQTs7O0FDVDJDOztBQUVwQzs7QUFFQTtBQUNBOztBQUVQO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixJQUFJO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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c0JBQWlCO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOzs7QUM1T2M7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FDWG1DO0FBQ0U7O0FBRS9CLElBQUksWUFBRzs7QUFFUDtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFD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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGtCQUFrQjtBQUNqRDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsK0JBQStCLGtCQUFrQjtBQUNqRDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsK0JBQStCLGtCQUFrQjtBQUNqRDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsK0JBQStCLGtCQUFrQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxZQUFZLDRCQUE0QjtBQUN4QztBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQyxTQUFTLFVBQUc7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FB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QTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUIsZ0JBQWdCLFFBQVE7O0FBRWpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRWUsaUVBQVksRUFBQzs7O0FDNU9vQjs7QUFFekM7QUFDUDtBQUNBLGNBQWMsYUFBSztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsS0FBSztBQUNQLEVBQUUsS0FBSztBQUNQO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLDBDQUEwQzs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQLFVBQVUsYUFBSztBQUNmOztBQUVBO0FBQ0EsNEJBQTRCLGFBQUs7QUFDakM7QUFDQSxpREFBaUQsZUFBTztBQUN4RCxtREFBbUQsZUFBTztBQUMxRCxhQUFhLGFBQUs7QUFDbEI7QUFDQTtBQUNBOzs7QUN2S3dDO0FBQ1E7O0FBRXpDO0FBQ1AsU0FBUyxLQUFLO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVPO0FBQ1A7QUFDQTs7QUFFTztBQUNQLHNCQUFzQixLQUFLLCtCQUErQixPQUFPO0FBQ2pFLGdCQUFnQixLQUFLO0FBQ3JCO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTyx1REFBdUQsYUFBSztBQUNwRixpQ0FBaUMsNEJBQTRCLEVBQUU7QUFDL0QsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBOztBQUVPO0FBQ1AsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixnQkFBZ0I7QUFDakMsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxhQUFLO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsYUFBSztBQUN6Qyx3Q0FBd0MsYUFBSztBQUM3QyxzQ0FBc0MsZUFBTyw4QkFBOEIsZUFBTztBQUNsRix5Q0FBeUMsYUFBSyxNQUFNLGdCQUFnQjtBQUNwRSxvQ0FBb0MsZUFBTyxnQkFBZ0IsZUFBTyxnQ0FBZ0MsZUFBTztBQUN6RyxzQ0FBc0MsZUFBTyxnQkFBZ0IsZUFBTyw0QkFBNEIsZUFBTztBQUN2RyxzQ0FBc0MsZUFBTyxnQkFBZ0IsZUFBTyxnQ0FBZ0MsZUFBTztBQUMzRyxzQ0FBc0MsZUFBTyxnQkFBZ0IsZUFBTyw0QkFBNEIsZUFBTztBQUN2RztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLGdCQUFnQjtBQUNqRCxpQkFBaUIsS0FBSztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGFBQUssTUFBTSxnQkFBZ0I7QUFDbkMsUUFBUSxhQUFLLE1BQU0sZ0JBQWdCO0FBQ25DLFFBQVEsYUFBSyxNQUFNLGdCQUFnQjtBQUNuQyxRQUFRLGFBQUssTUFBTSxnQkFBZ0I7QUFDbkM7QUFDQTtBQUNBOztBQUVBLDJDQUEyQztBQUMzQyxpQkFBaUIsZ0JBQWdCO0FBQ2pDLGVBQWUsS0FBSztBQUNwQjtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7O0FDN0g0QztBQUNBOztBQUU1Qzs7QUFFTzs7QUFFUDtBQUNBLEVBQUUsWUFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksZ0JBQVE7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEOztBQUU3RDs7QUFFQTtBQUNBLGFBQWEsZUFBTzs7QUFFcEI7QUFDQTtBQUNBO0FBQ0EsWUFBWSxpQkFBaUIsT0FBTztBQUNwQyxLQUFLO0FBQ0w7QUFDQSxZQUFZLGVBQWUsT0FBTztBQUNsQztBQUNBOztBQUVBLEVBQUUsZUFBTztBQUNUO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxJQUFJLGVBQU87QUFDWDtBQUNBLElBQUksWUFBWTtBQUNoQjtBQUNBO0FBQ0E7OztBQzdFNEM7QUFDVjtBQUNrQjtBQUNOO0FBQ0g7O0FBRTNDOztBQUVBO0FBQ0EsRUFBRSxZQUFZO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsWUFBWTtBQUNkLEVBQUUsT0FBTztBQUNUO0FBQ0EsRUFBRSxZQUFZO0FBQ2Q7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsdUNBQXVDLGVBQU87QUFDOUMsd0NBQXdDLGVBQU87QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsWUFBWTs7QUFFZDtBQUNBO0FBQ0EsdUNBQXVDLGVBQU87QUFDOUMsd0NBQXdDLGVBQU87QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsWUFBWTs7QUFFZDtBQUNBO0FBQ0EsZ0JBQWdCLGNBQWM7QUFDOUI7QUFDQTtBQUNBLElBQUksVUFBVTtBQUNkOztBQUVBO0FBQ0E7QUFDQSxjQUFjLFVBQVU7O0FBRXhCLEVBQUUsWUFBWTtBQUNkLEVBQUUsWUFBWTtBQUNkOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPOztBQUVwQjtBQUNBO0FBQ0EsY0FBYyxlQUFPLGdCQUFnQjtBQUNyQztBQUNBLGdCQUFnQixlQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsbUJBQW1CLGVBQU87QUFDMUI7QUFDQTtBQUNBLFNBQVMsaUJBQWlCLGVBQU87QUFDakM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSxVQUFVO0FBQ1o7QUFDQSxFQUFFLE9BQU87O0FBRVQ7O0FBRUE7QUFDQSxJQUFJLFlBQVk7QUFDaEI7QUFDQSxJQUFJLE9BQU87QUFDWCw4QkFBOEIsVUFBVTtBQUN4QyxJQUFJLFlBQVk7QUFDaEIsSUFBSSxZQUFZO0FBQ2hCO0FBQ0E7O0FBRUEsY0FBYztBQUNkLGtCQUFrQixVQUFVO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQSxFQUFFLFlBQVk7QUFDZCxFQUFFLFlBQVk7O0FBRWQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEVBQUUsVUFBVTtBQUNaLGdCQUFnQixVQUFVO0FBQzFCLGNBQWMsVUFBVTtBQUN4QixFQUFFLFlBQVk7QUFDZCxFQUFFLFlBQVk7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoTThDO0FBQ3lCO0FBQ2xDO0FBQ0o7QUFDUzs7QUFFbkMsSUFBSSxlQUFPO0FBQ1gsSUFBSSxnQkFBUTtBQUNaO0FBQ0E7QUFDQSxJQUFJLGVBQU87QUFDWCxJQUFJLGFBQUs7O0FBRWhCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEVBQUUsYUFBSztBQUNQO0FBQ0EsZ0JBQWdCLGdCQUFZO0FBQzVCLEVBQUUsZUFBTyxPQUFPLGdCQUFZOztBQUU1QjtBQUNBLGFBQWEsV0FBVztBQUN4QjtBQUNBO0FBQ0EsUUFBUSxRQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxNQUFNLFdBQVc7QUFDakIsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLGlCQUFpQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksU0FBUztBQUNiLElBQUksU0FBUztBQUNiOztBQUVBLGVBQWUsYUFBSztBQUNwQjs7QUFFQTtBQUNBLEVBQUUsZUFBTztBQUNULEVBQUUsYUFBSztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esb0RBQW9ELFFBQVEsaUJBQWlCLGlCQUFpQixFQUFFO0FBQ2hHO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBOzs7QUM3SWtDO0FBQ2U7QUFDTjs7QUFFNUI7QUFDZixVQUFVLFdBQU07QUFDaEIsVUFBVSxXQUFNO0FBQ2hCOztBQUVBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLDBDQUEwQyxlQUFPLElBQUksZUFBTyw2QkFBNkIsZUFBTyxJQUFJLGVBQU87QUFDM0c7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUVBQWlFLHVCQUFRO0FBQ3pFOztBQUVBO0FBQ0EsaUVBQWlFLHVCQUFRO0FBQ3pFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOzs7QUMvQzRDOzs7QUNBOUI7QUFDZjtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUNKYztBQUNmO0FBQ0E7QUFDQTtBQUNBOzs7QUNKTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVPLElBQUksa0JBQVE7O0FBRW5CLG1CQUFTOztBQUVNLFNBQVMsbUJBQVM7QUFDakMsNkRBQTZELGtCQUFRO0FBQ3JFO0FBQ0E7OztBQ2xEbUM7O0FBRTVCLFNBQVMseUJBQWE7QUFDN0IsRUFBRSxRQUFLO0FBQ1A7O0FBRWU7QUFDZixFQUFFLFFBQUs7QUFDUCxFQUFFLFFBQUs7QUFDUCxDQUFDOzs7QUNUb0M7QUFDVztBQUNEO0FBQ3VCO0FBQzlCO0FBQ0g7QUFDRjtBQUNnQjtBQUNDOztBQUVwRDtBQUNBLFNBQVMsa0JBQWE7QUFDdEIsVUFBVSxRQUFLLGFBQWEsUUFBSztBQUNqQzs7QUFFQSxTQUFTLGtCQUFhO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0Isa0JBQVE7QUFDaEM7O0FBRUE7QUFDQSxVQUFVLFFBQUssV0FBVyxRQUFLLDBCQUEwQixRQUFLO0FBQzlEOztBQUVBLFNBQVMscUJBQWdCO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZixlQUFlLGtCQUFhO0FBQzVCLGVBQWUsa0JBQWE7QUFDNUI7QUFDQTtBQUNBLGtCQUFrQixxQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQWU7QUFDbkMsa0JBQWtCLFlBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSwrQ0FBK0MsU0FBUztBQUN4RDs7QUFFQTtBQUNBO0FBQ0Esb0VBQW9FLFNBQVM7QUFDN0U7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0Msa0NBQWtDLEVBQUU7QUFDMUUsbURBQW1ELGdDQUFnQyxFQUFFO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0Isa0JBQWtCLDRCQUE0QixTQUFTLFNBQVMsc0NBQXNDO0FBQ3RHO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLE1BQU0sV0FBVyxLQUFLLFNBQVM7QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxLQUFLOztBQUVqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTSxTQUFTO0FBQ2Y7QUFDQTs7QUFFQSxJQUFJLG1CQUFPO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksVUFBTSxDQUFDLFFBQUs7QUFDeEIsWUFBWSxLQUFLO0FBQ2pCLGFBQWEsUUFBSztBQUNsQixhQUFhLFFBQUs7O0FBRWxCLElBQUksTUFBVyxDQUFDLFFBQUs7QUFDckIsSUFBSSx5QkFBYTtBQUNqQjtBQUNBLElBQUksU0FBUztBQUNiOztBQUVBO0FBQ0EsTUFBTSxtQkFBTztBQUNiO0FBQ0EsaUJBQWlCLFFBQUssb0JBQW9CLFFBQUs7QUFDL0M7QUFDQTtBQUNBLHNFQUFzRSxLQUFLO0FBQzNFOztBQUVBO0FBQ0E7QUFDQSxNQUFNLE9BQVUsQ0FBQyxRQUFLO0FBQ3RCLE1BQU0sbUJBQU87QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLO0FBQ2xCO0FBQ0EscUJBQXFCLFFBQUs7QUFDMUI7O0FBRUEsSUFBSSxtQkFBTztBQUNYLHNCQUFzQixVQUFNO0FBQzVCLFNBQVMsVUFBTTtBQUNmOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBSztBQUN2QjtBQUNBLHFDQUFxQyxRQUFLO0FBQzFDOztBQUVBLElBQUkseUJBQWE7QUFDakIsZUFBZSxPQUFPO0FBQ3RCLDBCQUEwQixTQUFLO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNkRBQTZELHNCQUFzQixFQUFFO0FBQ3JGLE1BQU0sU0FBUztBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBSztBQUN2Qjs7QUFFQSxJQUFJLG1CQUFPO0FBQ1g7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QiwwQkFBMEIsU0FBSztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFLO0FBQ3ZCOztBQUVBLElBQUkseUJBQWE7QUFDakI7QUFDQSx5Q0FBeUMsb0JBQW9CLEVBQUU7QUFDL0QsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFVBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwRUFBMEUsb0JBQVE7QUFDbEY7O0FBRUE7QUFDQSxzRUFBc0Usb0JBQVE7QUFDOUU7O0FBRUE7QUFDQSx5RUFBeUUsb0JBQVE7QUFDakY7O0FBRUE7QUFDQSxzRUFBc0Usb0JBQVE7QUFDOUU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOzs7QUNsYXlDO0FBQ3dDOzs7QUNEeEM7QUFDakI7QUFDRDtBQUNDO0FBQ0E7QUFDSztBQUNMO0FBQ0U7QUFDQztBQUNKO0FBQ0Q7QUFDQztBQUNDO0FBQ0E7QUFDQztBQUNIO0FBQ007QUFDRTtBQUNQO0FBQ0c7QUFDQztBQUNGO0FBQ0Q7QUFDVTtBQUNOO0FBQ0o7QUFDRDtBQUNPO0FBQ047QUFDSztBQUNIO0FBQ0giLCJmaWxlIjoiNC5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB2YXIgbmFtZSA9IFwiZDNcIjtcbmV4cG9ydCB2YXIgdmVyc2lvbiA9IFwiNS4xNi4wXCI7XG5leHBvcnQgdmFyIGRlc2NyaXB0aW9uID0gXCJEYXRhLURyaXZlbiBEb2N1bWVudHNcIjtcbmV4cG9ydCB2YXIga2V5d29yZHMgPSBbXCJkb21cIixcInZpc3VhbGl6YXRpb25cIixcInN2Z1wiLFwiYW5pbWF0aW9uXCIsXCJjYW52YXNcIl07XG5leHBvcnQgdmFyIGhvbWVwYWdlID0gXCJodHRwczovL2QzanMub3JnXCI7XG5leHBvcnQgdmFyIGxpY2Vuc2UgPSBcIkJTRC0zLUNsYXVzZVwiO1xuZXhwb3J0IHZhciBhdXRob3IgPSB7XCJuYW1lXCI6XCJNaWtlIEJvc3RvY2tcIixcInVybFwiOlwiaHR0cHM6Ly9ib3N0Lm9ja3Mub3JnL21pa2VcIn07XG5leHBvcnQgdmFyIG1haW4gPSBcImRpc3QvZDMubm9kZS5qc1wiO1xuZXhwb3J0IHZhciB1bnBrZyA9IFwiZGlzdC9kMy5taW4uanNcIjtcbmV4cG9ydCB2YXIganNkZWxpdnIgPSBcImRpc3QvZDMubWluLmpzXCI7XG5leHBvcnQgdmFyIG1vZHVsZSA9IFwiaW5kZXguanNcIjtcbmV4cG9ydCB2YXIgcmVwb3NpdG9yeSA9IHtcInR5cGVcIjpcImdpdFwiLFwidXJsXCI6XCJodHRwczovL2dpdGh1Yi5jb20vZDMvZDMuZ2l0XCJ9O1xuZXhwb3J0IHZhciBmaWxlcyA9IFtcImRpc3QvKiovKi5qc1wiLFwiaW5kZXguanNcIl07XG5leHBvcnQgdmFyIHNjcmlwdHMgPSB7XCJwcmV0ZXN0XCI6XCJyaW1yYWYgZGlzdCAmJiBta2RpciBkaXN0ICYmIGpzb24ybW9kdWxlIHBhY2thZ2UuanNvbiA+IGRpc3QvcGFja2FnZS5qcyAmJiByb2xsdXAgLWNcIixcInRlc3RcIjpcInRhcGUgJ3Rlc3QvKiovKi10ZXN0LmpzJ1wiLFwicHJlcHVibGlzaE9ubHlcIjpcInlhcm4gdGVzdFwiLFwicG9zdHB1Ymxpc2hcIjpcImdpdCBwdXNoICYmIGdpdCBwdXNoIC0tdGFncyAmJiBjZCAuLi9kMy5naXRodWIuY29tICYmIGdpdCBwdWxsICYmIGNwIC4uL2QzL2Rpc3QvZDMuanMgZDMudjUuanMgJiYgY3AgLi4vZDMvZGlzdC9kMy5taW4uanMgZDMudjUubWluLmpzICYmIGdpdCBhZGQgZDMudjUuanMgZDMudjUubWluLmpzICYmIGdpdCBjb21taXQgLW0gXFxcImQzICR7bnBtX3BhY2thZ2VfdmVyc2lvbn1cXFwiICYmIGdpdCBwdXNoICYmIGNkIC0gJiYgY2QgLi4vZDMtYm93ZXIgJiYgZ2l0IHB1bGwgJiYgY3AgLi4vZDMvTElDRU5TRSAuLi9kMy9SRUFETUUubWQgLi4vZDMvZGlzdC9kMy5qcyAuLi9kMy9kaXN0L2QzLm1pbi5qcyAuICYmIGdpdCBhZGQgLS0gTElDRU5TRSBSRUFETUUubWQgZDMuanMgZDMubWluLmpzICYmIGdpdCBjb21taXQgLW0gXFxcIiR7bnBtX3BhY2thZ2VfdmVyc2lvbn1cXFwiICYmIGdpdCB0YWcgLWFtIFxcXCIke25wbV9wYWNrYWdlX3ZlcnNpb259XFxcIiB2JHtucG1fcGFja2FnZV92ZXJzaW9ufSAmJiBnaXQgcHVzaCAmJiBnaXQgcHVzaCAtLXRhZ3MgJiYgY2QgLSAmJiB6aXAgLWogZGlzdC9kMy56aXAgLS0gTElDRU5TRSBSRUFETUUubWQgQVBJLm1kIENIQU5HRVMubWQgZGlzdC9kMy5qcyBkaXN0L2QzLm1pbi5qc1wifTtcbmV4cG9ydCB2YXIgZGV2RGVwZW5kZW5jaWVzID0ge1wianNvbjJtb2R1bGVcIjpcIjAuMFwiLFwicmltcmFmXCI6XCIyXCIsXCJyb2xsdXBcIjpcIjFcIixcInJvbGx1cC1wbHVnaW4tYXNjaWlcIjpcIjAuMFwiLFwicm9sbHVwLXBsdWdpbi1ub2RlLXJlc29sdmVcIjpcIjNcIixcInJvbGx1cC1wbHVnaW4tdGVyc2VyXCI6XCI1XCIsXCJ0YXBlXCI6XCI0XCJ9O1xuZXhwb3J0IHZhciBkZXBlbmRlbmNpZXMgPSB7XCJkMy1hcnJheVwiOlwiMVwiLFwiZDMtYXhpc1wiOlwiMVwiLFwiZDMtYnJ1c2hcIjpcIjFcIixcImQzLWNob3JkXCI6XCIxXCIsXCJkMy1jb2xsZWN0aW9uXCI6XCIxXCIsXCJkMy1jb2xvclwiOlwiMVwiLFwiZDMtY29udG91clwiOlwiMVwiLFwiZDMtZGlzcGF0Y2hcIjpcIjFcIixcImQzLWRyYWdcIjpcIjFcIixcImQzLWRzdlwiOlwiMVwiLFwiZDMtZWFzZVwiOlwiMVwiLFwiZDMtZmV0Y2hcIjpcIjFcIixcImQzLWZvcmNlXCI6XCIxXCIsXCJkMy1mb3JtYXRcIjpcIjFcIixcImQzLWdlb1wiOlwiMVwiLFwiZDMtaGllcmFyY2h5XCI6XCIxXCIsXCJkMy1pbnRlcnBvbGF0ZVwiOlwiMVwiLFwiZDMtcGF0aFwiOlwiMVwiLFwiZDMtcG9seWdvblwiOlwiMVwiLFwiZDMtcXVhZHRyZWVcIjpcIjFcIixcImQzLXJhbmRvbVwiOlwiMVwiLFwiZDMtc2NhbGVcIjpcIjJcIixcImQzLXNjYWxlLWNocm9tYXRpY1wiOlwiMVwiLFwiZDMtc2VsZWN0aW9uXCI6XCIxXCIsXCJkMy1zaGFwZVwiOlwiMVwiLFwiZDMtdGltZVwiOlwiMVwiLFwiZDMtdGltZS1mb3JtYXRcIjpcIjJcIixcImQzLXRpbWVyXCI6XCIxXCIsXCJkMy10cmFuc2l0aW9uXCI6XCIxXCIsXCJkMy12b3Jvbm9pXCI6XCIxXCIsXCJkMy16b29tXCI6XCIxXCJ9O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wYXJlKSB7XG4gIGlmIChjb21wYXJlLmxlbmd0aCA9PT0gMSkgY29tcGFyZSA9IGFzY2VuZGluZ0NvbXBhcmF0b3IoY29tcGFyZSk7XG4gIHJldHVybiB7XG4gICAgbGVmdDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7XG4gICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwO1xuICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7XG4gICAgICB3aGlsZSAobG8gPCBoaSkge1xuICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsbztcbiAgICB9LFxuICAgIHJpZ2h0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHtcbiAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7XG4gICAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDtcbiAgICAgIHdoaWxlIChsbyA8IGhpKSB7XG4gICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxO1xuICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpID4gMCkgaGkgPSBtaWQ7XG4gICAgICAgIGVsc2UgbG8gPSBtaWQgKyAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxvO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7XG4gIHJldHVybiBmdW5jdGlvbihkLCB4KSB7XG4gICAgcmV0dXJuIGFzY2VuZGluZyhmKGQpLCB4KTtcbiAgfTtcbn1cbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nXCI7XG5pbXBvcnQgYmlzZWN0b3IgZnJvbSBcIi4vYmlzZWN0b3JcIjtcblxudmFyIGFzY2VuZGluZ0Jpc2VjdCA9IGJpc2VjdG9yKGFzY2VuZGluZyk7XG5leHBvcnQgdmFyIGJpc2VjdFJpZ2h0ID0gYXNjZW5kaW5nQmlzZWN0LnJpZ2h0O1xuZXhwb3J0IHZhciBiaXNlY3RMZWZ0ID0gYXNjZW5kaW5nQmlzZWN0LmxlZnQ7XG5leHBvcnQgZGVmYXVsdCBiaXNlY3RSaWdodDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGFycmF5LCBmKSB7XG4gIGlmIChmID09IG51bGwpIGYgPSBwYWlyO1xuICB2YXIgaSA9IDAsIG4gPSBhcnJheS5sZW5ndGggLSAxLCBwID0gYXJyYXlbMF0sIHBhaXJzID0gbmV3IEFycmF5KG4gPCAwID8gMCA6IG4pO1xuICB3aGlsZSAoaSA8IG4pIHBhaXJzW2ldID0gZihwLCBwID0gYXJyYXlbKytpXSk7XG4gIHJldHVybiBwYWlycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhaXIoYSwgYikge1xuICByZXR1cm4gW2EsIGJdO1xufVxuIiwiaW1wb3J0IHtwYWlyfSBmcm9tIFwiLi9wYWlyc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMwLCB2YWx1ZXMxLCByZWR1Y2UpIHtcbiAgdmFyIG4wID0gdmFsdWVzMC5sZW5ndGgsXG4gICAgICBuMSA9IHZhbHVlczEubGVuZ3RoLFxuICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4wICogbjEpLFxuICAgICAgaTAsXG4gICAgICBpMSxcbiAgICAgIGksXG4gICAgICB2YWx1ZTA7XG5cbiAgaWYgKHJlZHVjZSA9PSBudWxsKSByZWR1Y2UgPSBwYWlyO1xuXG4gIGZvciAoaTAgPSBpID0gMDsgaTAgPCBuMDsgKytpMCkge1xuICAgIGZvciAodmFsdWUwID0gdmFsdWVzMFtpMF0sIGkxID0gMDsgaTEgPCBuMTsgKytpMSwgKytpKSB7XG4gICAgICB2YWx1ZXNbaV0gPSByZWR1Y2UodmFsdWUwLCB2YWx1ZXMxW2kxXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4O1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG0gPSAwLFxuICAgICAgaSA9IC0xLFxuICAgICAgbWVhbiA9IDAsXG4gICAgICB2YWx1ZSxcbiAgICAgIGRlbHRhLFxuICAgICAgc3VtID0gMDtcblxuICBpZiAodmFsdWVvZiA9PSBudWxsKSB7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVzW2ldKSkpIHtcbiAgICAgICAgZGVsdGEgPSB2YWx1ZSAtIG1lYW47XG4gICAgICAgIG1lYW4gKz0gZGVsdGEgLyArK207XG4gICAgICAgIHN1bSArPSBkZWx0YSAqICh2YWx1ZSAtIG1lYW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVsc2Uge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSkpIHtcbiAgICAgICAgZGVsdGEgPSB2YWx1ZSAtIG1lYW47XG4gICAgICAgIG1lYW4gKz0gZGVsdGEgLyArK207XG4gICAgICAgIHN1bSArPSBkZWx0YSAqICh2YWx1ZSAtIG1lYW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChtID4gMSkgcmV0dXJuIHN1bSAvIChtIC0gMSk7XG59XG4iLCJpbXBvcnQgdmFyaWFuY2UgZnJvbSBcIi4vdmFyaWFuY2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYXJyYXksIGYpIHtcbiAgdmFyIHYgPSB2YXJpYW5jZShhcnJheSwgZik7XG4gIHJldHVybiB2ID8gTWF0aC5zcXJ0KHYpIDogdjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcywgdmFsdWVvZikge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBpID0gLTEsXG4gICAgICB2YWx1ZSxcbiAgICAgIG1pbixcbiAgICAgIG1heDtcblxuICBpZiAodmFsdWVvZiA9PSBudWxsKSB7XG4gICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS5cbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHtcbiAgICAgICAgbWluID0gbWF4ID0gdmFsdWU7XG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuXG4gICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKG1pbiA+IHZhbHVlKSBtaW4gPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZWxzZSB7XG4gICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS5cbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkge1xuICAgICAgICBtaW4gPSBtYXggPSB2YWx1ZTtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy5cbiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbbWluLCBtYXhdO1xufVxuIiwidmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlO1xuXG5leHBvcnQgdmFyIHNsaWNlID0gYXJyYXkuc2xpY2U7XG5leHBvcnQgdmFyIG1hcCA9IGFycmF5Lm1hcDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7XG4gIHN0YXJ0ID0gK3N0YXJ0LCBzdG9wID0gK3N0b3AsIHN0ZXAgPSAobiA9IGFyZ3VtZW50cy5sZW5ndGgpIDwgMiA/IChzdG9wID0gc3RhcnQsIHN0YXJ0ID0gMCwgMSkgOiBuIDwgMyA/IDEgOiArc3RlcDtcblxuICB2YXIgaSA9IC0xLFxuICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsXG4gICAgICByYW5nZSA9IG5ldyBBcnJheShuKTtcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIHJhbmdlW2ldID0gc3RhcnQgKyBpICogc3RlcDtcbiAgfVxuXG4gIHJldHVybiByYW5nZTtcbn1cbiIsInZhciBlMTAgPSBNYXRoLnNxcnQoNTApLFxuICAgIGU1ID0gTWF0aC5zcXJ0KDEwKSxcbiAgICBlMiA9IE1hdGguc3FydCgyKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RhcnQsIHN0b3AsIGNvdW50KSB7XG4gIHZhciByZXZlcnNlLFxuICAgICAgaSA9IC0xLFxuICAgICAgbixcbiAgICAgIHRpY2tzLFxuICAgICAgc3RlcDtcblxuICBzdG9wID0gK3N0b3AsIHN0YXJ0ID0gK3N0YXJ0LCBjb3VudCA9ICtjb3VudDtcbiAgaWYgKHN0YXJ0ID09PSBzdG9wICYmIGNvdW50ID4gMCkgcmV0dXJuIFtzdGFydF07XG4gIGlmIChyZXZlcnNlID0gc3RvcCA8IHN0YXJ0KSBuID0gc3RhcnQsIHN0YXJ0ID0gc3RvcCwgc3RvcCA9IG47XG4gIGlmICgoc3RlcCA9IHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KSkgPT09IDAgfHwgIWlzRmluaXRlKHN0ZXApKSByZXR1cm4gW107XG5cbiAgaWYgKHN0ZXAgPiAwKSB7XG4gICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgLyBzdGVwKTtcbiAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wIC8gc3RlcCk7XG4gICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IE1hdGguY2VpbChzdG9wIC0gc3RhcnQgKyAxKSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHN0YXJ0ICsgaSkgKiBzdGVwO1xuICB9IGVsc2Uge1xuICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAqIHN0ZXApO1xuICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAqIHN0ZXApO1xuICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSBNYXRoLmNlaWwoc3RhcnQgLSBzdG9wICsgMSkpO1xuICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tpXSA9IChzdGFydCAtIGkpIC8gc3RlcDtcbiAgfVxuXG4gIGlmIChyZXZlcnNlKSB0aWNrcy5yZXZlcnNlKCk7XG5cbiAgcmV0dXJuIHRpY2tzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgdmFyIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDAsIGNvdW50KSxcbiAgICAgIHBvd2VyID0gTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwKSAvIE1hdGguTE4xMCksXG4gICAgICBlcnJvciA9IHN0ZXAgLyBNYXRoLnBvdygxMCwgcG93ZXIpO1xuICByZXR1cm4gcG93ZXIgPj0gMFxuICAgICAgPyAoZXJyb3IgPj0gZTEwID8gMTAgOiBlcnJvciA+PSBlNSA/IDUgOiBlcnJvciA+PSBlMiA/IDIgOiAxKSAqIE1hdGgucG93KDEwLCBwb3dlcilcbiAgICAgIDogLU1hdGgucG93KDEwLCAtcG93ZXIpIC8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJyb3IgPj0gZTIgPyAyIDogMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgdmFyIHN0ZXAwID0gTWF0aC5hYnMoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDAsIGNvdW50KSxcbiAgICAgIHN0ZXAxID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2coc3RlcDApIC8gTWF0aC5MTjEwKSksXG4gICAgICBlcnJvciA9IHN0ZXAwIC8gc3RlcDE7XG4gIGlmIChlcnJvciA+PSBlMTApIHN0ZXAxICo9IDEwO1xuICBlbHNlIGlmIChlcnJvciA+PSBlNSkgc3RlcDEgKj0gNTtcbiAgZWxzZSBpZiAoZXJyb3IgPj0gZTIpIHN0ZXAxICo9IDI7XG4gIHJldHVybiBzdG9wIDwgc3RhcnQgPyAtc3RlcDEgOiBzdGVwMTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlcy5sZW5ndGgpIC8gTWF0aC5MTjIpICsgMTtcbn1cbiIsImltcG9ydCB7c2xpY2V9IGZyb20gXCIuL2FycmF5XCI7XG5pbXBvcnQgYmlzZWN0IGZyb20gXCIuL2Jpc2VjdFwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgZXh0ZW50IGZyb20gXCIuL2V4dGVudFwiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5XCI7XG5pbXBvcnQgcmFuZ2UgZnJvbSBcIi4vcmFuZ2VcIjtcbmltcG9ydCB7dGlja1N0ZXB9IGZyb20gXCIuL3RpY2tzXCI7XG5pbXBvcnQgc3R1cmdlcyBmcm9tIFwiLi90aHJlc2hvbGQvc3R1cmdlc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHZhbHVlID0gaWRlbnRpdHksXG4gICAgICBkb21haW4gPSBleHRlbnQsXG4gICAgICB0aHJlc2hvbGQgPSBzdHVyZ2VzO1xuXG4gIGZ1bmN0aW9uIGhpc3RvZ3JhbShkYXRhKSB7XG4gICAgdmFyIGksXG4gICAgICAgIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgeCxcbiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4pO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdmFsdWVzW2ldID0gdmFsdWUoZGF0YVtpXSwgaSwgZGF0YSk7XG4gICAgfVxuXG4gICAgdmFyIHh6ID0gZG9tYWluKHZhbHVlcyksXG4gICAgICAgIHgwID0geHpbMF0sXG4gICAgICAgIHgxID0geHpbMV0sXG4gICAgICAgIHR6ID0gdGhyZXNob2xkKHZhbHVlcywgeDAsIHgxKTtcblxuICAgIC8vIENvbnZlcnQgbnVtYmVyIG9mIHRocmVzaG9sZHMgaW50byB1bmlmb3JtIHRocmVzaG9sZHMuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkge1xuICAgICAgdHogPSB0aWNrU3RlcCh4MCwgeDEsIHR6KTtcbiAgICAgIHR6ID0gcmFuZ2UoTWF0aC5jZWlsKHgwIC8gdHopICogdHosIHgxLCB0eik7IC8vIGV4Y2x1c2l2ZVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgdGhyZXNob2xkcyBvdXRzaWRlIHRoZSBkb21haW4uXG4gICAgdmFyIG0gPSB0ei5sZW5ndGg7XG4gICAgd2hpbGUgKHR6WzBdIDw9IHgwKSB0ei5zaGlmdCgpLCAtLW07XG4gICAgd2hpbGUgKHR6W20gLSAxXSA+IHgxKSB0ei5wb3AoKSwgLS1tO1xuXG4gICAgdmFyIGJpbnMgPSBuZXcgQXJyYXkobSArIDEpLFxuICAgICAgICBiaW47XG5cbiAgICAvLyBJbml0aWFsaXplIGJpbnMuXG4gICAgZm9yIChpID0gMDsgaSA8PSBtOyArK2kpIHtcbiAgICAgIGJpbiA9IGJpbnNbaV0gPSBbXTtcbiAgICAgIGJpbi54MCA9IGkgPiAwID8gdHpbaSAtIDFdIDogeDA7XG4gICAgICBiaW4ueDEgPSBpIDwgbSA/IHR6W2ldIDogeDE7XG4gICAgfVxuXG4gICAgLy8gQXNzaWduIGRhdGEgdG8gYmlucyBieSB2YWx1ZSwgaWdub3JpbmcgYW55IG91dHNpZGUgdGhlIGRvbWFpbi5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB4ID0gdmFsdWVzW2ldO1xuICAgICAgaWYgKHgwIDw9IHggJiYgeCA8PSB4MSkge1xuICAgICAgICBiaW5zW2Jpc2VjdCh0eiwgeCwgMCwgbSldLnB1c2goZGF0YVtpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJpbnM7XG4gIH1cblxuICBoaXN0b2dyYW0udmFsdWUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCBoaXN0b2dyYW0pIDogdmFsdWU7XG4gIH07XG5cbiAgaGlzdG9ncmFtLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KFtfWzBdLCBfWzFdXSksIGhpc3RvZ3JhbSkgOiBkb21haW47XG4gIH07XG5cbiAgaGlzdG9ncmFtLnRocmVzaG9sZHMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhyZXNob2xkID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29uc3RhbnQoc2xpY2UuY2FsbChfKSkgOiBjb25zdGFudChfKSwgaGlzdG9ncmFtKSA6IHRocmVzaG9sZDtcbiAgfTtcblxuICByZXR1cm4gaGlzdG9ncmFtO1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzLCBwLCB2YWx1ZW9mKSB7XG4gIGlmICh2YWx1ZW9mID09IG51bGwpIHZhbHVlb2YgPSBudW1iZXI7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSkgcmV0dXJuO1xuICBpZiAoKHAgPSArcCkgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG4iLCJpbXBvcnQge21hcH0gZnJvbSBcIi4uL2FycmF5XCI7XG5pbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuLi9hc2NlbmRpbmdcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlclwiO1xuaW1wb3J0IHF1YW50aWxlIGZyb20gXCIuLi9xdWFudGlsZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMsIG1pbiwgbWF4KSB7XG4gIHZhbHVlcyA9IG1hcC5jYWxsKHZhbHVlcywgbnVtYmVyKS5zb3J0KGFzY2VuZGluZyk7XG4gIHJldHVybiBNYXRoLmNlaWwoKG1heCAtIG1pbikgLyAoMiAqIChxdWFudGlsZSh2YWx1ZXMsIDAuNzUpIC0gcXVhbnRpbGUodmFsdWVzLCAwLjI1KSkgKiBNYXRoLnBvdyh2YWx1ZXMubGVuZ3RoLCAtMSAvIDMpKSk7XG59XG4iLCJpbXBvcnQgZGV2aWF0aW9uIGZyb20gXCIuLi9kZXZpYXRpb25cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzLCBtaW4sIG1heCkge1xuICByZXR1cm4gTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gKDMuNSAqIGRldmlhdGlvbih2YWx1ZXMpICogTWF0aC5wb3codmFsdWVzLmxlbmd0aCwgLTEgLyAzKSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIGkgPSAtMSxcbiAgICAgIHZhbHVlLFxuICAgICAgbWF4O1xuXG4gIGlmICh2YWx1ZW9mID09IG51bGwpIHtcbiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLlxuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy5cbiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVlID4gbWF4KSB7XG4gICAgICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlbHNlIHtcbiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLlxuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLlxuICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiB2YWx1ZSA+IG1heCkge1xuICAgICAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1heDtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcywgdmFsdWVvZikge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBtID0gbixcbiAgICAgIGkgPSAtMSxcbiAgICAgIHZhbHVlLFxuICAgICAgc3VtID0gMDtcblxuICBpZiAodmFsdWVvZiA9PSBudWxsKSB7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVzW2ldKSkpIHN1bSArPSB2YWx1ZTtcbiAgICAgIGVsc2UgLS1tO1xuICAgIH1cbiAgfVxuXG4gIGVsc2Uge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSkpIHN1bSArPSB2YWx1ZTtcbiAgICAgIGVsc2UgLS1tO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtKSByZXR1cm4gc3VtIC8gbTtcbn1cbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlclwiO1xuaW1wb3J0IHF1YW50aWxlIGZyb20gXCIuL3F1YW50aWxlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcywgdmFsdWVvZikge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBpID0gLTEsXG4gICAgICB2YWx1ZSxcbiAgICAgIG51bWJlcnMgPSBbXTtcblxuICBpZiAodmFsdWVvZiA9PSBudWxsKSB7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVzW2ldKSkpIHtcbiAgICAgICAgbnVtYmVycy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlbHNlIHtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlcih2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpKSB7XG4gICAgICAgIG51bWJlcnMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHF1YW50aWxlKG51bWJlcnMuc29ydChhc2NlbmRpbmcpLCAwLjUpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYXJyYXlzKSB7XG4gIHZhciBuID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgIG0sXG4gICAgICBpID0gLTEsXG4gICAgICBqID0gMCxcbiAgICAgIG1lcmdlZCxcbiAgICAgIGFycmF5O1xuXG4gIHdoaWxlICgrK2kgPCBuKSBqICs9IGFycmF5c1tpXS5sZW5ndGg7XG4gIG1lcmdlZCA9IG5ldyBBcnJheShqKTtcblxuICB3aGlsZSAoLS1uID49IDApIHtcbiAgICBhcnJheSA9IGFycmF5c1tuXTtcbiAgICBtID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlICgtLW0gPj0gMCkge1xuICAgICAgbWVyZ2VkWy0tal0gPSBhcnJheVttXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIGkgPSAtMSxcbiAgICAgIHZhbHVlLFxuICAgICAgbWluO1xuXG4gIGlmICh2YWx1ZW9mID09IG51bGwpIHtcbiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLlxuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy5cbiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIG1pbiA+IHZhbHVlKSB7XG4gICAgICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlbHNlIHtcbiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLlxuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7XG4gICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLlxuICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiBtaW4gPiB2YWx1ZSkge1xuICAgICAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1pbjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7XG4gIHZhciBpID0gaW5kZXhlcy5sZW5ndGgsIHBlcm11dGVzID0gbmV3IEFycmF5KGkpO1xuICB3aGlsZSAoaS0tKSBwZXJtdXRlc1tpXSA9IGFycmF5W2luZGV4ZXNbaV1dO1xuICByZXR1cm4gcGVybXV0ZXM7XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMsIGNvbXBhcmUpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpKSByZXR1cm47XG4gIHZhciBuLFxuICAgICAgaSA9IDAsXG4gICAgICBqID0gMCxcbiAgICAgIHhpLFxuICAgICAgeGogPSB2YWx1ZXNbal07XG5cbiAgaWYgKGNvbXBhcmUgPT0gbnVsbCkgY29tcGFyZSA9IGFzY2VuZGluZztcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIGlmIChjb21wYXJlKHhpID0gdmFsdWVzW2ldLCB4aikgPCAwIHx8IGNvbXBhcmUoeGosIHhqKSAhPT0gMCkge1xuICAgICAgeGogPSB4aSwgaiA9IGk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbXBhcmUoeGosIHhqKSA9PT0gMCkgcmV0dXJuIGo7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhcnJheSwgaTAsIGkxKSB7XG4gIHZhciBtID0gKGkxID09IG51bGwgPyBhcnJheS5sZW5ndGggOiBpMSkgLSAoaTAgPSBpMCA9PSBudWxsID8gMCA6ICtpMCksXG4gICAgICB0LFxuICAgICAgaTtcblxuICB3aGlsZSAobSkge1xuICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDtcbiAgICB0ID0gYXJyYXlbbSArIGkwXTtcbiAgICBhcnJheVttICsgaTBdID0gYXJyYXlbaSArIGkwXTtcbiAgICBhcnJheVtpICsgaTBdID0gdDtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcywgdmFsdWVvZikge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBpID0gLTEsXG4gICAgICB2YWx1ZSxcbiAgICAgIHN1bSA9IDA7XG5cbiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAodmFsdWUgPSArdmFsdWVzW2ldKSBzdW0gKz0gdmFsdWU7IC8vIE5vdGU6IHplcm8gYW5kIG51bGwgYXJlIGVxdWl2YWxlbnQuXG4gICAgfVxuICB9XG5cbiAgZWxzZSB7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh2YWx1ZSA9ICt2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgc3VtICs9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdW07XG59XG4iLCJpbXBvcnQgbWluIGZyb20gXCIuL21pblwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRyaXgpIHtcbiAgaWYgKCEobiA9IG1hdHJpeC5sZW5ndGgpKSByZXR1cm4gW107XG4gIGZvciAodmFyIGkgPSAtMSwgbSA9IG1pbihtYXRyaXgsIGxlbmd0aCksIHRyYW5zcG9zZSA9IG5ldyBBcnJheShtKTsgKytpIDwgbTspIHtcbiAgICBmb3IgKHZhciBqID0gLTEsIG4sIHJvdyA9IHRyYW5zcG9zZVtpXSA9IG5ldyBBcnJheShuKTsgKytqIDwgbjspIHtcbiAgICAgIHJvd1tqXSA9IG1hdHJpeFtqXVtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRyYW5zcG9zZTtcbn1cblxuZnVuY3Rpb24gbGVuZ3RoKGQpIHtcbiAgcmV0dXJuIGQubGVuZ3RoO1xufVxuIiwiaW1wb3J0IHRyYW5zcG9zZSBmcm9tIFwiLi90cmFuc3Bvc2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0cmFuc3Bvc2UoYXJndW1lbnRzKTtcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBiaXNlY3QsIGJpc2VjdFJpZ2h0LCBiaXNlY3RMZWZ0fSBmcm9tIFwiLi9iaXNlY3RcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBhc2NlbmRpbmd9IGZyb20gXCIuL2FzY2VuZGluZ1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGJpc2VjdG9yfSBmcm9tIFwiLi9iaXNlY3RvclwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGNyb3NzfSBmcm9tIFwiLi9jcm9zc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGRlc2NlbmRpbmd9IGZyb20gXCIuL2Rlc2NlbmRpbmdcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBkZXZpYXRpb259IGZyb20gXCIuL2RldmlhdGlvblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGV4dGVudH0gZnJvbSBcIi4vZXh0ZW50XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaGlzdG9ncmFtfSBmcm9tIFwiLi9oaXN0b2dyYW1cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzfSBmcm9tIFwiLi90aHJlc2hvbGQvZnJlZWRtYW5EaWFjb25pc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRocmVzaG9sZFNjb3R0fSBmcm9tIFwiLi90aHJlc2hvbGQvc2NvdHRcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0aHJlc2hvbGRTdHVyZ2VzfSBmcm9tIFwiLi90aHJlc2hvbGQvc3R1cmdlc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG1heH0gZnJvbSBcIi4vbWF4XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWVhbn0gZnJvbSBcIi4vbWVhblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG1lZGlhbn0gZnJvbSBcIi4vbWVkaWFuXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWVyZ2V9IGZyb20gXCIuL21lcmdlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWlufSBmcm9tIFwiLi9taW5cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwYWlyc30gZnJvbSBcIi4vcGFpcnNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwZXJtdXRlfSBmcm9tIFwiLi9wZXJtdXRlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcXVhbnRpbGV9IGZyb20gXCIuL3F1YW50aWxlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcmFuZ2V9IGZyb20gXCIuL3JhbmdlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2Nhbn0gZnJvbSBcIi4vc2NhblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNodWZmbGV9IGZyb20gXCIuL3NodWZmbGVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdW19IGZyb20gXCIuL3N1bVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRpY2tzLCB0aWNrSW5jcmVtZW50LCB0aWNrU3RlcH0gZnJvbSBcIi4vdGlja3NcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc3Bvc2V9IGZyb20gXCIuL3RyYW5zcG9zZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHZhcmlhbmNlfSBmcm9tIFwiLi92YXJpYW5jZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHppcH0gZnJvbSBcIi4vemlwXCI7XG4iLCJleHBvcnQgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cbiIsImltcG9ydCB7c2xpY2V9IGZyb20gXCIuL2FycmF5XCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHlcIjtcblxudmFyIHRvcCA9IDEsXG4gICAgcmlnaHQgPSAyLFxuICAgIGJvdHRvbSA9IDMsXG4gICAgbGVmdCA9IDQsXG4gICAgZXBzaWxvbiA9IDFlLTY7XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZVgoeCkge1xuICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyAoeCArIDAuNSkgKyBcIiwwKVwiO1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVZKHkpIHtcbiAgcmV0dXJuIFwidHJhbnNsYXRlKDAsXCIgKyAoeSArIDAuNSkgKyBcIilcIjtcbn1cblxuZnVuY3Rpb24gbnVtYmVyKHNjYWxlKSB7XG4gIHJldHVybiBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuICtzY2FsZShkKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2VudGVyKHNjYWxlKSB7XG4gIHZhciBvZmZzZXQgPSBNYXRoLm1heCgwLCBzY2FsZS5iYW5kd2lkdGgoKSAtIDEpIC8gMjsgLy8gQWRqdXN0IGZvciAwLjVweCBvZmZzZXQuXG4gIGlmIChzY2FsZS5yb3VuZCgpKSBvZmZzZXQgPSBNYXRoLnJvdW5kKG9mZnNldCk7XG4gIHJldHVybiBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuICtzY2FsZShkKSArIG9mZnNldDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZW50ZXJpbmcoKSB7XG4gIHJldHVybiAhdGhpcy5fX2F4aXM7XG59XG5cbmZ1bmN0aW9uIGF4aXMob3JpZW50LCBzY2FsZSkge1xuICB2YXIgdGlja0FyZ3VtZW50cyA9IFtdLFxuICAgICAgdGlja1ZhbHVlcyA9IG51bGwsXG4gICAgICB0aWNrRm9ybWF0ID0gbnVsbCxcbiAgICAgIHRpY2tTaXplSW5uZXIgPSA2LFxuICAgICAgdGlja1NpemVPdXRlciA9IDYsXG4gICAgICB0aWNrUGFkZGluZyA9IDMsXG4gICAgICBrID0gb3JpZW50ID09PSB0b3AgfHwgb3JpZW50ID09PSBsZWZ0ID8gLTEgOiAxLFxuICAgICAgeCA9IG9yaWVudCA9PT0gbGVmdCB8fCBvcmllbnQgPT09IHJpZ2h0ID8gXCJ4XCIgOiBcInlcIixcbiAgICAgIHRyYW5zZm9ybSA9IG9yaWVudCA9PT0gdG9wIHx8IG9yaWVudCA9PT0gYm90dG9tID8gdHJhbnNsYXRlWCA6IHRyYW5zbGF0ZVk7XG5cbiAgZnVuY3Rpb24gYXhpcyhjb250ZXh0KSB7XG4gICAgdmFyIHZhbHVlcyA9IHRpY2tWYWx1ZXMgPT0gbnVsbCA/IChzY2FsZS50aWNrcyA/IHNjYWxlLnRpY2tzLmFwcGx5KHNjYWxlLCB0aWNrQXJndW1lbnRzKSA6IHNjYWxlLmRvbWFpbigpKSA6IHRpY2tWYWx1ZXMsXG4gICAgICAgIGZvcm1hdCA9IHRpY2tGb3JtYXQgPT0gbnVsbCA/IChzY2FsZS50aWNrRm9ybWF0ID8gc2NhbGUudGlja0Zvcm1hdC5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50cykgOiBpZGVudGl0eSkgOiB0aWNrRm9ybWF0LFxuICAgICAgICBzcGFjaW5nID0gTWF0aC5tYXgodGlja1NpemVJbm5lciwgMCkgKyB0aWNrUGFkZGluZyxcbiAgICAgICAgcmFuZ2UgPSBzY2FsZS5yYW5nZSgpLFxuICAgICAgICByYW5nZTAgPSArcmFuZ2VbMF0gKyAwLjUsXG4gICAgICAgIHJhbmdlMSA9ICtyYW5nZVtyYW5nZS5sZW5ndGggLSAxXSArIDAuNSxcbiAgICAgICAgcG9zaXRpb24gPSAoc2NhbGUuYmFuZHdpZHRoID8gY2VudGVyIDogbnVtYmVyKShzY2FsZS5jb3B5KCkpLFxuICAgICAgICBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0LFxuICAgICAgICBwYXRoID0gc2VsZWN0aW9uLnNlbGVjdEFsbChcIi5kb21haW5cIikuZGF0YShbbnVsbF0pLFxuICAgICAgICB0aWNrID0gc2VsZWN0aW9uLnNlbGVjdEFsbChcIi50aWNrXCIpLmRhdGEodmFsdWVzLCBzY2FsZSkub3JkZXIoKSxcbiAgICAgICAgdGlja0V4aXQgPSB0aWNrLmV4aXQoKSxcbiAgICAgICAgdGlja0VudGVyID0gdGljay5lbnRlcigpLmFwcGVuZChcImdcIikuYXR0cihcImNsYXNzXCIsIFwidGlja1wiKSxcbiAgICAgICAgbGluZSA9IHRpY2suc2VsZWN0KFwibGluZVwiKSxcbiAgICAgICAgdGV4dCA9IHRpY2suc2VsZWN0KFwidGV4dFwiKTtcblxuICAgIHBhdGggPSBwYXRoLm1lcmdlKHBhdGguZW50ZXIoKS5pbnNlcnQoXCJwYXRoXCIsIFwiLnRpY2tcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImRvbWFpblwiKVxuICAgICAgICAuYXR0cihcInN0cm9rZVwiLCBcImN1cnJlbnRDb2xvclwiKSk7XG5cbiAgICB0aWNrID0gdGljay5tZXJnZSh0aWNrRW50ZXIpO1xuXG4gICAgbGluZSA9IGxpbmUubWVyZ2UodGlja0VudGVyLmFwcGVuZChcImxpbmVcIilcbiAgICAgICAgLmF0dHIoXCJzdHJva2VcIiwgXCJjdXJyZW50Q29sb3JcIilcbiAgICAgICAgLmF0dHIoeCArIFwiMlwiLCBrICogdGlja1NpemVJbm5lcikpO1xuXG4gICAgdGV4dCA9IHRleHQubWVyZ2UodGlja0VudGVyLmFwcGVuZChcInRleHRcIilcbiAgICAgICAgLmF0dHIoXCJmaWxsXCIsIFwiY3VycmVudENvbG9yXCIpXG4gICAgICAgIC5hdHRyKHgsIGsgKiBzcGFjaW5nKVxuICAgICAgICAuYXR0cihcImR5XCIsIG9yaWVudCA9PT0gdG9wID8gXCIwZW1cIiA6IG9yaWVudCA9PT0gYm90dG9tID8gXCIwLjcxZW1cIiA6IFwiMC4zMmVtXCIpKTtcblxuICAgIGlmIChjb250ZXh0ICE9PSBzZWxlY3Rpb24pIHtcbiAgICAgIHBhdGggPSBwYXRoLnRyYW5zaXRpb24oY29udGV4dCk7XG4gICAgICB0aWNrID0gdGljay50cmFuc2l0aW9uKGNvbnRleHQpO1xuICAgICAgbGluZSA9IGxpbmUudHJhbnNpdGlvbihjb250ZXh0KTtcbiAgICAgIHRleHQgPSB0ZXh0LnRyYW5zaXRpb24oY29udGV4dCk7XG5cbiAgICAgIHRpY2tFeGl0ID0gdGlja0V4aXQudHJhbnNpdGlvbihjb250ZXh0KVxuICAgICAgICAgIC5hdHRyKFwib3BhY2l0eVwiLCBlcHNpbG9uKVxuICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGlzRmluaXRlKGQgPSBwb3NpdGlvbihkKSkgPyB0cmFuc2Zvcm0oZCkgOiB0aGlzLmdldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTsgfSk7XG5cbiAgICAgIHRpY2tFbnRlclxuICAgICAgICAgIC5hdHRyKFwib3BhY2l0eVwiLCBlcHNpbG9uKVxuICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uKGQpIHsgdmFyIHAgPSB0aGlzLnBhcmVudE5vZGUuX19heGlzOyByZXR1cm4gdHJhbnNmb3JtKHAgJiYgaXNGaW5pdGUocCA9IHAoZCkpID8gcCA6IHBvc2l0aW9uKGQpKTsgfSk7XG4gICAgfVxuXG4gICAgdGlja0V4aXQucmVtb3ZlKCk7XG5cbiAgICBwYXRoXG4gICAgICAgIC5hdHRyKFwiZFwiLCBvcmllbnQgPT09IGxlZnQgfHwgb3JpZW50ID09IHJpZ2h0XG4gICAgICAgICAgICA/ICh0aWNrU2l6ZU91dGVyID8gXCJNXCIgKyBrICogdGlja1NpemVPdXRlciArIFwiLFwiICsgcmFuZ2UwICsgXCJIMC41VlwiICsgcmFuZ2UxICsgXCJIXCIgKyBrICogdGlja1NpemVPdXRlciA6IFwiTTAuNSxcIiArIHJhbmdlMCArIFwiVlwiICsgcmFuZ2UxKVxuICAgICAgICAgICAgOiAodGlja1NpemVPdXRlciA/IFwiTVwiICsgcmFuZ2UwICsgXCIsXCIgKyBrICogdGlja1NpemVPdXRlciArIFwiVjAuNUhcIiArIHJhbmdlMSArIFwiVlwiICsgayAqIHRpY2tTaXplT3V0ZXIgOiBcIk1cIiArIHJhbmdlMCArIFwiLDAuNUhcIiArIHJhbmdlMSkpO1xuXG4gICAgdGlja1xuICAgICAgICAuYXR0cihcIm9wYWNpdHlcIiwgMSlcbiAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gdHJhbnNmb3JtKHBvc2l0aW9uKGQpKTsgfSk7XG5cbiAgICBsaW5lXG4gICAgICAgIC5hdHRyKHggKyBcIjJcIiwgayAqIHRpY2tTaXplSW5uZXIpO1xuXG4gICAgdGV4dFxuICAgICAgICAuYXR0cih4LCBrICogc3BhY2luZylcbiAgICAgICAgLnRleHQoZm9ybWF0KTtcblxuICAgIHNlbGVjdGlvbi5maWx0ZXIoZW50ZXJpbmcpXG4gICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcbiAgICAgICAgLmF0dHIoXCJmb250LXNpemVcIiwgMTApXG4gICAgICAgIC5hdHRyKFwiZm9udC1mYW1pbHlcIiwgXCJzYW5zLXNlcmlmXCIpXG4gICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgb3JpZW50ID09PSByaWdodCA/IFwic3RhcnRcIiA6IG9yaWVudCA9PT0gbGVmdCA/IFwiZW5kXCIgOiBcIm1pZGRsZVwiKTtcblxuICAgIHNlbGVjdGlvblxuICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsgdGhpcy5fX2F4aXMgPSBwb3NpdGlvbjsgfSk7XG4gIH1cblxuICBheGlzLnNjYWxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlID0gXywgYXhpcykgOiBzY2FsZTtcbiAgfTtcblxuICBheGlzLnRpY2tzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRpY2tBcmd1bWVudHMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyksIGF4aXM7XG4gIH07XG5cbiAgYXhpcy50aWNrQXJndW1lbnRzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tBcmd1bWVudHMgPSBfID09IG51bGwgPyBbXSA6IHNsaWNlLmNhbGwoXyksIGF4aXMpIDogdGlja0FyZ3VtZW50cy5zbGljZSgpO1xuICB9O1xuXG4gIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrVmFsdWVzID0gXyA9PSBudWxsID8gbnVsbCA6IHNsaWNlLmNhbGwoXyksIGF4aXMpIDogdGlja1ZhbHVlcyAmJiB0aWNrVmFsdWVzLnNsaWNlKCk7XG4gIH07XG5cbiAgYXhpcy50aWNrRm9ybWF0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tGb3JtYXQgPSBfLCBheGlzKSA6IHRpY2tGb3JtYXQ7XG4gIH07XG5cbiAgYXhpcy50aWNrU2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZUlubmVyID0gdGlja1NpemVPdXRlciA9ICtfLCBheGlzKSA6IHRpY2tTaXplSW5uZXI7XG4gIH07XG5cbiAgYXhpcy50aWNrU2l6ZUlubmVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTaXplSW5uZXIgPSArXywgYXhpcykgOiB0aWNrU2l6ZUlubmVyO1xuICB9O1xuXG4gIGF4aXMudGlja1NpemVPdXRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZU91dGVyID0gK18sIGF4aXMpIDogdGlja1NpemVPdXRlcjtcbiAgfTtcblxuICBheGlzLnRpY2tQYWRkaW5nID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tQYWRkaW5nID0gK18sIGF4aXMpIDogdGlja1BhZGRpbmc7XG4gIH07XG5cbiAgcmV0dXJuIGF4aXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBheGlzVG9wKHNjYWxlKSB7XG4gIHJldHVybiBheGlzKHRvcCwgc2NhbGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXhpc1JpZ2h0KHNjYWxlKSB7XG4gIHJldHVybiBheGlzKHJpZ2h0LCBzY2FsZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBheGlzQm90dG9tKHNjYWxlKSB7XG4gIHJldHVybiBheGlzKGJvdHRvbSwgc2NhbGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXhpc0xlZnQoc2NhbGUpIHtcbiAgcmV0dXJuIGF4aXMobGVmdCwgc2NhbGUpO1xufVxuIiwiZXhwb3J0IHtcbiAgYXhpc1RvcCxcbiAgYXhpc1JpZ2h0LFxuICBheGlzQm90dG9tLFxuICBheGlzTGVmdFxufSBmcm9tIFwiLi9heGlzXCI7XG4iLCJ2YXIgbm9vcCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7fX07XG5cbmZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkge1xuICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyBcIlwiKSB8fCAodCBpbiBfKSB8fCAvW1xccy5dLy50ZXN0KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIHR5cGU6IFwiICsgdCk7XG4gICAgX1t0XSA9IFtdO1xuICB9XG4gIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7XG59XG5cbmZ1bmN0aW9uIERpc3BhdGNoKF8pIHtcbiAgdGhpcy5fID0gXztcbn1cblxuZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzLCB0eXBlcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdCk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbkRpc3BhdGNoLnByb3RvdHlwZSA9IGRpc3BhdGNoLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IERpc3BhdGNoLFxuICBvbjogZnVuY3Rpb24odHlwZW5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF8gPSB0aGlzLl8sXG4gICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIsIF8pLFxuICAgICAgICB0LFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSBULmxlbmd0aDtcblxuICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgY2FsbGJhY2sgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS5cbiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBjYWxsYmFjazogXCIgKyBjYWxsYmFjayk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBjYWxsYmFjayk7XG4gICAgICBlbHNlIGlmIChjYWxsYmFjayA9PSBudWxsKSBmb3IgKHQgaW4gXykgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29weTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXztcbiAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlbdF0gPSBfW3RdLnNsaWNlKCk7XG4gICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTtcbiAgfSxcbiAgY2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkge1xuICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHR5cGUsIHRoYXQsIGFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICByZXR1cm4gYy52YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0KHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICB0eXBlW2ldID0gbm9vcCwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTtcbiAgcmV0dXJuIHR5cGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRpc3BhdGNoO1xuIiwiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4XCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZnVuY3Rpb24gZW1wdHkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4XCI7XG5pbXBvcnQgc2VsZWN0b3JBbGwgZnJvbSBcIi4uL3NlbGVjdG9yQWxsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4XCI7XG5pbXBvcnQgbWF0Y2hlciBmcm9tIFwiLi4vbWF0Y2hlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHVwZGF0ZSkge1xuICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpO1xufVxuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2VcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7XG4gIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX19kYXRhX18gPSBkYXR1bTtcbn1cblxuRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH1cbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHtFbnRlck5vZGV9IGZyb20gXCIuL2VudGVyXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4uL2NvbnN0YW50XCI7XG5cbnZhciBrZXlQcmVmaXggPSBcIiRcIjsgLy8gUHJvdGVjdCBhZ2FpbnN0IGtleXMgbGlrZSDigJxfX3Byb3RvX1/igJ0uXG5cbmZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7XG4gIHZhciBpID0gMCxcbiAgICAgIG5vZGUsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLlxuICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci5cbiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLlxuICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC5cbiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7XG4gIHZhciBpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVCeUtleVZhbHVlID0ge30sXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksXG4gICAgICBrZXlWYWx1ZTtcblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS5cbiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5UHJlZml4ICsga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgICAgaWYgKGtleVZhbHVlIGluIG5vZGVCeUtleVZhbHVlKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uXG4gIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuXG4gIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGtleVZhbHVlID0ga2V5UHJlZml4ICsga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKTtcbiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSkge1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZXNbaV1dID09PSBub2RlKSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIGRhdGEgPSBuZXcgQXJyYXkodGhpcy5zaXplKCkpLCBqID0gLTE7XG4gICAgdGhpcy5lYWNoKGZ1bmN0aW9uKGQpIHsgZGF0YVsrK2pdID0gZDsgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsXG4gICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cyxcbiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwcztcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpO1xuXG4gIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLFxuICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSxcbiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICAgIGRhdGEgPSB2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cyksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2VcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25lbnRlciwgb251cGRhdGUsIG9uZXhpdCkge1xuICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4aXQoKTtcbiAgZW50ZXIgPSB0eXBlb2Ygb25lbnRlciA9PT0gXCJmdW5jdGlvblwiID8gb25lbnRlcihlbnRlcikgOiBlbnRlci5hcHBlbmQob25lbnRlciArIFwiXCIpO1xuICBpZiAob251cGRhdGUgIT0gbnVsbCkgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTtcbiAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpOyBlbHNlIG9uZXhpdChleGl0KTtcbiAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rpb24pIHtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOykge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcbiAgICAgICAgbmV4dCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlcyA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGkgPSAtMTtcbiAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyBub2Rlc1srK2ldID0gdGhpczsgfSk7XG4gIHJldHVybiBub2Rlcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBzaXplID0gMDtcbiAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyArK3NpemU7IH0pO1xuICByZXR1cm4gc2l6ZTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2spIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCJpbXBvcnQgbmFtZXNwYWNlcyBmcm9tIFwiLi9uYW1lc3BhY2VzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gXCJcIiwgaSA9IHByZWZpeC5pbmRleE9mKFwiOlwiKTtcbiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7XG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuLi9uYW1lc3BhY2VcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsXG4gICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpXG4gICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbilcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3dcIjtcblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvblxuICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50KShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpXG4gICAgICA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3R5bGVWYWx1ZShub2RlLCBuYW1lKSB7XG4gIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSlcbiAgICAgIHx8IGRlZmF1bHRWaWV3KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbn1cbiIsImZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzW25hbWVdID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uXG4gICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpW25hbWVdO1xufVxuIiwiZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XFxzKy8pO1xufVxuXG5mdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHtcbiAgdGhpcy5fbm9kZSA9IG5vZGU7XG4gIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xufVxuXG5DbGFzc0xpc3QucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICBjb250YWluczogZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlXG4gICAgICA/IGNsYXNzZWRUcnVlXG4gICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkge1xuICB0aGlzLnRleHRDb250ZW50ID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRleHRGdW5jdGlvblxuICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50O1xufVxuIiwiZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHtcbiAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBodG1sUmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBodG1sRnVuY3Rpb25cbiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7XG59XG4iLCJmdW5jdGlvbiByYWlzZSgpIHtcbiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmFpc2UpO1xufVxuIiwiZnVuY3Rpb24gbG93ZXIoKSB7XG4gIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvclwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3JcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3JcIjtcblxuZnVuY3Rpb24gY29uc3RhbnROdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09IFwiZnVuY3Rpb25cIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwiZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVlcCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187XG59XG4iLCJ2YXIgZmlsdGVyRXZlbnRzID0ge307XG5cbmV4cG9ydCB2YXIgZXZlbnQgPSBudWxsO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICBpZiAoIShcIm9ubW91c2VlbnRlclwiIGluIGVsZW1lbnQpKSB7XG4gICAgZmlsdGVyRXZlbnRzID0ge21vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsIG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIn07XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsdGVyQ29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHtcbiAgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsIGluZGV4LCBncm91cCk7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgICBpZiAoIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRoaXMgJiYgIShyZWxhdGVkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpICYgOCkpKSB7XG4gICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudDEpIHtcbiAgICB2YXIgZXZlbnQwID0gZXZlbnQ7IC8vIEV2ZW50cyBjYW4gYmUgcmVlbnRyYW50IChlLmcuLCBmb2N1cykuXG4gICAgZXZlbnQgPSBldmVudDE7XG4gICAgdHJ5IHtcbiAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgdGhpcy5fX2RhdGFfXywgaW5kZXgsIGdyb3VwKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZXZlbnQgPSBldmVudDA7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5jYXB0dXJlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7XG4gIHZhciB3cmFwID0gZmlsdGVyRXZlbnRzLmhhc093blByb3BlcnR5KHR5cGVuYW1lLnR5cGUpID8gZmlsdGVyQ29udGV4dExpc3RlbmVyIDogY29udGV4dExpc3RlbmVyO1xuICByZXR1cm4gZnVuY3Rpb24oZCwgaSwgZ3JvdXApIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gd3JhcCh2YWx1ZSwgaSwgZ3JvdXApO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8uY2FwdHVyZSA9IGNhcHR1cmUpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBjYXB0dXJlOiBjYXB0dXJlfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGlmIChjYXB0dXJlID09IG51bGwpIGNhcHR1cmUgPSBmYWxzZTtcbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5cGVuYW1lc1tpXSwgdmFsdWUsIGNhcHR1cmUpKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b21FdmVudChldmVudDEsIGxpc3RlbmVyLCB0aGF0LCBhcmdzKSB7XG4gIHZhciBldmVudDAgPSBldmVudDtcbiAgZXZlbnQxLnNvdXJjZUV2ZW50ID0gZXZlbnQ7XG4gIGV2ZW50ID0gZXZlbnQxO1xuICB0cnkge1xuICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBldmVudCA9IGV2ZW50MDtcbiAgfVxufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3dcIjtcblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLFxuICAgICAgZXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7XG5cbiAgaWYgKHR5cGVvZiBldmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBldmVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO1xuICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50KHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBkaXNwYXRjaEZ1bmN0aW9uXG4gICAgICA6IGRpc3BhdGNoQ29uc3RhbnQpKHR5cGUsIHBhcmFtcykpO1xufVxuIiwiaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3QgZnJvbSBcIi4vc2VsZWN0XCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGxcIjtcbmltcG9ydCBzZWxlY3Rpb25fZmlsdGVyIGZyb20gXCIuL2ZpbHRlclwiO1xuaW1wb3J0IHNlbGVjdGlvbl9kYXRhIGZyb20gXCIuL2RhdGFcIjtcbmltcG9ydCBzZWxlY3Rpb25fZW50ZXIgZnJvbSBcIi4vZW50ZXJcIjtcbmltcG9ydCBzZWxlY3Rpb25fZXhpdCBmcm9tIFwiLi9leGl0XCI7XG5pbXBvcnQgc2VsZWN0aW9uX2pvaW4gZnJvbSBcIi4vam9pblwiO1xuaW1wb3J0IHNlbGVjdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZVwiO1xuaW1wb3J0IHNlbGVjdGlvbl9vcmRlciBmcm9tIFwiLi9vcmRlclwiO1xuaW1wb3J0IHNlbGVjdGlvbl9zb3J0IGZyb20gXCIuL3NvcnRcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2FsbCBmcm9tIFwiLi9jYWxsXCI7XG5pbXBvcnQgc2VsZWN0aW9uX25vZGVzIGZyb20gXCIuL25vZGVzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX25vZGUgZnJvbSBcIi4vbm9kZVwiO1xuaW1wb3J0IHNlbGVjdGlvbl9zaXplIGZyb20gXCIuL3NpemVcIjtcbmltcG9ydCBzZWxlY3Rpb25fZW1wdHkgZnJvbSBcIi4vZW1wdHlcIjtcbmltcG9ydCBzZWxlY3Rpb25fZWFjaCBmcm9tIFwiLi9lYWNoXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2F0dHIgZnJvbSBcIi4vYXR0clwiO1xuaW1wb3J0IHNlbGVjdGlvbl9zdHlsZSBmcm9tIFwiLi9zdHlsZVwiO1xuaW1wb3J0IHNlbGVjdGlvbl9wcm9wZXJ0eSBmcm9tIFwiLi9wcm9wZXJ0eVwiO1xuaW1wb3J0IHNlbGVjdGlvbl9jbGFzc2VkIGZyb20gXCIuL2NsYXNzZWRcIjtcbmltcG9ydCBzZWxlY3Rpb25fdGV4dCBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgc2VsZWN0aW9uX2h0bWwgZnJvbSBcIi4vaHRtbFwiO1xuaW1wb3J0IHNlbGVjdGlvbl9yYWlzZSBmcm9tIFwiLi9yYWlzZVwiO1xuaW1wb3J0IHNlbGVjdGlvbl9sb3dlciBmcm9tIFwiLi9sb3dlclwiO1xuaW1wb3J0IHNlbGVjdGlvbl9hcHBlbmQgZnJvbSBcIi4vYXBwZW5kXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2luc2VydCBmcm9tIFwiLi9pbnNlcnRcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZVwiO1xuaW1wb3J0IHNlbGVjdGlvbl9jbG9uZSBmcm9tIFwiLi9jbG9uZVwiO1xuaW1wb3J0IHNlbGVjdGlvbl9kYXR1bSBmcm9tIFwiLi9kYXR1bVwiO1xuaW1wb3J0IHNlbGVjdGlvbl9vbiBmcm9tIFwiLi9vblwiO1xuaW1wb3J0IHNlbGVjdGlvbl9kaXNwYXRjaCBmcm9tIFwiLi9kaXNwYXRjaFwiO1xuXG5leHBvcnQgdmFyIHJvb3QgPSBbbnVsbF07XG5cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3Rpb24oZ3JvdXBzLCBwYXJlbnRzKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLFxuICBzb3J0OiBzZWxlY3Rpb25fc29ydCxcbiAgY2FsbDogc2VsZWN0aW9uX2NhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsXG4gIG5vZGU6IHNlbGVjdGlvbl9ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSxcbiAgZWFjaDogc2VsZWN0aW9uX2VhY2gsXG4gIGF0dHI6IHNlbGVjdGlvbl9hdHRyLFxuICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLFxuICBwcm9wZXJ0eTogc2VsZWN0aW9uX3Byb3BlcnR5LFxuICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xhc3NlZCxcbiAgdGV4dDogc2VsZWN0aW9uX3RleHQsXG4gIGh0bWw6IHNlbGVjdGlvbl9odG1sLFxuICByYWlzZTogc2VsZWN0aW9uX3JhaXNlLFxuICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLFxuICBhcHBlbmQ6IHNlbGVjdGlvbl9hcHBlbmQsXG4gIGluc2VydDogc2VsZWN0aW9uX2luc2VydCxcbiAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLFxuICBjbG9uZTogc2VsZWN0aW9uX2Nsb25lLFxuICBkYXR1bTogc2VsZWN0aW9uX2RhdHVtLFxuICBvbjogc2VsZWN0aW9uX29uLFxuICBkaXNwYXRjaDogc2VsZWN0aW9uX2Rpc3BhdGNoXG59O1xuXG5leHBvcnQgZGVmYXVsdCBzZWxlY3Rpb247XG4iLCJpbXBvcnQge1NlbGVjdGlvbiwgcm9vdH0gZnJvbSBcIi4vc2VsZWN0aW9uL2luZGV4XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKVxuICAgICAgOiBuZXcgU2VsZWN0aW9uKFtbc2VsZWN0b3JdXSwgcm9vdCk7XG59XG4iLCJpbXBvcnQge2V2ZW50fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3R9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2V2ZW50IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmlldykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbm9ldmVudCwgdHJ1ZSk7XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBub2V2ZW50LCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gXCJub25lXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHllc2RyYWcodmlldywgbm9jbGljaykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIGlmIChub2NsaWNrKSB7XG4gICAgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBub2V2ZW50LCB0cnVlKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG51bGwpOyB9LCAwKTtcbiAgfVxuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gcm9vdC5fX25vc2VsZWN0O1xuICAgIGRlbGV0ZSByb290Ll9fbm9zZWxlY3Q7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dP1xcXFxkKlxcXFwuP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KVxcXFxzKlwiLFxuICAgIHJlUCA9IFwiXFxcXHMqKFsrLV0/XFxcXGQqXFxcXC4/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pJVxcXFxzKlwiLFxuICAgIHJlSGV4ID0gL14jKFswLTlhLWZdezMsOH0pJC8sXG4gICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChcIl5yZ2JcXFxcKFwiICsgW3JlSSwgcmVJLCByZUldICsgXCJcXFxcKSRcIiksXG4gICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5yZ2JcXFxcKFwiICsgW3JlUCwgcmVQLCByZVBdICsgXCJcXFxcKSRcIiksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoXCJecmdiYVxcXFwoXCIgKyBbcmVJLCByZUksIHJlSSwgcmVOXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiYVBlcmNlbnQgPSBuZXcgUmVnRXhwKFwiXnJnYmFcXFxcKFwiICsgW3JlUCwgcmVQLCByZVAsIHJlTl0gKyBcIlxcXFwpJFwiKSxcbiAgICByZUhzbFBlcmNlbnQgPSBuZXcgUmVnRXhwKFwiXmhzbFxcXFwoXCIgKyBbcmVOLCByZVAsIHJlUF0gKyBcIlxcXFwpJFwiKSxcbiAgICByZUhzbGFQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5oc2xhXFxcXChcIiArIFtyZU4sIHJlUCwgcmVQLCByZU5dICsgXCJcXFxcKSRcIik7XG5cbnZhciBuYW1lZCA9IHtcbiAgYWxpY2VibHVlOiAweGYwZjhmZixcbiAgYW50aXF1ZXdoaXRlOiAweGZhZWJkNyxcbiAgYXF1YTogMHgwMGZmZmYsXG4gIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LFxuICBhenVyZTogMHhmMGZmZmYsXG4gIGJlaWdlOiAweGY1ZjVkYyxcbiAgYmlzcXVlOiAweGZmZTRjNCxcbiAgYmxhY2s6IDB4MDAwMDAwLFxuICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsXG4gIGJsdWU6IDB4MDAwMGZmLFxuICBibHVldmlvbGV0OiAweDhhMmJlMixcbiAgYnJvd246IDB4YTUyYTJhLFxuICBidXJseXdvb2Q6IDB4ZGViODg3LFxuICBjYWRldGJsdWU6IDB4NWY5ZWEwLFxuICBjaGFydHJldXNlOiAweDdmZmYwMCxcbiAgY2hvY29sYXRlOiAweGQyNjkxZSxcbiAgY29yYWw6IDB4ZmY3ZjUwLFxuICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsXG4gIGNvcm5zaWxrOiAweGZmZjhkYyxcbiAgY3JpbXNvbjogMHhkYzE0M2MsXG4gIGN5YW46IDB4MDBmZmZmLFxuICBkYXJrYmx1ZTogMHgwMDAwOGIsXG4gIGRhcmtjeWFuOiAweDAwOGI4YixcbiAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsXG4gIGRhcmtncmF5OiAweGE5YTlhOSxcbiAgZGFya2dyZWVuOiAweDAwNjQwMCxcbiAgZGFya2dyZXk6IDB4YTlhOWE5LFxuICBkYXJra2hha2k6IDB4YmRiNzZiLFxuICBkYXJrbWFnZW50YTogMHg4YjAwOGIsXG4gIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZixcbiAgZGFya29yYW5nZTogMHhmZjhjMDAsXG4gIGRhcmtvcmNoaWQ6IDB4OTkzMmNjLFxuICBkYXJrcmVkOiAweDhiMDAwMCxcbiAgZGFya3NhbG1vbjogMHhlOTk2N2EsXG4gIGRhcmtzZWFncmVlbjogMHg4ZmJjOGYsXG4gIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLFxuICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZixcbiAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGYsXG4gIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLFxuICBkYXJrdmlvbGV0OiAweDk0MDBkMyxcbiAgZGVlcHBpbms6IDB4ZmYxNDkzLFxuICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsXG4gIGRpbWdyYXk6IDB4Njk2OTY5LFxuICBkaW1ncmV5OiAweDY5Njk2OSxcbiAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsXG4gIGZpcmVicmljazogMHhiMjIyMjIsXG4gIGZsb3JhbHdoaXRlOiAweGZmZmFmMCxcbiAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLFxuICBmdWNoc2lhOiAweGZmMDBmZixcbiAgZ2FpbnNib3JvOiAweGRjZGNkYyxcbiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsXG4gIGdvbGQ6IDB4ZmZkNzAwLFxuICBnb2xkZW5yb2Q6IDB4ZGFhNTIwLFxuICBncmF5OiAweDgwODA4MCxcbiAgZ3JlZW46IDB4MDA4MDAwLFxuICBncmVlbnllbGxvdzogMHhhZGZmMmYsXG4gIGdyZXk6IDB4ODA4MDgwLFxuICBob25leWRldzogMHhmMGZmZjAsXG4gIGhvdHBpbms6IDB4ZmY2OWI0LFxuICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLFxuICBpbmRpZ286IDB4NGIwMDgyLFxuICBpdm9yeTogMHhmZmZmZjAsXG4gIGtoYWtpOiAweGYwZTY4YyxcbiAgbGF2ZW5kZXI6IDB4ZTZlNmZhLFxuICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNSxcbiAgbGF3bmdyZWVuOiAweDdjZmMwMCxcbiAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCxcbiAgbGlnaHRibHVlOiAweGFkZDhlNixcbiAgbGlnaHRjb3JhbDogMHhmMDgwODAsXG4gIGxpZ2h0Y3lhbjogMHhlMGZmZmYsXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMixcbiAgbGlnaHRncmF5OiAweGQzZDNkMyxcbiAgbGlnaHRncmVlbjogMHg5MGVlOTAsXG4gIGxpZ2h0Z3JleTogMHhkM2QzZDMsXG4gIGxpZ2h0cGluazogMHhmZmI2YzEsXG4gIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSxcbiAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWEsXG4gIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsXG4gIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSxcbiAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5LFxuICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsXG4gIGxpZ2h0eWVsbG93OiAweGZmZmZlMCxcbiAgbGltZTogMHgwMGZmMDAsXG4gIGxpbWVncmVlbjogMHgzMmNkMzIsXG4gIGxpbmVuOiAweGZhZjBlNixcbiAgbWFnZW50YTogMHhmZjAwZmYsXG4gIG1hcm9vbjogMHg4MDAwMDAsXG4gIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLFxuICBtZWRpdW1ibHVlOiAweDAwMDBjZCxcbiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMyxcbiAgbWVkaXVtcHVycGxlOiAweDkzNzBkYixcbiAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxLFxuICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLFxuICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsXG4gIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2MsXG4gIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsXG4gIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsXG4gIG1pbnRjcmVhbTogMHhmNWZmZmEsXG4gIG1pc3R5cm9zZTogMHhmZmU0ZTEsXG4gIG1vY2Nhc2luOiAweGZmZTRiNSxcbiAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkLFxuICBuYXZ5OiAweDAwMDA4MCxcbiAgb2xkbGFjZTogMHhmZGY1ZTYsXG4gIG9saXZlOiAweDgwODAwMCxcbiAgb2xpdmVkcmFiOiAweDZiOGUyMyxcbiAgb3JhbmdlOiAweGZmYTUwMCxcbiAgb3JhbmdlcmVkOiAweGZmNDUwMCxcbiAgb3JjaGlkOiAweGRhNzBkNixcbiAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsXG4gIHBhbGVncmVlbjogMHg5OGZiOTgsXG4gIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLFxuICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MyxcbiAgcGFwYXlhd2hpcDogMHhmZmVmZDUsXG4gIHBlYWNocHVmZjogMHhmZmRhYjksXG4gIHBlcnU6IDB4Y2Q4NTNmLFxuICBwaW5rOiAweGZmYzBjYixcbiAgcGx1bTogMHhkZGEwZGQsXG4gIHBvd2RlcmJsdWU6IDB4YjBlMGU2LFxuICBwdXJwbGU6IDB4ODAwMDgwLFxuICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSxcbiAgcmVkOiAweGZmMDAwMCxcbiAgcm9zeWJyb3duOiAweGJjOGY4ZixcbiAgcm95YWxibHVlOiAweDQxNjllMSxcbiAgc2FkZGxlYnJvd246IDB4OGI0NTEzLFxuICBzYWxtb246IDB4ZmE4MDcyLFxuICBzYW5keWJyb3duOiAweGY0YTQ2MCxcbiAgc2VhZ3JlZW46IDB4MmU4YjU3LFxuICBzZWFzaGVsbDogMHhmZmY1ZWUsXG4gIHNpZW5uYTogMHhhMDUyMmQsXG4gIHNpbHZlcjogMHhjMGMwYzAsXG4gIHNreWJsdWU6IDB4ODdjZWViLFxuICBzbGF0ZWJsdWU6IDB4NmE1YWNkLFxuICBzbGF0ZWdyYXk6IDB4NzA4MDkwLFxuICBzbGF0ZWdyZXk6IDB4NzA4MDkwLFxuICBzbm93OiAweGZmZmFmYSxcbiAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLFxuICBzdGVlbGJsdWU6IDB4NDY4MmI0LFxuICB0YW46IDB4ZDJiNDhjLFxuICB0ZWFsOiAweDAwODA4MCxcbiAgdGhpc3RsZTogMHhkOGJmZDgsXG4gIHRvbWF0bzogMHhmZjYzNDcsXG4gIHR1cnF1b2lzZTogMHg0MGUwZDAsXG4gIHZpb2xldDogMHhlZTgyZWUsXG4gIHdoZWF0OiAweGY1ZGViMyxcbiAgd2hpdGU6IDB4ZmZmZmZmLFxuICB3aGl0ZXNtb2tlOiAweGY1ZjVmNSxcbiAgeWVsbG93OiAweGZmZmYwMCxcbiAgeWVsbG93Z3JlZW46IDB4OWFjZDMyXG59O1xuXG5kZWZpbmUoQ29sb3IsIGNvbG9yLCB7XG4gIGNvcHk6IGZ1bmN0aW9uKGNoYW5uZWxzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTtcbiAgfSxcbiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkge1xuICByZXR1cm4gaHNsQ29udmVydCh0aGlzKS5mb3JtYXRIc2woKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0UmdiKCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7XG4gIHZhciBtLCBsO1xuICBmb3JtYXQgPSAoZm9ybWF0ICsgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwXG4gICAgICA6IGwgPT09IDMgPyBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpIC8vICNmMDBcbiAgICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwXG4gICAgICA6IGwgPT09IDQgPyByZ2JhKChtID4+IDEyICYgMHhmKSB8IChtID4+IDggJiAweGYwKSwgKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKCgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZikpIC8gMHhmZikgLy8gI2YwMDBcbiAgICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXhcbiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMClcbiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSlcbiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKVxuICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSlcbiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpXG4gICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpXG4gICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICA6IGZvcm1hdCA9PT0gXCJ0cmFuc3BhcmVudFwiID8gbmV3IFJnYihOYU4sIE5hTiwgTmFOLCAwKVxuICAgICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZ2JuKG4pIHtcbiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTtcbn1cblxuZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7XG4gIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjtcbiAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgUmdiO1xuICBvID0gby5yZ2IoKTtcbiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5yID0gK3I7XG4gIHRoaXMuZyA9ICtnO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShSZ2IsIHJnYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IHJnYl9mb3JtYXRSZ2Jcbn0pKTtcblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIFwiI1wiICsgaGV4KHRoaXMucikgKyBoZXgodGhpcy5nKSArIGhleCh0aGlzLmIpO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTtcbiAgcmV0dXJuIChhID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCIpXG4gICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArIFwiLCBcIlxuICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyBcIiwgXCJcbiAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuYikgfHwgMCkpXG4gICAgICArIChhID09PSAxID8gXCIpXCIgOiBcIiwgXCIgKyBhICsgXCIpXCIpO1xufVxuXG5mdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTtcbiAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTtcbn1cblxuZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7XG4gIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtcbiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47XG4gIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjtcbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvO1xuICBvID0gby5yZ2IoKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBoID0gTmFOLFxuICAgICAgcyA9IG1heCAtIG1pbixcbiAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7XG4gIGlmIChzKSB7XG4gICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7XG4gICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyO1xuICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDtcbiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluO1xuICAgIGggKj0gNjA7XG4gIH0gZWxzZSB7XG4gICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7XG4gIH1cbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLFxuICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsXG4gICAgICAgIGwgPSB0aGlzLmwsXG4gICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsXG4gICAgICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfSxcbiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBmb3JtYXRIc2w6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpO1xuICAgIHJldHVybiAoYSA9PT0gMSA/IFwiaHNsKFwiIDogXCJoc2xhKFwiKVxuICAgICAgICArICh0aGlzLmggfHwgMCkgKyBcIiwgXCJcbiAgICAgICAgKyAodGhpcy5zIHx8IDApICogMTAwICsgXCIlLCBcIlxuICAgICAgICArICh0aGlzLmwgfHwgMCkgKiAxMDAgKyBcIiVcIlxuICAgICAgICArIChhID09PSAxID8gXCIpXCIgOiBcIiwgXCIgKyBhICsgXCIpXCIpO1xuICB9XG59KSk7XG5cbi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi9cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7XG4gIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjBcbiAgICAgIDogaCA8IDE4MCA/IG0yXG4gICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwXG4gICAgICA6IG0xKSAqIDI1NTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHtcbiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxO1xuICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjBcbiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjFcbiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjJcbiAgICAgICsgdDMgKiB2MykgLyA2O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLFxuICAgICAgICB2MSA9IHZhbHVlc1tpXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbaSArIDFdLFxuICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLFxuICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJpbXBvcnQge2Jhc2lzfSBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSxcbiAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLFxuICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sXG4gICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwiaW1wb3J0IHtyZ2IgYXMgY29sb3JSZ2J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGJhc2lzIGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5pbXBvcnQgYmFzaXNDbG9zZWQgZnJvbSBcIi4vYmFzaXNDbG9zZWQuanNcIjtcbmltcG9ydCBub2dhbW1hLCB7Z2FtbWF9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7XG4gIHZhciBjb2xvciA9IGdhbW1hKHkpO1xuXG4gIGZ1bmN0aW9uIHJnYihzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSBjb2xvcigoc3RhcnQgPSBjb2xvclJnYihzdGFydCkpLnIsIChlbmQgPSBjb2xvclJnYihlbmQpKS5yKSxcbiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSxcbiAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBzdGFydC5yID0gcih0KTtcbiAgICAgIHN0YXJ0LmcgPSBnKHQpO1xuICAgICAgc3RhcnQuYiA9IGIodCk7XG4gICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gICAgfTtcbiAgfVxuXG4gIHJnYi5nYW1tYSA9IHJnYkdhbW1hO1xuXG4gIHJldHVybiByZ2I7XG59KSgxKTtcblxuZnVuY3Rpb24gcmdiU3BsaW5lKHNwbGluZSkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7XG4gICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLFxuICAgICAgICByID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBnID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBiID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBpLCBjb2xvcjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBjb2xvciA9IGNvbG9yUmdiKGNvbG9yc1tpXSk7XG4gICAgICByW2ldID0gY29sb3IuciB8fCAwO1xuICAgICAgZ1tpXSA9IGNvbG9yLmcgfHwgMDtcbiAgICAgIGJbaV0gPSBjb2xvci5iIHx8IDA7XG4gICAgfVxuICAgIHIgPSBzcGxpbmUocik7XG4gICAgZyA9IHNwbGluZShnKTtcbiAgICBiID0gc3BsaW5lKGIpO1xuICAgIGNvbG9yLm9wYWNpdHkgPSAxO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBjb2xvci5yID0gcih0KTtcbiAgICAgIGNvbG9yLmcgPSBnKHQpO1xuICAgICAgY29sb3IuYiA9IGIodCk7XG4gICAgICByZXR1cm4gY29sb3IgKyBcIlwiO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMpO1xuZXhwb3J0IHZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGluZShiYXNpc0Nsb3NlZCk7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIGlmICghYikgYiA9IFtdO1xuICB2YXIgbiA9IGEgPyBNYXRoLm1pbihiLmxlbmd0aCwgYS5sZW5ndGgpIDogMCxcbiAgICAgIGMgPSBiLnNsaWNlKCksXG4gICAgICBpO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGNbaV0gPSBhW2ldICogKDEgLSB0KSArIGJbaV0gKiB0O1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJBcnJheSh4KSB7XG4gIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoeCkgJiYgISh4IGluc3RhbmNlb2YgRGF0YVZpZXcpO1xufVxuIiwiaW1wb3J0IHZhbHVlIGZyb20gXCIuL3ZhbHVlLmpzXCI7XG5pbXBvcnQgbnVtYmVyQXJyYXksIHtpc051bWJlckFycmF5fSBmcm9tIFwiLi9udW1iZXJBcnJheS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiAoaXNOdW1iZXJBcnJheShiKSA/IG51bWJlckFycmF5IDogZ2VuZXJpY0FycmF5KShhLCBiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyaWNBcnJheShhLCBiKSB7XG4gIHZhciBuYiA9IGIgPyBiLmxlbmd0aCA6IDAsXG4gICAgICBuYSA9IGEgPyBNYXRoLm1pbihuYiwgYS5sZW5ndGgpIDogMCxcbiAgICAgIHggPSBuZXcgQXJyYXkobmEpLFxuICAgICAgYyA9IG5ldyBBcnJheShuYiksXG4gICAgICBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gdmFsdWUoYVtpXSwgYltpXSk7XG4gIGZvciAoOyBpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgY1tpXSA9IHhbaV0odCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBkID0gbmV3IERhdGU7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBkLnNldFRpbWUoYSAqICgxIC0gdCkgKyBiICogdCksIGQ7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0O1xuICB9O1xufVxuIiwiaW1wb3J0IHZhbHVlIGZyb20gXCIuL3ZhbHVlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGkgPSB7fSxcbiAgICAgIGMgPSB7fSxcbiAgICAgIGs7XG5cbiAgaWYgKGEgPT09IG51bGwgfHwgdHlwZW9mIGEgIT09IFwib2JqZWN0XCIpIGEgPSB7fTtcbiAgaWYgKGIgPT09IG51bGwgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIGIgPSB7fTtcblxuICBmb3IgKGsgaW4gYikge1xuICAgIGlmIChrIGluIGEpIHtcbiAgICAgIGlba10gPSB2YWx1ZShhW2tdLCBiW2tdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY1trXSA9IGJba107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlba10odCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG4iLCJpbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG52YXIgcmVBID0gL1stK10/KD86XFxkK1xcLj9cXGQqfFxcLj9cXGQrKSg/OltlRV1bLStdP1xcZCspPy9nLFxuICAgIHJlQiA9IG5ldyBSZWdFeHAocmVBLnNvdXJjZSwgXCJnXCIpO1xuXG5mdW5jdGlvbiB6ZXJvKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBiO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbmUoYikge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBiKHQpICsgXCJcIjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYmkgPSByZUEubGFzdEluZGV4ID0gcmVCLmxhc3RJbmRleCA9IDAsIC8vIHNjYW4gaW5kZXggZm9yIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGFtLCAvLyBjdXJyZW50IG1hdGNoIGluIGFcbiAgICAgIGJtLCAvLyBjdXJyZW50IG1hdGNoIGluIGJcbiAgICAgIGJzLCAvLyBzdHJpbmcgcHJlY2VkaW5nIGN1cnJlbnQgbnVtYmVyIGluIGIsIGlmIGFueVxuICAgICAgaSA9IC0xLCAvLyBpbmRleCBpbiBzXG4gICAgICBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuXG4gIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy5cbiAgYSA9IGEgKyBcIlwiLCBiID0gYiArIFwiXCI7XG5cbiAgLy8gSW50ZXJwb2xhdGUgcGFpcnMgb2YgbnVtYmVycyBpbiBhICYgYi5cbiAgd2hpbGUgKChhbSA9IHJlQS5leGVjKGEpKVxuICAgICAgJiYgKGJtID0gcmVCLmV4ZWMoYikpKSB7XG4gICAgaWYgKChicyA9IGJtLmluZGV4KSA+IGJpKSB7IC8vIGEgc3RyaW5nIHByZWNlZGVzIHRoZSBuZXh0IG51bWJlciBpbiBiXG4gICAgICBicyA9IGIuc2xpY2UoYmksIGJzKTtcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgICAgZWxzZSBzWysraV0gPSBicztcbiAgICB9XG4gICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7IC8vIG51bWJlcnMgaW4gYSAmIGIgbWF0Y2hcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgICAgZWxzZSBzWysraV0gPSBibTtcbiAgICB9IGVsc2UgeyAvLyBpbnRlcnBvbGF0ZSBub24tbWF0Y2hpbmcgbnVtYmVyc1xuICAgICAgc1srK2ldID0gbnVsbDtcbiAgICAgIHEucHVzaCh7aTogaSwgeDogbnVtYmVyKGFtLCBibSl9KTtcbiAgICB9XG4gICAgYmkgPSByZUIubGFzdEluZGV4O1xuICB9XG5cbiAgLy8gQWRkIHJlbWFpbnMgb2YgYi5cbiAgaWYgKGJpIDwgYi5sZW5ndGgpIHtcbiAgICBicyA9IGIuc2xpY2UoYmkpO1xuICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZ1xuICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gIH1cblxuICAvLyBTcGVjaWFsIG9wdGltaXphdGlvbiBmb3Igb25seSBhIHNpbmdsZSBtYXRjaC5cbiAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy5cbiAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IChxWzBdXG4gICAgICA/IG9uZShxWzBdLngpXG4gICAgICA6IHplcm8oYikpXG4gICAgICA6IChiID0gcS5sZW5ndGgsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgICAgIH0pO1xufVxuIiwiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgcmdiIGZyb20gXCIuL3JnYi5qc1wiO1xuaW1wb3J0IHtnZW5lcmljQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCI7XG5pbXBvcnQgZGF0ZSBmcm9tIFwiLi9kYXRlLmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuaW1wb3J0IG9iamVjdCBmcm9tIFwiLi9vYmplY3QuanNcIjtcbmltcG9ydCBzdHJpbmcgZnJvbSBcIi4vc3RyaW5nLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBudW1iZXJBcnJheSwge2lzTnVtYmVyQXJyYXl9IGZyb20gXCIuL251bWJlckFycmF5LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIHQgPSB0eXBlb2YgYiwgYztcbiAgcmV0dXJuIGIgPT0gbnVsbCB8fCB0ID09PSBcImJvb2xlYW5cIiA/IGNvbnN0YW50KGIpXG4gICAgICA6ICh0ID09PSBcIm51bWJlclwiID8gbnVtYmVyXG4gICAgICA6IHQgPT09IFwic3RyaW5nXCIgPyAoKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIHJnYikgOiBzdHJpbmcpXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IHJnYlxuICAgICAgOiBiIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGVcbiAgICAgIDogaXNOdW1iZXJBcnJheShiKSA/IG51bWJlckFycmF5XG4gICAgICA6IEFycmF5LmlzQXJyYXkoYikgPyBnZW5lcmljQXJyYXlcbiAgICAgIDogdHlwZW9mIGIudmFsdWVPZiAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBiLnRvU3RyaW5nICE9PSBcImZ1bmN0aW9uXCIgfHwgaXNOYU4oYikgPyBvYmplY3RcbiAgICAgIDogbnVtYmVyKShhLCBiKTtcbn1cbiIsImltcG9ydCB7ZXZlbnR9IGZyb20gXCIuL3NlbGVjdGlvbi9vblwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGN1cnJlbnQgPSBldmVudCwgc291cmNlO1xuICB3aGlsZSAoc291cmNlID0gY3VycmVudC5zb3VyY2VFdmVudCkgY3VycmVudCA9IHNvdXJjZTtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBldmVudCkge1xuICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTtcblxuICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZO1xuICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldO1xuICB9XG5cbiAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTtcbn1cbiIsImltcG9ydCBzb3VyY2VFdmVudCBmcm9tIFwiLi9zb3VyY2VFdmVudFwiO1xuaW1wb3J0IHBvaW50IGZyb20gXCIuL3BvaW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIHRvdWNoZXMsIGlkZW50aWZpZXIpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBpZGVudGlmaWVyID0gdG91Y2hlcywgdG91Y2hlcyA9IHNvdXJjZUV2ZW50KCkuY2hhbmdlZFRvdWNoZXM7XG5cbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCB0b3VjaDsgaSA8IG47ICsraSkge1xuICAgIGlmICgodG91Y2ggPSB0b3VjaGVzW2ldKS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXR1cm4gcG9pbnQobm9kZSwgdG91Y2gpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50XCI7XG5pbXBvcnQgcG9pbnQgZnJvbSBcIi4vcG9pbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICB2YXIgZXZlbnQgPSBzb3VyY2VFdmVudCgpO1xuICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXMpIGV2ZW50ID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gIHJldHVybiBwb2ludChub2RlLCBldmVudCk7XG59XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpO1xuICAgIHQgPSB0Ll9uZXh0O1xuICB9XG4gIC0tZnJhbWU7XG59XG5cbmZ1bmN0aW9uIHdha2UoKSB7XG4gIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldztcbiAgZnJhbWUgPSB0aW1lb3V0ID0gMDtcbiAgdHJ5IHtcbiAgICB0aW1lckZsdXNoKCk7XG4gIH0gZmluYWxseSB7XG4gICAgZnJhbWUgPSAwO1xuICAgIG5hcCgpO1xuICAgIGNsb2NrTm93ID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb2tlKCkge1xuICB2YXIgbm93ID0gY2xvY2subm93KCksIGRlbGF5ID0gbm93IC0gY2xvY2tMYXN0O1xuICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93O1xufVxuXG5mdW5jdGlvbiBuYXAoKSB7XG4gIHZhciB0MCwgdDEgPSB0YXNrSGVhZCwgdDIsIHRpbWUgPSBJbmZpbml0eTtcbiAgd2hpbGUgKHQxKSB7XG4gICAgaWYgKHQxLl9jYWxsKSB7XG4gICAgICBpZiAodGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7XG4gICAgICB0MCA9IHQxLCB0MSA9IHQxLl9uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7XG4gICAgICB0MSA9IHQwID8gdDAuX25leHQgPSB0MiA6IHRhc2tIZWFkID0gdDI7XG4gICAgfVxuICB9XG4gIHRhc2tUYWlsID0gdDA7XG4gIHNsZWVwKHRpbWUpO1xufVxuXG5mdW5jdGlvbiBzbGVlcCh0aW1lKSB7XG4gIGlmIChmcmFtZSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3aWxsIGJlLlxuICBpZiAodGltZW91dCkgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy5cbiAgaWYgKGRlbGF5ID4gMjQpIHtcbiAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0ID0gc2V0VGltZW91dCh3YWtlLCB0aW1lIC0gY2xvY2subm93KCkgLSBjbG9ja1NrZXcpO1xuICAgIGlmIChpbnRlcnZhbCkgaW50ZXJ2YWwgPSBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWludGVydmFsKSBjbG9ja0xhc3QgPSBjbG9jay5ub3coKSwgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwb2tlLCBwb2tlRGVsYXkpO1xuICAgIGZyYW1lID0gMSwgc2V0RnJhbWUod2FrZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7VGltZXJ9IGZyb20gXCIuL3RpbWVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTtcbiAgdC5yZXN0YXJ0KGZ1bmN0aW9uKGVsYXBzZWQpIHtcbiAgICB0LnN0b3AoKTtcbiAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpO1xuICB9LCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge3RpbWVyLCB0aW1lb3V0fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGVtcHR5T24gPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiZW5kXCIsIFwiY2FuY2VsXCIsIFwiaW50ZXJydXB0XCIpO1xudmFyIGVtcHR5VHdlZW4gPSBbXTtcblxuZXhwb3J0IHZhciBDUkVBVEVEID0gMDtcbmV4cG9ydCB2YXIgU0NIRURVTEVEID0gMTtcbmV4cG9ydCB2YXIgU1RBUlRJTkcgPSAyO1xuZXhwb3J0IHZhciBTVEFSVEVEID0gMztcbmV4cG9ydCB2YXIgUlVOTklORyA9IDQ7XG5leHBvcnQgdmFyIEVORElORyA9IDU7XG5leHBvcnQgdmFyIEVOREVEID0gNjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSwgaWQsIGluZGV4LCBncm91cCwgdGltaW5nKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZXMpIG5vZGUuX190cmFuc2l0aW9uID0ge307XG4gIGVsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuO1xuICBjcmVhdGUobm9kZSwgaWQsIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGluZGV4OiBpbmRleCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIGdyb3VwOiBncm91cCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIG9uOiBlbXB0eU9uLFxuICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLFxuICAgIHRpbWU6IHRpbWluZy50aW1lLFxuICAgIGRlbGF5OiB0aW1pbmcuZGVsYXksXG4gICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbixcbiAgICBlYXNlOiB0aW1pbmcuZWFzZSxcbiAgICB0aW1lcjogbnVsbCxcbiAgICBzdGF0ZTogQ1JFQVRFRFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gU1RBUlRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZ1wiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFuc2l0aW9uIG5vdCBmb3VuZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGUobm9kZSwgaWQsIHNlbGYpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgdHdlZW47XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0aW9uIGlzIGNyZWF0ZWQuXG4gIC8vIE5vdGUgdGhlIGFjdHVhbCBkZWxheSBpcyBub3Qga25vd24gdW50aWwgdGhlIGZpcnN0IGNhbGxiYWNrIVxuICBzY2hlZHVsZXNbaWRdID0gc2VsZjtcbiAgc2VsZi50aW1lciA9IHRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpO1xuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHtcbiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEO1xuICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcblxuICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5LlxuICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHtcbiAgICB2YXIgaSwgaiwgbiwgbztcblxuICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC5cbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEKSByZXR1cm4gc3RvcCgpO1xuXG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgbyA9IHNjaGVkdWxlc1tpXTtcbiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7XG5cbiAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsXG4gICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGFcbiAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpO1xuXG4gICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORykge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJpbnRlcnJ1cHRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy5cbiAgICAgIGVsc2UgaWYgKCtpIDwgaWQpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuXG4gICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayFcbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhXG4gICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLlxuICAgIHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkge1xuICAgICAgICBzZWxmLnN0YXRlID0gUlVOTklORztcbiAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG4gICAgICAgIHRpY2soZWxhcHNlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC5cbiAgICBzZWxmLnN0YXRlID0gU1RBUlRJTkc7XG4gICAgc2VsZi5vbi5jYWxsKFwic3RhcnRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi5cbiAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpO1xuICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHtcbiAgICAgICAgdHdlZW5bKytqXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxO1xuICB9XG5cbiAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7XG4gICAgdmFyIHQgPSBlbGFwc2VkIDwgc2VsZi5kdXJhdGlvbiA/IHNlbGYuZWFzZS5jYWxsKG51bGwsIGVsYXBzZWQgLyBzZWxmLmR1cmF0aW9uKSA6IChzZWxmLnRpbWVyLnJlc3RhcnQoc3RvcCksIHNlbGYuc3RhdGUgPSBFTkRJTkcsIDEpLFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgdHdlZW5baV0uY2FsbChub2RlLCB0KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LlxuICAgIGlmIChzZWxmLnN0YXRlID09PSBFTkRJTkcpIHtcbiAgICAgIHNlbGYub24uY2FsbChcImVuZFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHNlbGYuc3RhdGUgPSBFTkRFRDtcbiAgICBzZWxmLnRpbWVyLnN0b3AoKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2lkXTtcbiAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQge1NUQVJUSU5HLCBFTkRJTkcsIEVOREVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgc2NoZWR1bGUsXG4gICAgICBhY3RpdmUsXG4gICAgICBlbXB0eSA9IHRydWUsXG4gICAgICBpO1xuXG4gIGlmICghc2NoZWR1bGVzKSByZXR1cm47XG5cbiAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcblxuICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfVxuICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7XG4gICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRDtcbiAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7XG4gICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyBcImludGVycnVwdFwiIDogXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2NoZWR1bGUuaW5kZXgsIHNjaGVkdWxlLmdyb3VwKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICB9XG5cbiAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG59XG4iLCJpbXBvcnQgaW50ZXJydXB0IGZyb20gXCIuLi9pbnRlcnJ1cHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIGludGVycnVwdCh0aGlzLCBuYW1lKTtcbiAgfSk7XG59XG4iLCJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsImltcG9ydCBkZWNvbXBvc2UsIHtpZGVudGl0eX0gZnJvbSBcIi4vZGVjb21wb3NlLmpzXCI7XG5cbnZhciBjc3NOb2RlLFxuICAgIGNzc1Jvb3QsXG4gICAgY3NzVmlldyxcbiAgICBzdmdOb2RlO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBcIm5vbmVcIikgcmV0dXJuIGlkZW50aXR5O1xuICBpZiAoIWNzc05vZGUpIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiRElWXCIpLCBjc3NSb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBjc3NWaWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gIGNzc05vZGUuc3R5bGUudHJhbnNmb3JtID0gdmFsdWU7XG4gIHZhbHVlID0gY3NzVmlldy5nZXRDb21wdXRlZFN0eWxlKGNzc1Jvb3QuYXBwZW5kQ2hpbGQoY3NzTm9kZSksIG51bGwpLmdldFByb3BlcnR5VmFsdWUoXCJ0cmFuc2Zvcm1cIik7XG4gIGNzc1Jvb3QucmVtb3ZlQ2hpbGQoY3NzTm9kZSk7XG4gIHZhbHVlID0gdmFsdWUuc2xpY2UoNywgLTEpLnNwbGl0KFwiLFwiKTtcbiAgcmV0dXJuIGRlY29tcG9zZSgrdmFsdWVbMF0sICt2YWx1ZVsxXSwgK3ZhbHVlWzJdLCArdmFsdWVbM10sICt2YWx1ZVs0XSwgK3ZhbHVlWzVdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3ZnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdmFsdWUpO1xuICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eTtcbiAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7XG4gIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7XG59XG4iLCJpbXBvcnQgbnVtYmVyIGZyb20gXCIuLi9udW1iZXIuanNcIjtcbmltcG9ydCB7cGFyc2VDc3MsIHBhcnNlU3ZnfSBmcm9tIFwiLi9wYXJzZS5qc1wiO1xuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZSwgcHhDb21tYSwgcHhQYXJlbiwgZGVnUGFyZW4pIHtcblxuICBmdW5jdGlvbiBwb3Aocykge1xuICAgIHJldHVybiBzLmxlbmd0aCA/IHMucG9wKCkgKyBcIiBcIiA6IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2goXCJ0cmFuc2xhdGUoXCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiB8fCB5Yikge1xuICAgICAgcy5wdXNoKFwidHJhbnNsYXRlKFwiICsgeGIgKyBweENvbW1hICsgeWIgKyBweFBhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBpZiAoYSAtIGIgPiAxODApIGIgKz0gMzYwOyBlbHNlIGlmIChiIC0gYSA+IDE4MCkgYSArPSAzNjA7IC8vIHNob3J0ZXN0IHBhdGhcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2tld1goYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiLCBudWxsLCBcIixcIiwgbnVsbCwgXCIpXCIpO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIgKyB4YiArIFwiLFwiICsgeWIgKyBcIilcIik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuICAgIGEgPSBwYXJzZShhKSwgYiA9IHBhcnNlKGIpO1xuICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpO1xuICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpO1xuICAgIHNrZXdYKGEuc2tld1gsIGIuc2tld1gsIHMsIHEpO1xuICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTtcbiAgICBhID0gYiA9IG51bGw7IC8vIGdjXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbztcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgXCJweCwgXCIsIFwicHgpXCIsIFwiZGVnKVwiKTtcbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZVN2ZywgXCIsIFwiLCBcIilcIiwgXCIpXCIpO1xuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpO1xuICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjFbaV0gPSB0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIG5hbWUgKz0gXCJcIjtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgdHdlZW4gPSBnZXQodGhpcy5ub2RlKCksIGlkKS50d2VlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbCA/IHR3ZWVuUmVtb3ZlIDogdHdlZW5GdW5jdGlvbikoaWQsIG5hbWUsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkO1xuXG4gIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpO1xuICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0KG5vZGUsIGlkKS52YWx1ZVtuYW1lXTtcbiAgfTtcbn1cbiIsImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJhdHRyLlwiICsgbmFtZSwgdmFsdWUpKVxuICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KShmdWxsbmFtZSwgaSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcImF0dHIuXCIgKyBuYW1lO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2VlbikoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge2dldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZGVsYXlGdW5jdGlvblxuICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvblxuICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTtcbn1cbiIsImltcG9ydCB7bWF0Y2hlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0cmFuc2l0aW9uKSB7XG4gIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBzdGFydChuYW1lKSB7XG4gIHJldHVybiAobmFtZSArIFwiXCIpLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykuZXZlcnkoZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4gIXQgfHwgdCA9PT0gXCJzdGFydFwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQgOiBzZXQ7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDJcbiAgICAgID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSlcbiAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmVGdW5jdGlvbihpZCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMub24oXCJlbmQucmVtb3ZlXCIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7XG59XG4iLCJpbXBvcnQge3NlbGVjdG9yfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZCA9IHRoaXMuX2lkO1xuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdG9yQWxsfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZCA9IHRoaXMuX2lkO1xuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPSBjaGlsZHJlbltrXSkge1xuICAgICAgICAgICAgc2NoZWR1bGUoY2hpbGQsIG5hbWUsIGlkLCBrLCBjaGlsZHJlbiwgaW5oZXJpdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKGNoaWxkcmVuKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbnZhciBTZWxlY3Rpb24gPSBzZWxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzdHlsZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVOdWxsKG5hbWUsIGludGVycG9sYXRlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKSxcbiAgICAgICAgc3RyaW5nMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHN0cmluZzEwID0gc3RyaW5nMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKSxcbiAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksXG4gICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgc3RyaW5nMSA9IHZhbHVlMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZU1heWJlUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciBvbjAsIG9uMSwgbGlzdGVuZXIwLCBrZXkgPSBcInN0eWxlLlwiICsgbmFtZSwgZXZlbnQgPSBcImVuZC5cIiArIGtleSwgcmVtb3ZlO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbixcbiAgICAgICAgbGlzdGVuZXIgPSBzY2hlZHVsZS52YWx1ZVtrZXldID09IG51bGwgPyByZW1vdmUgfHwgKHJlbW92ZSA9IHN0eWxlUmVtb3ZlKG5hbWUpKSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCB8fCBsaXN0ZW5lcjAgIT09IGxpc3RlbmVyKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKGV2ZW50LCBsaXN0ZW5lcjAgPSBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBpID0gKG5hbWUgKz0gXCJcIikgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSlcbiAgICAgIC5vbihcImVuZC5zdHlsZS5cIiArIG5hbWUsIHN0eWxlUmVtb3ZlKG5hbWUpKVxuICAgIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUZ1bmN0aW9uKG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJzdHlsZS5cIiArIG5hbWUsIHZhbHVlKSkpXG4gICAgICAuZWFjaChzdHlsZU1heWJlUmVtb3ZlKHRoaXMuX2lkLCBuYW1lKSlcbiAgICA6IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSlcbiAgICAgIC5vbihcImVuZC5zdHlsZS5cIiArIG5hbWUsIG51bGwpO1xufVxuIiwiZnVuY3Rpb24gc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgaS5jYWxsKHRoaXMsIHQpLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciB0LCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdCA9IChpMCA9IGkpICYmIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpO1xuICAgIHJldHVybiB0O1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIga2V5ID0gXCJzdHlsZS5cIiArIChuYW1lICs9IFwiXCIpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpO1xufVxuIiwiaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gXCJcIiA6IHZhbHVlMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMudHdlZW4oXCJ0ZXh0XCIsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsIFwidGV4dFwiLCB2YWx1ZSkpXG4gICAgICA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIikpO1xufVxuIiwiZnVuY3Rpb24gdGV4dEludGVycG9sYXRlKGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gaS5jYWxsKHRoaXMsIHQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0VHdlZW4odmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiB0ZXh0SW50ZXJwb2xhdGUoaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcInRleHRcIjtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkMCA9IHRoaXMuX2lkLFxuICAgICAgaWQxID0gbmV3SWQoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICB2YXIgaW5oZXJpdCA9IGdldChub2RlLCBpZDApO1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZDEsIGksIGdyb3VwLCB7XG4gICAgICAgICAgdGltZTogaW5oZXJpdC50aW1lICsgaW5oZXJpdC5kZWxheSArIGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZGVsYXk6IDAsXG4gICAgICAgICAgZHVyYXRpb246IGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZWFzZTogaW5oZXJpdC5lYXNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkMSk7XG59XG4iLCJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBvbjAsIG9uMSwgdGhhdCA9IHRoaXMsIGlkID0gdGhhdC5faWQsIHNpemUgPSB0aGF0LnNpemUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sXG4gICAgICAgIGVuZCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7IGlmICgtLXNpemUgPT09IDApIHJlc29sdmUoKTsgfX07XG5cbiAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgICBpZiAob24gIT09IG9uMCkge1xuICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTtcbiAgICAgICAgb24xLl8uY2FuY2VsLnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uaW50ZXJydXB0LnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUub24gPSBvbjE7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0VHdlZW4gZnJvbSBcIi4vdGV4dFR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lbmQgZnJvbSBcIi4vZW5kLmpzXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbixcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlLFxuICBlbmQ6IHRyYW5zaXRpb25fZW5kXG59O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlIGZyb20gXCIuLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge2Vhc2VDdWJpY0luT3V0fSBmcm9tIFwiZDMtZWFzZVwiO1xuaW1wb3J0IHtub3d9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZGVmYXVsdFRpbWluZyA9IHtcbiAgdGltZTogbnVsbCwgLy8gU2V0IG9uIHVzZS5cbiAgZGVsYXk6IDAsXG4gIGR1cmF0aW9uOiAyNTAsXG4gIGVhc2U6IGVhc2VDdWJpY0luT3V0XG59O1xuXG5mdW5jdGlvbiBpbmhlcml0KG5vZGUsIGlkKSB7XG4gIHZhciB0aW1pbmc7XG4gIHdoaWxlICghKHRpbWluZyA9IG5vZGUuX190cmFuc2l0aW9uKSB8fCAhKHRpbWluZyA9IHRpbWluZ1tpZF0pKSB7XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VGltaW5nLnRpbWUgPSBub3coKSwgZGVmYXVsdFRpbWluZztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpbWluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgaWQsXG4gICAgICB0aW1pbmc7XG5cbiAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7XG4gICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7XG4gIH0gZWxzZSB7XG4gICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQsIGksIGdyb3VwLCB0aW1pbmcgfHwgaW5oZXJpdChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQge1NDSEVEVUxFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG52YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGk7XG5cbiAgaWYgKHNjaGVkdWxlcykge1xuICAgIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkuc3RhdGUgPiBTQ0hFRFVMRUQgJiYgc2NoZWR1bGUubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oW1tub2RlXV0sIHJvb3QsIG5hbWUsICtpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsImltcG9ydCBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJhbnNpdGlvbn0gZnJvbSBcIi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFjdGl2ZX0gZnJvbSBcIi4vYWN0aXZlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJydXB0fSBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBzZWxlY3Rpb24pIHtcbiAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xufVxuIiwiaW1wb3J0IHtldmVudH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbigpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtkcmFnRGlzYWJsZSwgZHJhZ0VuYWJsZX0gZnJvbSBcImQzLWRyYWdcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGV9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtjdXN0b21FdmVudCwgZXZlbnQsIHRvdWNoLCBtb3VzZSwgc2VsZWN0fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge2ludGVycnVwdH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IEJydXNoRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG52YXIgTU9ERV9EUkFHID0ge25hbWU6IFwiZHJhZ1wifSxcbiAgICBNT0RFX1NQQUNFID0ge25hbWU6IFwic3BhY2VcIn0sXG4gICAgTU9ERV9IQU5ETEUgPSB7bmFtZTogXCJoYW5kbGVcIn0sXG4gICAgTU9ERV9DRU5URVIgPSB7bmFtZTogXCJjZW50ZXJcIn07XG5cbmZ1bmN0aW9uIG51bWJlcjEoZSkge1xuICByZXR1cm4gWytlWzBdLCArZVsxXV07XG59XG5cbmZ1bmN0aW9uIG51bWJlcjIoZSkge1xuICByZXR1cm4gW251bWJlcjEoZVswXSksIG51bWJlcjEoZVsxXSldO1xufVxuXG5mdW5jdGlvbiB0b3VjaGVyKGlkZW50aWZpZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgIHJldHVybiB0b3VjaCh0YXJnZXQsIGV2ZW50LnRvdWNoZXMsIGlkZW50aWZpZXIpO1xuICB9O1xufVxuXG52YXIgWCA9IHtcbiAgbmFtZTogXCJ4XCIsXG4gIGhhbmRsZXM6IFtcIndcIiwgXCJlXCJdLm1hcCh0eXBlKSxcbiAgaW5wdXQ6IGZ1bmN0aW9uKHgsIGUpIHsgcmV0dXJuIHggPT0gbnVsbCA/IG51bGwgOiBbWyt4WzBdLCBlWzBdWzFdXSwgWyt4WzFdLCBlWzFdWzFdXV07IH0sXG4gIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5ICYmIFt4eVswXVswXSwgeHlbMV1bMF1dOyB9XG59O1xuXG52YXIgWSA9IHtcbiAgbmFtZTogXCJ5XCIsXG4gIGhhbmRsZXM6IFtcIm5cIiwgXCJzXCJdLm1hcCh0eXBlKSxcbiAgaW5wdXQ6IGZ1bmN0aW9uKHksIGUpIHsgcmV0dXJuIHkgPT0gbnVsbCA/IG51bGwgOiBbW2VbMF1bMF0sICt5WzBdXSwgW2VbMV1bMF0sICt5WzFdXV07IH0sXG4gIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5ICYmIFt4eVswXVsxXSwgeHlbMV1bMV1dOyB9XG59O1xuXG52YXIgWFkgPSB7XG4gIG5hbWU6IFwieHlcIixcbiAgaGFuZGxlczogW1wiblwiLCBcIndcIiwgXCJlXCIsIFwic1wiLCBcIm53XCIsIFwibmVcIiwgXCJzd1wiLCBcInNlXCJdLm1hcCh0eXBlKSxcbiAgaW5wdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSA9PSBudWxsID8gbnVsbCA6IG51bWJlcjIoeHkpOyB9LFxuICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eTsgfVxufTtcblxudmFyIGN1cnNvcnMgPSB7XG4gIG92ZXJsYXk6IFwiY3Jvc3NoYWlyXCIsXG4gIHNlbGVjdGlvbjogXCJtb3ZlXCIsXG4gIG46IFwibnMtcmVzaXplXCIsXG4gIGU6IFwiZXctcmVzaXplXCIsXG4gIHM6IFwibnMtcmVzaXplXCIsXG4gIHc6IFwiZXctcmVzaXplXCIsXG4gIG53OiBcIm53c2UtcmVzaXplXCIsXG4gIG5lOiBcIm5lc3ctcmVzaXplXCIsXG4gIHNlOiBcIm53c2UtcmVzaXplXCIsXG4gIHN3OiBcIm5lc3ctcmVzaXplXCJcbn07XG5cbnZhciBmbGlwWCA9IHtcbiAgZTogXCJ3XCIsXG4gIHc6IFwiZVwiLFxuICBudzogXCJuZVwiLFxuICBuZTogXCJud1wiLFxuICBzZTogXCJzd1wiLFxuICBzdzogXCJzZVwiXG59O1xuXG52YXIgZmxpcFkgPSB7XG4gIG46IFwic1wiLFxuICBzOiBcIm5cIixcbiAgbnc6IFwic3dcIixcbiAgbmU6IFwic2VcIixcbiAgc2U6IFwibmVcIixcbiAgc3c6IFwibndcIlxufTtcblxudmFyIHNpZ25zWCA9IHtcbiAgb3ZlcmxheTogKzEsXG4gIHNlbGVjdGlvbjogKzEsXG4gIG46IG51bGwsXG4gIGU6ICsxLFxuICBzOiBudWxsLFxuICB3OiAtMSxcbiAgbnc6IC0xLFxuICBuZTogKzEsXG4gIHNlOiArMSxcbiAgc3c6IC0xXG59O1xuXG52YXIgc2lnbnNZID0ge1xuICBvdmVybGF5OiArMSxcbiAgc2VsZWN0aW9uOiArMSxcbiAgbjogLTEsXG4gIGU6IG51bGwsXG4gIHM6ICsxLFxuICB3OiBudWxsLFxuICBudzogLTEsXG4gIG5lOiAtMSxcbiAgc2U6ICsxLFxuICBzdzogKzFcbn07XG5cbmZ1bmN0aW9uIHR5cGUodCkge1xuICByZXR1cm4ge3R5cGU6IHR9O1xufVxuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoKSB7XG4gIHJldHVybiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgc3ZnID0gdGhpcy5vd25lclNWR0VsZW1lbnQgfHwgdGhpcztcbiAgaWYgKHN2Zy5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgc3ZnID0gc3ZnLnZpZXdCb3guYmFzZVZhbDtcbiAgICByZXR1cm4gW1tzdmcueCwgc3ZnLnldLCBbc3ZnLnggKyBzdmcud2lkdGgsIHN2Zy55ICsgc3ZnLmhlaWdodF1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbc3ZnLndpZHRoLmJhc2VWYWwudmFsdWUsIHN2Zy5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG4vLyBMaWtlIGQzLmxvY2FsLCBidXQgd2l0aCB0aGUgbmFtZSDigJxfX2JydXNo4oCdIHJhdGhlciB0aGFuIGF1dG8tZ2VuZXJhdGVkLlxuZnVuY3Rpb24gbG9jYWwobm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX19icnVzaCkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybjtcbiAgcmV0dXJuIG5vZGUuX19icnVzaDtcbn1cblxuZnVuY3Rpb24gZW1wdHkoZXh0ZW50KSB7XG4gIHJldHVybiBleHRlbnRbMF1bMF0gPT09IGV4dGVudFsxXVswXVxuICAgICAgfHwgZXh0ZW50WzBdWzFdID09PSBleHRlbnRbMV1bMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicnVzaFNlbGVjdGlvbihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX19icnVzaDtcbiAgcmV0dXJuIHN0YXRlID8gc3RhdGUuZGltLm91dHB1dChzdGF0ZS5zZWxlY3Rpb24pIDogbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJydXNoWCgpIHtcbiAgcmV0dXJuIGJydXNoKFgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJ1c2hZKCkge1xuICByZXR1cm4gYnJ1c2goWSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gYnJ1c2goWFkpO1xufVxuXG5mdW5jdGlvbiBicnVzaChkaW0pIHtcbiAgdmFyIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIGtleXMgPSB0cnVlLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImJydXNoXCIsIFwiZW5kXCIpLFxuICAgICAgaGFuZGxlU2l6ZSA9IDYsXG4gICAgICB0b3VjaGVuZGluZztcblxuICBmdW5jdGlvbiBicnVzaChncm91cCkge1xuICAgIHZhciBvdmVybGF5ID0gZ3JvdXBcbiAgICAgICAgLnByb3BlcnR5KFwiX19icnVzaFwiLCBpbml0aWFsaXplKVxuICAgICAgLnNlbGVjdEFsbChcIi5vdmVybGF5XCIpXG4gICAgICAuZGF0YShbdHlwZShcIm92ZXJsYXlcIildKTtcblxuICAgIG92ZXJsYXkuZW50ZXIoKS5hcHBlbmQoXCJyZWN0XCIpXG4gICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJvdmVybGF5XCIpXG4gICAgICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIilcbiAgICAgICAgLmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5vdmVybGF5KVxuICAgICAgLm1lcmdlKG92ZXJsYXkpXG4gICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBleHRlbnQgPSBsb2NhbCh0aGlzKS5leHRlbnQ7XG4gICAgICAgICAgc2VsZWN0KHRoaXMpXG4gICAgICAgICAgICAgIC5hdHRyKFwieFwiLCBleHRlbnRbMF1bMF0pXG4gICAgICAgICAgICAgIC5hdHRyKFwieVwiLCBleHRlbnRbMF1bMV0pXG4gICAgICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdKVxuICAgICAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0pO1xuICAgICAgICB9KTtcblxuICAgIGdyb3VwLnNlbGVjdEFsbChcIi5zZWxlY3Rpb25cIilcbiAgICAgIC5kYXRhKFt0eXBlKFwic2VsZWN0aW9uXCIpXSlcbiAgICAgIC5lbnRlcigpLmFwcGVuZChcInJlY3RcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcInNlbGVjdGlvblwiKVxuICAgICAgICAuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzLnNlbGVjdGlvbilcbiAgICAgICAgLmF0dHIoXCJmaWxsXCIsIFwiIzc3N1wiKVxuICAgICAgICAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAwLjMpXG4gICAgICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiI2ZmZlwiKVxuICAgICAgICAuYXR0cihcInNoYXBlLXJlbmRlcmluZ1wiLCBcImNyaXNwRWRnZXNcIik7XG5cbiAgICB2YXIgaGFuZGxlID0gZ3JvdXAuc2VsZWN0QWxsKFwiLmhhbmRsZVwiKVxuICAgICAgLmRhdGEoZGltLmhhbmRsZXMsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZTsgfSk7XG5cbiAgICBoYW5kbGUuZXhpdCgpLnJlbW92ZSgpO1xuXG4gICAgaGFuZGxlLmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKVxuICAgICAgICAuYXR0cihcImNsYXNzXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIFwiaGFuZGxlIGhhbmRsZS0tXCIgKyBkLnR5cGU7IH0pXG4gICAgICAgIC5hdHRyKFwiY3Vyc29yXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGN1cnNvcnNbZC50eXBlXTsgfSk7XG5cbiAgICBncm91cFxuICAgICAgICAuZWFjaChyZWRyYXcpXG4gICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcbiAgICAgICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcImFsbFwiKVxuICAgICAgICAub24oXCJtb3VzZWRvd24uYnJ1c2hcIiwgc3RhcnRlZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0LmJydXNoXCIsIHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS5icnVzaFwiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaFwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCJ0b3VjaC1hY3Rpb25cIiwgXCJub25lXCIpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICBicnVzaC5tb3ZlID0gZnVuY3Rpb24oZ3JvdXAsIHNlbGVjdGlvbikge1xuICAgIGlmIChncm91cC5zZWxlY3Rpb24pIHtcbiAgICAgIGdyb3VwXG4gICAgICAgICAgLm9uKFwic3RhcnQuYnJ1c2hcIiwgZnVuY3Rpb24oKSB7IGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCk7IH0pXG4gICAgICAgICAgLm9uKFwiaW50ZXJydXB0LmJydXNoIGVuZC5icnVzaFwiLCBmdW5jdGlvbigpIHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZCgpOyB9KVxuICAgICAgICAgIC50d2VlbihcImJydXNoXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIHN0YXRlID0gdGhhdC5fX2JydXNoLFxuICAgICAgICAgICAgICAgIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3VtZW50cyksXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uMCA9IHN0YXRlLnNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24xID0gZGltLmlucHV0KHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIiA/IHNlbGVjdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc2VsZWN0aW9uLCBzdGF0ZS5leHRlbnQpLFxuICAgICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZShzZWxlY3Rpb24wLCBzZWxlY3Rpb24xKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gdHdlZW4odCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSB0ID09PSAxICYmIHNlbGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogaSh0KTtcbiAgICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgICAgICAgICAgIGVtaXQuYnJ1c2goKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbjAgIT09IG51bGwgJiYgc2VsZWN0aW9uMSAhPT0gbnVsbCA/IHR3ZWVuIDogdHdlZW4oMSk7XG4gICAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3VwXG4gICAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24xID0gZGltLmlucHV0KHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIiA/IHNlbGVjdGlvbi5hcHBseSh0aGF0LCBhcmdzKSA6IHNlbGVjdGlvbiwgc3RhdGUuZXh0ZW50KSxcbiAgICAgICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmdzKS5iZWZvcmVzdGFydCgpO1xuXG4gICAgICAgICAgICBpbnRlcnJ1cHQodGhhdCk7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBzZWxlY3Rpb24xID09PSBudWxsID8gbnVsbCA6IHNlbGVjdGlvbjE7XG4gICAgICAgICAgICByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICAgICAgICAgIGVtaXQuc3RhcnQoKS5icnVzaCgpLmVuZCgpO1xuICAgICAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBicnVzaC5jbGVhciA9IGZ1bmN0aW9uKGdyb3VwKSB7XG4gICAgYnJ1c2gubW92ZShncm91cCwgbnVsbCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVkcmF3KCkge1xuICAgIHZhciBncm91cCA9IHNlbGVjdCh0aGlzKSxcbiAgICAgICAgc2VsZWN0aW9uID0gbG9jYWwodGhpcykuc2VsZWN0aW9uO1xuXG4gICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgZ3JvdXAuc2VsZWN0QWxsKFwiLnNlbGVjdGlvblwiKVxuICAgICAgICAgIC5zdHlsZShcImRpc3BsYXlcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcInhcIiwgc2VsZWN0aW9uWzBdWzBdKVxuICAgICAgICAgIC5hdHRyKFwieVwiLCBzZWxlY3Rpb25bMF1bMV0pXG4gICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCBzZWxlY3Rpb25bMV1bMF0gLSBzZWxlY3Rpb25bMF1bMF0pXG4gICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgc2VsZWN0aW9uWzFdWzFdIC0gc2VsZWN0aW9uWzBdWzFdKTtcblxuICAgICAgZ3JvdXAuc2VsZWN0QWxsKFwiLmhhbmRsZVwiKVxuICAgICAgICAgIC5zdHlsZShcImRpc3BsYXlcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcInhcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlW2QudHlwZS5sZW5ndGggLSAxXSA9PT0gXCJlXCIgPyBzZWxlY3Rpb25bMV1bMF0gLSBoYW5kbGVTaXplIC8gMiA6IHNlbGVjdGlvblswXVswXSAtIGhhbmRsZVNpemUgLyAyOyB9KVxuICAgICAgICAgIC5hdHRyKFwieVwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGVbMF0gPT09IFwic1wiID8gc2VsZWN0aW9uWzFdWzFdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMV0gLSBoYW5kbGVTaXplIC8gMjsgfSlcbiAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZSA9PT0gXCJuXCIgfHwgZC50eXBlID09PSBcInNcIiA/IHNlbGVjdGlvblsxXVswXSAtIHNlbGVjdGlvblswXVswXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KVxuICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZSA9PT0gXCJlXCIgfHwgZC50eXBlID09PSBcIndcIiA/IHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KTtcbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgIGdyb3VwLnNlbGVjdEFsbChcIi5zZWxlY3Rpb24sLmhhbmRsZVwiKVxuICAgICAgICAgIC5zdHlsZShcImRpc3BsYXlcIiwgXCJub25lXCIpXG4gICAgICAgICAgLmF0dHIoXCJ4XCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJ5XCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXR0ZXIodGhhdCwgYXJncywgY2xlYW4pIHtcbiAgICByZXR1cm4gKCFjbGVhbiAmJiB0aGF0Ll9fYnJ1c2guZW1pdHRlcikgfHwgbmV3IEVtaXR0ZXIodGhhdCwgYXJncyk7XG4gIH1cblxuICBmdW5jdGlvbiBFbWl0dGVyKHRoYXQsIGFyZ3MpIHtcbiAgICB0aGlzLnRoYXQgPSB0aGF0O1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgdGhpcy5zdGF0ZSA9IHRoYXQuX19icnVzaDtcbiAgICB0aGlzLmFjdGl2ZSA9IDA7XG4gIH1cblxuICBFbWl0dGVyLnByb3RvdHlwZSA9IHtcbiAgICBiZWZvcmVzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkgdGhpcy5zdGF0ZS5lbWl0dGVyID0gdGhpcywgdGhpcy5zdGFydGluZyA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXJ0aW5nKSB0aGlzLnN0YXJ0aW5nID0gZmFsc2UsIHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuICAgICAgZWxzZSB0aGlzLmVtaXQoXCJicnVzaFwiKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgYnJ1c2g6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5lbWl0KFwiYnJ1c2hcIik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkgZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlciwgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICBjdXN0b21FdmVudChuZXcgQnJ1c2hFdmVudChicnVzaCwgdHlwZSwgZGltLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLCBsaXN0ZW5lcnMuYXBwbHksIGxpc3RlbmVycywgW3R5cGUsIHRoaXMudGhhdCwgdGhpcy5hcmdzXSk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHN0YXJ0ZWQoKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nICYmICFldmVudC50b3VjaGVzKSByZXR1cm47XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICB0eXBlID0gZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsXG4gICAgICAgIG1vZGUgPSAoa2V5cyAmJiBldmVudC5tZXRhS2V5ID8gdHlwZSA9IFwib3ZlcmxheVwiIDogdHlwZSkgPT09IFwic2VsZWN0aW9uXCIgPyBNT0RFX0RSQUcgOiAoa2V5cyAmJiBldmVudC5hbHRLZXkgPyBNT0RFX0NFTlRFUiA6IE1PREVfSEFORExFKSxcbiAgICAgICAgc2lnblggPSBkaW0gPT09IFkgPyBudWxsIDogc2lnbnNYW3R5cGVdLFxuICAgICAgICBzaWduWSA9IGRpbSA9PT0gWCA/IG51bGwgOiBzaWduc1lbdHlwZV0sXG4gICAgICAgIHN0YXRlID0gbG9jYWwodGhhdCksXG4gICAgICAgIGV4dGVudCA9IHN0YXRlLmV4dGVudCxcbiAgICAgICAgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICBXID0gZXh0ZW50WzBdWzBdLCB3MCwgdzEsXG4gICAgICAgIE4gPSBleHRlbnRbMF1bMV0sIG4wLCBuMSxcbiAgICAgICAgRSA9IGV4dGVudFsxXVswXSwgZTAsIGUxLFxuICAgICAgICBTID0gZXh0ZW50WzFdWzFdLCBzMCwgczEsXG4gICAgICAgIGR4ID0gMCxcbiAgICAgICAgZHkgPSAwLFxuICAgICAgICBtb3ZpbmcsXG4gICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblkgJiYga2V5cyAmJiBldmVudC5zaGlmdEtleSxcbiAgICAgICAgbG9ja1gsXG4gICAgICAgIGxvY2tZLFxuICAgICAgICBwb2ludGVyID0gZXZlbnQudG91Y2hlcyA/IHRvdWNoZXIoZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcikgOiBtb3VzZSxcbiAgICAgICAgcG9pbnQwID0gcG9pbnRlcih0aGF0KSxcbiAgICAgICAgcG9pbnQgPSBwb2ludDAsXG4gICAgICAgIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3VtZW50cywgdHJ1ZSkuYmVmb3Jlc3RhcnQoKTtcblxuICAgIGlmICh0eXBlID09PSBcIm92ZXJsYXlcIikge1xuICAgICAgaWYgKHNlbGVjdGlvbikgbW92aW5nID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiA9IFtcbiAgICAgICAgW3cwID0gZGltID09PSBZID8gVyA6IHBvaW50MFswXSwgbjAgPSBkaW0gPT09IFggPyBOIDogcG9pbnQwWzFdXSxcbiAgICAgICAgW2UwID0gZGltID09PSBZID8gRSA6IHcwLCBzMCA9IGRpbSA9PT0gWCA/IFMgOiBuMF1cbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHcwID0gc2VsZWN0aW9uWzBdWzBdO1xuICAgICAgbjAgPSBzZWxlY3Rpb25bMF1bMV07XG4gICAgICBlMCA9IHNlbGVjdGlvblsxXVswXTtcbiAgICAgIHMwID0gc2VsZWN0aW9uWzFdWzFdO1xuICAgIH1cblxuICAgIHcxID0gdzA7XG4gICAgbjEgPSBuMDtcbiAgICBlMSA9IGUwO1xuICAgIHMxID0gczA7XG5cbiAgICB2YXIgZ3JvdXAgPSBzZWxlY3QodGhhdClcbiAgICAgICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIik7XG5cbiAgICB2YXIgb3ZlcmxheSA9IGdyb3VwLnNlbGVjdEFsbChcIi5vdmVybGF5XCIpXG4gICAgICAgIC5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnNbdHlwZV0pO1xuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMpIHtcbiAgICAgIGVtaXQubW92ZWQgPSBtb3ZlZDtcbiAgICAgIGVtaXQuZW5kZWQgPSBlbmRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHZpZXcgPSBzZWxlY3QoZXZlbnQudmlldylcbiAgICAgICAgICAub24oXCJtb3VzZW1vdmUuYnJ1c2hcIiwgbW92ZWQsIHRydWUpXG4gICAgICAgICAgLm9uKFwibW91c2V1cC5icnVzaFwiLCBlbmRlZCwgdHJ1ZSk7XG4gICAgICBpZiAoa2V5cykgdmlld1xuICAgICAgICAgIC5vbihcImtleWRvd24uYnJ1c2hcIiwga2V5ZG93bmVkLCB0cnVlKVxuICAgICAgICAgIC5vbihcImtleXVwLmJydXNoXCIsIGtleXVwcGVkLCB0cnVlKVxuXG4gICAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICB9XG5cbiAgICBub3Byb3BhZ2F0aW9uKCk7XG4gICAgaW50ZXJydXB0KHRoYXQpO1xuICAgIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgIGVtaXQuc3RhcnQoKTtcblxuICAgIGZ1bmN0aW9uIG1vdmVkKCkge1xuICAgICAgdmFyIHBvaW50MSA9IHBvaW50ZXIodGhhdCk7XG4gICAgICBpZiAoc2hpZnRpbmcgJiYgIWxvY2tYICYmICFsb2NrWSkge1xuICAgICAgICBpZiAoTWF0aC5hYnMocG9pbnQxWzBdIC0gcG9pbnRbMF0pID4gTWF0aC5hYnMocG9pbnQxWzFdIC0gcG9pbnRbMV0pKSBsb2NrWSA9IHRydWU7XG4gICAgICAgIGVsc2UgbG9ja1ggPSB0cnVlO1xuICAgICAgfVxuICAgICAgcG9pbnQgPSBwb2ludDE7XG4gICAgICBtb3ZpbmcgPSB0cnVlO1xuICAgICAgbm9ldmVudCgpO1xuICAgICAgbW92ZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdmUoKSB7XG4gICAgICB2YXIgdDtcblxuICAgICAgZHggPSBwb2ludFswXSAtIHBvaW50MFswXTtcbiAgICAgIGR5ID0gcG9pbnRbMV0gLSBwb2ludDBbMV07XG5cbiAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICBjYXNlIE1PREVfU1BBQ0U6XG4gICAgICAgIGNhc2UgTU9ERV9EUkFHOiB7XG4gICAgICAgICAgaWYgKHNpZ25YKSBkeCA9IE1hdGgubWF4KFcgLSB3MCwgTWF0aC5taW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwICsgZHgsIGUxID0gZTAgKyBkeDtcbiAgICAgICAgICBpZiAoc2lnblkpIGR5ID0gTWF0aC5tYXgoTiAtIG4wLCBNYXRoLm1pbihTIC0gczAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMCArIGR5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTU9ERV9IQU5ETEU6IHtcbiAgICAgICAgICBpZiAoc2lnblggPCAwKSBkeCA9IE1hdGgubWF4KFcgLSB3MCwgTWF0aC5taW4oRSAtIHcwLCBkeCkpLCB3MSA9IHcwICsgZHgsIGUxID0gZTA7XG4gICAgICAgICAgZWxzZSBpZiAoc2lnblggPiAwKSBkeCA9IE1hdGgubWF4KFcgLSBlMCwgTWF0aC5taW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwLCBlMSA9IGUwICsgZHg7XG4gICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgZHkgPSBNYXRoLm1heChOIC0gbjAsIE1hdGgubWluKFMgLSBuMCwgZHkpKSwgbjEgPSBuMCArIGR5LCBzMSA9IHMwO1xuICAgICAgICAgIGVsc2UgaWYgKHNpZ25ZID4gMCkgZHkgPSBNYXRoLm1heChOIC0gczAsIE1hdGgubWluKFMgLSBzMCwgZHkpKSwgbjEgPSBuMCwgczEgPSBzMCArIGR5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTU9ERV9DRU5URVI6IHtcbiAgICAgICAgICBpZiAoc2lnblgpIHcxID0gTWF0aC5tYXgoVywgTWF0aC5taW4oRSwgdzAgLSBkeCAqIHNpZ25YKSksIGUxID0gTWF0aC5tYXgoVywgTWF0aC5taW4oRSwgZTAgKyBkeCAqIHNpZ25YKSk7XG4gICAgICAgICAgaWYgKHNpZ25ZKSBuMSA9IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIG4wIC0gZHkgKiBzaWduWSkpLCBzMSA9IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIHMwICsgZHkgKiBzaWduWSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlMSA8IHcxKSB7XG4gICAgICAgIHNpZ25YICo9IC0xO1xuICAgICAgICB0ID0gdzAsIHcwID0gZTAsIGUwID0gdDtcbiAgICAgICAgdCA9IHcxLCB3MSA9IGUxLCBlMSA9IHQ7XG4gICAgICAgIGlmICh0eXBlIGluIGZsaXBYKSBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29yc1t0eXBlID0gZmxpcFhbdHlwZV1dKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMxIDwgbjEpIHtcbiAgICAgICAgc2lnblkgKj0gLTE7XG4gICAgICAgIHQgPSBuMCwgbjAgPSBzMCwgczAgPSB0O1xuICAgICAgICB0ID0gbjEsIG4xID0gczEsIHMxID0gdDtcbiAgICAgICAgaWYgKHR5cGUgaW4gZmxpcFkpIG92ZXJsYXkuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzW3R5cGUgPSBmbGlwWVt0eXBlXV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uKSBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247IC8vIE1heSBiZSBzZXQgYnkgYnJ1c2gubW92ZSFcbiAgICAgIGlmIChsb2NrWCkgdzEgPSBzZWxlY3Rpb25bMF1bMF0sIGUxID0gc2VsZWN0aW9uWzFdWzBdO1xuICAgICAgaWYgKGxvY2tZKSBuMSA9IHNlbGVjdGlvblswXVsxXSwgczEgPSBzZWxlY3Rpb25bMV1bMV07XG5cbiAgICAgIGlmIChzZWxlY3Rpb25bMF1bMF0gIT09IHcxXG4gICAgICAgICAgfHwgc2VsZWN0aW9uWzBdWzFdICE9PSBuMVxuICAgICAgICAgIHx8IHNlbGVjdGlvblsxXVswXSAhPT0gZTFcbiAgICAgICAgICB8fCBzZWxlY3Rpb25bMV1bMV0gIT09IHMxKSB7XG4gICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IFtbdzEsIG4xXSwgW2UxLCBzMV1dO1xuICAgICAgICByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICAgICAgZW1pdC5icnVzaCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZGVkKCkge1xuICAgICAgbm9wcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKGV2ZW50LnRvdWNoZXMpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICAgICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgbW92aW5nKTtcbiAgICAgICAgdmlldy5vbihcImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2hcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBncm91cC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIik7XG4gICAgICBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5vdmVybGF5KTtcbiAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24pIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbjsgLy8gTWF5IGJlIHNldCBieSBicnVzaC5tb3ZlIChvbiBzdGFydCkhXG4gICAgICBpZiAoZW1wdHkoc2VsZWN0aW9uKSkgc3RhdGUuc2VsZWN0aW9uID0gbnVsbCwgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgICBlbWl0LmVuZCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGtleWRvd25lZCgpIHtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICBjYXNlIDE2OiB7IC8vIFNISUZUXG4gICAgICAgICAgc2hpZnRpbmcgPSBzaWduWCAmJiBzaWduWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDE4OiB7IC8vIEFMVFxuICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0hBTkRMRSkge1xuICAgICAgICAgICAgaWYgKHNpZ25YKSBlMCA9IGUxIC0gZHggKiBzaWduWCwgdzAgPSB3MSArIGR4ICogc2lnblg7XG4gICAgICAgICAgICBpZiAoc2lnblkpIHMwID0gczEgLSBkeSAqIHNpZ25ZLCBuMCA9IG4xICsgZHkgKiBzaWduWTtcbiAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjtcbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAzMjogeyAvLyBTUEFDRTsgdGFrZXMgcHJpb3JpdHkgb3ZlciBBTFRcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUgfHwgbW9kZSA9PT0gTU9ERV9DRU5URVIpIHtcbiAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTEgLSBkeDsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxIC0gZHg7XG4gICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMxIC0gZHk7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMSAtIGR5O1xuICAgICAgICAgICAgbW9kZSA9IE1PREVfU1BBQ0U7XG4gICAgICAgICAgICBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiByZXR1cm47XG4gICAgICB9XG4gICAgICBub2V2ZW50KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga2V5dXBwZWQoKSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSAxNjogeyAvLyBTSElGVFxuICAgICAgICAgIGlmIChzaGlmdGluZykge1xuICAgICAgICAgICAgbG9ja1ggPSBsb2NrWSA9IHNoaWZ0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTg6IHsgLy8gQUxUXG4gICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfQ0VOVEVSKSB7XG4gICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUxOyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzE7XG4gICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMxOyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjE7XG4gICAgICAgICAgICBtb2RlID0gTU9ERV9IQU5ETEU7XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0VcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9TUEFDRSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICBpZiAoc2lnblgpIGUwID0gZTEgLSBkeCAqIHNpZ25YLCB3MCA9IHcxICsgZHggKiBzaWduWDtcbiAgICAgICAgICAgICAgaWYgKHNpZ25ZKSBzMCA9IHMxIC0gZHkgKiBzaWduWSwgbjAgPSBuMSArIGR5ICogc2lnblk7XG4gICAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTE7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MTtcbiAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xO1xuICAgICAgICAgICAgICBtb2RlID0gTU9ERV9IQU5ETEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29yc1t0eXBlXSk7XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKCkge1xuICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5tb3ZlZCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZCgpIHtcbiAgICBlbWl0dGVyKHRoaXMsIGFyZ3VtZW50cykuZW5kZWQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fX2JydXNoIHx8IHtzZWxlY3Rpb246IG51bGx9O1xuICAgIHN0YXRlLmV4dGVudCA9IG51bWJlcjIoZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIHN0YXRlLmRpbSA9IGRpbTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChudW1iZXIyKF8pKSwgYnJ1c2gpIDogZXh0ZW50O1xuICB9O1xuXG4gIGJydXNoLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGJydXNoKSA6IGZpbHRlcjtcbiAgfTtcblxuICBicnVzaC50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBicnVzaCkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgYnJ1c2guaGFuZGxlU2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChoYW5kbGVTaXplID0gK18sIGJydXNoKSA6IGhhbmRsZVNpemU7XG4gIH07XG5cbiAgYnJ1c2gua2V5TW9kaWZpZXJzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSAhIV8sIGJydXNoKSA6IGtleXM7XG4gIH07XG5cbiAgYnJ1c2gub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gYnJ1c2ggOiB2YWx1ZTtcbiAgfTtcblxuICByZXR1cm4gYnJ1c2g7XG59XG4iLCJleHBvcnQge1xuICBkZWZhdWx0IGFzIGJydXNoLFxuICBicnVzaFgsXG4gIGJydXNoWSxcbiAgYnJ1c2hTZWxlY3Rpb25cbn0gZnJvbSBcIi4vYnJ1c2guanNcIjtcbiIsImV4cG9ydCB2YXIgY29zID0gTWF0aC5jb3M7XG5leHBvcnQgdmFyIHNpbiA9IE1hdGguc2luO1xuZXhwb3J0IHZhciBwaSA9IE1hdGguUEk7XG5leHBvcnQgdmFyIGhhbGZQaSA9IHBpIC8gMjtcbmV4cG9ydCB2YXIgdGF1ID0gcGkgKiAyO1xuZXhwb3J0IHZhciBtYXggPSBNYXRoLm1heDtcbiIsImltcG9ydCB7cmFuZ2V9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHttYXgsIHRhdX0gZnJvbSBcIi4vbWF0aFwiO1xuXG5mdW5jdGlvbiBjb21wYXJlVmFsdWUoY29tcGFyZSkge1xuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBjb21wYXJlKFxuICAgICAgYS5zb3VyY2UudmFsdWUgKyBhLnRhcmdldC52YWx1ZSxcbiAgICAgIGIuc291cmNlLnZhbHVlICsgYi50YXJnZXQudmFsdWVcbiAgICApO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHBhZEFuZ2xlID0gMCxcbiAgICAgIHNvcnRHcm91cHMgPSBudWxsLFxuICAgICAgc29ydFN1Ymdyb3VwcyA9IG51bGwsXG4gICAgICBzb3J0Q2hvcmRzID0gbnVsbDtcblxuICBmdW5jdGlvbiBjaG9yZChtYXRyaXgpIHtcbiAgICB2YXIgbiA9IG1hdHJpeC5sZW5ndGgsXG4gICAgICAgIGdyb3VwU3VtcyA9IFtdLFxuICAgICAgICBncm91cEluZGV4ID0gcmFuZ2UobiksXG4gICAgICAgIHN1Ymdyb3VwSW5kZXggPSBbXSxcbiAgICAgICAgY2hvcmRzID0gW10sXG4gICAgICAgIGdyb3VwcyA9IGNob3Jkcy5ncm91cHMgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShuICogbiksXG4gICAgICAgIGssXG4gICAgICAgIHgsXG4gICAgICAgIHgwLFxuICAgICAgICBkeCxcbiAgICAgICAgaSxcbiAgICAgICAgajtcblxuICAgIC8vIENvbXB1dGUgdGhlIHN1bS5cbiAgICBrID0gMCwgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikge1xuICAgICAgeCA9IDAsIGogPSAtMTsgd2hpbGUgKCsraiA8IG4pIHtcbiAgICAgICAgeCArPSBtYXRyaXhbaV1bal07XG4gICAgICB9XG4gICAgICBncm91cFN1bXMucHVzaCh4KTtcbiAgICAgIHN1Ymdyb3VwSW5kZXgucHVzaChyYW5nZShuKSk7XG4gICAgICBrICs9IHg7XG4gICAgfVxuXG4gICAgLy8gU29ydCBncm91cHPigKZcbiAgICBpZiAoc29ydEdyb3VwcykgZ3JvdXBJbmRleC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgIHJldHVybiBzb3J0R3JvdXBzKGdyb3VwU3Vtc1thXSwgZ3JvdXBTdW1zW2JdKTtcbiAgICB9KTtcblxuICAgIC8vIFNvcnQgc3ViZ3JvdXBz4oCmXG4gICAgaWYgKHNvcnRTdWJncm91cHMpIHN1Ymdyb3VwSW5kZXguZm9yRWFjaChmdW5jdGlvbihkLCBpKSB7XG4gICAgICBkLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICByZXR1cm4gc29ydFN1Ymdyb3VwcyhtYXRyaXhbaV1bYV0sIG1hdHJpeFtpXVtiXSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIENvbnZlcnQgdGhlIHN1bSB0byBzY2FsaW5nIGZhY3RvciBmb3IgWzAsIDJwaV0uXG4gICAgLy8gVE9ETyBBbGxvdyBzdGFydCBhbmQgZW5kIGFuZ2xlIHRvIGJlIHNwZWNpZmllZD9cbiAgICAvLyBUT0RPIEFsbG93IHBhZGRpbmcgdG8gYmUgc3BlY2lmaWVkIGFzIHBlcmNlbnRhZ2U/XG4gICAgayA9IG1heCgwLCB0YXUgLSBwYWRBbmdsZSAqIG4pIC8gaztcbiAgICBkeCA9IGsgPyBwYWRBbmdsZSA6IHRhdSAvIG47XG5cbiAgICAvLyBDb21wdXRlIHRoZSBzdGFydCBhbmQgZW5kIGFuZ2xlIGZvciBlYWNoIGdyb3VwIGFuZCBzdWJncm91cC5cbiAgICAvLyBOb3RlOiBPcGVyYSBoYXMgYSBidWcgcmVvcmRlcmluZyBvYmplY3QgbGl0ZXJhbCBwcm9wZXJ0aWVzIVxuICAgIHggPSAwLCBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICB4MCA9IHgsIGogPSAtMTsgd2hpbGUgKCsraiA8IG4pIHtcbiAgICAgICAgdmFyIGRpID0gZ3JvdXBJbmRleFtpXSxcbiAgICAgICAgICAgIGRqID0gc3ViZ3JvdXBJbmRleFtkaV1bal0sXG4gICAgICAgICAgICB2ID0gbWF0cml4W2RpXVtkal0sXG4gICAgICAgICAgICBhMCA9IHgsXG4gICAgICAgICAgICBhMSA9IHggKz0gdiAqIGs7XG4gICAgICAgIHN1Ymdyb3Vwc1tkaiAqIG4gKyBkaV0gPSB7XG4gICAgICAgICAgaW5kZXg6IGRpLFxuICAgICAgICAgIHN1YmluZGV4OiBkaixcbiAgICAgICAgICBzdGFydEFuZ2xlOiBhMCxcbiAgICAgICAgICBlbmRBbmdsZTogYTEsXG4gICAgICAgICAgdmFsdWU6IHZcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGdyb3Vwc1tkaV0gPSB7XG4gICAgICAgIGluZGV4OiBkaSxcbiAgICAgICAgc3RhcnRBbmdsZTogeDAsXG4gICAgICAgIGVuZEFuZ2xlOiB4LFxuICAgICAgICB2YWx1ZTogZ3JvdXBTdW1zW2RpXVxuICAgICAgfTtcbiAgICAgIHggKz0gZHg7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgY2hvcmRzIGZvciBlYWNoIChub24tZW1wdHkpIHN1Ymdyb3VwLXN1Ymdyb3VwIGxpbmsuXG4gICAgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaiA9IGkgLSAxOyB3aGlsZSAoKytqIDwgbikge1xuICAgICAgICB2YXIgc291cmNlID0gc3ViZ3JvdXBzW2ogKiBuICsgaV0sXG4gICAgICAgICAgICB0YXJnZXQgPSBzdWJncm91cHNbaSAqIG4gKyBqXTtcbiAgICAgICAgaWYgKHNvdXJjZS52YWx1ZSB8fCB0YXJnZXQudmFsdWUpIHtcbiAgICAgICAgICBjaG9yZHMucHVzaChzb3VyY2UudmFsdWUgPCB0YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgPyB7c291cmNlOiB0YXJnZXQsIHRhcmdldDogc291cmNlfVxuICAgICAgICAgICAgICA6IHtzb3VyY2U6IHNvdXJjZSwgdGFyZ2V0OiB0YXJnZXR9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0Q2hvcmRzID8gY2hvcmRzLnNvcnQoc29ydENob3JkcykgOiBjaG9yZHM7XG4gIH1cblxuICBjaG9yZC5wYWRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRBbmdsZSA9IG1heCgwLCBfKSwgY2hvcmQpIDogcGFkQW5nbGU7XG4gIH07XG5cbiAgY2hvcmQuc29ydEdyb3VwcyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0R3JvdXBzID0gXywgY2hvcmQpIDogc29ydEdyb3VwcztcbiAgfTtcblxuICBjaG9yZC5zb3J0U3ViZ3JvdXBzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnRTdWJncm91cHMgPSBfLCBjaG9yZCkgOiBzb3J0U3ViZ3JvdXBzO1xuICB9O1xuXG4gIGNob3JkLnNvcnRDaG9yZHMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gc29ydENob3JkcyA9IG51bGwgOiAoc29ydENob3JkcyA9IGNvbXBhcmVWYWx1ZShfKSkuXyA9IF8sIGNob3JkKSA6IHNvcnRDaG9yZHMgJiYgc29ydENob3Jkcy5fO1xuICB9O1xuXG4gIHJldHVybiBjaG9yZDtcbn1cbiIsImV4cG9ydCB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsInZhciBwaSA9IE1hdGguUEksXG4gICAgdGF1ID0gMiAqIHBpLFxuICAgIGVwc2lsb24gPSAxZS02LFxuICAgIHRhdUVwc2lsb24gPSB0YXUgLSBlcHNpbG9uO1xuXG5mdW5jdGlvbiBQYXRoKCkge1xuICB0aGlzLl94MCA9IHRoaXMuX3kwID0gLy8gc3RhcnQgb2YgY3VycmVudCBzdWJwYXRoXG4gIHRoaXMuX3gxID0gdGhpcy5feTEgPSBudWxsOyAvLyBlbmQgb2YgY3VycmVudCBzdWJwYXRoXG4gIHRoaXMuXyA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiBuZXcgUGF0aDtcbn1cblxuUGF0aC5wcm90b3R5cGUgPSBwYXRoLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFBhdGgsXG4gIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkge1xuICAgIHRoaXMuXyArPSBcIk1cIiArICh0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KTtcbiAgfSxcbiAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5feDEgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3gxID0gdGhpcy5feDAsIHRoaXMuX3kxID0gdGhpcy5feTA7XG4gICAgICB0aGlzLl8gKz0gXCJaXCI7XG4gICAgfVxuICB9LFxuICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLl8gKz0gXCJMXCIgKyAodGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MSA9ICt5KTtcbiAgfSxcbiAgcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4LCB5KSB7XG4gICAgdGhpcy5fICs9IFwiUVwiICsgKCt4MSkgKyBcIixcIiArICgreTEpICsgXCIsXCIgKyAodGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MSA9ICt5KTtcbiAgfSxcbiAgYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHtcbiAgICB0aGlzLl8gKz0gXCJDXCIgKyAoK3gxKSArIFwiLFwiICsgKCt5MSkgKyBcIixcIiArICgreDIpICsgXCIsXCIgKyAoK3kyKSArIFwiLFwiICsgKHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIGFyY1RvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5Miwgcikge1xuICAgIHgxID0gK3gxLCB5MSA9ICt5MSwgeDIgPSAreDIsIHkyID0gK3kyLCByID0gK3I7XG4gICAgdmFyIHgwID0gdGhpcy5feDEsXG4gICAgICAgIHkwID0gdGhpcy5feTEsXG4gICAgICAgIHgyMSA9IHgyIC0geDEsXG4gICAgICAgIHkyMSA9IHkyIC0geTEsXG4gICAgICAgIHgwMSA9IHgwIC0geDEsXG4gICAgICAgIHkwMSA9IHkwIC0geTEsXG4gICAgICAgIGwwMV8yID0geDAxICogeDAxICsgeTAxICogeTAxO1xuXG4gICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuXG4gICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJuZWdhdGl2ZSByYWRpdXM6IFwiICsgcik7XG5cbiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgxLHkxKS5cbiAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuXyArPSBcIk1cIiArICh0aGlzLl94MSA9IHgxKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTEpO1xuICAgIH1cblxuICAgIC8vIE9yLCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDAseTApPyBEbyBub3RoaW5nLlxuICAgIGVsc2UgaWYgKCEobDAxXzIgPiBlcHNpbG9uKSk7XG5cbiAgICAvLyBPciwgYXJlICh4MCx5MCksICh4MSx5MSkgYW5kICh4Mix5MikgY29sbGluZWFyP1xuICAgIC8vIEVxdWl2YWxlbnRseSwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgyLHkyKT9cbiAgICAvLyBPciwgaXMgdGhlIHJhZGl1cyB6ZXJvPyBMaW5lIHRvICh4MSx5MSkuXG4gICAgZWxzZSBpZiAoIShNYXRoLmFicyh5MDEgKiB4MjEgLSB5MjEgKiB4MDEpID4gZXBzaWxvbikgfHwgIXIpIHtcbiAgICAgIHRoaXMuXyArPSBcIkxcIiArICh0aGlzLl94MSA9IHgxKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTEpO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgZHJhdyBhbiBhcmMhXG4gICAgZWxzZSB7XG4gICAgICB2YXIgeDIwID0geDIgLSB4MCxcbiAgICAgICAgICB5MjAgPSB5MiAtIHkwLFxuICAgICAgICAgIGwyMV8yID0geDIxICogeDIxICsgeTIxICogeTIxLFxuICAgICAgICAgIGwyMF8yID0geDIwICogeDIwICsgeTIwICogeTIwLFxuICAgICAgICAgIGwyMSA9IE1hdGguc3FydChsMjFfMiksXG4gICAgICAgICAgbDAxID0gTWF0aC5zcXJ0KGwwMV8yKSxcbiAgICAgICAgICBsID0gciAqIE1hdGgudGFuKChwaSAtIE1hdGguYWNvcygobDIxXzIgKyBsMDFfMiAtIGwyMF8yKSAvICgyICogbDIxICogbDAxKSkpIC8gMiksXG4gICAgICAgICAgdDAxID0gbCAvIGwwMSxcbiAgICAgICAgICB0MjEgPSBsIC8gbDIxO1xuXG4gICAgICAvLyBJZiB0aGUgc3RhcnQgdGFuZ2VudCBpcyBub3QgY29pbmNpZGVudCB3aXRoICh4MCx5MCksIGxpbmUgdG8uXG4gICAgICBpZiAoTWF0aC5hYnModDAxIC0gMSkgPiBlcHNpbG9uKSB7XG4gICAgICAgIHRoaXMuXyArPSBcIkxcIiArICh4MSArIHQwMSAqIHgwMSkgKyBcIixcIiArICh5MSArIHQwMSAqIHkwMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuXyArPSBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiwwLDAsXCIgKyAoKyh5MDEgKiB4MjAgPiB4MDEgKiB5MjApKSArIFwiLFwiICsgKHRoaXMuX3gxID0geDEgKyB0MjEgKiB4MjEpICsgXCIsXCIgKyAodGhpcy5feTEgPSB5MSArIHQyMSAqIHkyMSk7XG4gICAgfVxuICB9LFxuICBhcmM6IGZ1bmN0aW9uKHgsIHksIHIsIGEwLCBhMSwgY2N3KSB7XG4gICAgeCA9ICt4LCB5ID0gK3ksIHIgPSArciwgY2N3ID0gISFjY3c7XG4gICAgdmFyIGR4ID0gciAqIE1hdGguY29zKGEwKSxcbiAgICAgICAgZHkgPSByICogTWF0aC5zaW4oYTApLFxuICAgICAgICB4MCA9IHggKyBkeCxcbiAgICAgICAgeTAgPSB5ICsgZHksXG4gICAgICAgIGN3ID0gMSBeIGNjdyxcbiAgICAgICAgZGEgPSBjY3cgPyBhMCAtIGExIDogYTEgLSBhMDtcblxuICAgIC8vIElzIHRoZSByYWRpdXMgbmVnYXRpdmU/IEVycm9yLlxuICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IEVycm9yKFwibmVnYXRpdmUgcmFkaXVzOiBcIiArIHIpO1xuXG4gICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRvICh4MCx5MCkuXG4gICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7XG4gICAgICB0aGlzLl8gKz0gXCJNXCIgKyB4MCArIFwiLFwiICsgeTA7XG4gICAgfVxuXG4gICAgLy8gT3IsIGlzICh4MCx5MCkgbm90IGNvaW5jaWRlbnQgd2l0aCB0aGUgcHJldmlvdXMgcG9pbnQ/IExpbmUgdG8gKHgwLHkwKS5cbiAgICBlbHNlIGlmIChNYXRoLmFicyh0aGlzLl94MSAtIHgwKSA+IGVwc2lsb24gfHwgTWF0aC5hYnModGhpcy5feTEgLSB5MCkgPiBlcHNpbG9uKSB7XG4gICAgICB0aGlzLl8gKz0gXCJMXCIgKyB4MCArIFwiLFwiICsgeTA7XG4gICAgfVxuXG4gICAgLy8gSXMgdGhpcyBhcmMgZW1wdHk/IFdl4oCZcmUgZG9uZS5cbiAgICBpZiAoIXIpIHJldHVybjtcblxuICAgIC8vIERvZXMgdGhlIGFuZ2xlIGdvIHRoZSB3cm9uZyB3YXk/IEZsaXAgdGhlIGRpcmVjdGlvbi5cbiAgICBpZiAoZGEgPCAwKSBkYSA9IGRhICUgdGF1ICsgdGF1O1xuXG4gICAgLy8gSXMgdGhpcyBhIGNvbXBsZXRlIGNpcmNsZT8gRHJhdyB0d28gYXJjcyB0byBjb21wbGV0ZSB0aGUgY2lyY2xlLlxuICAgIGlmIChkYSA+IHRhdUVwc2lsb24pIHtcbiAgICAgIHRoaXMuXyArPSBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiwwLDEsXCIgKyBjdyArIFwiLFwiICsgKHggLSBkeCkgKyBcIixcIiArICh5IC0gZHkpICsgXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIsMCwxLFwiICsgY3cgKyBcIixcIiArICh0aGlzLl94MSA9IHgwKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTApO1xuICAgIH1cblxuICAgIC8vIElzIHRoaXMgYXJjIG5vbi1lbXB0eT8gRHJhdyBhbiBhcmMhXG4gICAgZWxzZSBpZiAoZGEgPiBlcHNpbG9uKSB7XG4gICAgICB0aGlzLl8gKz0gXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIsMCxcIiArICgrKGRhID49IHBpKSkgKyBcIixcIiArIGN3ICsgXCIsXCIgKyAodGhpcy5feDEgPSB4ICsgciAqIE1hdGguY29zKGExKSkgKyBcIixcIiArICh0aGlzLl95MSA9IHkgKyByICogTWF0aC5zaW4oYTEpKTtcbiAgICB9XG4gIH0sXG4gIHJlY3Q6IGZ1bmN0aW9uKHgsIHksIHcsIGgpIHtcbiAgICB0aGlzLl8gKz0gXCJNXCIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArIFwiLFwiICsgKHRoaXMuX3kwID0gdGhpcy5feTEgPSAreSkgKyBcImhcIiArICgrdykgKyBcInZcIiArICgraCkgKyBcImhcIiArICgtdykgKyBcIlpcIjtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl87XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHBhdGg7XG4iLCJpbXBvcnQge3NsaWNlfSBmcm9tIFwiLi9hcnJheVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQge2NvcywgaGFsZlBpLCBzaW59IGZyb20gXCIuL21hdGhcIjtcbmltcG9ydCB7cGF0aH0gZnJvbSBcImQzLXBhdGhcIjtcblxuZnVuY3Rpb24gZGVmYXVsdFNvdXJjZShkKSB7XG4gIHJldHVybiBkLnNvdXJjZTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRhcmdldChkKSB7XG4gIHJldHVybiBkLnRhcmdldDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFJhZGl1cyhkKSB7XG4gIHJldHVybiBkLnJhZGl1cztcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFN0YXJ0QW5nbGUoZCkge1xuICByZXR1cm4gZC5zdGFydEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RW5kQW5nbGUoZCkge1xuICByZXR1cm4gZC5lbmRBbmdsZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBzb3VyY2UgPSBkZWZhdWx0U291cmNlLFxuICAgICAgdGFyZ2V0ID0gZGVmYXVsdFRhcmdldCxcbiAgICAgIHJhZGl1cyA9IGRlZmF1bHRSYWRpdXMsXG4gICAgICBzdGFydEFuZ2xlID0gZGVmYXVsdFN0YXJ0QW5nbGUsXG4gICAgICBlbmRBbmdsZSA9IGRlZmF1bHRFbmRBbmdsZSxcbiAgICAgIGNvbnRleHQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHJpYmJvbigpIHtcbiAgICB2YXIgYnVmZmVyLFxuICAgICAgICBhcmd2ID0gc2xpY2UuY2FsbChhcmd1bWVudHMpLFxuICAgICAgICBzID0gc291cmNlLmFwcGx5KHRoaXMsIGFyZ3YpLFxuICAgICAgICB0ID0gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3YpLFxuICAgICAgICBzciA9ICtyYWRpdXMuYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSBzLCBhcmd2KSksXG4gICAgICAgIHNhMCA9IHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGksXG4gICAgICAgIHNhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3YpIC0gaGFsZlBpLFxuICAgICAgICBzeDAgPSBzciAqIGNvcyhzYTApLFxuICAgICAgICBzeTAgPSBzciAqIHNpbihzYTApLFxuICAgICAgICB0ciA9ICtyYWRpdXMuYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSB0LCBhcmd2KSksXG4gICAgICAgIHRhMCA9IHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGksXG4gICAgICAgIHRhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3YpIC0gaGFsZlBpO1xuXG4gICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCgpO1xuXG4gICAgY29udGV4dC5tb3ZlVG8oc3gwLCBzeTApO1xuICAgIGNvbnRleHQuYXJjKDAsIDAsIHNyLCBzYTAsIHNhMSk7XG4gICAgaWYgKHNhMCAhPT0gdGEwIHx8IHNhMSAhPT0gdGExKSB7IC8vIFRPRE8gc3IgIT09IHRyP1xuICAgICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKDAsIDAsIHRyICogY29zKHRhMCksIHRyICogc2luKHRhMCkpO1xuICAgICAgY29udGV4dC5hcmMoMCwgMCwgdHIsIHRhMCwgdGExKTtcbiAgICB9XG4gICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKDAsIDAsIHN4MCwgc3kwKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGNvbnRleHQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICByaWJib24ucmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCByaWJib24pIDogcmFkaXVzO1xuICB9O1xuXG4gIHJpYmJvbi5zdGFydEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0YXJ0QW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgcmliYm9uKSA6IHN0YXJ0QW5nbGU7XG4gIH07XG5cbiAgcmliYm9uLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHJpYmJvbikgOiBlbmRBbmdsZTtcbiAgfTtcblxuICByaWJib24uc291cmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvdXJjZSA9IF8sIHJpYmJvbikgOiBzb3VyY2U7XG4gIH07XG5cbiAgcmliYm9uLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXJnZXQgPSBfLCByaWJib24pIDogdGFyZ2V0O1xuICB9O1xuXG4gIHJpYmJvbi5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8pLCByaWJib24pIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gcmliYm9uO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGNob3JkfSBmcm9tIFwiLi9jaG9yZFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHJpYmJvbn0gZnJvbSBcIi4vcmliYm9uXCI7XG4iLCJleHBvcnQgdmFyIHByZWZpeCA9IFwiJFwiO1xuXG5mdW5jdGlvbiBNYXAoKSB7fVxuXG5NYXAucHJvdG90eXBlID0gbWFwLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IE1hcCxcbiAgaGFzOiBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gKHByZWZpeCArIGtleSkgaW4gdGhpcztcbiAgfSxcbiAgZ2V0OiBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gdGhpc1twcmVmaXggKyBrZXldO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICB0aGlzW3ByZWZpeCArIGtleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgcHJvcGVydHkgPSBwcmVmaXggKyBrZXk7XG4gICAgcmV0dXJuIHByb3BlcnR5IGluIHRoaXMgJiYgZGVsZXRlIHRoaXNbcHJvcGVydHldO1xuICB9LFxuICBjbGVhcjogZnVuY3Rpb24oKSB7XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTtcbiAgfSxcbiAga2V5czogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkga2V5cy5wdXNoKHByb3BlcnR5LnNsaWNlKDEpKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfSxcbiAgdmFsdWVzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIHZhbHVlcy5wdXNoKHRoaXNbcHJvcGVydHldKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9LFxuICBlbnRyaWVzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBlbnRyaWVzLnB1c2goe2tleTogcHJvcGVydHkuc2xpY2UoMSksIHZhbHVlOiB0aGlzW3Byb3BlcnR5XX0pO1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9LFxuICBzaXplOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpICsrc2l6ZTtcbiAgICByZXR1cm4gc2l6ZTtcbiAgfSxcbiAgZW1wdHk6IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGVhY2g6IGZ1bmN0aW9uKGYpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZih0aGlzW3Byb3BlcnR5XSwgcHJvcGVydHkuc2xpY2UoMSksIHRoaXMpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBtYXAob2JqZWN0LCBmKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwO1xuXG4gIC8vIENvcHkgY29uc3RydWN0b3IuXG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIG9iamVjdC5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsgbWFwLnNldChrZXksIHZhbHVlKTsgfSk7XG5cbiAgLy8gSW5kZXggYXJyYXkgYnkgbnVtZXJpYyBpbmRleCBvciBzcGVjaWZpZWQga2V5IGZ1bmN0aW9uLlxuICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICB2YXIgaSA9IC0xLFxuICAgICAgICBuID0gb2JqZWN0Lmxlbmd0aCxcbiAgICAgICAgbztcblxuICAgIGlmIChmID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGksIG9iamVjdFtpXSk7XG4gICAgZWxzZSB3aGlsZSAoKytpIDwgbikgbWFwLnNldChmKG8gPSBvYmplY3RbaV0sIGksIG9iamVjdCksIG8pO1xuICB9XG5cbiAgLy8gQ29udmVydCBvYmplY3QgdG8gbWFwLlxuICBlbHNlIGlmIChvYmplY3QpIGZvciAodmFyIGtleSBpbiBvYmplY3QpIG1hcC5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG5cbiAgcmV0dXJuIG1hcDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwO1xuIiwiaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXBcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBrZXlzID0gW10sXG4gICAgICBzb3J0S2V5cyA9IFtdLFxuICAgICAgc29ydFZhbHVlcyxcbiAgICAgIHJvbGx1cCxcbiAgICAgIG5lc3Q7XG5cbiAgZnVuY3Rpb24gYXBwbHkoYXJyYXksIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkge1xuICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkge1xuICAgICAgaWYgKHNvcnRWYWx1ZXMgIT0gbnVsbCkgYXJyYXkuc29ydChzb3J0VmFsdWVzKTtcbiAgICAgIHJldHVybiByb2xsdXAgIT0gbnVsbCA/IHJvbGx1cChhcnJheSkgOiBhcnJheTtcbiAgICB9XG5cbiAgICB2YXIgaSA9IC0xLFxuICAgICAgICBuID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBrZXkgPSBrZXlzW2RlcHRoKytdLFxuICAgICAgICBrZXlWYWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlc0J5S2V5ID0gbWFwKCksXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KCk7XG5cbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHZhbHVlcyA9IHZhbHVlc0J5S2V5LmdldChrZXlWYWx1ZSA9IGtleSh2YWx1ZSA9IGFycmF5W2ldKSArIFwiXCIpKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc0J5S2V5LnNldChrZXlWYWx1ZSwgW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsdWVzQnlLZXkuZWFjaChmdW5jdGlvbih2YWx1ZXMsIGtleSkge1xuICAgICAgc2V0UmVzdWx0KHJlc3VsdCwga2V5LCBhcHBseSh2YWx1ZXMsIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVudHJpZXMobWFwLCBkZXB0aCkge1xuICAgIGlmICgrK2RlcHRoID4ga2V5cy5sZW5ndGgpIHJldHVybiBtYXA7XG4gICAgdmFyIGFycmF5LCBzb3J0S2V5ID0gc29ydEtleXNbZGVwdGggLSAxXTtcbiAgICBpZiAocm9sbHVwICE9IG51bGwgJiYgZGVwdGggPj0ga2V5cy5sZW5ndGgpIGFycmF5ID0gbWFwLmVudHJpZXMoKTtcbiAgICBlbHNlIGFycmF5ID0gW10sIG1hcC5lYWNoKGZ1bmN0aW9uKHYsIGspIHsgYXJyYXkucHVzaCh7a2V5OiBrLCB2YWx1ZXM6IGVudHJpZXModiwgZGVwdGgpfSk7IH0pO1xuICAgIHJldHVybiBzb3J0S2V5ICE9IG51bGwgPyBhcnJheS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHNvcnRLZXkoYS5rZXksIGIua2V5KTsgfSkgOiBhcnJheTtcbiAgfVxuXG4gIHJldHVybiBuZXN0ID0ge1xuICAgIG9iamVjdDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5KGFycmF5LCAwLCBjcmVhdGVPYmplY3QsIHNldE9iamVjdCk7IH0sXG4gICAgbWFwOiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU1hcCwgc2V0TWFwKTsgfSxcbiAgICBlbnRyaWVzOiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gZW50cmllcyhhcHBseShhcnJheSwgMCwgY3JlYXRlTWFwLCBzZXRNYXApLCAwKTsgfSxcbiAgICBrZXk6IGZ1bmN0aW9uKGQpIHsga2V5cy5wdXNoKGQpOyByZXR1cm4gbmVzdDsgfSxcbiAgICBzb3J0S2V5czogZnVuY3Rpb24ob3JkZXIpIHsgc29ydEtleXNba2V5cy5sZW5ndGggLSAxXSA9IG9yZGVyOyByZXR1cm4gbmVzdDsgfSxcbiAgICBzb3J0VmFsdWVzOiBmdW5jdGlvbihvcmRlcikgeyBzb3J0VmFsdWVzID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LFxuICAgIHJvbGx1cDogZnVuY3Rpb24oZikgeyByb2xsdXAgPSBmOyByZXR1cm4gbmVzdDsgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVPYmplY3QoKSB7XG4gIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gc2V0T2JqZWN0KG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXAoKSB7XG4gIHJldHVybiBtYXAoKTtcbn1cblxuZnVuY3Rpb24gc2V0TWFwKG1hcCwga2V5LCB2YWx1ZSkge1xuICBtYXAuc2V0KGtleSwgdmFsdWUpO1xufVxuIiwiaW1wb3J0IHtkZWZhdWx0IGFzIG1hcCwgcHJlZml4fSBmcm9tIFwiLi9tYXBcIjtcblxuZnVuY3Rpb24gU2V0KCkge31cblxudmFyIHByb3RvID0gbWFwLnByb3RvdHlwZTtcblxuU2V0LnByb3RvdHlwZSA9IHNldC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZXQsXG4gIGhhczogcHJvdG8uaGFzLFxuICBhZGQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFsdWUgKz0gXCJcIjtcbiAgICB0aGlzW3ByZWZpeCArIHZhbHVlXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmU6IHByb3RvLnJlbW92ZSxcbiAgY2xlYXI6IHByb3RvLmNsZWFyLFxuICB2YWx1ZXM6IHByb3RvLmtleXMsXG4gIHNpemU6IHByb3RvLnNpemUsXG4gIGVtcHR5OiBwcm90by5lbXB0eSxcbiAgZWFjaDogcHJvdG8uZWFjaFxufTtcblxuZnVuY3Rpb24gc2V0KG9iamVjdCwgZikge1xuICB2YXIgc2V0ID0gbmV3IFNldDtcblxuICAvLyBDb3B5IGNvbnN0cnVjdG9yLlxuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2V0KSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSkgeyBzZXQuYWRkKHZhbHVlKTsgfSk7XG5cbiAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaXTigJlzIGFuIGFycmF5LlxuICBlbHNlIGlmIChvYmplY3QpIHtcbiAgICB2YXIgaSA9IC0xLCBuID0gb2JqZWN0Lmxlbmd0aDtcbiAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChvYmplY3RbaV0pO1xuICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIHNldC5hZGQoZihvYmplY3RbaV0sIGksIG9iamVjdCkpO1xuICB9XG5cbiAgcmV0dXJuIHNldDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWFwKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBtYXApIGtleXMucHVzaChrZXkpO1xuICByZXR1cm4ga2V5cztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hcCkge1xuICB2YXIgdmFsdWVzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBtYXApIHZhbHVlcy5wdXNoKG1hcFtrZXldKTtcbiAgcmV0dXJuIHZhbHVlcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hcCkge1xuICB2YXIgZW50cmllcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goe2tleToga2V5LCB2YWx1ZTogbWFwW2tleV19KTtcbiAgcmV0dXJuIGVudHJpZXM7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgbmVzdH0gZnJvbSBcIi4vbmVzdFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNldH0gZnJvbSBcIi4vc2V0XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWFwfSBmcm9tIFwiLi9tYXBcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBrZXlzfSBmcm9tIFwiLi9rZXlzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdmFsdWVzfSBmcm9tIFwiLi92YWx1ZXNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBlbnRyaWVzfSBmcm9tIFwiLi9lbnRyaWVzXCI7XG4iLCJleHBvcnQgdmFyIGRlZzJyYWQgPSBNYXRoLlBJIC8gMTgwO1xuZXhwb3J0IHZhciByYWQyZGVnID0gMTgwIC8gTWF0aC5QSTtcbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuaW1wb3J0IHtDb2xvciwgcmdiQ29udmVydCwgUmdifSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuaW1wb3J0IHtkZWcycmFkLCByYWQyZGVnfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbi8vIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AbWJvc3RvY2svbGFiLWFuZC1yZ2JcbnZhciBLID0gMTgsXG4gICAgWG4gPSAwLjk2NDIyLFxuICAgIFluID0gMSxcbiAgICBabiA9IDAuODI1MjEsXG4gICAgdDAgPSA0IC8gMjksXG4gICAgdDEgPSA2IC8gMjksXG4gICAgdDIgPSAzICogdDEgKiB0MSxcbiAgICB0MyA9IHQxICogdDEgKiB0MTtcblxuZnVuY3Rpb24gbGFiQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgTGFiKSByZXR1cm4gbmV3IExhYihvLmwsIG8uYSwgby5iLCBvLm9wYWNpdHkpO1xuICBpZiAobyBpbnN0YW5jZW9mIEhjbCkgcmV0dXJuIGhjbDJsYWIobyk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdiQ29udmVydChvKTtcbiAgdmFyIHIgPSByZ2IybHJnYihvLnIpLFxuICAgICAgZyA9IHJnYjJscmdiKG8uZyksXG4gICAgICBiID0gcmdiMmxyZ2Ioby5iKSxcbiAgICAgIHkgPSB4eXoybGFiKCgwLjIyMjUwNDUgKiByICsgMC43MTY4Nzg2ICogZyArIDAuMDYwNjE2OSAqIGIpIC8gWW4pLCB4LCB6O1xuICBpZiAociA9PT0gZyAmJiBnID09PSBiKSB4ID0geiA9IHk7IGVsc2Uge1xuICAgIHggPSB4eXoybGFiKCgwLjQzNjA3NDcgKiByICsgMC4zODUwNjQ5ICogZyArIDAuMTQzMDgwNCAqIGIpIC8gWG4pO1xuICAgIHogPSB4eXoybGFiKCgwLjAxMzkzMjIgKiByICsgMC4wOTcxMDQ1ICogZyArIDAuNzE0MTczMyAqIGIpIC8gWm4pO1xuICB9XG4gIHJldHVybiBuZXcgTGFiKDExNiAqIHkgLSAxNiwgNTAwICogKHggLSB5KSwgMjAwICogKHkgLSB6KSwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyYXkobCwgb3BhY2l0eSkge1xuICByZXR1cm4gbmV3IExhYihsLCAwLCAwLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxhYihsLCBhLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gbGFiQ29udmVydChsKSA6IG5ldyBMYWIobCwgYSwgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTGFiKGwsIGEsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMuYSA9ICthO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShMYWIsIGxhYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sICsgSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgLSBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5hLCB0aGlzLmIsIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHkgPSAodGhpcy5sICsgMTYpIC8gMTE2LFxuICAgICAgICB4ID0gaXNOYU4odGhpcy5hKSA/IHkgOiB5ICsgdGhpcy5hIC8gNTAwLFxuICAgICAgICB6ID0gaXNOYU4odGhpcy5iKSA/IHkgOiB5IC0gdGhpcy5iIC8gMjAwO1xuICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7XG4gICAgeSA9IFluICogbGFiMnh5eih5KTtcbiAgICB6ID0gWm4gKiBsYWIyeHl6KHopO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgbHJnYjJyZ2IoIDMuMTMzODU2MSAqIHggLSAxLjYxNjg2NjcgKiB5IC0gMC40OTA2MTQ2ICogeiksXG4gICAgICBscmdiMnJnYigtMC45Nzg3Njg0ICogeCArIDEuOTE2MTQxNSAqIHkgKyAwLjAzMzQ1NDAgKiB6KSxcbiAgICAgIGxyZ2IycmdiKCAwLjA3MTk0NTMgKiB4IC0gMC4yMjg5OTE0ICogeSArIDEuNDA1MjQyNyAqIHopLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfVxufSkpO1xuXG5mdW5jdGlvbiB4eXoybGFiKHQpIHtcbiAgcmV0dXJuIHQgPiB0MyA/IE1hdGgucG93KHQsIDEgLyAzKSA6IHQgLyB0MiArIHQwO1xufVxuXG5mdW5jdGlvbiBsYWIyeHl6KHQpIHtcbiAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7XG59XG5cbmZ1bmN0aW9uIGxyZ2IycmdiKHgpIHtcbiAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7XG59XG5cbmZ1bmN0aW9uIHJnYjJscmdiKHgpIHtcbiAgcmV0dXJuICh4IC89IDI1NSkgPD0gMC4wNDA0NSA/IHggLyAxMi45MiA6IE1hdGgucG93KCh4ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG59XG5cbmZ1bmN0aW9uIGhjbENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEhjbCkgcmV0dXJuIG5ldyBIY2woby5oLCBvLmMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIExhYikpIG8gPSBsYWJDb252ZXJ0KG8pO1xuICBpZiAoby5hID09PSAwICYmIG8uYiA9PT0gMCkgcmV0dXJuIG5ldyBIY2woTmFOLCAwIDwgby5sICYmIG8ubCA8IDEwMCA/IDAgOiBOYU4sIG8ubCwgby5vcGFjaXR5KTtcbiAgdmFyIGggPSBNYXRoLmF0YW4yKG8uYiwgby5hKSAqIHJhZDJkZWc7XG4gIHJldHVybiBuZXcgSGNsKGggPCAwID8gaCArIDM2MCA6IGgsIE1hdGguc3FydChvLmEgKiBvLmEgKyBvLmIgKiBvLmIpLCBvLmwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsY2gobCwgYywgaCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQobCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhjbChoLCBjLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaGNsQ29udmVydChoKSA6IG5ldyBIY2woaCwgYywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSGNsKGgsIGMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMuYyA9ICtjO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmZ1bmN0aW9uIGhjbDJsYWIobykge1xuICBpZiAoaXNOYU4oby5oKSkgcmV0dXJuIG5ldyBMYWIoby5sLCAwLCAwLCBvLm9wYWNpdHkpO1xuICB2YXIgaCA9IG8uaCAqIGRlZzJyYWQ7XG4gIHJldHVybiBuZXcgTGFiKG8ubCwgTWF0aC5jb3MoaCkgKiBvLmMsIE1hdGguc2luKGgpICogby5jLCBvLm9wYWNpdHkpO1xufVxuXG5kZWZpbmUoSGNsLCBoY2wsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcjogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCAtIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBoY2wybGFiKHRoaXMpLnJnYigpO1xuICB9XG59KSk7XG4iLCJpbXBvcnQgZGVmaW5lLCB7ZXh0ZW5kfSBmcm9tIFwiLi9kZWZpbmUuanNcIjtcbmltcG9ydCB7Q29sb3IsIHJnYkNvbnZlcnQsIFJnYiwgZGFya2VyLCBicmlnaHRlcn0gZnJvbSBcIi4vY29sb3IuanNcIjtcbmltcG9ydCB7ZGVnMnJhZCwgcmFkMmRlZ30gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG52YXIgQSA9IC0wLjE0ODYxLFxuICAgIEIgPSArMS43ODI3NyxcbiAgICBDID0gLTAuMjkyMjcsXG4gICAgRCA9IC0wLjkwNjQ5LFxuICAgIEUgPSArMS45NzI5NCxcbiAgICBFRCA9IEUgKiBELFxuICAgIEVCID0gRSAqIEIsXG4gICAgQkNfREEgPSBCICogQyAtIEQgKiBBO1xuXG5mdW5jdGlvbiBjdWJlaGVsaXhDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBDdWJlaGVsaXgpIHJldHVybiBuZXcgQ3ViZWhlbGl4KG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdiQ29udmVydChvKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIGwgPSAoQkNfREEgKiBiICsgRUQgKiByIC0gRUIgKiBnKSAvIChCQ19EQSArIEVEIC0gRUIpLFxuICAgICAgYmwgPSBiIC0gbCxcbiAgICAgIGsgPSAoRSAqIChnIC0gbCkgLSBDICogYmwpIC8gRCxcbiAgICAgIHMgPSBNYXRoLnNxcnQoayAqIGsgKyBibCAqIGJsKSAvIChFICogbCAqICgxIC0gbCkpLCAvLyBOYU4gaWYgbD0wIG9yIGw9MVxuICAgICAgaCA9IHMgPyBNYXRoLmF0YW4yKGssIGJsKSAqIHJhZDJkZWcgLSAxMjAgOiBOYU47XG4gIHJldHVybiBuZXcgQ3ViZWhlbGl4KGggPCAwID8gaCArIDM2MCA6IGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGN1YmVoZWxpeChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY3ViZWhlbGl4Q29udmVydChoKSA6IG5ldyBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShDdWJlaGVsaXgsIGN1YmVoZWxpeCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaCA9IGlzTmFOKHRoaXMuaCkgPyAwIDogKHRoaXMuaCArIDEyMCkgKiBkZWcycmFkLFxuICAgICAgICBsID0gK3RoaXMubCxcbiAgICAgICAgYSA9IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zICogbCAqICgxIC0gbCksXG4gICAgICAgIGNvc2ggPSBNYXRoLmNvcyhoKSxcbiAgICAgICAgc2luaCA9IE1hdGguc2luKGgpO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgMjU1ICogKGwgKyBhICogKEEgKiBjb3NoICsgQiAqIHNpbmgpKSxcbiAgICAgIDI1NSAqIChsICsgYSAqIChDICogY29zaCArIEQgKiBzaW5oKSksXG4gICAgICAyNTUgKiAobCArIGEgKiAoRSAqIGNvc2gpKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH1cbn0pKTtcbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBjb2xvciwgcmdiLCBoc2x9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbGFiLCBoY2wsIGxjaCwgZ3JheX0gZnJvbSBcIi4vbGFiLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3ViZWhlbGl4fSBmcm9tIFwiLi9jdWJlaGVsaXguanNcIjtcbiIsInZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZTtcblxuZXhwb3J0IHZhciBzbGljZSA9IGFycmF5LnNsaWNlO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSAtIGI7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyaW5nKSB7XG4gIHZhciBpID0gMCwgbiA9IHJpbmcubGVuZ3RoLCBhcmVhID0gcmluZ1tuIC0gMV1bMV0gKiByaW5nWzBdWzBdIC0gcmluZ1tuIC0gMV1bMF0gKiByaW5nWzBdWzFdO1xuICB3aGlsZSAoKytpIDwgbikgYXJlYSArPSByaW5nW2kgLSAxXVsxXSAqIHJpbmdbaV1bMF0gLSByaW5nW2kgLSAxXVswXSAqIHJpbmdbaV1bMV07XG4gIHJldHVybiBhcmVhO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyaW5nLCBob2xlKSB7XG4gIHZhciBpID0gLTEsIG4gPSBob2xlLmxlbmd0aCwgYztcbiAgd2hpbGUgKCsraSA8IG4pIGlmIChjID0gcmluZ0NvbnRhaW5zKHJpbmcsIGhvbGVbaV0pKSByZXR1cm4gYztcbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIHJpbmdDb250YWlucyhyaW5nLCBwb2ludCkge1xuICB2YXIgeCA9IHBvaW50WzBdLCB5ID0gcG9pbnRbMV0sIGNvbnRhaW5zID0gLTE7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gcmluZy5sZW5ndGgsIGogPSBuIC0gMTsgaSA8IG47IGogPSBpKyspIHtcbiAgICB2YXIgcGkgPSByaW5nW2ldLCB4aSA9IHBpWzBdLCB5aSA9IHBpWzFdLCBwaiA9IHJpbmdbal0sIHhqID0gcGpbMF0sIHlqID0gcGpbMV07XG4gICAgaWYgKHNlZ21lbnRDb250YWlucyhwaSwgcGosIHBvaW50KSkgcmV0dXJuIDA7XG4gICAgaWYgKCgoeWkgPiB5KSAhPT0gKHlqID4geSkpICYmICgoeCA8ICh4aiAtIHhpKSAqICh5IC0geWkpIC8gKHlqIC0geWkpICsgeGkpKSkgY29udGFpbnMgPSAtY29udGFpbnM7XG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5zO1xufVxuXG5mdW5jdGlvbiBzZWdtZW50Q29udGFpbnMoYSwgYiwgYykge1xuICB2YXIgaTsgcmV0dXJuIGNvbGxpbmVhcihhLCBiLCBjKSAmJiB3aXRoaW4oYVtpID0gKyhhWzBdID09PSBiWzBdKV0sIGNbaV0sIGJbaV0pO1xufVxuXG5mdW5jdGlvbiBjb2xsaW5lYXIoYSwgYiwgYykge1xuICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChjWzFdIC0gYVsxXSkgPT09IChjWzBdIC0gYVswXSkgKiAoYlsxXSAtIGFbMV0pO1xufVxuXG5mdW5jdGlvbiB3aXRoaW4ocCwgcSwgcikge1xuICByZXR1cm4gcCA8PSBxICYmIHEgPD0gciB8fCByIDw9IHEgJiYgcSA8PSBwO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVxuIiwiaW1wb3J0IHtleHRlbnQsIHRocmVzaG9sZFN0dXJnZXMsIHRpY2tTdGVwLCByYW5nZX0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge3NsaWNlfSBmcm9tIFwiLi9hcnJheVwiO1xuaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmdcIjtcbmltcG9ydCBhcmVhIGZyb20gXCIuL2FyZWFcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuL2NvbnRhaW5zXCI7XG5pbXBvcnQgbm9vcCBmcm9tIFwiLi9ub29wXCI7XG5cbnZhciBjYXNlcyA9IFtcbiAgW10sXG4gIFtbWzEuMCwgMS41XSwgWzAuNSwgMS4wXV1dLFxuICBbW1sxLjUsIDEuMF0sIFsxLjAsIDEuNV1dXSxcbiAgW1tbMS41LCAxLjBdLCBbMC41LCAxLjBdXV0sXG4gIFtbWzEuMCwgMC41XSwgWzEuNSwgMS4wXV1dLFxuICBbW1sxLjAsIDEuNV0sIFswLjUsIDEuMF1dLCBbWzEuMCwgMC41XSwgWzEuNSwgMS4wXV1dLFxuICBbW1sxLjAsIDAuNV0sIFsxLjAsIDEuNV1dXSxcbiAgW1tbMS4wLCAwLjVdLCBbMC41LCAxLjBdXV0sXG4gIFtbWzAuNSwgMS4wXSwgWzEuMCwgMC41XV1dLFxuICBbW1sxLjAsIDEuNV0sIFsxLjAsIDAuNV1dXSxcbiAgW1tbMC41LCAxLjBdLCBbMS4wLCAwLjVdXSwgW1sxLjUsIDEuMF0sIFsxLjAsIDEuNV1dXSxcbiAgW1tbMS41LCAxLjBdLCBbMS4wLCAwLjVdXV0sXG4gIFtbWzAuNSwgMS4wXSwgWzEuNSwgMS4wXV1dLFxuICBbW1sxLjAsIDEuNV0sIFsxLjUsIDEuMF1dXSxcbiAgW1tbMC41LCAxLjBdLCBbMS4wLCAxLjVdXV0sXG4gIFtdXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZFN0dXJnZXMsXG4gICAgICBzbW9vdGggPSBzbW9vdGhMaW5lYXI7XG5cbiAgZnVuY3Rpb24gY29udG91cnModmFsdWVzKSB7XG4gICAgdmFyIHR6ID0gdGhyZXNob2xkKHZhbHVlcyk7XG5cbiAgICAvLyBDb252ZXJ0IG51bWJlciBvZiB0aHJlc2hvbGRzIGludG8gdW5pZm9ybSB0aHJlc2hvbGRzLlxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0eikpIHtcbiAgICAgIHZhciBkb21haW4gPSBleHRlbnQodmFsdWVzKSwgc3RhcnQgPSBkb21haW5bMF0sIHN0b3AgPSBkb21haW5bMV07XG4gICAgICB0eiA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCB0eik7XG4gICAgICB0eiA9IHJhbmdlKE1hdGguZmxvb3Ioc3RhcnQgLyB0eikgKiB0eiwgTWF0aC5mbG9vcihzdG9wIC8gdHopICogdHosIHR6KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHogPSB0ei5zbGljZSgpLnNvcnQoYXNjZW5kaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHoubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gY29udG91cih2YWx1ZXMsIHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFjY3VtdWxhdGUsIHNtb290aCBjb250b3VyIHJpbmdzLCBhc3NpZ24gaG9sZXMgdG8gZXh0ZXJpb3IgcmluZ3MuXG4gIC8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tYm9zdG9jay9zaGFwZWZpbGUvYmxvYi92MC42LjIvc2hwL3BvbHlnb24uanNcbiAgZnVuY3Rpb24gY29udG91cih2YWx1ZXMsIHZhbHVlKSB7XG4gICAgdmFyIHBvbHlnb25zID0gW10sXG4gICAgICAgIGhvbGVzID0gW107XG5cbiAgICBpc29yaW5ncyh2YWx1ZXMsIHZhbHVlLCBmdW5jdGlvbihyaW5nKSB7XG4gICAgICBzbW9vdGgocmluZywgdmFsdWVzLCB2YWx1ZSk7XG4gICAgICBpZiAoYXJlYShyaW5nKSA+IDApIHBvbHlnb25zLnB1c2goW3JpbmddKTtcbiAgICAgIGVsc2UgaG9sZXMucHVzaChyaW5nKTtcbiAgICB9KTtcblxuICAgIGhvbGVzLmZvckVhY2goZnVuY3Rpb24oaG9sZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBwb2x5Z29ucy5sZW5ndGgsIHBvbHlnb247IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKGNvbnRhaW5zKChwb2x5Z29uID0gcG9seWdvbnNbaV0pWzBdLCBob2xlKSAhPT0gLTEpIHtcbiAgICAgICAgICBwb2x5Z29uLnB1c2goaG9sZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJNdWx0aVBvbHlnb25cIixcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGNvb3JkaW5hdGVzOiBwb2x5Z29uc1xuICAgIH07XG4gIH1cblxuICAvLyBNYXJjaGluZyBzcXVhcmVzIHdpdGggaXNvbGluZXMgc3RpdGNoZWQgaW50byByaW5ncy5cbiAgLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3RvcG9qc29uL3RvcG9qc29uLWNsaWVudC9ibG9iL3YzLjAuMC9zcmMvc3RpdGNoLmpzXG4gIGZ1bmN0aW9uIGlzb3JpbmdzKHZhbHVlcywgdmFsdWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZyYWdtZW50QnlTdGFydCA9IG5ldyBBcnJheSxcbiAgICAgICAgZnJhZ21lbnRCeUVuZCA9IG5ldyBBcnJheSxcbiAgICAgICAgeCwgeSwgdDAsIHQxLCB0MiwgdDM7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRoZSBmaXJzdCByb3cgKHkgPSAtMSwgdDIgPSB0MyA9IDApLlxuICAgIHggPSB5ID0gLTE7XG4gICAgdDEgPSB2YWx1ZXNbMF0gPj0gdmFsdWU7XG4gICAgY2FzZXNbdDEgPDwgMV0uZm9yRWFjaChzdGl0Y2gpO1xuICAgIHdoaWxlICgrK3ggPCBkeCAtIDEpIHtcbiAgICAgIHQwID0gdDEsIHQxID0gdmFsdWVzW3ggKyAxXSA+PSB2YWx1ZTtcbiAgICAgIGNhc2VzW3QwIHwgdDEgPDwgMV0uZm9yRWFjaChzdGl0Y2gpO1xuICAgIH1cbiAgICBjYXNlc1t0MSA8PCAwXS5mb3JFYWNoKHN0aXRjaCk7XG5cbiAgICAvLyBHZW5lcmFsIGNhc2UgZm9yIHRoZSBpbnRlcm1lZGlhdGUgcm93cy5cbiAgICB3aGlsZSAoKyt5IDwgZHkgLSAxKSB7XG4gICAgICB4ID0gLTE7XG4gICAgICB0MSA9IHZhbHVlc1t5ICogZHggKyBkeF0gPj0gdmFsdWU7XG4gICAgICB0MiA9IHZhbHVlc1t5ICogZHhdID49IHZhbHVlO1xuICAgICAgY2FzZXNbdDEgPDwgMSB8IHQyIDw8IDJdLmZvckVhY2goc3RpdGNoKTtcbiAgICAgIHdoaWxlICgrK3ggPCBkeCAtIDEpIHtcbiAgICAgICAgdDAgPSB0MSwgdDEgPSB2YWx1ZXNbeSAqIGR4ICsgZHggKyB4ICsgMV0gPj0gdmFsdWU7XG4gICAgICAgIHQzID0gdDIsIHQyID0gdmFsdWVzW3kgKiBkeCArIHggKyAxXSA+PSB2YWx1ZTtcbiAgICAgICAgY2FzZXNbdDAgfCB0MSA8PCAxIHwgdDIgPDwgMiB8IHQzIDw8IDNdLmZvckVhY2goc3RpdGNoKTtcbiAgICAgIH1cbiAgICAgIGNhc2VzW3QxIHwgdDIgPDwgM10uZm9yRWFjaChzdGl0Y2gpO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIGxhc3Qgcm93ICh5ID0gZHkgLSAxLCB0MCA9IHQxID0gMCkuXG4gICAgeCA9IC0xO1xuICAgIHQyID0gdmFsdWVzW3kgKiBkeF0gPj0gdmFsdWU7XG4gICAgY2FzZXNbdDIgPDwgMl0uZm9yRWFjaChzdGl0Y2gpO1xuICAgIHdoaWxlICgrK3ggPCBkeCAtIDEpIHtcbiAgICAgIHQzID0gdDIsIHQyID0gdmFsdWVzW3kgKiBkeCArIHggKyAxXSA+PSB2YWx1ZTtcbiAgICAgIGNhc2VzW3QyIDw8IDIgfCB0MyA8PCAzXS5mb3JFYWNoKHN0aXRjaCk7XG4gICAgfVxuICAgIGNhc2VzW3QyIDw8IDNdLmZvckVhY2goc3RpdGNoKTtcblxuICAgIGZ1bmN0aW9uIHN0aXRjaChsaW5lKSB7XG4gICAgICB2YXIgc3RhcnQgPSBbbGluZVswXVswXSArIHgsIGxpbmVbMF1bMV0gKyB5XSxcbiAgICAgICAgICBlbmQgPSBbbGluZVsxXVswXSArIHgsIGxpbmVbMV1bMV0gKyB5XSxcbiAgICAgICAgICBzdGFydEluZGV4ID0gaW5kZXgoc3RhcnQpLFxuICAgICAgICAgIGVuZEluZGV4ID0gaW5kZXgoZW5kKSxcbiAgICAgICAgICBmLCBnO1xuICAgICAgaWYgKGYgPSBmcmFnbWVudEJ5RW5kW3N0YXJ0SW5kZXhdKSB7XG4gICAgICAgIGlmIChnID0gZnJhZ21lbnRCeVN0YXJ0W2VuZEluZGV4XSkge1xuICAgICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5RW5kW2YuZW5kXTtcbiAgICAgICAgICBkZWxldGUgZnJhZ21lbnRCeVN0YXJ0W2cuc3RhcnRdO1xuICAgICAgICAgIGlmIChmID09PSBnKSB7XG4gICAgICAgICAgICBmLnJpbmcucHVzaChlbmQpO1xuICAgICAgICAgICAgY2FsbGJhY2soZi5yaW5nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJhZ21lbnRCeVN0YXJ0W2Yuc3RhcnRdID0gZnJhZ21lbnRCeUVuZFtnLmVuZF0gPSB7c3RhcnQ6IGYuc3RhcnQsIGVuZDogZy5lbmQsIHJpbmc6IGYucmluZy5jb25jYXQoZy5yaW5nKX07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5RW5kW2YuZW5kXTtcbiAgICAgICAgICBmLnJpbmcucHVzaChlbmQpO1xuICAgICAgICAgIGZyYWdtZW50QnlFbmRbZi5lbmQgPSBlbmRJbmRleF0gPSBmO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGYgPSBmcmFnbWVudEJ5U3RhcnRbZW5kSW5kZXhdKSB7XG4gICAgICAgIGlmIChnID0gZnJhZ21lbnRCeUVuZFtzdGFydEluZGV4XSkge1xuICAgICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5U3RhcnRbZi5zdGFydF07XG4gICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlFbmRbZy5lbmRdO1xuICAgICAgICAgIGlmIChmID09PSBnKSB7XG4gICAgICAgICAgICBmLnJpbmcucHVzaChlbmQpO1xuICAgICAgICAgICAgY2FsbGJhY2soZi5yaW5nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJhZ21lbnRCeVN0YXJ0W2cuc3RhcnRdID0gZnJhZ21lbnRCeUVuZFtmLmVuZF0gPSB7c3RhcnQ6IGcuc3RhcnQsIGVuZDogZi5lbmQsIHJpbmc6IGcucmluZy5jb25jYXQoZi5yaW5nKX07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5U3RhcnRbZi5zdGFydF07XG4gICAgICAgICAgZi5yaW5nLnVuc2hpZnQoc3RhcnQpO1xuICAgICAgICAgIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0ID0gc3RhcnRJbmRleF0gPSBmO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFnbWVudEJ5U3RhcnRbc3RhcnRJbmRleF0gPSBmcmFnbWVudEJ5RW5kW2VuZEluZGV4XSA9IHtzdGFydDogc3RhcnRJbmRleCwgZW5kOiBlbmRJbmRleCwgcmluZzogW3N0YXJ0LCBlbmRdfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbmRleChwb2ludCkge1xuICAgIHJldHVybiBwb2ludFswXSAqIDIgKyBwb2ludFsxXSAqIChkeCArIDEpICogNDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNtb290aExpbmVhcihyaW5nLCB2YWx1ZXMsIHZhbHVlKSB7XG4gICAgcmluZy5mb3JFYWNoKGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgICB2YXIgeCA9IHBvaW50WzBdLFxuICAgICAgICAgIHkgPSBwb2ludFsxXSxcbiAgICAgICAgICB4dCA9IHggfCAwLFxuICAgICAgICAgIHl0ID0geSB8IDAsXG4gICAgICAgICAgdjAsXG4gICAgICAgICAgdjEgPSB2YWx1ZXNbeXQgKiBkeCArIHh0XTtcbiAgICAgIGlmICh4ID4gMCAmJiB4IDwgZHggJiYgeHQgPT09IHgpIHtcbiAgICAgICAgdjAgPSB2YWx1ZXNbeXQgKiBkeCArIHh0IC0gMV07XG4gICAgICAgIHBvaW50WzBdID0geCArICh2YWx1ZSAtIHYwKSAvICh2MSAtIHYwKSAtIDAuNTtcbiAgICAgIH1cbiAgICAgIGlmICh5ID4gMCAmJiB5IDwgZHkgJiYgeXQgPT09IHkpIHtcbiAgICAgICAgdjAgPSB2YWx1ZXNbKHl0IC0gMSkgKiBkeCArIHh0XTtcbiAgICAgICAgcG9pbnRbMV0gPSB5ICsgKHZhbHVlIC0gdjApIC8gKHYxIC0gdjApIC0gMC41O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29udG91cnMuY29udG91ciA9IGNvbnRvdXI7XG5cbiAgY29udG91cnMuc2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbZHgsIGR5XTtcbiAgICB2YXIgXzAgPSBNYXRoLmNlaWwoX1swXSksIF8xID0gTWF0aC5jZWlsKF9bMV0pO1xuICAgIGlmICghKF8wID4gMCkgfHwgIShfMSA+IDApKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHNpemVcIik7XG4gICAgcmV0dXJuIGR4ID0gXzAsIGR5ID0gXzEsIGNvbnRvdXJzO1xuICB9O1xuXG4gIGNvbnRvdXJzLnRocmVzaG9sZHMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhyZXNob2xkID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29uc3RhbnQoc2xpY2UuY2FsbChfKSkgOiBjb25zdGFudChfKSwgY29udG91cnMpIDogdGhyZXNob2xkO1xuICB9O1xuXG4gIGNvbnRvdXJzLnNtb290aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzbW9vdGggPSBfID8gc21vb3RoTGluZWFyIDogbm9vcCwgY29udG91cnMpIDogc21vb3RoID09PSBzbW9vdGhMaW5lYXI7XG4gIH07XG5cbiAgcmV0dXJuIGNvbnRvdXJzO1xufVxuIiwiLy8gVE9ETyBPcHRpbWl6ZSBlZGdlIGNhc2VzLlxuLy8gVE9ETyBPcHRpbWl6ZSBpbmRleCBjYWxjdWxhdGlvbi5cbi8vIFRPRE8gT3B0aW1pemUgYXJndW1lbnRzLlxuZXhwb3J0IGZ1bmN0aW9uIGJsdXJYKHNvdXJjZSwgdGFyZ2V0LCByKSB7XG4gIHZhciBuID0gc291cmNlLndpZHRoLFxuICAgICAgbSA9IHNvdXJjZS5oZWlnaHQsXG4gICAgICB3ID0gKHIgPDwgMSkgKyAxO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGkgPSAwLCBzciA9IDA7IGkgPCBuICsgcjsgKytpKSB7XG4gICAgICBpZiAoaSA8IG4pIHtcbiAgICAgICAgc3IgKz0gc291cmNlLmRhdGFbaSArIGogKiBuXTtcbiAgICAgIH1cbiAgICAgIGlmIChpID49IHIpIHtcbiAgICAgICAgaWYgKGkgPj0gdykge1xuICAgICAgICAgIHNyIC09IHNvdXJjZS5kYXRhW2kgLSB3ICsgaiAqIG5dO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kYXRhW2kgLSByICsgaiAqIG5dID0gc3IgLyBNYXRoLm1pbihpICsgMSwgbiAtIDEgKyB3IC0gaSwgdyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE8gT3B0aW1pemUgZWRnZSBjYXNlcy5cbi8vIFRPRE8gT3B0aW1pemUgaW5kZXggY2FsY3VsYXRpb24uXG4vLyBUT0RPIE9wdGltaXplIGFyZ3VtZW50cy5cbmV4cG9ydCBmdW5jdGlvbiBibHVyWShzb3VyY2UsIHRhcmdldCwgcikge1xuICB2YXIgbiA9IHNvdXJjZS53aWR0aCxcbiAgICAgIG0gPSBzb3VyY2UuaGVpZ2h0LFxuICAgICAgdyA9IChyIDw8IDEpICsgMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBmb3IgKHZhciBqID0gMCwgc3IgPSAwOyBqIDwgbSArIHI7ICsraikge1xuICAgICAgaWYgKGogPCBtKSB7XG4gICAgICAgIHNyICs9IHNvdXJjZS5kYXRhW2kgKyBqICogbl07XG4gICAgICB9XG4gICAgICBpZiAoaiA+PSByKSB7XG4gICAgICAgIGlmIChqID49IHcpIHtcbiAgICAgICAgICBzciAtPSBzb3VyY2UuZGF0YVtpICsgKGogLSB3KSAqIG5dO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kYXRhW2kgKyAoaiAtIHIpICogbl0gPSBzciAvIE1hdGgubWluKGogKyAxLCBtIC0gMSArIHcgLSBqLCB3KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7bWF4LCByYW5nZSwgdGlja1N0ZXB9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtzbGljZX0gZnJvbSBcIi4vYXJyYXlcIjtcbmltcG9ydCB7Ymx1clgsIGJsdXJZfSBmcm9tIFwiLi9ibHVyXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCBjb250b3VycyBmcm9tIFwiLi9jb250b3Vyc1wiO1xuXG5mdW5jdGlvbiBkZWZhdWx0WChkKSB7XG4gIHJldHVybiBkWzBdO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0WShkKSB7XG4gIHJldHVybiBkWzFdO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0V2VpZ2h0KCkge1xuICByZXR1cm4gMTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciB4ID0gZGVmYXVsdFgsXG4gICAgICB5ID0gZGVmYXVsdFksXG4gICAgICB3ZWlnaHQgPSBkZWZhdWx0V2VpZ2h0LFxuICAgICAgZHggPSA5NjAsXG4gICAgICBkeSA9IDUwMCxcbiAgICAgIHIgPSAyMCwgLy8gYmx1ciByYWRpdXNcbiAgICAgIGsgPSAyLCAvLyBsb2cyKGdyaWQgY2VsbCBzaXplKVxuICAgICAgbyA9IHIgKiAzLCAvLyBncmlkIG9mZnNldCwgdG8gcGFkIGZvciBibHVyXG4gICAgICBuID0gKGR4ICsgbyAqIDIpID4+IGssIC8vIGdyaWQgd2lkdGhcbiAgICAgIG0gPSAoZHkgKyBvICogMikgPj4gaywgLy8gZ3JpZCBoZWlnaHRcbiAgICAgIHRocmVzaG9sZCA9IGNvbnN0YW50KDIwKTtcblxuICBmdW5jdGlvbiBkZW5zaXR5KGRhdGEpIHtcbiAgICB2YXIgdmFsdWVzMCA9IG5ldyBGbG9hdDMyQXJyYXkobiAqIG0pLFxuICAgICAgICB2YWx1ZXMxID0gbmV3IEZsb2F0MzJBcnJheShuICogbSk7XG5cbiAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24oZCwgaSwgZGF0YSkge1xuICAgICAgdmFyIHhpID0gKCt4KGQsIGksIGRhdGEpICsgbykgPj4gayxcbiAgICAgICAgICB5aSA9ICgreShkLCBpLCBkYXRhKSArIG8pID4+IGssXG4gICAgICAgICAgd2kgPSArd2VpZ2h0KGQsIGksIGRhdGEpO1xuICAgICAgaWYgKHhpID49IDAgJiYgeGkgPCBuICYmIHlpID49IDAgJiYgeWkgPCBtKSB7XG4gICAgICAgIHZhbHVlczBbeGkgKyB5aSAqIG5dICs9IHdpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVE9ETyBPcHRpbWl6ZS5cbiAgICBibHVyWCh7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMH0sIHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMxfSwgciA+PiBrKTtcbiAgICBibHVyWSh7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMX0sIHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMwfSwgciA+PiBrKTtcbiAgICBibHVyWCh7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMH0sIHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMxfSwgciA+PiBrKTtcbiAgICBibHVyWSh7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMX0sIHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMwfSwgciA+PiBrKTtcbiAgICBibHVyWCh7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMH0sIHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMxfSwgciA+PiBrKTtcbiAgICBibHVyWSh7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMX0sIHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMwfSwgciA+PiBrKTtcblxuICAgIHZhciB0eiA9IHRocmVzaG9sZCh2YWx1ZXMwKTtcblxuICAgIC8vIENvbnZlcnQgbnVtYmVyIG9mIHRocmVzaG9sZHMgaW50byB1bmlmb3JtIHRocmVzaG9sZHMuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkge1xuICAgICAgdmFyIHN0b3AgPSBtYXgodmFsdWVzMCk7XG4gICAgICB0eiA9IHRpY2tTdGVwKDAsIHN0b3AsIHR6KTtcbiAgICAgIHR6ID0gcmFuZ2UoMCwgTWF0aC5mbG9vcihzdG9wIC8gdHopICogdHosIHR6KTtcbiAgICAgIHR6LnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRvdXJzKClcbiAgICAgICAgLnRocmVzaG9sZHModHopXG4gICAgICAgIC5zaXplKFtuLCBtXSlcbiAgICAgICh2YWx1ZXMwKVxuICAgICAgICAubWFwKHRyYW5zZm9ybSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm0oZ2VvbWV0cnkpIHtcbiAgICBnZW9tZXRyeS52YWx1ZSAqPSBNYXRoLnBvdygyLCAtMiAqIGspOyAvLyBEZW5zaXR5IGluIHBvaW50cyBwZXIgc3F1YXJlIHBpeGVsLlxuICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtUG9seWdvbik7XG4gICAgcmV0dXJuIGdlb21ldHJ5O1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNmb3JtUG9seWdvbihjb29yZGluYXRlcykge1xuICAgIGNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtUmluZyk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1SaW5nKGNvb3JkaW5hdGVzKSB7XG4gICAgY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm1Qb2ludCk7XG4gIH1cblxuICAvLyBUT0RPIE9wdGltaXplLlxuICBmdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludChjb29yZGluYXRlcykge1xuICAgIGNvb3JkaW5hdGVzWzBdID0gY29vcmRpbmF0ZXNbMF0gKiBNYXRoLnBvdygyLCBrKSAtIG87XG4gICAgY29vcmRpbmF0ZXNbMV0gPSBjb29yZGluYXRlc1sxXSAqIE1hdGgucG93KDIsIGspIC0gbztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2l6ZSgpIHtcbiAgICBvID0gciAqIDM7XG4gICAgbiA9IChkeCArIG8gKiAyKSA+PiBrO1xuICAgIG0gPSAoZHkgKyBvICogMikgPj4gaztcbiAgICByZXR1cm4gZGVuc2l0eTtcbiAgfVxuXG4gIGRlbnNpdHkueCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGRlbnNpdHkpIDogeDtcbiAgfTtcblxuICBkZW5zaXR5LnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBkZW5zaXR5KSA6IHk7XG4gIH07XG5cbiAgZGVuc2l0eS53ZWlnaHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAod2VpZ2h0ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGRlbnNpdHkpIDogd2VpZ2h0O1xuICB9O1xuXG4gIGRlbnNpdHkuc2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbZHgsIGR5XTtcbiAgICB2YXIgXzAgPSBNYXRoLmNlaWwoX1swXSksIF8xID0gTWF0aC5jZWlsKF9bMV0pO1xuICAgIGlmICghKF8wID49IDApICYmICEoXzAgPj0gMCkpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgc2l6ZVwiKTtcbiAgICByZXR1cm4gZHggPSBfMCwgZHkgPSBfMSwgcmVzaXplKCk7XG4gIH07XG5cbiAgZGVuc2l0eS5jZWxsU2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiAxIDw8IGs7XG4gICAgaWYgKCEoKF8gPSArXykgPj0gMSkpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2VsbCBzaXplXCIpO1xuICAgIHJldHVybiBrID0gTWF0aC5mbG9vcihNYXRoLmxvZyhfKSAvIE1hdGguTE4yKSwgcmVzaXplKCk7XG4gIH07XG5cbiAgZGVuc2l0eS50aHJlc2hvbGRzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRocmVzaG9sZCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogQXJyYXkuaXNBcnJheShfKSA/IGNvbnN0YW50KHNsaWNlLmNhbGwoXykpIDogY29uc3RhbnQoXyksIGRlbnNpdHkpIDogdGhyZXNob2xkO1xuICB9O1xuXG4gIGRlbnNpdHkuYmFuZHdpZHRoID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIE1hdGguc3FydChyICogKHIgKyAxKSk7XG4gICAgaWYgKCEoKF8gPSArXykgPj0gMCkpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgYmFuZHdpZHRoXCIpO1xuICAgIHJldHVybiByID0gTWF0aC5yb3VuZCgoTWF0aC5zcXJ0KDQgKiBfICogXyArIDEpIC0gMSkgLyAyKSwgcmVzaXplKCk7XG4gIH07XG5cbiAgcmV0dXJuIGRlbnNpdHk7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgY29udG91cnN9IGZyb20gXCIuL2NvbnRvdXJzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY29udG91ckRlbnNpdHl9IGZyb20gXCIuL2RlbnNpdHlcIjtcbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBkaXNwYXRjaH0gZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRHJhZ0V2ZW50KHRhcmdldCwgdHlwZSwgc3ViamVjdCwgaWQsIGFjdGl2ZSwgeCwgeSwgZHgsIGR5LCBkaXNwYXRjaCkge1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5zdWJqZWN0ID0gc3ViamVjdDtcbiAgdGhpcy5pZGVudGlmaWVyID0gaWQ7XG4gIHRoaXMuYWN0aXZlID0gYWN0aXZlO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xuICB0aGlzLmR4ID0gZHg7XG4gIHRoaXMuZHkgPSBkeTtcbiAgdGhpcy5fID0gZGlzcGF0Y2g7XG59XG5cbkRyYWdFdmVudC5wcm90b3R5cGUub24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHZhbHVlID0gdGhpcy5fLm9uLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHZhbHVlID09PSB0aGlzLl8gPyB0aGlzIDogdmFsdWU7XG59O1xuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2V2ZW50LCBjdXN0b21FdmVudCwgc2VsZWN0LCBtb3VzZSwgdG91Y2h9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2RyYWcsIHt5ZXNkcmFnfSBmcm9tIFwiLi9ub2RyYWcuanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgRHJhZ0V2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcigpIHtcbiAgcmV0dXJuICFldmVudC5jdHJsS2V5ICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb250YWluZXIoKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudE5vZGU7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTdWJqZWN0KGQpIHtcbiAgcmV0dXJuIGQgPT0gbnVsbCA/IHt4OiBldmVudC54LCB5OiBldmVudC55fSA6IGQ7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGNvbnRhaW5lciA9IGRlZmF1bHRDb250YWluZXIsXG4gICAgICBzdWJqZWN0ID0gZGVmYXVsdFN1YmplY3QsXG4gICAgICB0b3VjaGFibGUgPSBkZWZhdWx0VG91Y2hhYmxlLFxuICAgICAgZ2VzdHVyZXMgPSB7fSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJkcmFnXCIsIFwiZW5kXCIpLFxuICAgICAgYWN0aXZlID0gMCxcbiAgICAgIG1vdXNlZG93bngsXG4gICAgICBtb3VzZWRvd255LFxuICAgICAgbW91c2Vtb3ZpbmcsXG4gICAgICB0b3VjaGVuZGluZyxcbiAgICAgIGNsaWNrRGlzdGFuY2UyID0gMDtcblxuICBmdW5jdGlvbiBkcmFnKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvblxuICAgICAgICAub24oXCJtb3VzZWRvd24uZHJhZ1wiLCBtb3VzZWRvd25lZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0LmRyYWdcIiwgdG91Y2hzdGFydGVkKVxuICAgICAgICAub24oXCJ0b3VjaG1vdmUuZHJhZ1wiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWdcIiwgdG91Y2hlbmRlZClcbiAgICAgICAgLnN0eWxlKFwidG91Y2gtYWN0aW9uXCIsIFwibm9uZVwiKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnZXN0dXJlID0gYmVmb3Jlc3RhcnQoXCJtb3VzZVwiLCBjb250YWluZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgbW91c2UsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKCFnZXN0dXJlKSByZXR1cm47XG4gICAgc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLmRyYWdcIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oXCJtb3VzZXVwLmRyYWdcIiwgbW91c2V1cHBlZCwgdHJ1ZSk7XG4gICAgbm9kcmFnKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oKTtcbiAgICBtb3VzZW1vdmluZyA9IGZhbHNlO1xuICAgIG1vdXNlZG93bnggPSBldmVudC5jbGllbnRYO1xuICAgIG1vdXNlZG93bnkgPSBldmVudC5jbGllbnRZO1xuICAgIGdlc3R1cmUoXCJzdGFydFwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlbW92ZWQoKSB7XG4gICAgbm9ldmVudCgpO1xuICAgIGlmICghbW91c2Vtb3ZpbmcpIHtcbiAgICAgIHZhciBkeCA9IGV2ZW50LmNsaWVudFggLSBtb3VzZWRvd254LCBkeSA9IGV2ZW50LmNsaWVudFkgLSBtb3VzZWRvd255O1xuICAgICAgbW91c2Vtb3ZpbmcgPSBkeCAqIGR4ICsgZHkgKiBkeSA+IGNsaWNrRGlzdGFuY2UyO1xuICAgIH1cbiAgICBnZXN0dXJlcy5tb3VzZShcImRyYWdcIik7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZXVwcGVkKCkge1xuICAgIHNlbGVjdChldmVudC52aWV3KS5vbihcIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZ1wiLCBudWxsKTtcbiAgICB5ZXNkcmFnKGV2ZW50LnZpZXcsIG1vdXNlbW92aW5nKTtcbiAgICBub2V2ZW50KCk7XG4gICAgZ2VzdHVyZXMubW91c2UoXCJlbmRcIik7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIGMgPSBjb250YWluZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0b3VjaGVzW2ldLmlkZW50aWZpZXIsIGMsIHRvdWNoLCB0aGlzLCBhcmd1bWVudHMpKSB7XG4gICAgICAgIG5vcHJvcGFnYXRpb24oKTtcbiAgICAgICAgZ2VzdHVyZShcInN0YXJ0XCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoKSB7XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzW2ldLmlkZW50aWZpZXJdKSB7XG4gICAgICAgIG5vZXZlbnQoKTtcbiAgICAgICAgZ2VzdHVyZShcImRyYWdcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZCgpIHtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7XG5cbiAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7XG4gICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCFcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHtcbiAgICAgICAgbm9wcm9wYWdhdGlvbigpO1xuICAgICAgICBnZXN0dXJlKFwiZW5kXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJlZm9yZXN0YXJ0KGlkLCBjb250YWluZXIsIHBvaW50LCB0aGF0LCBhcmdzKSB7XG4gICAgdmFyIHAgPSBwb2ludChjb250YWluZXIsIGlkKSwgcywgZHgsIGR5LFxuICAgICAgICBzdWJsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuY29weSgpO1xuXG4gICAgaWYgKCFjdXN0b21FdmVudChuZXcgRHJhZ0V2ZW50KGRyYWcsIFwiYmVmb3Jlc3RhcnRcIiwgcywgaWQsIGFjdGl2ZSwgcFswXSwgcFsxXSwgMCwgMCwgc3VibGlzdGVuZXJzKSwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKGV2ZW50LnN1YmplY3QgPSBzID0gc3ViamVjdC5hcHBseSh0aGF0LCBhcmdzKSkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZHggPSBzLnggLSBwWzBdIHx8IDA7XG4gICAgICBkeSA9IHMueSAtIHBbMV0gfHwgMDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pKSByZXR1cm47XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gZ2VzdHVyZSh0eXBlKSB7XG4gICAgICB2YXIgcDAgPSBwLCBuO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzdGFydFwiOiBnZXN0dXJlc1tpZF0gPSBnZXN0dXJlLCBuID0gYWN0aXZlKys7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6IGRlbGV0ZSBnZXN0dXJlc1tpZF0sIC0tYWN0aXZlOyAvLyBub2JyZWFrXG4gICAgICAgIGNhc2UgXCJkcmFnXCI6IHAgPSBwb2ludChjb250YWluZXIsIGlkKSwgbiA9IGFjdGl2ZTsgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXN0b21FdmVudChuZXcgRHJhZ0V2ZW50KGRyYWcsIHR5cGUsIHMsIGlkLCBuLCBwWzBdICsgZHgsIHBbMV0gKyBkeSwgcFswXSAtIHAwWzBdLCBwWzFdIC0gcDBbMV0sIHN1Ymxpc3RlbmVycyksIHN1Ymxpc3RlbmVycy5hcHBseSwgc3VibGlzdGVuZXJzLCBbdHlwZSwgdGhhdCwgYXJnc10pO1xuICAgIH07XG4gIH1cblxuICBkcmFnLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGRyYWcpIDogZmlsdGVyO1xuICB9O1xuXG4gIGRyYWcuY29udGFpbmVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnRhaW5lciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIGRyYWcpIDogY29udGFpbmVyO1xuICB9O1xuXG4gIGRyYWcuc3ViamVjdCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdWJqZWN0ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgZHJhZykgOiBzdWJqZWN0O1xuICB9O1xuXG4gIGRyYWcudG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgZHJhZykgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgZHJhZy5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyBkcmFnIDogdmFsdWU7XG4gIH07XG5cbiAgZHJhZy5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCBkcmFnKSA6IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7XG4gIH07XG5cbiAgcmV0dXJuIGRyYWc7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgZHJhZ30gZnJvbSBcIi4vZHJhZy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGRyYWdEaXNhYmxlLCB5ZXNkcmFnIGFzIGRyYWdFbmFibGV9IGZyb20gXCIuL25vZHJhZy5qc1wiO1xuIiwidmFyIEVPTCA9IHt9LFxuICAgIEVPRiA9IHt9LFxuICAgIFFVT1RFID0gMzQsXG4gICAgTkVXTElORSA9IDEwLFxuICAgIFJFVFVSTiA9IDEzO1xuXG5mdW5jdGlvbiBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucykge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKFwiZFwiLCBcInJldHVybiB7XCIgKyBjb2x1bW5zLm1hcChmdW5jdGlvbihuYW1lLCBpKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5hbWUpICsgXCI6IGRbXCIgKyBpICsgXCJdIHx8IFxcXCJcXFwiXCI7XG4gIH0pLmpvaW4oXCIsXCIpICsgXCJ9XCIpO1xufVxuXG5mdW5jdGlvbiBjdXN0b21Db252ZXJ0ZXIoY29sdW1ucywgZikge1xuICB2YXIgb2JqZWN0ID0gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpO1xuICByZXR1cm4gZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgcmV0dXJuIGYob2JqZWN0KHJvdyksIGksIGNvbHVtbnMpO1xuICB9O1xufVxuXG4vLyBDb21wdXRlIHVuaXF1ZSBjb2x1bW5zIGluIG9yZGVyIG9mIGRpc2NvdmVyeS5cbmZ1bmN0aW9uIGluZmVyQ29sdW1ucyhyb3dzKSB7XG4gIHZhciBjb2x1bW5TZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgY29sdW1ucyA9IFtdO1xuXG4gIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcbiAgICBmb3IgKHZhciBjb2x1bW4gaW4gcm93KSB7XG4gICAgICBpZiAoIShjb2x1bW4gaW4gY29sdW1uU2V0KSkge1xuICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uU2V0W2NvbHVtbl0gPSBjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNvbHVtbnM7XG59XG5cbmZ1bmN0aW9uIHBhZCh2YWx1ZSwgd2lkdGgpIHtcbiAgdmFyIHMgPSB2YWx1ZSArIFwiXCIsIGxlbmd0aCA9IHMubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKDApICsgcyA6IHM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFllYXIoeWVhcikge1xuICByZXR1cm4geWVhciA8IDAgPyBcIi1cIiArIHBhZCgteWVhciwgNilcbiAgICA6IHllYXIgPiA5OTk5ID8gXCIrXCIgKyBwYWQoeWVhciwgNilcbiAgICA6IHBhZCh5ZWFyLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlKSB7XG4gIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKSxcbiAgICAgIG1pbnV0ZXMgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgIHNlY29uZHMgPSBkYXRlLmdldFVUQ1NlY29uZHMoKSxcbiAgICAgIG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XG4gIHJldHVybiBpc05hTihkYXRlKSA/IFwiSW52YWxpZCBEYXRlXCJcbiAgICAgIDogZm9ybWF0WWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIDQpICsgXCItXCIgKyBwYWQoZGF0ZS5nZXRVVENNb250aCgpICsgMSwgMikgKyBcIi1cIiArIHBhZChkYXRlLmdldFVUQ0RhdGUoKSwgMilcbiAgICAgICsgKG1pbGxpc2Vjb25kcyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCI6XCIgKyBwYWQoc2Vjb25kcywgMikgKyBcIi5cIiArIHBhZChtaWxsaXNlY29uZHMsIDMpICsgXCJaXCJcbiAgICAgIDogc2Vjb25kcyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCI6XCIgKyBwYWQoc2Vjb25kcywgMikgKyBcIlpcIlxuICAgICAgOiBtaW51dGVzIHx8IGhvdXJzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIlpcIlxuICAgICAgOiBcIlwiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVsaW1pdGVyKSB7XG4gIHZhciByZUZvcm1hdCA9IG5ldyBSZWdFeHAoXCJbXFxcIlwiICsgZGVsaW1pdGVyICsgXCJcXG5cXHJdXCIpLFxuICAgICAgREVMSU1JVEVSID0gZGVsaW1pdGVyLmNoYXJDb2RlQXQoMCk7XG5cbiAgZnVuY3Rpb24gcGFyc2UodGV4dCwgZikge1xuICAgIHZhciBjb252ZXJ0LCBjb2x1bW5zLCByb3dzID0gcGFyc2VSb3dzKHRleHQsIGZ1bmN0aW9uKHJvdywgaSkge1xuICAgICAgaWYgKGNvbnZlcnQpIHJldHVybiBjb252ZXJ0KHJvdywgaSAtIDEpO1xuICAgICAgY29sdW1ucyA9IHJvdywgY29udmVydCA9IGYgPyBjdXN0b21Db252ZXJ0ZXIocm93LCBmKSA6IG9iamVjdENvbnZlcnRlcihyb3cpO1xuICAgIH0pO1xuICAgIHJvd3MuY29sdW1ucyA9IGNvbHVtbnMgfHwgW107XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVJvd3ModGV4dCwgZikge1xuICAgIHZhciByb3dzID0gW10sIC8vIG91dHB1dCByb3dzXG4gICAgICAgIE4gPSB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgSSA9IDAsIC8vIGN1cnJlbnQgY2hhcmFjdGVyIGluZGV4XG4gICAgICAgIG4gPSAwLCAvLyBjdXJyZW50IGxpbmUgbnVtYmVyXG4gICAgICAgIHQsIC8vIGN1cnJlbnQgdG9rZW5cbiAgICAgICAgZW9mID0gTiA8PSAwLCAvLyBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPRj9cbiAgICAgICAgZW9sID0gZmFsc2U7IC8vIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9MP1xuXG4gICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIG5ld2xpbmUuXG4gICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IE5FV0xJTkUpIC0tTjtcbiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gUkVUVVJOKSAtLU47XG5cbiAgICBmdW5jdGlvbiB0b2tlbigpIHtcbiAgICAgIGlmIChlb2YpIHJldHVybiBFT0Y7XG4gICAgICBpZiAoZW9sKSByZXR1cm4gZW9sID0gZmFsc2UsIEVPTDtcblxuICAgICAgLy8gVW5lc2NhcGUgcXVvdGVzLlxuICAgICAgdmFyIGksIGogPSBJLCBjO1xuICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChqKSA9PT0gUVVPVEUpIHtcbiAgICAgICAgd2hpbGUgKEkrKyA8IE4gJiYgdGV4dC5jaGFyQ29kZUF0KEkpICE9PSBRVU9URSB8fCB0ZXh0LmNoYXJDb2RlQXQoKytJKSA9PT0gUVVPVEUpO1xuICAgICAgICBpZiAoKGkgPSBJKSA+PSBOKSBlb2YgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfVxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqICsgMSwgaSAtIDEpLnJlcGxhY2UoL1wiXCIvZywgXCJcXFwiXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBGaW5kIG5leHQgZGVsaW1pdGVyIG9yIG5ld2xpbmUuXG4gICAgICB3aGlsZSAoSSA8IE4pIHtcbiAgICAgICAgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KGkgPSBJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfVxuICAgICAgICBlbHNlIGlmIChjICE9PSBERUxJTUlURVIpIGNvbnRpbnVlO1xuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqLCBpKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGxhc3QgdG9rZW4gYmVmb3JlIEVPRi5cbiAgICAgIHJldHVybiBlb2YgPSB0cnVlLCB0ZXh0LnNsaWNlKGosIE4pO1xuICAgIH1cblxuICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YpIHtcbiAgICAgIHZhciByb3cgPSBbXTtcbiAgICAgIHdoaWxlICh0ICE9PSBFT0wgJiYgdCAhPT0gRU9GKSByb3cucHVzaCh0KSwgdCA9IHRva2VuKCk7XG4gICAgICBpZiAoZiAmJiAocm93ID0gZihyb3csIG4rKykpID09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgcm93cy5wdXNoKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gcm93cy5tYXAoZnVuY3Rpb24ocm93KSB7XG4gICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24oY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRWYWx1ZShyb3dbY29sdW1uXSk7XG4gICAgICB9KS5qb2luKGRlbGltaXRlcik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXQocm93cywgY29sdW1ucykge1xuICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7XG4gICAgcmV0dXJuIFtjb2x1bW5zLm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpXS5jb25jYXQocHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdEJvZHkocm93cywgY29sdW1ucykge1xuICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7XG4gICAgcmV0dXJuIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFJvd3Mocm93cykge1xuICAgIHJldHVybiByb3dzLm1hcChmb3JtYXRSb3cpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRSb3cocm93KSB7XG4gICAgcmV0dXJuIHJvdy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiXG4gICAgICAgIDogdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gZm9ybWF0RGF0ZSh2YWx1ZSlcbiAgICAgICAgOiByZUZvcm1hdC50ZXN0KHZhbHVlICs9IFwiXCIpID8gXCJcXFwiXCIgKyB2YWx1ZS5yZXBsYWNlKC9cIi9nLCBcIlxcXCJcXFwiXCIpICsgXCJcXFwiXCJcbiAgICAgICAgOiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHBhcnNlUm93czogcGFyc2VSb3dzLFxuICAgIGZvcm1hdDogZm9ybWF0LFxuICAgIGZvcm1hdEJvZHk6IGZvcm1hdEJvZHksXG4gICAgZm9ybWF0Um93czogZm9ybWF0Um93cyxcbiAgICBmb3JtYXRSb3c6IGZvcm1hdFJvdyxcbiAgICBmb3JtYXRWYWx1ZTogZm9ybWF0VmFsdWVcbiAgfTtcbn1cbiIsImltcG9ydCBkc3YgZnJvbSBcIi4vZHN2LmpzXCI7XG5cbnZhciBjc3YgPSBkc3YoXCIsXCIpO1xuXG5leHBvcnQgdmFyIGNzdlBhcnNlID0gY3N2LnBhcnNlO1xuZXhwb3J0IHZhciBjc3ZQYXJzZVJvd3MgPSBjc3YucGFyc2VSb3dzO1xuZXhwb3J0IHZhciBjc3ZGb3JtYXQgPSBjc3YuZm9ybWF0O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRCb2R5ID0gY3N2LmZvcm1hdEJvZHk7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFJvd3MgPSBjc3YuZm9ybWF0Um93cztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Um93ID0gY3N2LmZvcm1hdFJvdztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0VmFsdWUgPSBjc3YuZm9ybWF0VmFsdWU7XG4iLCJpbXBvcnQgZHN2IGZyb20gXCIuL2Rzdi5qc1wiO1xuXG52YXIgdHN2ID0gZHN2KFwiXFx0XCIpO1xuXG5leHBvcnQgdmFyIHRzdlBhcnNlID0gdHN2LnBhcnNlO1xuZXhwb3J0IHZhciB0c3ZQYXJzZVJvd3MgPSB0c3YucGFyc2VSb3dzO1xuZXhwb3J0IHZhciB0c3ZGb3JtYXQgPSB0c3YuZm9ybWF0O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRCb2R5ID0gdHN2LmZvcm1hdEJvZHk7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFJvd3MgPSB0c3YuZm9ybWF0Um93cztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Um93ID0gdHN2LmZvcm1hdFJvdztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0VmFsdWUgPSB0c3YuZm9ybWF0VmFsdWU7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdXRvVHlwZShvYmplY3QpIHtcbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldLnRyaW0oKSwgbnVtYmVyLCBtO1xuICAgIGlmICghdmFsdWUpIHZhbHVlID0gbnVsbDtcbiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gXCJ0cnVlXCIpIHZhbHVlID0gdHJ1ZTtcbiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gXCJmYWxzZVwiKSB2YWx1ZSA9IGZhbHNlO1xuICAgIGVsc2UgaWYgKHZhbHVlID09PSBcIk5hTlwiKSB2YWx1ZSA9IE5hTjtcbiAgICBlbHNlIGlmICghaXNOYU4obnVtYmVyID0gK3ZhbHVlKSkgdmFsdWUgPSBudW1iZXI7XG4gICAgZWxzZSBpZiAobSA9IHZhbHVlLm1hdGNoKC9eKFstK11cXGR7Mn0pP1xcZHs0fSgtXFxkezJ9KC1cXGR7Mn0pPyk/KFRcXGR7Mn06XFxkezJ9KDpcXGR7Mn0oXFwuXFxkezN9KT8pPyhafFstK11cXGR7Mn06XFxkezJ9KT8pPyQvKSkge1xuICAgICAgaWYgKGZpeHR6ICYmICEhbVs0XSAmJiAhbVs3XSkgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8tL2csIFwiL1wiKS5yZXBsYWNlKC9ULywgXCIgXCIpO1xuICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgY29udGludWU7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtZHN2L2lzc3Vlcy80NVxudmFyIGZpeHR6ID0gbmV3IERhdGUoXCIyMDE5LTAxLTAxVDAwOjAwXCIpLmdldEhvdXJzKCkgfHwgbmV3IERhdGUoXCIyMDE5LTA3LTAxVDAwOjAwXCIpLmdldEhvdXJzKCk7IiwiZXhwb3J0IHtkZWZhdWx0IGFzIGRzdkZvcm1hdH0gZnJvbSBcIi4vZHN2LmpzXCI7XG5leHBvcnQge2NzdlBhcnNlLCBjc3ZQYXJzZVJvd3MsIGNzdkZvcm1hdCwgY3N2Rm9ybWF0Qm9keSwgY3N2Rm9ybWF0Um93cywgY3N2Rm9ybWF0Um93LCBjc3ZGb3JtYXRWYWx1ZX0gZnJvbSBcIi4vY3N2LmpzXCI7XG5leHBvcnQge3RzdlBhcnNlLCB0c3ZQYXJzZVJvd3MsIHRzdkZvcm1hdCwgdHN2Rm9ybWF0Qm9keSwgdHN2Rm9ybWF0Um93cywgdHN2Rm9ybWF0Um93LCB0c3ZGb3JtYXRWYWx1ZX0gZnJvbSBcIi4vdHN2LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgYXV0b1R5cGV9IGZyb20gXCIuL2F1dG9UeXBlLmpzXCI7XG4iLCJleHBvcnQgZnVuY3Rpb24gbGluZWFyKHQpIHtcbiAgcmV0dXJuICt0O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHF1YWRJbih0KSB7XG4gIHJldHVybiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1YWRPdXQodCkge1xuICByZXR1cm4gdCAqICgyIC0gdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFkSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCA6IC0tdCAqICgyIC0gdCkgKyAxKSAvIDI7XG59XG4iLCJ2YXIgZXhwb25lbnQgPSAzO1xuXG5leHBvcnQgdmFyIHBvbHlJbiA9IChmdW5jdGlvbiBjdXN0b20oZSkge1xuICBlID0gK2U7XG5cbiAgZnVuY3Rpb24gcG9seUluKHQpIHtcbiAgICByZXR1cm4gTWF0aC5wb3codCwgZSk7XG4gIH1cblxuICBwb2x5SW4uZXhwb25lbnQgPSBjdXN0b207XG5cbiAgcmV0dXJuIHBvbHlJbjtcbn0pKGV4cG9uZW50KTtcblxuZXhwb3J0IHZhciBwb2x5T3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShlKSB7XG4gIGUgPSArZTtcblxuICBmdW5jdGlvbiBwb2x5T3V0KHQpIHtcbiAgICByZXR1cm4gMSAtIE1hdGgucG93KDEgLSB0LCBlKTtcbiAgfVxuXG4gIHBvbHlPdXQuZXhwb25lbnQgPSBjdXN0b207XG5cbiAgcmV0dXJuIHBvbHlPdXQ7XG59KShleHBvbmVudCk7XG5cbmV4cG9ydCB2YXIgcG9seUluT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShlKSB7XG4gIGUgPSArZTtcblxuICBmdW5jdGlvbiBwb2x5SW5PdXQodCkge1xuICAgIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IE1hdGgucG93KHQsIGUpIDogMiAtIE1hdGgucG93KDIgLSB0LCBlKSkgLyAyO1xuICB9XG5cbiAgcG9seUluT3V0LmV4cG9uZW50ID0gY3VzdG9tO1xuXG4gIHJldHVybiBwb2x5SW5PdXQ7XG59KShleHBvbmVudCk7XG4iLCJ2YXIgcGkgPSBNYXRoLlBJLFxuICAgIGhhbGZQaSA9IHBpIC8gMjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNpbkluKHQpIHtcbiAgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogaGFsZlBpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpbk91dCh0KSB7XG4gIHJldHVybiBNYXRoLnNpbih0ICogaGFsZlBpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpbkluT3V0KHQpIHtcbiAgcmV0dXJuICgxIC0gTWF0aC5jb3MocGkgKiB0KSkgLyAyO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGV4cEluKHQpIHtcbiAgcmV0dXJuIE1hdGgucG93KDIsIDEwICogdCAtIDEwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cE91dCh0KSB7XG4gIHJldHVybiAxIC0gTWF0aC5wb3coMiwgLTEwICogdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IE1hdGgucG93KDIsIDEwICogdCAtIDEwKSA6IDIgLSBNYXRoLnBvdygyLCAxMCAtIDEwICogdCkpIC8gMjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjaXJjbGVJbih0KSB7XG4gIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaXJjbGVPdXQodCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KDEgLSAtLXQgKiB0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNpcmNsZUluT3V0KHQpIHtcbiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpIDogTWF0aC5zcXJ0KDEgLSAodCAtPSAyKSAqIHQpICsgMSkgLyAyO1xufVxuIiwidmFyIGIxID0gNCAvIDExLFxuICAgIGIyID0gNiAvIDExLFxuICAgIGIzID0gOCAvIDExLFxuICAgIGI0ID0gMyAvIDQsXG4gICAgYjUgPSA5IC8gMTEsXG4gICAgYjYgPSAxMCAvIDExLFxuICAgIGI3ID0gMTUgLyAxNixcbiAgICBiOCA9IDIxIC8gMjIsXG4gICAgYjkgPSA2MyAvIDY0LFxuICAgIGIwID0gMSAvIGIxIC8gYjE7XG5cbmV4cG9ydCBmdW5jdGlvbiBib3VuY2VJbih0KSB7XG4gIHJldHVybiAxIC0gYm91bmNlT3V0KDEgLSB0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJvdW5jZU91dCh0KSB7XG4gIHJldHVybiAodCA9ICt0KSA8IGIxID8gYjAgKiB0ICogdCA6IHQgPCBiMyA/IGIwICogKHQgLT0gYjIpICogdCArIGI0IDogdCA8IGI2ID8gYjAgKiAodCAtPSBiNSkgKiB0ICsgYjcgOiBiMCAqICh0IC09IGI4KSAqIHQgKyBiOTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJvdW5jZUluT3V0KHQpIHtcbiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gMSAtIGJvdW5jZU91dCgxIC0gdCkgOiBib3VuY2VPdXQodCAtIDEpICsgMSkgLyAyO1xufVxuIiwidmFyIG92ZXJzaG9vdCA9IDEuNzAxNTg7XG5cbmV4cG9ydCB2YXIgYmFja0luID0gKGZ1bmN0aW9uIGN1c3RvbShzKSB7XG4gIHMgPSArcztcblxuICBmdW5jdGlvbiBiYWNrSW4odCkge1xuICAgIHJldHVybiB0ICogdCAqICgocyArIDEpICogdCAtIHMpO1xuICB9XG5cbiAgYmFja0luLm92ZXJzaG9vdCA9IGN1c3RvbTtcblxuICByZXR1cm4gYmFja0luO1xufSkob3ZlcnNob290KTtcblxuZXhwb3J0IHZhciBiYWNrT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShzKSB7XG4gIHMgPSArcztcblxuICBmdW5jdGlvbiBiYWNrT3V0KHQpIHtcbiAgICByZXR1cm4gLS10ICogdCAqICgocyArIDEpICogdCArIHMpICsgMTtcbiAgfVxuXG4gIGJhY2tPdXQub3ZlcnNob290ID0gY3VzdG9tO1xuXG4gIHJldHVybiBiYWNrT3V0O1xufSkob3ZlcnNob290KTtcblxuZXhwb3J0IHZhciBiYWNrSW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHtcbiAgcyA9ICtzO1xuXG4gIGZ1bmN0aW9uIGJhY2tJbk91dCh0KSB7XG4gICAgcmV0dXJuICgodCAqPSAyKSA8IDEgPyB0ICogdCAqICgocyArIDEpICogdCAtIHMpIDogKHQgLT0gMikgKiB0ICogKChzICsgMSkgKiB0ICsgcykgKyAyKSAvIDI7XG4gIH1cblxuICBiYWNrSW5PdXQub3ZlcnNob290ID0gY3VzdG9tO1xuXG4gIHJldHVybiBiYWNrSW5PdXQ7XG59KShvdmVyc2hvb3QpO1xuIiwidmFyIHRhdSA9IDIgKiBNYXRoLlBJLFxuICAgIGFtcGxpdHVkZSA9IDEsXG4gICAgcGVyaW9kID0gMC4zO1xuXG5leHBvcnQgdmFyIGVsYXN0aWNJbiA9IChmdW5jdGlvbiBjdXN0b20oYSwgcCkge1xuICB2YXIgcyA9IE1hdGguYXNpbigxIC8gKGEgPSBNYXRoLm1heCgxLCBhKSkpICogKHAgLz0gdGF1KTtcblxuICBmdW5jdGlvbiBlbGFzdGljSW4odCkge1xuICAgIHJldHVybiBhICogTWF0aC5wb3coMiwgMTAgKiAtLXQpICogTWF0aC5zaW4oKHMgLSB0KSAvIHApO1xuICB9XG5cbiAgZWxhc3RpY0luLmFtcGxpdHVkZSA9IGZ1bmN0aW9uKGEpIHsgcmV0dXJuIGN1c3RvbShhLCBwICogdGF1KTsgfTtcbiAgZWxhc3RpY0luLnBlcmlvZCA9IGZ1bmN0aW9uKHApIHsgcmV0dXJuIGN1c3RvbShhLCBwKTsgfTtcblxuICByZXR1cm4gZWxhc3RpY0luO1xufSkoYW1wbGl0dWRlLCBwZXJpb2QpO1xuXG5leHBvcnQgdmFyIGVsYXN0aWNPdXQgPSAoZnVuY3Rpb24gY3VzdG9tKGEsIHApIHtcbiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7XG5cbiAgZnVuY3Rpb24gZWxhc3RpY091dCh0KSB7XG4gICAgcmV0dXJuIDEgLSBhICogTWF0aC5wb3coMiwgLTEwICogKHQgPSArdCkpICogTWF0aC5zaW4oKHQgKyBzKSAvIHApO1xuICB9XG5cbiAgZWxhc3RpY091dC5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07XG4gIGVsYXN0aWNPdXQucGVyaW9kID0gZnVuY3Rpb24ocCkgeyByZXR1cm4gY3VzdG9tKGEsIHApOyB9O1xuXG4gIHJldHVybiBlbGFzdGljT3V0O1xufSkoYW1wbGl0dWRlLCBwZXJpb2QpO1xuXG5leHBvcnQgdmFyIGVsYXN0aWNJbk91dCA9IChmdW5jdGlvbiBjdXN0b20oYSwgcCkge1xuICB2YXIgcyA9IE1hdGguYXNpbigxIC8gKGEgPSBNYXRoLm1heCgxLCBhKSkpICogKHAgLz0gdGF1KTtcblxuICBmdW5jdGlvbiBlbGFzdGljSW5PdXQodCkge1xuICAgIHJldHVybiAoKHQgPSB0ICogMiAtIDEpIDwgMFxuICAgICAgICA/IGEgKiBNYXRoLnBvdygyLCAxMCAqIHQpICogTWF0aC5zaW4oKHMgLSB0KSAvIHApXG4gICAgICAgIDogMiAtIGEgKiBNYXRoLnBvdygyLCAtMTAgKiB0KSAqIE1hdGguc2luKChzICsgdCkgLyBwKSkgLyAyO1xuICB9XG5cbiAgZWxhc3RpY0luT3V0LmFtcGxpdHVkZSA9IGZ1bmN0aW9uKGEpIHsgcmV0dXJuIGN1c3RvbShhLCBwICogdGF1KTsgfTtcbiAgZWxhc3RpY0luT3V0LnBlcmlvZCA9IGZ1bmN0aW9uKHApIHsgcmV0dXJuIGN1c3RvbShhLCBwKTsgfTtcblxuICByZXR1cm4gZWxhc3RpY0luT3V0O1xufSkoYW1wbGl0dWRlLCBwZXJpb2QpO1xuIiwiZXhwb3J0IHtcbiAgbGluZWFyIGFzIGVhc2VMaW5lYXJcbn0gZnJvbSBcIi4vbGluZWFyLmpzXCI7XG5cbmV4cG9ydCB7XG4gIHF1YWRJbk91dCBhcyBlYXNlUXVhZCxcbiAgcXVhZEluIGFzIGVhc2VRdWFkSW4sXG4gIHF1YWRPdXQgYXMgZWFzZVF1YWRPdXQsXG4gIHF1YWRJbk91dCBhcyBlYXNlUXVhZEluT3V0XG59IGZyb20gXCIuL3F1YWQuanNcIjtcblxuZXhwb3J0IHtcbiAgY3ViaWNJbk91dCBhcyBlYXNlQ3ViaWMsXG4gIGN1YmljSW4gYXMgZWFzZUN1YmljSW4sXG4gIGN1YmljT3V0IGFzIGVhc2VDdWJpY091dCxcbiAgY3ViaWNJbk91dCBhcyBlYXNlQ3ViaWNJbk91dFxufSBmcm9tIFwiLi9jdWJpYy5qc1wiO1xuXG5leHBvcnQge1xuICBwb2x5SW5PdXQgYXMgZWFzZVBvbHksXG4gIHBvbHlJbiBhcyBlYXNlUG9seUluLFxuICBwb2x5T3V0IGFzIGVhc2VQb2x5T3V0LFxuICBwb2x5SW5PdXQgYXMgZWFzZVBvbHlJbk91dFxufSBmcm9tIFwiLi9wb2x5LmpzXCI7XG5cbmV4cG9ydCB7XG4gIHNpbkluT3V0IGFzIGVhc2VTaW4sXG4gIHNpbkluIGFzIGVhc2VTaW5JbixcbiAgc2luT3V0IGFzIGVhc2VTaW5PdXQsXG4gIHNpbkluT3V0IGFzIGVhc2VTaW5Jbk91dFxufSBmcm9tIFwiLi9zaW4uanNcIjtcblxuZXhwb3J0IHtcbiAgZXhwSW5PdXQgYXMgZWFzZUV4cCxcbiAgZXhwSW4gYXMgZWFzZUV4cEluLFxuICBleHBPdXQgYXMgZWFzZUV4cE91dCxcbiAgZXhwSW5PdXQgYXMgZWFzZUV4cEluT3V0XG59IGZyb20gXCIuL2V4cC5qc1wiO1xuXG5leHBvcnQge1xuICBjaXJjbGVJbk91dCBhcyBlYXNlQ2lyY2xlLFxuICBjaXJjbGVJbiBhcyBlYXNlQ2lyY2xlSW4sXG4gIGNpcmNsZU91dCBhcyBlYXNlQ2lyY2xlT3V0LFxuICBjaXJjbGVJbk91dCBhcyBlYXNlQ2lyY2xlSW5PdXRcbn0gZnJvbSBcIi4vY2lyY2xlLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGJvdW5jZU91dCBhcyBlYXNlQm91bmNlLFxuICBib3VuY2VJbiBhcyBlYXNlQm91bmNlSW4sXG4gIGJvdW5jZU91dCBhcyBlYXNlQm91bmNlT3V0LFxuICBib3VuY2VJbk91dCBhcyBlYXNlQm91bmNlSW5PdXRcbn0gZnJvbSBcIi4vYm91bmNlLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGJhY2tJbk91dCBhcyBlYXNlQmFjayxcbiAgYmFja0luIGFzIGVhc2VCYWNrSW4sXG4gIGJhY2tPdXQgYXMgZWFzZUJhY2tPdXQsXG4gIGJhY2tJbk91dCBhcyBlYXNlQmFja0luT3V0XG59IGZyb20gXCIuL2JhY2suanNcIjtcblxuZXhwb3J0IHtcbiAgZWxhc3RpY091dCBhcyBlYXNlRWxhc3RpYyxcbiAgZWxhc3RpY0luIGFzIGVhc2VFbGFzdGljSW4sXG4gIGVsYXN0aWNPdXQgYXMgZWFzZUVsYXN0aWNPdXQsXG4gIGVsYXN0aWNJbk91dCBhcyBlYXNlRWxhc3RpY0luT3V0XG59IGZyb20gXCIuL2VsYXN0aWMuanNcIjtcbiIsImZ1bmN0aW9uIHJlc3BvbnNlQmxvYihyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgXCIgXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgcmV0dXJuIHJlc3BvbnNlLmJsb2IoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlQmxvYik7XG59XG4iLCJmdW5jdGlvbiByZXNwb25zZUFycmF5QnVmZmVyKHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyBcIiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlQXJyYXlCdWZmZXIpO1xufVxuIiwiZnVuY3Rpb24gcmVzcG9uc2VUZXh0KHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyBcIiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VUZXh0KTtcbn1cbiIsImltcG9ydCB7Y3N2UGFyc2UsIGRzdkZvcm1hdCwgdHN2UGFyc2V9IGZyb20gXCJkMy1kc3ZcIjtcbmltcG9ydCB0ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcblxuZnVuY3Rpb24gZHN2UGFyc2UocGFyc2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBpbml0LCByb3cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcGFyc2UocmVzcG9uc2UsIHJvdyk7XG4gICAgfSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRzdihkZWxpbWl0ZXIsIGlucHV0LCBpbml0LCByb3cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIGluaXQgPT09IFwiZnVuY3Rpb25cIikgcm93ID0gaW5pdCwgaW5pdCA9IHVuZGVmaW5lZDtcbiAgdmFyIGZvcm1hdCA9IGRzdkZvcm1hdChkZWxpbWl0ZXIpO1xuICByZXR1cm4gdGV4dChpbnB1dCwgaW5pdCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgIHJldHVybiBmb3JtYXQucGFyc2UocmVzcG9uc2UsIHJvdyk7XG4gIH0pO1xufVxuXG5leHBvcnQgdmFyIGNzdiA9IGRzdlBhcnNlKGNzdlBhcnNlKTtcbmV4cG9ydCB2YXIgdHN2ID0gZHN2UGFyc2UodHN2UGFyc2UpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZTtcbiAgICBmb3IgKHZhciBrZXkgaW4gaW5pdCkgaW1hZ2Vba2V5XSA9IGluaXRba2V5XTtcbiAgICBpbWFnZS5vbmVycm9yID0gcmVqZWN0O1xuICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkgeyByZXNvbHZlKGltYWdlKTsgfTtcbiAgICBpbWFnZS5zcmMgPSBpbnB1dDtcbiAgfSk7XG59XG4iLCJmdW5jdGlvbiByZXNwb25zZUpzb24ocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyArIFwiIFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNSkgcmV0dXJuO1xuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VKc29uKTtcbn1cbiIsImltcG9ydCB0ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcblxuZnVuY3Rpb24gcGFyc2VyKHR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBpbml0KSAge1xuICAgIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiAobmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHRleHQsIHR5cGUpO1xuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZXIoXCJhcHBsaWNhdGlvbi94bWxcIik7XG5cbmV4cG9ydCB2YXIgaHRtbCA9IHBhcnNlcihcInRleHQvaHRtbFwiKTtcblxuZXhwb3J0IHZhciBzdmcgPSBwYXJzZXIoXCJpbWFnZS9zdmcreG1sXCIpO1xuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGJsb2J9IGZyb20gXCIuL2Jsb2IuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBidWZmZXJ9IGZyb20gXCIuL2J1ZmZlci5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGRzdiwgY3N2LCB0c3Z9IGZyb20gXCIuL2Rzdi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGltYWdlfSBmcm9tIFwiLi9pbWFnZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGpzb259IGZyb20gXCIuL2pzb24uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0ZXh0fSBmcm9tIFwiLi90ZXh0LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgeG1sLCBodG1sLCBzdmd9IGZyb20gXCIuL3htbC5qc1wiO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgeSkge1xuICB2YXIgbm9kZXM7XG5cbiAgaWYgKHggPT0gbnVsbCkgeCA9IDA7XG4gIGlmICh5ID09IG51bGwpIHkgPSAwO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKCkge1xuICAgIHZhciBpLFxuICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICBub2RlLFxuICAgICAgICBzeCA9IDAsXG4gICAgICAgIHN5ID0gMDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgc3ggKz0gbm9kZS54LCBzeSArPSBub2RlLnk7XG4gICAgfVxuXG4gICAgZm9yIChzeCA9IHN4IC8gbiAtIHgsIHN5ID0gc3kgLyBuIC0geSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS54IC09IHN4LCBub2RlLnkgLT0gc3k7XG4gICAgfVxuICB9XG5cbiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBub2RlcyA9IF87XG4gIH07XG5cbiAgZm9yY2UueCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gK18sIGZvcmNlKSA6IHg7XG4gIH07XG5cbiAgZm9yY2UueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gK18sIGZvcmNlKSA6IHk7XG4gIH07XG5cbiAgcmV0dXJuIGZvcmNlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDFlLTY7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkKSB7XG4gIHZhciB4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkKSxcbiAgICAgIHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpO1xuICByZXR1cm4gYWRkKHRoaXMuY292ZXIoeCwgeSksIHgsIHksIGQpO1xufVxuXG5mdW5jdGlvbiBhZGQodHJlZSwgeCwgeSwgZCkge1xuICBpZiAoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIHJldHVybiB0cmVlOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHNcblxuICB2YXIgcGFyZW50LFxuICAgICAgbm9kZSA9IHRyZWUuX3Jvb3QsXG4gICAgICBsZWFmID0ge2RhdGE6IGR9LFxuICAgICAgeDAgPSB0cmVlLl94MCxcbiAgICAgIHkwID0gdHJlZS5feTAsXG4gICAgICB4MSA9IHRyZWUuX3gxLFxuICAgICAgeTEgPSB0cmVlLl95MSxcbiAgICAgIHhtLFxuICAgICAgeW0sXG4gICAgICB4cCxcbiAgICAgIHlwLFxuICAgICAgcmlnaHQsXG4gICAgICBib3R0b20sXG4gICAgICBpLFxuICAgICAgajtcblxuICAvLyBJZiB0aGUgdHJlZSBpcyBlbXB0eSwgaW5pdGlhbGl6ZSB0aGUgcm9vdCBhcyBhIGxlYWYuXG4gIGlmICghbm9kZSkgcmV0dXJuIHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlO1xuXG4gIC8vIEZpbmQgdGhlIGV4aXN0aW5nIGxlYWYgZm9yIHRoZSBuZXcgcG9pbnQsIG9yIGFkZCBpdC5cbiAgd2hpbGUgKG5vZGUubGVuZ3RoKSB7XG4gICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtO1xuICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07XG4gICAgaWYgKHBhcmVudCA9IG5vZGUsICEobm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHBhcmVudFtpXSA9IGxlYWYsIHRyZWU7XG4gIH1cblxuICAvLyBJcyB0aGUgbmV3IHBvaW50IGlzIGV4YWN0bHkgY29pbmNpZGVudCB3aXRoIHRoZSBleGlzdGluZyBwb2ludD9cbiAgeHAgPSArdHJlZS5feC5jYWxsKG51bGwsIG5vZGUuZGF0YSk7XG4gIHlwID0gK3RyZWUuX3kuY2FsbChudWxsLCBub2RlLmRhdGEpO1xuICBpZiAoeCA9PT0geHAgJiYgeSA9PT0geXApIHJldHVybiBsZWFmLm5leHQgPSBub2RlLCBwYXJlbnQgPyBwYXJlbnRbaV0gPSBsZWFmIDogdHJlZS5fcm9vdCA9IGxlYWYsIHRyZWU7XG5cbiAgLy8gT3RoZXJ3aXNlLCBzcGxpdCB0aGUgbGVhZiBub2RlIHVudGlsIHRoZSBvbGQgYW5kIG5ldyBwb2ludCBhcmUgc2VwYXJhdGVkLlxuICBkbyB7XG4gICAgcGFyZW50ID0gcGFyZW50ID8gcGFyZW50W2ldID0gbmV3IEFycmF5KDQpIDogdHJlZS5fcm9vdCA9IG5ldyBBcnJheSg0KTtcbiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07XG4gICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTtcbiAgfSB3aGlsZSAoKGkgPSBib3R0b20gPDwgMSB8IHJpZ2h0KSA9PT0gKGogPSAoeXAgPj0geW0pIDw8IDEgfCAoeHAgPj0geG0pKSk7XG4gIHJldHVybiBwYXJlbnRbal0gPSBub2RlLCBwYXJlbnRbaV0gPSBsZWFmLCB0cmVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQWxsKGRhdGEpIHtcbiAgdmFyIGQsIGksIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeHogPSBuZXcgQXJyYXkobiksXG4gICAgICB5eiA9IG5ldyBBcnJheShuKSxcbiAgICAgIHgwID0gSW5maW5pdHksXG4gICAgICB5MCA9IEluZmluaXR5LFxuICAgICAgeDEgPSAtSW5maW5pdHksXG4gICAgICB5MSA9IC1JbmZpbml0eTtcblxuICAvLyBDb21wdXRlIHRoZSBwb2ludHMgYW5kIHRoZWlyIGV4dGVudC5cbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgIGlmIChpc05hTih4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkID0gZGF0YVtpXSkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpKSkgY29udGludWU7XG4gICAgeHpbaV0gPSB4O1xuICAgIHl6W2ldID0geTtcbiAgICBpZiAoeCA8IHgwKSB4MCA9IHg7XG4gICAgaWYgKHggPiB4MSkgeDEgPSB4O1xuICAgIGlmICh5IDwgeTApIHkwID0geTtcbiAgICBpZiAoeSA+IHkxKSB5MSA9IHk7XG4gIH1cblxuICAvLyBJZiB0aGVyZSB3ZXJlIG5vICh2YWxpZCkgcG9pbnRzLCBhYm9ydC5cbiAgaWYgKHgwID4geDEgfHwgeTAgPiB5MSkgcmV0dXJuIHRoaXM7XG5cbiAgLy8gRXhwYW5kIHRoZSB0cmVlIHRvIGNvdmVyIHRoZSBuZXcgcG9pbnRzLlxuICB0aGlzLmNvdmVyKHgwLCB5MCkuY292ZXIoeDEsIHkxKTtcblxuICAvLyBBZGQgdGhlIG5ldyBwb2ludHMuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBhZGQodGhpcywgeHpbaV0sIHl6W2ldLCBkYXRhW2ldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgeSkge1xuICBpZiAoaXNOYU4oeCA9ICt4KSB8fCBpc05hTih5ID0gK3kpKSByZXR1cm4gdGhpczsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzXG5cbiAgdmFyIHgwID0gdGhpcy5feDAsXG4gICAgICB5MCA9IHRoaXMuX3kwLFxuICAgICAgeDEgPSB0aGlzLl94MSxcbiAgICAgIHkxID0gdGhpcy5feTE7XG5cbiAgLy8gSWYgdGhlIHF1YWR0cmVlIGhhcyBubyBleHRlbnQsIGluaXRpYWxpemUgdGhlbS5cbiAgLy8gSW50ZWdlciBleHRlbnQgYXJlIG5lY2Vzc2FyeSBzbyB0aGF0IGlmIHdlIGxhdGVyIGRvdWJsZSB0aGUgZXh0ZW50LFxuICAvLyB0aGUgZXhpc3RpbmcgcXVhZHJhbnQgYm91bmRhcmllcyBkb27igJl0IGNoYW5nZSBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgZXJyb3IhXG4gIGlmIChpc05hTih4MCkpIHtcbiAgICB4MSA9ICh4MCA9IE1hdGguZmxvb3IoeCkpICsgMTtcbiAgICB5MSA9ICh5MCA9IE1hdGguZmxvb3IoeSkpICsgMTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwgZG91YmxlIHJlcGVhdGVkbHkgdG8gY292ZXIuXG4gIGVsc2Uge1xuICAgIHZhciB6ID0geDEgLSB4MCxcbiAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgaTtcblxuICAgIHdoaWxlICh4MCA+IHggfHwgeCA+PSB4MSB8fCB5MCA+IHkgfHwgeSA+PSB5MSkge1xuICAgICAgaSA9ICh5IDwgeTApIDw8IDEgfCAoeCA8IHgwKTtcbiAgICAgIHBhcmVudCA9IG5ldyBBcnJheSg0KSwgcGFyZW50W2ldID0gbm9kZSwgbm9kZSA9IHBhcmVudCwgeiAqPSAyO1xuICAgICAgc3dpdGNoIChpKSB7XG4gICAgICAgIGNhc2UgMDogeDEgPSB4MCArIHosIHkxID0geTAgKyB6OyBicmVhaztcbiAgICAgICAgY2FzZSAxOiB4MCA9IHgxIC0geiwgeTEgPSB5MCArIHo7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IHgxID0geDAgKyB6LCB5MCA9IHkxIC0gejsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogeDAgPSB4MSAtIHosIHkwID0geTEgLSB6OyBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lmxlbmd0aCkgdGhpcy5fcm9vdCA9IG5vZGU7XG4gIH1cblxuICB0aGlzLl94MCA9IHgwO1xuICB0aGlzLl95MCA9IHkwO1xuICB0aGlzLl94MSA9IHgxO1xuICB0aGlzLl95MSA9IHkxO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZGF0YSA9IFtdO1xuICB0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUubGVuZ3RoKSBkbyBkYXRhLnB1c2gobm9kZS5kYXRhKTsgd2hpbGUgKG5vZGUgPSBub2RlLm5leHQpXG4gIH0pO1xuICByZXR1cm4gZGF0YTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKF8pIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5jb3ZlcigrX1swXVswXSwgK19bMF1bMV0pLmNvdmVyKCtfWzFdWzBdLCArX1sxXVsxXSlcbiAgICAgIDogaXNOYU4odGhpcy5feDApID8gdW5kZWZpbmVkIDogW1t0aGlzLl94MCwgdGhpcy5feTBdLCBbdGhpcy5feDEsIHRoaXMuX3kxXV07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCB4MCwgeTAsIHgxLCB5MSkge1xuICB0aGlzLm5vZGUgPSBub2RlO1xuICB0aGlzLngwID0geDA7XG4gIHRoaXMueTAgPSB5MDtcbiAgdGhpcy54MSA9IHgxO1xuICB0aGlzLnkxID0geTE7XG59XG4iLCJpbXBvcnQgUXVhZCBmcm9tIFwiLi9xdWFkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHksIHJhZGl1cykge1xuICB2YXIgZGF0YSxcbiAgICAgIHgwID0gdGhpcy5feDAsXG4gICAgICB5MCA9IHRoaXMuX3kwLFxuICAgICAgeDEsXG4gICAgICB5MSxcbiAgICAgIHgyLFxuICAgICAgeTIsXG4gICAgICB4MyA9IHRoaXMuX3gxLFxuICAgICAgeTMgPSB0aGlzLl95MSxcbiAgICAgIHF1YWRzID0gW10sXG4gICAgICBub2RlID0gdGhpcy5fcm9vdCxcbiAgICAgIHEsXG4gICAgICBpO1xuXG4gIGlmIChub2RlKSBxdWFkcy5wdXNoKG5ldyBRdWFkKG5vZGUsIHgwLCB5MCwgeDMsIHkzKSk7XG4gIGlmIChyYWRpdXMgPT0gbnVsbCkgcmFkaXVzID0gSW5maW5pdHk7XG4gIGVsc2Uge1xuICAgIHgwID0geCAtIHJhZGl1cywgeTAgPSB5IC0gcmFkaXVzO1xuICAgIHgzID0geCArIHJhZGl1cywgeTMgPSB5ICsgcmFkaXVzO1xuICAgIHJhZGl1cyAqPSByYWRpdXM7XG4gIH1cblxuICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7XG5cbiAgICAvLyBTdG9wIHNlYXJjaGluZyBpZiB0aGlzIHF1YWRyYW50IGNhbuKAmXQgY29udGFpbiBhIGNsb3NlciBub2RlLlxuICAgIGlmICghKG5vZGUgPSBxLm5vZGUpXG4gICAgICAgIHx8ICh4MSA9IHEueDApID4geDNcbiAgICAgICAgfHwgKHkxID0gcS55MCkgPiB5M1xuICAgICAgICB8fCAoeDIgPSBxLngxKSA8IHgwXG4gICAgICAgIHx8ICh5MiA9IHEueTEpIDwgeTApIGNvbnRpbnVlO1xuXG4gICAgLy8gQmlzZWN0IHRoZSBjdXJyZW50IHF1YWRyYW50LlxuICAgIGlmIChub2RlLmxlbmd0aCkge1xuICAgICAgdmFyIHhtID0gKHgxICsgeDIpIC8gMixcbiAgICAgICAgICB5bSA9ICh5MSArIHkyKSAvIDI7XG5cbiAgICAgIHF1YWRzLnB1c2goXG4gICAgICAgIG5ldyBRdWFkKG5vZGVbM10sIHhtLCB5bSwgeDIsIHkyKSxcbiAgICAgICAgbmV3IFF1YWQobm9kZVsyXSwgeDEsIHltLCB4bSwgeTIpLFxuICAgICAgICBuZXcgUXVhZChub2RlWzFdLCB4bSwgeTEsIHgyLCB5bSksXG4gICAgICAgIG5ldyBRdWFkKG5vZGVbMF0sIHgxLCB5MSwgeG0sIHltKVxuICAgICAgKTtcblxuICAgICAgLy8gVmlzaXQgdGhlIGNsb3Nlc3QgcXVhZHJhbnQgZmlyc3QuXG4gICAgICBpZiAoaSA9ICh5ID49IHltKSA8PCAxIHwgKHggPj0geG0pKSB7XG4gICAgICAgIHEgPSBxdWFkc1txdWFkcy5sZW5ndGggLSAxXTtcbiAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV0gPSBxdWFkc1txdWFkcy5sZW5ndGggLSAxIC0gaV07XG4gICAgICAgIHF1YWRzW3F1YWRzLmxlbmd0aCAtIDEgLSBpXSA9IHE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmlzaXQgdGhpcyBwb2ludC4gKFZpc2l0aW5nIGNvaW5jaWRlbnQgcG9pbnRzIGlzbuKAmXQgbmVjZXNzYXJ5ISlcbiAgICBlbHNlIHtcbiAgICAgIHZhciBkeCA9IHggLSArdGhpcy5feC5jYWxsKG51bGwsIG5vZGUuZGF0YSksXG4gICAgICAgICAgZHkgPSB5IC0gK3RoaXMuX3kuY2FsbChudWxsLCBub2RlLmRhdGEpLFxuICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICBpZiAoZDIgPCByYWRpdXMpIHtcbiAgICAgICAgdmFyIGQgPSBNYXRoLnNxcnQocmFkaXVzID0gZDIpO1xuICAgICAgICB4MCA9IHggLSBkLCB5MCA9IHkgLSBkO1xuICAgICAgICB4MyA9IHggKyBkLCB5MyA9IHkgKyBkO1xuICAgICAgICBkYXRhID0gbm9kZS5kYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICBpZiAoaXNOYU4oeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpKSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50c1xuXG4gIHZhciBwYXJlbnQsXG4gICAgICBub2RlID0gdGhpcy5fcm9vdCxcbiAgICAgIHJldGFpbmVyLFxuICAgICAgcHJldmlvdXMsXG4gICAgICBuZXh0LFxuICAgICAgeDAgPSB0aGlzLl94MCxcbiAgICAgIHkwID0gdGhpcy5feTAsXG4gICAgICB4MSA9IHRoaXMuX3gxLFxuICAgICAgeTEgPSB0aGlzLl95MSxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeG0sXG4gICAgICB5bSxcbiAgICAgIHJpZ2h0LFxuICAgICAgYm90dG9tLFxuICAgICAgaSxcbiAgICAgIGo7XG5cbiAgLy8gSWYgdGhlIHRyZWUgaXMgZW1wdHksIGluaXRpYWxpemUgdGhlIHJvb3QgYXMgYSBsZWFmLlxuICBpZiAoIW5vZGUpIHJldHVybiB0aGlzO1xuXG4gIC8vIEZpbmQgdGhlIGxlYWYgbm9kZSBmb3IgdGhlIHBvaW50LlxuICAvLyBXaGlsZSBkZXNjZW5kaW5nLCBhbHNvIHJldGFpbiB0aGUgZGVlcGVzdCBwYXJlbnQgd2l0aCBhIG5vbi1yZW1vdmVkIHNpYmxpbmcuXG4gIGlmIChub2RlLmxlbmd0aCkgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07XG4gICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTtcbiAgICBpZiAoIShwYXJlbnQgPSBub2RlLCBub2RlID0gbm9kZVtpID0gYm90dG9tIDw8IDEgfCByaWdodF0pKSByZXR1cm4gdGhpcztcbiAgICBpZiAoIW5vZGUubGVuZ3RoKSBicmVhaztcbiAgICBpZiAocGFyZW50WyhpICsgMSkgJiAzXSB8fCBwYXJlbnRbKGkgKyAyKSAmIDNdIHx8IHBhcmVudFsoaSArIDMpICYgM10pIHJldGFpbmVyID0gcGFyZW50LCBqID0gaTtcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIHBvaW50IHRvIHJlbW92ZS5cbiAgd2hpbGUgKG5vZGUuZGF0YSAhPT0gZCkgaWYgKCEocHJldmlvdXMgPSBub2RlLCBub2RlID0gbm9kZS5uZXh0KSkgcmV0dXJuIHRoaXM7XG4gIGlmIChuZXh0ID0gbm9kZS5uZXh0KSBkZWxldGUgbm9kZS5uZXh0O1xuXG4gIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb2luY2lkZW50IHBvaW50cywgcmVtb3ZlIGp1c3QgdGhlIHBvaW50LlxuICBpZiAocHJldmlvdXMpIHJldHVybiAobmV4dCA/IHByZXZpb3VzLm5leHQgPSBuZXh0IDogZGVsZXRlIHByZXZpb3VzLm5leHQpLCB0aGlzO1xuXG4gIC8vIElmIHRoaXMgaXMgdGhlIHJvb3QgcG9pbnQsIHJlbW92ZSBpdC5cbiAgaWYgKCFwYXJlbnQpIHJldHVybiB0aGlzLl9yb290ID0gbmV4dCwgdGhpcztcblxuICAvLyBSZW1vdmUgdGhpcyBsZWFmLlxuICBuZXh0ID8gcGFyZW50W2ldID0gbmV4dCA6IGRlbGV0ZSBwYXJlbnRbaV07XG5cbiAgLy8gSWYgdGhlIHBhcmVudCBub3cgY29udGFpbnMgZXhhY3RseSBvbmUgbGVhZiwgY29sbGFwc2Ugc3VwZXJmbHVvdXMgcGFyZW50cy5cbiAgaWYgKChub2RlID0gcGFyZW50WzBdIHx8IHBhcmVudFsxXSB8fCBwYXJlbnRbMl0gfHwgcGFyZW50WzNdKVxuICAgICAgJiYgbm9kZSA9PT0gKHBhcmVudFszXSB8fCBwYXJlbnRbMl0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFswXSlcbiAgICAgICYmICFub2RlLmxlbmd0aCkge1xuICAgIGlmIChyZXRhaW5lcikgcmV0YWluZXJbal0gPSBub2RlO1xuICAgIGVsc2UgdGhpcy5fcm9vdCA9IG5vZGU7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFsbChkYXRhKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gZGF0YS5sZW5ndGg7IGkgPCBuOyArK2kpIHRoaXMucmVtb3ZlKGRhdGFbaV0pO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fcm9vdDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgc2l6ZSA9IDA7XG4gIHRoaXMudmlzaXQoZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghbm9kZS5sZW5ndGgpIGRvICsrc2l6ZTsgd2hpbGUgKG5vZGUgPSBub2RlLm5leHQpXG4gIH0pO1xuICByZXR1cm4gc2l6ZTtcbn1cbiIsImltcG9ydCBRdWFkIGZyb20gXCIuL3F1YWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIHF1YWRzID0gW10sIHEsIG5vZGUgPSB0aGlzLl9yb290LCBjaGlsZCwgeDAsIHkwLCB4MSwgeTE7XG4gIGlmIChub2RlKSBxdWFkcy5wdXNoKG5ldyBRdWFkKG5vZGUsIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMuX3kxKSk7XG4gIHdoaWxlIChxID0gcXVhZHMucG9wKCkpIHtcbiAgICBpZiAoIWNhbGxiYWNrKG5vZGUgPSBxLm5vZGUsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSkgJiYgbm9kZS5sZW5ndGgpIHtcbiAgICAgIHZhciB4bSA9ICh4MCArIHgxKSAvIDIsIHltID0gKHkwICsgeTEpIC8gMjtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbM10pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5bSwgeDEsIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzJdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeW0sIHhtLCB5MSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMF0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5MCwgeG0sIHltKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgcXVhZHMgPSBbXSwgbmV4dCA9IFtdLCBxO1xuICBpZiAodGhpcy5fcm9vdCkgcXVhZHMucHVzaChuZXcgUXVhZCh0aGlzLl9yb290LCB0aGlzLl94MCwgdGhpcy5feTAsIHRoaXMuX3gxLCB0aGlzLl95MSkpO1xuICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7XG4gICAgdmFyIG5vZGUgPSBxLm5vZGU7XG4gICAgaWYgKG5vZGUubGVuZ3RoKSB7XG4gICAgICB2YXIgY2hpbGQsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSwgeG0gPSAoeDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzBdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeTAsIHhtLCB5bSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5bSwgeG0sIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzNdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeW0sIHgxLCB5MSkpO1xuICAgIH1cbiAgICBuZXh0LnB1c2gocSk7XG4gIH1cbiAgd2hpbGUgKHEgPSBuZXh0LnBvcCgpKSB7XG4gICAgY2FsbGJhY2socS5ub2RlLCBxLngwLCBxLnkwLCBxLngxLCBxLnkxKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0WChkKSB7XG4gIHJldHVybiBkWzBdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihfKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3ggPSBfLCB0aGlzKSA6IHRoaXMuX3g7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZGVmYXVsdFkoZCkge1xuICByZXR1cm4gZFsxXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXykge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl95ID0gXywgdGhpcykgOiB0aGlzLl95O1xufVxuIiwiaW1wb3J0IHRyZWVfYWRkLCB7YWRkQWxsIGFzIHRyZWVfYWRkQWxsfSBmcm9tIFwiLi9hZGQuanNcIjtcbmltcG9ydCB0cmVlX2NvdmVyIGZyb20gXCIuL2NvdmVyLmpzXCI7XG5pbXBvcnQgdHJlZV9kYXRhIGZyb20gXCIuL2RhdGEuanNcIjtcbmltcG9ydCB0cmVlX2V4dGVudCBmcm9tIFwiLi9leHRlbnQuanNcIjtcbmltcG9ydCB0cmVlX2ZpbmQgZnJvbSBcIi4vZmluZC5qc1wiO1xuaW1wb3J0IHRyZWVfcmVtb3ZlLCB7cmVtb3ZlQWxsIGFzIHRyZWVfcmVtb3ZlQWxsfSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmVlX3Jvb3QgZnJvbSBcIi4vcm9vdC5qc1wiO1xuaW1wb3J0IHRyZWVfc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgdHJlZV92aXNpdCBmcm9tIFwiLi92aXNpdC5qc1wiO1xuaW1wb3J0IHRyZWVfdmlzaXRBZnRlciBmcm9tIFwiLi92aXNpdEFmdGVyLmpzXCI7XG5pbXBvcnQgdHJlZV94LCB7ZGVmYXVsdFh9IGZyb20gXCIuL3guanNcIjtcbmltcG9ydCB0cmVlX3ksIHtkZWZhdWx0WX0gZnJvbSBcIi4veS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFkdHJlZShub2RlcywgeCwgeSkge1xuICB2YXIgdHJlZSA9IG5ldyBRdWFkdHJlZSh4ID09IG51bGwgPyBkZWZhdWx0WCA6IHgsIHkgPT0gbnVsbCA/IGRlZmF1bHRZIDogeSwgTmFOLCBOYU4sIE5hTiwgTmFOKTtcbiAgcmV0dXJuIG5vZGVzID09IG51bGwgPyB0cmVlIDogdHJlZS5hZGRBbGwobm9kZXMpO1xufVxuXG5mdW5jdGlvbiBRdWFkdHJlZSh4LCB5LCB4MCwgeTAsIHgxLCB5MSkge1xuICB0aGlzLl94ID0geDtcbiAgdGhpcy5feSA9IHk7XG4gIHRoaXMuX3gwID0geDA7XG4gIHRoaXMuX3kwID0geTA7XG4gIHRoaXMuX3gxID0geDE7XG4gIHRoaXMuX3kxID0geTE7XG4gIHRoaXMuX3Jvb3QgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGxlYWZfY29weShsZWFmKSB7XG4gIHZhciBjb3B5ID0ge2RhdGE6IGxlYWYuZGF0YX0sIG5leHQgPSBjb3B5O1xuICB3aGlsZSAobGVhZiA9IGxlYWYubmV4dCkgbmV4dCA9IG5leHQubmV4dCA9IHtkYXRhOiBsZWFmLmRhdGF9O1xuICByZXR1cm4gY29weTtcbn1cblxudmFyIHRyZWVQcm90byA9IHF1YWR0cmVlLnByb3RvdHlwZSA9IFF1YWR0cmVlLnByb3RvdHlwZTtcblxudHJlZVByb3RvLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvcHkgPSBuZXcgUXVhZHRyZWUodGhpcy5feCwgdGhpcy5feSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpLFxuICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICBub2RlcyxcbiAgICAgIGNoaWxkO1xuXG4gIGlmICghbm9kZSkgcmV0dXJuIGNvcHk7XG5cbiAgaWYgKCFub2RlLmxlbmd0aCkgcmV0dXJuIGNvcHkuX3Jvb3QgPSBsZWFmX2NvcHkobm9kZSksIGNvcHk7XG5cbiAgbm9kZXMgPSBbe3NvdXJjZTogbm9kZSwgdGFyZ2V0OiBjb3B5Ll9yb290ID0gbmV3IEFycmF5KDQpfV07XG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgaWYgKGNoaWxkID0gbm9kZS5zb3VyY2VbaV0pIHtcbiAgICAgICAgaWYgKGNoaWxkLmxlbmd0aCkgbm9kZXMucHVzaCh7c291cmNlOiBjaGlsZCwgdGFyZ2V0OiBub2RlLnRhcmdldFtpXSA9IG5ldyBBcnJheSg0KX0pO1xuICAgICAgICBlbHNlIG5vZGUudGFyZ2V0W2ldID0gbGVhZl9jb3B5KGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG5cbnRyZWVQcm90by5hZGQgPSB0cmVlX2FkZDtcbnRyZWVQcm90by5hZGRBbGwgPSB0cmVlX2FkZEFsbDtcbnRyZWVQcm90by5jb3ZlciA9IHRyZWVfY292ZXI7XG50cmVlUHJvdG8uZGF0YSA9IHRyZWVfZGF0YTtcbnRyZWVQcm90by5leHRlbnQgPSB0cmVlX2V4dGVudDtcbnRyZWVQcm90by5maW5kID0gdHJlZV9maW5kO1xudHJlZVByb3RvLnJlbW92ZSA9IHRyZWVfcmVtb3ZlO1xudHJlZVByb3RvLnJlbW92ZUFsbCA9IHRyZWVfcmVtb3ZlQWxsO1xudHJlZVByb3RvLnJvb3QgPSB0cmVlX3Jvb3Q7XG50cmVlUHJvdG8uc2l6ZSA9IHRyZWVfc2l6ZTtcbnRyZWVQcm90by52aXNpdCA9IHRyZWVfdmlzaXQ7XG50cmVlUHJvdG8udmlzaXRBZnRlciA9IHRyZWVfdmlzaXRBZnRlcjtcbnRyZWVQcm90by54ID0gdHJlZV94O1xudHJlZVByb3RvLnkgPSB0cmVlX3k7XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCBqaWdnbGUgZnJvbSBcIi4vamlnZ2xlXCI7XG5pbXBvcnQge3F1YWR0cmVlfSBmcm9tIFwiZDMtcXVhZHRyZWVcIjtcblxuZnVuY3Rpb24geChkKSB7XG4gIHJldHVybiBkLnggKyBkLnZ4O1xufVxuXG5mdW5jdGlvbiB5KGQpIHtcbiAgcmV0dXJuIGQueSArIGQudnk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHJhZGl1cykge1xuICB2YXIgbm9kZXMsXG4gICAgICByYWRpaSxcbiAgICAgIHN0cmVuZ3RoID0gMSxcbiAgICAgIGl0ZXJhdGlvbnMgPSAxO1xuXG4gIGlmICh0eXBlb2YgcmFkaXVzICE9PSBcImZ1bmN0aW9uXCIpIHJhZGl1cyA9IGNvbnN0YW50KHJhZGl1cyA9PSBudWxsID8gMSA6ICtyYWRpdXMpO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKCkge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICB0cmVlLFxuICAgICAgICBub2RlLFxuICAgICAgICB4aSxcbiAgICAgICAgeWksXG4gICAgICAgIHJpLFxuICAgICAgICByaTI7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykge1xuICAgICAgdHJlZSA9IHF1YWR0cmVlKG5vZGVzLCB4LCB5KS52aXNpdEFmdGVyKHByZXBhcmUpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHJpID0gcmFkaWlbbm9kZS5pbmRleF0sIHJpMiA9IHJpICogcmk7XG4gICAgICAgIHhpID0gbm9kZS54ICsgbm9kZS52eDtcbiAgICAgICAgeWkgPSBub2RlLnkgKyBub2RlLnZ5O1xuICAgICAgICB0cmVlLnZpc2l0KGFwcGx5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseShxdWFkLCB4MCwgeTAsIHgxLCB5MSkge1xuICAgICAgdmFyIGRhdGEgPSBxdWFkLmRhdGEsIHJqID0gcXVhZC5yLCByID0gcmkgKyByajtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmluZGV4ID4gbm9kZS5pbmRleCkge1xuICAgICAgICAgIHZhciB4ID0geGkgLSBkYXRhLnggLSBkYXRhLnZ4LFxuICAgICAgICAgICAgICB5ID0geWkgLSBkYXRhLnkgLSBkYXRhLnZ5LFxuICAgICAgICAgICAgICBsID0geCAqIHggKyB5ICogeTtcbiAgICAgICAgICBpZiAobCA8IHIgKiByKSB7XG4gICAgICAgICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZSgpLCBsICs9IHggKiB4O1xuICAgICAgICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUoKSwgbCArPSB5ICogeTtcbiAgICAgICAgICAgIGwgPSAociAtIChsID0gTWF0aC5zcXJ0KGwpKSkgLyBsICogc3RyZW5ndGg7XG4gICAgICAgICAgICBub2RlLnZ4ICs9ICh4ICo9IGwpICogKHIgPSAocmogKj0gcmopIC8gKHJpMiArIHJqKSk7XG4gICAgICAgICAgICBub2RlLnZ5ICs9ICh5ICo9IGwpICogcjtcbiAgICAgICAgICAgIGRhdGEudnggLT0geCAqIChyID0gMSAtIHIpO1xuICAgICAgICAgICAgZGF0YS52eSAtPSB5ICogcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHgwID4geGkgKyByIHx8IHgxIDwgeGkgLSByIHx8IHkwID4geWkgKyByIHx8IHkxIDwgeWkgLSByO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmUocXVhZCkge1xuICAgIGlmIChxdWFkLmRhdGEpIHJldHVybiBxdWFkLnIgPSByYWRpaVtxdWFkLmRhdGEuaW5kZXhdO1xuICAgIGZvciAodmFyIGkgPSBxdWFkLnIgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICBpZiAocXVhZFtpXSAmJiBxdWFkW2ldLnIgPiBxdWFkLnIpIHtcbiAgICAgICAgcXVhZC5yID0gcXVhZFtpXS5yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuICAgIHJhZGlpID0gbmV3IEFycmF5KG4pO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgcmFkaWlbbm9kZS5pbmRleF0gPSArcmFkaXVzKG5vZGUsIGksIG5vZGVzKTtcbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgbm9kZXMgPSBfO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5pdGVyYXRpb25zID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2UpIDogaXRlcmF0aW9ucztcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9ICtfLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogcmFkaXVzO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IGppZ2dsZSBmcm9tIFwiLi9qaWdnbGVcIjtcbmltcG9ydCB7bWFwfSBmcm9tIFwiZDMtY29sbGVjdGlvblwiO1xuXG5mdW5jdGlvbiBpbmRleChkKSB7XG4gIHJldHVybiBkLmluZGV4O1xufVxuXG5mdW5jdGlvbiBmaW5kKG5vZGVCeUlkLCBub2RlSWQpIHtcbiAgdmFyIG5vZGUgPSBub2RlQnlJZC5nZXQobm9kZUlkKTtcbiAgaWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nOiBcIiArIG5vZGVJZCk7XG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsaW5rcykge1xuICB2YXIgaWQgPSBpbmRleCxcbiAgICAgIHN0cmVuZ3RoID0gZGVmYXVsdFN0cmVuZ3RoLFxuICAgICAgc3RyZW5ndGhzLFxuICAgICAgZGlzdGFuY2UgPSBjb25zdGFudCgzMCksXG4gICAgICBkaXN0YW5jZXMsXG4gICAgICBub2RlcyxcbiAgICAgIGNvdW50LFxuICAgICAgYmlhcyxcbiAgICAgIGl0ZXJhdGlvbnMgPSAxO1xuXG4gIGlmIChsaW5rcyA9PSBudWxsKSBsaW5rcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRlZmF1bHRTdHJlbmd0aChsaW5rKSB7XG4gICAgcmV0dXJuIDEgLyBNYXRoLm1pbihjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0sIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JjZShhbHBoYSkge1xuICAgIGZvciAodmFyIGsgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBrIDwgaXRlcmF0aW9uczsgKytrKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGluaywgc291cmNlLCB0YXJnZXQsIHgsIHksIGwsIGI7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbGluayA9IGxpbmtzW2ldLCBzb3VyY2UgPSBsaW5rLnNvdXJjZSwgdGFyZ2V0ID0gbGluay50YXJnZXQ7XG4gICAgICAgIHggPSB0YXJnZXQueCArIHRhcmdldC52eCAtIHNvdXJjZS54IC0gc291cmNlLnZ4IHx8IGppZ2dsZSgpO1xuICAgICAgICB5ID0gdGFyZ2V0LnkgKyB0YXJnZXQudnkgLSBzb3VyY2UueSAtIHNvdXJjZS52eSB8fCBqaWdnbGUoKTtcbiAgICAgICAgbCA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgICAgICAgbCA9IChsIC0gZGlzdGFuY2VzW2ldKSAvIGwgKiBhbHBoYSAqIHN0cmVuZ3Roc1tpXTtcbiAgICAgICAgeCAqPSBsLCB5ICo9IGw7XG4gICAgICAgIHRhcmdldC52eCAtPSB4ICogKGIgPSBiaWFzW2ldKTtcbiAgICAgICAgdGFyZ2V0LnZ5IC09IHkgKiBiO1xuICAgICAgICBzb3VyY2UudnggKz0geCAqIChiID0gMSAtIGIpO1xuICAgICAgICBzb3VyY2UudnkgKz0geSAqIGI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIW5vZGVzKSByZXR1cm47XG5cbiAgICB2YXIgaSxcbiAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgICAgbSA9IGxpbmtzLmxlbmd0aCxcbiAgICAgICAgbm9kZUJ5SWQgPSBtYXAobm9kZXMsIGlkKSxcbiAgICAgICAgbGluaztcblxuICAgIGZvciAoaSA9IDAsIGNvdW50ID0gbmV3IEFycmF5KG4pOyBpIDwgbTsgKytpKSB7XG4gICAgICBsaW5rID0gbGlua3NbaV0sIGxpbmsuaW5kZXggPSBpO1xuICAgICAgaWYgKHR5cGVvZiBsaW5rLnNvdXJjZSAhPT0gXCJvYmplY3RcIikgbGluay5zb3VyY2UgPSBmaW5kKG5vZGVCeUlkLCBsaW5rLnNvdXJjZSk7XG4gICAgICBpZiAodHlwZW9mIGxpbmsudGFyZ2V0ICE9PSBcIm9iamVjdFwiKSBsaW5rLnRhcmdldCA9IGZpbmQobm9kZUJ5SWQsIGxpbmsudGFyZ2V0KTtcbiAgICAgIGNvdW50W2xpbmsuc291cmNlLmluZGV4XSA9IChjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gfHwgMCkgKyAxO1xuICAgICAgY291bnRbbGluay50YXJnZXQuaW5kZXhdID0gKGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSB8fCAwKSArIDE7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMCwgYmlhcyA9IG5ldyBBcnJheShtKTsgaSA8IG07ICsraSkge1xuICAgICAgbGluayA9IGxpbmtzW2ldLCBiaWFzW2ldID0gY291bnRbbGluay5zb3VyY2UuaW5kZXhdIC8gKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSArIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSk7XG4gICAgfVxuXG4gICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG0pLCBpbml0aWFsaXplU3RyZW5ndGgoKTtcbiAgICBkaXN0YW5jZXMgPSBuZXcgQXJyYXkobSksIGluaXRpYWxpemVEaXN0YW5jZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZVN0cmVuZ3RoKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcblxuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICBzdHJlbmd0aHNbaV0gPSArc3RyZW5ndGgobGlua3NbaV0sIGksIGxpbmtzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplRGlzdGFuY2UoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIGRpc3RhbmNlc1tpXSA9ICtkaXN0YW5jZShsaW5rc1tpXSwgaSwgbGlua3MpO1xuICAgIH1cbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgbm9kZXMgPSBfO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5saW5rcyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsaW5rcyA9IF8sIGluaXRpYWxpemUoKSwgZm9yY2UpIDogbGlua3M7XG4gIH07XG5cbiAgZm9yY2UuaWQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaWQgPSBfLCBmb3JjZSkgOiBpZDtcbiAgfTtcblxuICBmb3JjZS5pdGVyYXRpb25zID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2UpIDogaXRlcmF0aW9ucztcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplU3RyZW5ndGgoKSwgZm9yY2UpIDogc3RyZW5ndGg7XG4gIH07XG5cbiAgZm9yY2UuZGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2UgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZURpc3RhbmNlKCksIGZvcmNlKSA6IGRpc3RhbmNlO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHttYXB9IGZyb20gXCJkMy1jb2xsZWN0aW9uXCI7XG5pbXBvcnQge3RpbWVyfSBmcm9tIFwiZDMtdGltZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHgoZCkge1xuICByZXR1cm4gZC54O1xufVxuXG5leHBvcnQgZnVuY3Rpb24geShkKSB7XG4gIHJldHVybiBkLnk7XG59XG5cbnZhciBpbml0aWFsUmFkaXVzID0gMTAsXG4gICAgaW5pdGlhbEFuZ2xlID0gTWF0aC5QSSAqICgzIC0gTWF0aC5zcXJ0KDUpKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZXMpIHtcbiAgdmFyIHNpbXVsYXRpb24sXG4gICAgICBhbHBoYSA9IDEsXG4gICAgICBhbHBoYU1pbiA9IDAuMDAxLFxuICAgICAgYWxwaGFEZWNheSA9IDEgLSBNYXRoLnBvdyhhbHBoYU1pbiwgMSAvIDMwMCksXG4gICAgICBhbHBoYVRhcmdldCA9IDAsXG4gICAgICB2ZWxvY2l0eURlY2F5ID0gMC42LFxuICAgICAgZm9yY2VzID0gbWFwKCksXG4gICAgICBzdGVwcGVyID0gdGltZXIoc3RlcCksXG4gICAgICBldmVudCA9IGRpc3BhdGNoKFwidGlja1wiLCBcImVuZFwiKTtcblxuICBpZiAobm9kZXMgPT0gbnVsbCkgbm9kZXMgPSBbXTtcblxuICBmdW5jdGlvbiBzdGVwKCkge1xuICAgIHRpY2soKTtcbiAgICBldmVudC5jYWxsKFwidGlja1wiLCBzaW11bGF0aW9uKTtcbiAgICBpZiAoYWxwaGEgPCBhbHBoYU1pbikge1xuICAgICAgc3RlcHBlci5zdG9wKCk7XG4gICAgICBldmVudC5jYWxsKFwiZW5kXCIsIHNpbXVsYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soaXRlcmF0aW9ucykge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuXG4gICAgaWYgKGl0ZXJhdGlvbnMgPT09IHVuZGVmaW5lZCkgaXRlcmF0aW9ucyA9IDE7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykge1xuICAgICAgYWxwaGEgKz0gKGFscGhhVGFyZ2V0IC0gYWxwaGEpICogYWxwaGFEZWNheTtcblxuICAgICAgZm9yY2VzLmVhY2goZnVuY3Rpb24gKGZvcmNlKSB7XG4gICAgICAgIGZvcmNlKGFscGhhKTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGUuZnggPT0gbnVsbCkgbm9kZS54ICs9IG5vZGUudnggKj0gdmVsb2NpdHlEZWNheTtcbiAgICAgICAgZWxzZSBub2RlLnggPSBub2RlLmZ4LCBub2RlLnZ4ID0gMDtcbiAgICAgICAgaWYgKG5vZGUuZnkgPT0gbnVsbCkgbm9kZS55ICs9IG5vZGUudnkgKj0gdmVsb2NpdHlEZWNheTtcbiAgICAgICAgZWxzZSBub2RlLnkgPSBub2RlLmZ5LCBub2RlLnZ5ID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2ltdWxhdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemVOb2RlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLmluZGV4ID0gaTtcbiAgICAgIGlmIChub2RlLmZ4ICE9IG51bGwpIG5vZGUueCA9IG5vZGUuZng7XG4gICAgICBpZiAobm9kZS5meSAhPSBudWxsKSBub2RlLnkgPSBub2RlLmZ5O1xuICAgICAgaWYgKGlzTmFOKG5vZGUueCkgfHwgaXNOYU4obm9kZS55KSkge1xuICAgICAgICB2YXIgcmFkaXVzID0gaW5pdGlhbFJhZGl1cyAqIE1hdGguc3FydChpKSwgYW5nbGUgPSBpICogaW5pdGlhbEFuZ2xlO1xuICAgICAgICBub2RlLnggPSByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIG5vZGUueSA9IHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc05hTihub2RlLnZ4KSB8fCBpc05hTihub2RlLnZ5KSkge1xuICAgICAgICBub2RlLnZ4ID0gbm9kZS52eSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZUZvcmNlKGZvcmNlKSB7XG4gICAgaWYgKGZvcmNlLmluaXRpYWxpemUpIGZvcmNlLmluaXRpYWxpemUobm9kZXMpO1xuICAgIHJldHVybiBmb3JjZTtcbiAgfVxuXG4gIGluaXRpYWxpemVOb2RlcygpO1xuXG4gIHJldHVybiBzaW11bGF0aW9uID0ge1xuICAgIHRpY2s6IHRpY2ssXG5cbiAgICByZXN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzdGVwcGVyLnJlc3RhcnQoc3RlcCksIHNpbXVsYXRpb247XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHN0ZXBwZXIuc3RvcCgpLCBzaW11bGF0aW9uO1xuICAgIH0sXG5cbiAgICBub2RlczogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZXMgPSBfLCBpbml0aWFsaXplTm9kZXMoKSwgZm9yY2VzLmVhY2goaW5pdGlhbGl6ZUZvcmNlKSwgc2ltdWxhdGlvbikgOiBub2RlcztcbiAgICB9LFxuXG4gICAgYWxwaGE6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhID0gK18sIHNpbXVsYXRpb24pIDogYWxwaGE7XG4gICAgfSxcblxuICAgIGFscGhhTWluOiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYU1pbiA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhTWluO1xuICAgIH0sXG5cbiAgICBhbHBoYURlY2F5OiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYURlY2F5ID0gK18sIHNpbXVsYXRpb24pIDogK2FscGhhRGVjYXk7XG4gICAgfSxcblxuICAgIGFscGhhVGFyZ2V0OiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYVRhcmdldCA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhVGFyZ2V0O1xuICAgIH0sXG5cbiAgICB2ZWxvY2l0eURlY2F5OiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2ZWxvY2l0eURlY2F5ID0gMSAtIF8sIHNpbXVsYXRpb24pIDogMSAtIHZlbG9jaXR5RGVjYXk7XG4gICAgfSxcblxuICAgIGZvcmNlOiBmdW5jdGlvbihuYW1lLCBfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAoKF8gPT0gbnVsbCA/IGZvcmNlcy5yZW1vdmUobmFtZSkgOiBmb3JjZXMuc2V0KG5hbWUsIGluaXRpYWxpemVGb3JjZShfKSkpLCBzaW11bGF0aW9uKSA6IGZvcmNlcy5nZXQobmFtZSk7XG4gICAgfSxcblxuICAgIGZpbmQ6IGZ1bmN0aW9uKHgsIHksIHJhZGl1cykge1xuICAgICAgdmFyIGkgPSAwLFxuICAgICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICAgICAgZHgsXG4gICAgICAgICAgZHksXG4gICAgICAgICAgZDIsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBjbG9zZXN0O1xuXG4gICAgICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5O1xuICAgICAgZWxzZSByYWRpdXMgKj0gcmFkaXVzO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgZHggPSB4IC0gbm9kZS54O1xuICAgICAgICBkeSA9IHkgLSBub2RlLnk7XG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICAgIGlmIChkMiA8IHJhZGl1cykgY2xvc2VzdCA9IG5vZGUsIHJhZGl1cyA9IGQyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2xvc2VzdDtcbiAgICB9LFxuXG4gICAgb246IGZ1bmN0aW9uKG5hbWUsIF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMSA/IChldmVudC5vbihuYW1lLCBfKSwgc2ltdWxhdGlvbikgOiBldmVudC5vbihuYW1lKTtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCBqaWdnbGUgZnJvbSBcIi4vamlnZ2xlXCI7XG5pbXBvcnQge3F1YWR0cmVlfSBmcm9tIFwiZDMtcXVhZHRyZWVcIjtcbmltcG9ydCB7eCwgeX0gZnJvbSBcIi4vc2ltdWxhdGlvblwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5vZGVzLFxuICAgICAgbm9kZSxcbiAgICAgIGFscGhhLFxuICAgICAgc3RyZW5ndGggPSBjb25zdGFudCgtMzApLFxuICAgICAgc3RyZW5ndGhzLFxuICAgICAgZGlzdGFuY2VNaW4yID0gMSxcbiAgICAgIGRpc3RhbmNlTWF4MiA9IEluZmluaXR5LFxuICAgICAgdGhldGEyID0gMC44MTtcblxuICBmdW5jdGlvbiBmb3JjZShfKSB7XG4gICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIHRyZWUgPSBxdWFkdHJlZShub2RlcywgeCwgeSkudmlzaXRBZnRlcihhY2N1bXVsYXRlKTtcbiAgICBmb3IgKGFscGhhID0gXywgaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgdHJlZS52aXNpdChhcHBseSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTtcbiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgbm9kZSA9IG5vZGVzW2ldLCBzdHJlbmd0aHNbbm9kZS5pbmRleF0gPSArc3RyZW5ndGgobm9kZSwgaSwgbm9kZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gYWNjdW11bGF0ZShxdWFkKSB7XG4gICAgdmFyIHN0cmVuZ3RoID0gMCwgcSwgYywgd2VpZ2h0ID0gMCwgeCwgeSwgaTtcblxuICAgIC8vIEZvciBpbnRlcm5hbCBub2RlcywgYWNjdW11bGF0ZSBmb3JjZXMgZnJvbSBjaGlsZCBxdWFkcmFudHMuXG4gICAgaWYgKHF1YWQubGVuZ3RoKSB7XG4gICAgICBmb3IgKHggPSB5ID0gaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgaWYgKChxID0gcXVhZFtpXSkgJiYgKGMgPSBNYXRoLmFicyhxLnZhbHVlKSkpIHtcbiAgICAgICAgICBzdHJlbmd0aCArPSBxLnZhbHVlLCB3ZWlnaHQgKz0gYywgeCArPSBjICogcS54LCB5ICs9IGMgKiBxLnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1YWQueCA9IHggLyB3ZWlnaHQ7XG4gICAgICBxdWFkLnkgPSB5IC8gd2VpZ2h0O1xuICAgIH1cblxuICAgIC8vIEZvciBsZWFmIG5vZGVzLCBhY2N1bXVsYXRlIGZvcmNlcyBmcm9tIGNvaW5jaWRlbnQgcXVhZHJhbnRzLlxuICAgIGVsc2Uge1xuICAgICAgcSA9IHF1YWQ7XG4gICAgICBxLnggPSBxLmRhdGEueDtcbiAgICAgIHEueSA9IHEuZGF0YS55O1xuICAgICAgZG8gc3RyZW5ndGggKz0gc3RyZW5ndGhzW3EuZGF0YS5pbmRleF07XG4gICAgICB3aGlsZSAocSA9IHEubmV4dCk7XG4gICAgfVxuXG4gICAgcXVhZC52YWx1ZSA9IHN0cmVuZ3RoO1xuICB9XG5cbiAgZnVuY3Rpb24gYXBwbHkocXVhZCwgeDEsIF8sIHgyKSB7XG4gICAgaWYgKCFxdWFkLnZhbHVlKSByZXR1cm4gdHJ1ZTtcblxuICAgIHZhciB4ID0gcXVhZC54IC0gbm9kZS54LFxuICAgICAgICB5ID0gcXVhZC55IC0gbm9kZS55LFxuICAgICAgICB3ID0geDIgLSB4MSxcbiAgICAgICAgbCA9IHggKiB4ICsgeSAqIHk7XG5cbiAgICAvLyBBcHBseSB0aGUgQmFybmVzLUh1dCBhcHByb3hpbWF0aW9uIGlmIHBvc3NpYmxlLlxuICAgIC8vIExpbWl0IGZvcmNlcyBmb3IgdmVyeSBjbG9zZSBub2RlczsgcmFuZG9taXplIGRpcmVjdGlvbiBpZiBjb2luY2lkZW50LlxuICAgIGlmICh3ICogdyAvIHRoZXRhMiA8IGwpIHtcbiAgICAgIGlmIChsIDwgZGlzdGFuY2VNYXgyKSB7XG4gICAgICAgIGlmICh4ID09PSAwKSB4ID0gamlnZ2xlKCksIGwgKz0geCAqIHg7XG4gICAgICAgIGlmICh5ID09PSAwKSB5ID0gamlnZ2xlKCksIGwgKz0geSAqIHk7XG4gICAgICAgIGlmIChsIDwgZGlzdGFuY2VNaW4yKSBsID0gTWF0aC5zcXJ0KGRpc3RhbmNlTWluMiAqIGwpO1xuICAgICAgICBub2RlLnZ4ICs9IHggKiBxdWFkLnZhbHVlICogYWxwaGEgLyBsO1xuICAgICAgICBub2RlLnZ5ICs9IHkgKiBxdWFkLnZhbHVlICogYWxwaGEgLyBsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBwcm9jZXNzIHBvaW50cyBkaXJlY3RseS5cbiAgICBlbHNlIGlmIChxdWFkLmxlbmd0aCB8fCBsID49IGRpc3RhbmNlTWF4MikgcmV0dXJuO1xuXG4gICAgLy8gTGltaXQgZm9yY2VzIGZvciB2ZXJ5IGNsb3NlIG5vZGVzOyByYW5kb21pemUgZGlyZWN0aW9uIGlmIGNvaW5jaWRlbnQuXG4gICAgaWYgKHF1YWQuZGF0YSAhPT0gbm9kZSB8fCBxdWFkLm5leHQpIHtcbiAgICAgIGlmICh4ID09PSAwKSB4ID0gamlnZ2xlKCksIGwgKz0geCAqIHg7XG4gICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2dsZSgpLCBsICs9IHkgKiB5O1xuICAgICAgaWYgKGwgPCBkaXN0YW5jZU1pbjIpIGwgPSBNYXRoLnNxcnQoZGlzdGFuY2VNaW4yICogbCk7XG4gICAgfVxuXG4gICAgZG8gaWYgKHF1YWQuZGF0YSAhPT0gbm9kZSkge1xuICAgICAgdyA9IHN0cmVuZ3Roc1txdWFkLmRhdGEuaW5kZXhdICogYWxwaGEgLyBsO1xuICAgICAgbm9kZS52eCArPSB4ICogdztcbiAgICAgIG5vZGUudnkgKz0geSAqIHc7XG4gICAgfSB3aGlsZSAocXVhZCA9IHF1YWQubmV4dCk7XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykge1xuICAgIG5vZGVzID0gXztcbiAgICBpbml0aWFsaXplKCk7XG4gIH07XG5cbiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS5kaXN0YW5jZU1pbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkaXN0YW5jZU1pbjIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KGRpc3RhbmNlTWluMik7XG4gIH07XG5cbiAgZm9yY2UuZGlzdGFuY2VNYXggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2VNYXgyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydChkaXN0YW5jZU1heDIpO1xuICB9O1xuXG4gIGZvcmNlLnRoZXRhID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoZXRhMiA9IF8gKiBfLCBmb3JjZSkgOiBNYXRoLnNxcnQodGhldGEyKTtcbiAgfTtcblxuICByZXR1cm4gZm9yY2U7XG59XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocmFkaXVzLCB4LCB5KSB7XG4gIHZhciBub2RlcyxcbiAgICAgIHN0cmVuZ3RoID0gY29uc3RhbnQoMC4xKSxcbiAgICAgIHN0cmVuZ3RocyxcbiAgICAgIHJhZGl1c2VzO1xuXG4gIGlmICh0eXBlb2YgcmFkaXVzICE9PSBcImZ1bmN0aW9uXCIpIHJhZGl1cyA9IGNvbnN0YW50KCtyYWRpdXMpO1xuICBpZiAoeCA9PSBudWxsKSB4ID0gMDtcbiAgaWYgKHkgPT0gbnVsbCkgeSA9IDA7XG5cbiAgZnVuY3Rpb24gZm9yY2UoYWxwaGEpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXSxcbiAgICAgICAgICBkeCA9IG5vZGUueCAtIHggfHwgMWUtNixcbiAgICAgICAgICBkeSA9IG5vZGUueSAtIHkgfHwgMWUtNixcbiAgICAgICAgICByID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KSxcbiAgICAgICAgICBrID0gKHJhZGl1c2VzW2ldIC0gcikgKiBzdHJlbmd0aHNbaV0gKiBhbHBoYSAvIHI7XG4gICAgICBub2RlLnZ4ICs9IGR4ICogaztcbiAgICAgIG5vZGUudnkgKz0gZHkgKiBrO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoO1xuICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShuKTtcbiAgICByYWRpdXNlcyA9IG5ldyBBcnJheShuKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICByYWRpdXNlc1tpXSA9ICtyYWRpdXMobm9kZXNbaV0sIGksIG5vZGVzKTtcbiAgICAgIHN0cmVuZ3Roc1tpXSA9IGlzTmFOKHJhZGl1c2VzW2ldKSA/IDAgOiArc3RyZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTtcbiAgICB9XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykge1xuICAgIG5vZGVzID0gXywgaW5pdGlhbGl6ZSgpO1xuICB9O1xuXG4gIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogc3RyZW5ndGg7XG4gIH07XG5cbiAgZm9yY2UucmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHJhZGl1cztcbiAgfTtcblxuICBmb3JjZS54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSArXywgZm9yY2UpIDogeDtcbiAgfTtcblxuICBmb3JjZS55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSArXywgZm9yY2UpIDogeTtcbiAgfTtcblxuICByZXR1cm4gZm9yY2U7XG59XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICB2YXIgc3RyZW5ndGggPSBjb25zdGFudCgwLjEpLFxuICAgICAgbm9kZXMsXG4gICAgICBzdHJlbmd0aHMsXG4gICAgICB4ejtcblxuICBpZiAodHlwZW9mIHggIT09IFwiZnVuY3Rpb25cIikgeCA9IGNvbnN0YW50KHggPT0gbnVsbCA/IDAgOiAreCk7XG5cbiAgZnVuY3Rpb24gZm9yY2UoYWxwaGEpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnZ4ICs9ICh4eltpXSAtIG5vZGUueCkgKiBzdHJlbmd0aHNbaV0gKiBhbHBoYTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aDtcbiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7XG4gICAgeHogPSBuZXcgQXJyYXkobik7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgc3RyZW5ndGhzW2ldID0gaXNOYU4oeHpbaV0gPSAreChub2Rlc1tpXSwgaSwgbm9kZXMpKSA/IDAgOiArc3RyZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTtcbiAgICB9XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykge1xuICAgIG5vZGVzID0gXztcbiAgICBpbml0aWFsaXplKCk7XG4gIH07XG5cbiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiB4O1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih5KSB7XG4gIHZhciBzdHJlbmd0aCA9IGNvbnN0YW50KDAuMSksXG4gICAgICBub2RlcyxcbiAgICAgIHN0cmVuZ3RocyxcbiAgICAgIHl6O1xuXG4gIGlmICh0eXBlb2YgeSAhPT0gXCJmdW5jdGlvblwiKSB5ID0gY29uc3RhbnQoeSA9PSBudWxsID8gMCA6ICt5KTtcblxuICBmdW5jdGlvbiBmb3JjZShhbHBoYSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUudnkgKz0gKHl6W2ldIC0gbm9kZS55KSAqIHN0cmVuZ3Roc1tpXSAqIGFscGhhO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoO1xuICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShuKTtcbiAgICB5eiA9IG5ldyBBcnJheShuKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBzdHJlbmd0aHNbaV0gPSBpc05hTih5eltpXSA9ICt5KG5vZGVzW2ldLCBpLCBub2RlcykpID8gMCA6ICtzdHJlbmd0aChub2Rlc1tpXSwgaSwgbm9kZXMpO1xuICAgIH1cbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgbm9kZXMgPSBfO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoO1xuICB9O1xuXG4gIGZvcmNlLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHk7XG4gIH07XG5cbiAgcmV0dXJuIGZvcmNlO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGZvcmNlQ2VudGVyfSBmcm9tIFwiLi9jZW50ZXJcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBmb3JjZUNvbGxpZGV9IGZyb20gXCIuL2NvbGxpZGVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBmb3JjZUxpbmt9IGZyb20gXCIuL2xpbmtcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBmb3JjZU1hbnlCb2R5fSBmcm9tIFwiLi9tYW55Qm9keVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGZvcmNlUmFkaWFsfSBmcm9tIFwiLi9yYWRpYWxcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBmb3JjZVNpbXVsYXRpb259IGZyb20gXCIuL3NpbXVsYXRpb25cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBmb3JjZVh9IGZyb20gXCIuL3hcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBmb3JjZVl9IGZyb20gXCIuL3lcIjtcbiIsIi8vIENvbXB1dGVzIHRoZSBkZWNpbWFsIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIG51bWJlciB4IHdpdGhcbi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLlxuLy8gRm9yIGV4YW1wbGUsIGZvcm1hdERlY2ltYWwoMS4yMykgcmV0dXJucyBbXCIxMjNcIiwgMF0uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZihcImVcIikpIDwgMCkgcmV0dXJuIG51bGw7IC8vIE5hTiwgwrFJbmZpbml0eVxuICB2YXIgaSwgY29lZmZpY2llbnQgPSB4LnNsaWNlKDAsIGkpO1xuXG4gIC8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdG9FeHBvbmVudGlhbCBlaXRoZXIgaGFzIHRoZSBmb3JtIFxcZFxcLlxcZCtlWy0rXVxcZCtcbiAgLy8gKGUuZy4sIDEuMmUrMykgb3IgdGhlIGZvcm0gXFxkZVstK11cXGQrIChlLmcuLCAxZSszKS5cbiAgcmV0dXJuIFtcbiAgICBjb2VmZmljaWVudC5sZW5ndGggPiAxID8gY29lZmZpY2llbnRbMF0gKyBjb2VmZmljaWVudC5zbGljZSgyKSA6IGNvZWZmaWNpZW50LFxuICAgICt4LnNsaWNlKGkgKyAxKVxuICBdO1xufVxuIiwiaW1wb3J0IGZvcm1hdERlY2ltYWwgZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbChNYXRoLmFicyh4KSksIHggPyB4WzFdIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZ3JvdXBpbmcsIHRob3VzYW5kcykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGgsXG4gICAgICAgIHQgPSBbXSxcbiAgICAgICAgaiA9IDAsXG4gICAgICAgIGcgPSBncm91cGluZ1swXSxcbiAgICAgICAgbGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkge1xuICAgICAgaWYgKGxlbmd0aCArIGcgKyAxID4gd2lkdGgpIGcgPSBNYXRoLm1heCgxLCB3aWR0aCAtIGxlbmd0aCk7XG4gICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTtcbiAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhaztcbiAgICAgIGcgPSBncm91cGluZ1tqID0gKGogKyAxKSAlIGdyb3VwaW5nLmxlbmd0aF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4odGhvdXNhbmRzKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG51bWVyYWxzKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bMC05XS9nLCBmdW5jdGlvbihpKSB7XG4gICAgICByZXR1cm4gbnVtZXJhbHNbK2ldO1xuICAgIH0pO1xuICB9O1xufVxuIiwiLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt+XVt0eXBlXVxudmFyIHJlID0gL14oPzooLik/KFs8Pj1eXSkpPyhbK1xcLSggXSk/KFskI10pPygwKT8oXFxkKyk/KCwpPyhcXC5cXGQrKT8ofik/KFthLXolXSk/JC9pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmb3JtYXQ6IFwiICsgc3BlY2lmaWVyKTtcbiAgdmFyIG1hdGNoO1xuICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcih7XG4gICAgZmlsbDogbWF0Y2hbMV0sXG4gICAgYWxpZ246IG1hdGNoWzJdLFxuICAgIHNpZ246IG1hdGNoWzNdLFxuICAgIHN5bWJvbDogbWF0Y2hbNF0sXG4gICAgemVybzogbWF0Y2hbNV0sXG4gICAgd2lkdGg6IG1hdGNoWzZdLFxuICAgIGNvbW1hOiBtYXRjaFs3XSxcbiAgICBwcmVjaXNpb246IG1hdGNoWzhdICYmIG1hdGNoWzhdLnNsaWNlKDEpLFxuICAgIHRyaW06IG1hdGNoWzldLFxuICAgIHR5cGU6IG1hdGNoWzEwXVxuICB9KTtcbn1cblxuZm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZSA9IEZvcm1hdFNwZWNpZmllci5wcm90b3R5cGU7IC8vIGluc3RhbmNlb2ZcblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/IFwiIFwiIDogc3BlY2lmaWVyLmZpbGwgKyBcIlwiO1xuICB0aGlzLmFsaWduID0gc3BlY2lmaWVyLmFsaWduID09PSB1bmRlZmluZWQgPyBcIj5cIiA6IHNwZWNpZmllci5hbGlnbiArIFwiXCI7XG4gIHRoaXMuc2lnbiA9IHNwZWNpZmllci5zaWduID09PSB1bmRlZmluZWQgPyBcIi1cIiA6IHNwZWNpZmllci5zaWduICsgXCJcIjtcbiAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnN5bWJvbCArIFwiXCI7XG4gIHRoaXMuemVybyA9ICEhc3BlY2lmaWVyLnplcm87XG4gIHRoaXMud2lkdGggPSBzcGVjaWZpZXIud2lkdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIud2lkdGg7XG4gIHRoaXMuY29tbWEgPSAhIXNwZWNpZmllci5jb21tYTtcbiAgdGhpcy5wcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLnByZWNpc2lvbjtcbiAgdGhpcy50cmltID0gISFzcGVjaWZpZXIudHJpbTtcbiAgdGhpcy50eXBlID0gc3BlY2lmaWVyLnR5cGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIudHlwZSArIFwiXCI7XG59XG5cbkZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZmlsbFxuICAgICAgKyB0aGlzLmFsaWduXG4gICAgICArIHRoaXMuc2lnblxuICAgICAgKyB0aGlzLnN5bWJvbFxuICAgICAgKyAodGhpcy56ZXJvID8gXCIwXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy53aWR0aCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IE1hdGgubWF4KDEsIHRoaXMud2lkdGggfCAwKSlcbiAgICAgICsgKHRoaXMuY29tbWEgPyBcIixcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IFwiLlwiICsgTWF0aC5tYXgoMCwgdGhpcy5wcmVjaXNpb24gfCAwKSlcbiAgICAgICsgKHRoaXMudHJpbSA/IFwiflwiIDogXCJcIilcbiAgICAgICsgdGhpcy50eXBlO1xufTtcbiIsIi8vIFRyaW1zIGluc2lnbmlmaWNhbnQgemVyb3MsIGUuZy4sIHJlcGxhY2VzIDEuMjAwMGsgd2l0aCAxLjJrLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocykge1xuICBvdXQ6IGZvciAodmFyIG4gPSBzLmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7XG4gICAgc3dpdGNoIChzW2ldKSB7XG4gICAgICBjYXNlIFwiLlwiOiBpMCA9IGkxID0gaTsgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogcztcbn1cbiIsImltcG9ydCBmb3JtYXREZWNpbWFsIGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IHZhciBwcmVmaXhFeHBvbmVudDtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWwoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdLFxuICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLFxuICAgICAgbiA9IGNvZWZmaWNpZW50Lmxlbmd0aDtcbiAgcmV0dXJuIGkgPT09IG4gPyBjb2VmZmljaWVudFxuICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbihcIjBcIilcbiAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoaSlcbiAgICAgIDogXCIwLlwiICsgbmV3IEFycmF5KDEgLSBpKS5qb2luKFwiMFwiKSArIGZvcm1hdERlY2ltYWwoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSFcbn1cbiIsImltcG9ydCBmb3JtYXREZWNpbWFsIGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWwoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdO1xuICByZXR1cm4gZXhwb25lbnQgPCAwID8gXCIwLlwiICsgbmV3IEFycmF5KC1leHBvbmVudCkuam9pbihcIjBcIikgKyBjb2VmZmljaWVudFxuICAgICAgOiBjb2VmZmljaWVudC5sZW5ndGggPiBleHBvbmVudCArIDEgPyBjb2VmZmljaWVudC5zbGljZSgwLCBleHBvbmVudCArIDEpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpXG4gICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbihcIjBcIik7XG59XG4iLCJpbXBvcnQgZm9ybWF0UHJlZml4QXV0byBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgZm9ybWF0Um91bmRlZCBmcm9tIFwiLi9mb3JtYXRSb3VuZGVkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgXCIlXCI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuICh4ICogMTAwKS50b0ZpeGVkKHApOyB9LFxuICBcImJcIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKTsgfSxcbiAgXCJjXCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggKyBcIlwiOyB9LFxuICBcImRcIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxMCk7IH0sXG4gIFwiZVwiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRXhwb25lbnRpYWwocCk7IH0sXG4gIFwiZlwiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRml4ZWQocCk7IH0sXG4gIFwiZ1wiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvUHJlY2lzaW9uKHApOyB9LFxuICBcIm9cIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KTsgfSxcbiAgXCJwXCI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCk7IH0sXG4gIFwiclwiOiBmb3JtYXRSb3VuZGVkLFxuICBcInNcIjogZm9ybWF0UHJlZml4QXV0byxcbiAgXCJYXCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7IH0sXG4gIFwieFwiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KTsgfVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcbmltcG9ydCBmb3JtYXRHcm91cCBmcm9tIFwiLi9mb3JtYXRHcm91cC5qc1wiO1xuaW1wb3J0IGZvcm1hdE51bWVyYWxzIGZyb20gXCIuL2Zvcm1hdE51bWVyYWxzLmpzXCI7XG5pbXBvcnQgZm9ybWF0U3BlY2lmaWVyIGZyb20gXCIuL2Zvcm1hdFNwZWNpZmllci5qc1wiO1xuaW1wb3J0IGZvcm1hdFRyaW0gZnJvbSBcIi4vZm9ybWF0VHJpbS5qc1wiO1xuaW1wb3J0IGZvcm1hdFR5cGVzIGZyb20gXCIuL2Zvcm1hdFR5cGVzLmpzXCI7XG5pbXBvcnQge3ByZWZpeEV4cG9uZW50fSBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcblxudmFyIG1hcCA9IEFycmF5LnByb3RvdHlwZS5tYXAsXG4gICAgcHJlZml4ZXMgPSBbXCJ5XCIsXCJ6XCIsXCJhXCIsXCJmXCIsXCJwXCIsXCJuXCIsXCLCtVwiLFwibVwiLFwiXCIsXCJrXCIsXCJNXCIsXCJHXCIsXCJUXCIsXCJQXCIsXCJFXCIsXCJaXCIsXCJZXCJdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsb2NhbGUpIHtcbiAgdmFyIGdyb3VwID0gbG9jYWxlLmdyb3VwaW5nID09PSB1bmRlZmluZWQgfHwgbG9jYWxlLnRob3VzYW5kcyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXRHcm91cChtYXAuY2FsbChsb2NhbGUuZ3JvdXBpbmcsIE51bWJlciksIGxvY2FsZS50aG91c2FuZHMgKyBcIlwiKSxcbiAgICAgIGN1cnJlbmN5UHJlZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzBdICsgXCJcIixcbiAgICAgIGN1cnJlbmN5U3VmZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzFdICsgXCJcIixcbiAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbCA9PT0gdW5kZWZpbmVkID8gXCIuXCIgOiBsb2NhbGUuZGVjaW1hbCArIFwiXCIsXG4gICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXROdW1lcmFscyhtYXAuY2FsbChsb2NhbGUubnVtZXJhbHMsIFN0cmluZykpLFxuICAgICAgcGVyY2VudCA9IGxvY2FsZS5wZXJjZW50ID09PSB1bmRlZmluZWQgPyBcIiVcIiA6IGxvY2FsZS5wZXJjZW50ICsgXCJcIixcbiAgICAgIG1pbnVzID0gbG9jYWxlLm1pbnVzID09PSB1bmRlZmluZWQgPyBcIi1cIiA6IGxvY2FsZS5taW51cyArIFwiXCIsXG4gICAgICBuYW4gPSBsb2NhbGUubmFuID09PSB1bmRlZmluZWQgPyBcIk5hTlwiIDogbG9jYWxlLm5hbiArIFwiXCI7XG5cbiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllcikge1xuICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpO1xuXG4gICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCxcbiAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sXG4gICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbixcbiAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCxcbiAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLFxuICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCxcbiAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsXG4gICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sXG4gICAgICAgIHRyaW0gPSBzcGVjaWZpZXIudHJpbSxcbiAgICAgICAgdHlwZSA9IHNwZWNpZmllci50eXBlO1xuXG4gICAgLy8gVGhlIFwiblwiIHR5cGUgaXMgYW4gYWxpYXMgZm9yIFwiLGdcIi5cbiAgICBpZiAodHlwZSA9PT0gXCJuXCIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gVGhlIFwiXCIgdHlwZSwgYW5kIGFueSBpbnZhbGlkIHR5cGUsIGlzIGFuIGFsaWFzIGZvciBcIi4xMn5nXCIuXG4gICAgZWxzZSBpZiAoIWZvcm1hdFR5cGVzW3R5cGVdKSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiAocHJlY2lzaW9uID0gMTIpLCB0cmltID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gSWYgemVybyBmaWxsIGlzIHNwZWNpZmllZCwgcGFkZGluZyBnb2VzIGFmdGVyIHNpZ24gYW5kIGJlZm9yZSBkaWdpdHMuXG4gICAgaWYgKHplcm8gfHwgKGZpbGwgPT09IFwiMFwiICYmIGFsaWduID09PSBcIj1cIikpIHplcm8gPSB0cnVlLCBmaWxsID0gXCIwXCIsIGFsaWduID0gXCI9XCI7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAvLyBGb3IgU0ktcHJlZml4LCB0aGUgc3VmZml4IGlzIGxhemlseSBjb21wdXRlZC5cbiAgICB2YXIgcHJlZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5UHJlZml4IDogc3ltYm9sID09PSBcIiNcIiAmJiAvW2JveFhdLy50ZXN0KHR5cGUpID8gXCIwXCIgKyB0eXBlLnRvTG93ZXJDYXNlKCkgOiBcIlwiLFxuICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lTdWZmaXggOiAvWyVwXS8udGVzdCh0eXBlKSA/IHBlcmNlbnQgOiBcIlwiO1xuXG4gICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24gc2hvdWxkIHdlIHVzZT9cbiAgICAvLyBJcyB0aGlzIGFuIGludGVnZXIgdHlwZT9cbiAgICAvLyBDYW4gdGhpcyB0eXBlIGdlbmVyYXRlIGV4cG9uZW50aWFsIG5vdGF0aW9uP1xuICAgIHZhciBmb3JtYXRUeXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sXG4gICAgICAgIG1heWJlU3VmZml4ID0gL1tkZWZncHJzJV0vLnRlc3QodHlwZSk7XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBzcGVjaWZpZWQsXG4gICAgLy8gb3IgY2xhbXAgdGhlIHNwZWNpZmllZCBwcmVjaXNpb24gdG8gdGhlIHN1cHBvcnRlZCByYW5nZS5cbiAgICAvLyBGb3Igc2lnbmlmaWNhbnQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFsxLCAyMV0uXG4gICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMCwgMjBdLlxuICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gNlxuICAgICAgICA6IC9bZ3Byc10vLnRlc3QodHlwZSkgPyBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSlcbiAgICAgICAgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQodmFsdWUpIHtcbiAgICAgIHZhciB2YWx1ZVByZWZpeCA9IHByZWZpeCxcbiAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IHN1ZmZpeCxcbiAgICAgICAgICBpLCBuLCBjO1xuXG4gICAgICBpZiAodHlwZSA9PT0gXCJjXCIpIHtcbiAgICAgICAgdmFsdWVTdWZmaXggPSBmb3JtYXRUeXBlKHZhbHVlKSArIHZhbHVlU3VmZml4O1xuICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICt2YWx1ZTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHNpZ24uIC0wIGlzIG5vdCBsZXNzIHRoYW4gMCwgYnV0IDEgLyAtMCBpcyFcbiAgICAgICAgdmFyIHZhbHVlTmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgMSAvIHZhbHVlIDwgMDtcblxuICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuXG4gICAgICAgIHZhbHVlID0gaXNOYU4odmFsdWUpID8gbmFuIDogZm9ybWF0VHlwZShNYXRoLmFicyh2YWx1ZSksIHByZWNpc2lvbik7XG5cbiAgICAgICAgLy8gVHJpbSBpbnNpZ25pZmljYW50IHplcm9zLlxuICAgICAgICBpZiAodHJpbSkgdmFsdWUgPSBmb3JtYXRUcmltKHZhbHVlKTtcblxuICAgICAgICAvLyBJZiBhIG5lZ2F0aXZlIHZhbHVlIHJvdW5kcyB0byB6ZXJvIGFmdGVyIGZvcm1hdHRpbmcsIGFuZCBubyBleHBsaWNpdCBwb3NpdGl2ZSBzaWduIGlzIHJlcXVlc3RlZCwgaGlkZSB0aGUgc2lnbi5cbiAgICAgICAgaWYgKHZhbHVlTmVnYXRpdmUgJiYgK3ZhbHVlID09PSAwICYmIHNpZ24gIT09IFwiK1wiKSB2YWx1ZU5lZ2F0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgICAgIHZhbHVlUHJlZml4ID0gKHZhbHVlTmVnYXRpdmUgPyAoc2lnbiA9PT0gXCIoXCIgPyBzaWduIDogbWludXMpIDogc2lnbiA9PT0gXCItXCIgfHwgc2lnbiA9PT0gXCIoXCIgPyBcIlwiIDogc2lnbikgKyB2YWx1ZVByZWZpeDtcbiAgICAgICAgdmFsdWVTdWZmaXggPSAodHlwZSA9PT0gXCJzXCIgPyBwcmVmaXhlc1s4ICsgcHJlZml4RXhwb25lbnQgLyAzXSA6IFwiXCIpICsgdmFsdWVTdWZmaXggKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSBcIihcIiA/IFwiKVwiIDogXCJcIik7XG5cbiAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIOKAnHZhbHVl4oCdIHBhcnQgdGhhdCBjYW4gYmVcbiAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhhdCBpcyBub3QuXG4gICAgICAgIGlmIChtYXliZVN1ZmZpeCkge1xuICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7XG4gICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4O1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBiZWZvcmUgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiAhemVybykgdmFsdWUgPSBncm91cCh2YWx1ZSwgSW5maW5pdHkpO1xuXG4gICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLlxuICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlUHJlZml4Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIHZhbHVlU3VmZml4Lmxlbmd0aCxcbiAgICAgICAgICBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogXCJcIjtcblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSBcIlwiO1xuXG4gICAgICAvLyBSZWNvbnN0cnVjdCB0aGUgZmluYWwgb3V0cHV0IGJhc2VkIG9uIHRoZSBkZXNpcmVkIGFsaWdubWVudC5cbiAgICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgICAgY2FzZSBcIjxcIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nOyBicmVhaztcbiAgICAgICAgY2FzZSBcIj1cIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgICAgY2FzZSBcIl5cIjogdmFsdWUgPSBwYWRkaW5nLnNsaWNlKDAsIGxlbmd0aCA9IHBhZGRpbmcubGVuZ3RoID4+IDEpICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZy5zbGljZShsZW5ndGgpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDogdmFsdWUgPSBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3JtYXQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzcGVjaWZpZXIgKyBcIlwiO1xuICAgIH07XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpIHtcbiAgICB2YXIgZiA9IG5ld0Zvcm1hdCgoc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciksIHNwZWNpZmllci50eXBlID0gXCJmXCIsIHNwZWNpZmllcikpLFxuICAgICAgICBlID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMsXG4gICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLFxuICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdO1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6IG5ld0Zvcm1hdCxcbiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZpeFxuICB9O1xufVxuIiwiaW1wb3J0IGZvcm1hdExvY2FsZSBmcm9tIFwiLi9sb2NhbGUuanNcIjtcblxudmFyIGxvY2FsZTtcbmV4cG9ydCB2YXIgZm9ybWF0O1xuZXhwb3J0IHZhciBmb3JtYXRQcmVmaXg7XG5cbmRlZmF1bHRMb2NhbGUoe1xuICBkZWNpbWFsOiBcIi5cIixcbiAgdGhvdXNhbmRzOiBcIixcIixcbiAgZ3JvdXBpbmc6IFszXSxcbiAgY3VycmVuY3k6IFtcIiRcIiwgXCJcIl0sXG4gIG1pbnVzOiBcIi1cIlxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlZmF1bHRMb2NhbGUoZGVmaW5pdGlvbikge1xuICBsb2NhbGUgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7XG4gIGZvcm1hdCA9IGxvY2FsZS5mb3JtYXQ7XG4gIGZvcm1hdFByZWZpeCA9IGxvY2FsZS5mb3JtYXRQcmVmaXg7XG4gIHJldHVybiBsb2NhbGU7XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgLWV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCwgdmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzIC0gZXhwb25lbnQoTWF0aC5hYnMoc3RlcCkpKTtcbn1cbiIsImltcG9ydCBleHBvbmVudCBmcm9tIFwiLi9leHBvbmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGVwLCBtYXgpIHtcbiAgc3RlcCA9IE1hdGguYWJzKHN0ZXApLCBtYXggPSBNYXRoLmFicyhtYXgpIC0gc3RlcDtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cG9uZW50KG1heCkgLSBleHBvbmVudChzdGVwKSkgKyAxO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGZvcm1hdERlZmF1bHRMb2NhbGUsIGZvcm1hdCwgZm9ybWF0UHJlZml4fSBmcm9tIFwiLi9kZWZhdWx0TG9jYWxlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZm9ybWF0TG9jYWxlfSBmcm9tIFwiLi9sb2NhbGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBmb3JtYXRTcGVjaWZpZXIsIEZvcm1hdFNwZWNpZmllcn0gZnJvbSBcIi4vZm9ybWF0U3BlY2lmaWVyLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcHJlY2lzaW9uRml4ZWR9IGZyb20gXCIuL3ByZWNpc2lvbkZpeGVkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcHJlY2lzaW9uUHJlZml4fSBmcm9tIFwiLi9wcmVjaXNpb25QcmVmaXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwcmVjaXNpb25Sb3VuZH0gZnJvbSBcIi4vcHJlY2lzaW9uUm91bmQuanNcIjtcbiIsIi8vIEFkZHMgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB3aXRoIHR3aWNlIHRoZSBub3JtYWwgcHJlY2lzaW9uLlxuLy8gUmVmZXJlbmNlOiBKLiBSLiBTaGV3Y2h1aywgQWRhcHRpdmUgUHJlY2lzaW9uIEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMgYW5kXG4vLyBGYXN0IFJvYnVzdCBHZW9tZXRyaWMgUHJlZGljYXRlcywgRGlzY3JldGUgJiBDb21wdXRhdGlvbmFsIEdlb21ldHJ5IDE4KDMpXG4vLyAzMDXigJMzNjMgKDE5OTcpLlxuLy8gQ29kZSBhZGFwdGVkIGZyb20gR2VvZ3JhcGhpY0xpYiBieSBDaGFybGVzIEYuIEYuIEthcm5leSxcbi8vIGh0dHA6Ly9nZW9ncmFwaGljbGliLnNvdXJjZWZvcmdlLm5ldC9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgQWRkZXI7XG59XG5cbmZ1bmN0aW9uIEFkZGVyKCkge1xuICB0aGlzLnJlc2V0KCk7XG59XG5cbkFkZGVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEFkZGVyLFxuICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zID0gLy8gcm91bmRlZCB2YWx1ZVxuICAgIHRoaXMudCA9IDA7IC8vIGV4YWN0IGVycm9yXG4gIH0sXG4gIGFkZDogZnVuY3Rpb24oeSkge1xuICAgIGFkZCh0ZW1wLCB5LCB0aGlzLnQpO1xuICAgIGFkZCh0aGlzLCB0ZW1wLnMsIHRoaXMucyk7XG4gICAgaWYgKHRoaXMucykgdGhpcy50ICs9IHRlbXAudDtcbiAgICBlbHNlIHRoaXMucyA9IHRlbXAudDtcbiAgfSxcbiAgdmFsdWVPZjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucztcbiAgfVxufTtcblxudmFyIHRlbXAgPSBuZXcgQWRkZXI7XG5cbmZ1bmN0aW9uIGFkZChhZGRlciwgYSwgYikge1xuICB2YXIgeCA9IGFkZGVyLnMgPSBhICsgYixcbiAgICAgIGJ2ID0geCAtIGEsXG4gICAgICBhdiA9IHggLSBidjtcbiAgYWRkZXIudCA9IChhIC0gYXYpICsgKGIgLSBidik7XG59XG4iLCJleHBvcnQgdmFyIGVwc2lsb24gPSAxZS02O1xuZXhwb3J0IHZhciBlcHNpbG9uMiA9IDFlLTEyO1xuZXhwb3J0IHZhciBwaSA9IE1hdGguUEk7XG5leHBvcnQgdmFyIGhhbGZQaSA9IHBpIC8gMjtcbmV4cG9ydCB2YXIgcXVhcnRlclBpID0gcGkgLyA0O1xuZXhwb3J0IHZhciB0YXUgPSBwaSAqIDI7XG5cbmV4cG9ydCB2YXIgZGVncmVlcyA9IDE4MCAvIHBpO1xuZXhwb3J0IHZhciByYWRpYW5zID0gcGkgLyAxODA7XG5cbmV4cG9ydCB2YXIgYWJzID0gTWF0aC5hYnM7XG5leHBvcnQgdmFyIGF0YW4gPSBNYXRoLmF0YW47XG5leHBvcnQgdmFyIGF0YW4yID0gTWF0aC5hdGFuMjtcbmV4cG9ydCB2YXIgY29zID0gTWF0aC5jb3M7XG5leHBvcnQgdmFyIGNlaWwgPSBNYXRoLmNlaWw7XG5leHBvcnQgdmFyIGV4cCA9IE1hdGguZXhwO1xuZXhwb3J0IHZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5leHBvcnQgdmFyIGxvZyA9IE1hdGgubG9nO1xuZXhwb3J0IHZhciBwb3cgPSBNYXRoLnBvdztcbmV4cG9ydCB2YXIgc2luID0gTWF0aC5zaW47XG5leHBvcnQgdmFyIHNpZ24gPSBNYXRoLnNpZ24gfHwgZnVuY3Rpb24oeCkgeyByZXR1cm4geCA+IDAgPyAxIDogeCA8IDAgPyAtMSA6IDA7IH07XG5leHBvcnQgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7XG5leHBvcnQgdmFyIHRhbiA9IE1hdGgudGFuO1xuXG5leHBvcnQgZnVuY3Rpb24gYWNvcyh4KSB7XG4gIHJldHVybiB4ID4gMSA/IDAgOiB4IDwgLTEgPyBwaSA6IE1hdGguYWNvcyh4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzaW4oeCkge1xuICByZXR1cm4geCA+IDEgPyBoYWxmUGkgOiB4IDwgLTEgPyAtaGFsZlBpIDogTWF0aC5hc2luKHgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGF2ZXJzaW4oeCkge1xuICByZXR1cm4gKHggPSBzaW4oeCAvIDIpKSAqIHg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub29wKCkge31cbiIsImZ1bmN0aW9uIHN0cmVhbUdlb21ldHJ5KGdlb21ldHJ5LCBzdHJlYW0pIHtcbiAgaWYgKGdlb21ldHJ5ICYmIHN0cmVhbUdlb21ldHJ5VHlwZS5oYXNPd25Qcm9wZXJ0eShnZW9tZXRyeS50eXBlKSkge1xuICAgIHN0cmVhbUdlb21ldHJ5VHlwZVtnZW9tZXRyeS50eXBlXShnZW9tZXRyeSwgc3RyZWFtKTtcbiAgfVxufVxuXG52YXIgc3RyZWFtT2JqZWN0VHlwZSA9IHtcbiAgRmVhdHVyZTogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICBzdHJlYW1HZW9tZXRyeShvYmplY3QuZ2VvbWV0cnksIHN0cmVhbSk7XG4gIH0sXG4gIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHZhciBmZWF0dXJlcyA9IG9iamVjdC5mZWF0dXJlcywgaSA9IC0xLCBuID0gZmVhdHVyZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1HZW9tZXRyeShmZWF0dXJlc1tpXS5nZW9tZXRyeSwgc3RyZWFtKTtcbiAgfVxufTtcblxudmFyIHN0cmVhbUdlb21ldHJ5VHlwZSA9IHtcbiAgU3BoZXJlOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHN0cmVhbS5zcGhlcmUoKTtcbiAgfSxcbiAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0LmNvb3JkaW5hdGVzO1xuICAgIHN0cmVhbS5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0WzJdKTtcbiAgfSxcbiAgTXVsdGlQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgb2JqZWN0ID0gY29vcmRpbmF0ZXNbaV0sIHN0cmVhbS5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0WzJdKTtcbiAgfSxcbiAgTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICBzdHJlYW1MaW5lKG9iamVjdC5jb29yZGluYXRlcywgc3RyZWFtLCAwKTtcbiAgfSxcbiAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0sIDApO1xuICB9LFxuICBQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICAgIHN0cmVhbVBvbHlnb24ob2JqZWN0LmNvb3JkaW5hdGVzLCBzdHJlYW0pO1xuICB9LFxuICBNdWx0aVBvbHlnb246IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7XG4gICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbVBvbHlnb24oY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSk7XG4gIH0sXG4gIEdlb21ldHJ5Q29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHtcbiAgICB2YXIgZ2VvbWV0cmllcyA9IG9iamVjdC5nZW9tZXRyaWVzLCBpID0gLTEsIG4gPSBnZW9tZXRyaWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgc3RyZWFtKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gc3RyZWFtTGluZShjb29yZGluYXRlcywgc3RyZWFtLCBjbG9zZWQpIHtcbiAgdmFyIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCAtIGNsb3NlZCwgY29vcmRpbmF0ZTtcbiAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICB3aGlsZSAoKytpIDwgbikgY29vcmRpbmF0ZSA9IGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0ucG9pbnQoY29vcmRpbmF0ZVswXSwgY29vcmRpbmF0ZVsxXSwgY29vcmRpbmF0ZVsyXSk7XG4gIHN0cmVhbS5saW5lRW5kKCk7XG59XG5cbmZ1bmN0aW9uIHN0cmVhbVBvbHlnb24oY29vcmRpbmF0ZXMsIHN0cmVhbSkge1xuICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICBzdHJlYW0ucG9seWdvblN0YXJ0KCk7XG4gIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0sIDEpO1xuICBzdHJlYW0ucG9seWdvbkVuZCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkge1xuICBpZiAob2JqZWN0ICYmIHN0cmVhbU9iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpKSB7XG4gICAgc3RyZWFtT2JqZWN0VHlwZVtvYmplY3QudHlwZV0ob2JqZWN0LCBzdHJlYW0pO1xuICB9IGVsc2Uge1xuICAgIHN0cmVhbUdlb21ldHJ5KG9iamVjdCwgc3RyZWFtKTtcbiAgfVxufVxuIiwiaW1wb3J0IGFkZGVyIGZyb20gXCIuL2FkZGVyLmpzXCI7XG5pbXBvcnQge2F0YW4yLCBjb3MsIHF1YXJ0ZXJQaSwgcmFkaWFucywgc2luLCB0YXV9IGZyb20gXCIuL21hdGguanNcIjtcbmltcG9ydCBub29wIGZyb20gXCIuL25vb3AuanNcIjtcbmltcG9ydCBzdHJlYW0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5cbmV4cG9ydCB2YXIgYXJlYVJpbmdTdW0gPSBhZGRlcigpO1xuXG52YXIgYXJlYVN1bSA9IGFkZGVyKCksXG4gICAgbGFtYmRhMDAsXG4gICAgcGhpMDAsXG4gICAgbGFtYmRhMCxcbiAgICBjb3NQaGkwLFxuICAgIHNpblBoaTA7XG5cbmV4cG9ydCB2YXIgYXJlYVN0cmVhbSA9IHtcbiAgcG9pbnQ6IG5vb3AsXG4gIGxpbmVTdGFydDogbm9vcCxcbiAgbGluZUVuZDogbm9vcCxcbiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICBhcmVhUmluZ1N1bS5yZXNldCgpO1xuICAgIGFyZWFTdHJlYW0ubGluZVN0YXJ0ID0gYXJlYVJpbmdTdGFydDtcbiAgICBhcmVhU3RyZWFtLmxpbmVFbmQgPSBhcmVhUmluZ0VuZDtcbiAgfSxcbiAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZWFSaW5nID0gK2FyZWFSaW5nU3VtO1xuICAgIGFyZWFTdW0uYWRkKGFyZWFSaW5nIDwgMCA/IHRhdSArIGFyZWFSaW5nIDogYXJlYVJpbmcpO1xuICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5saW5lRW5kID0gdGhpcy5wb2ludCA9IG5vb3A7XG4gIH0sXG4gIHNwaGVyZTogZnVuY3Rpb24oKSB7XG4gICAgYXJlYVN1bS5hZGQodGF1KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYXJlYVJpbmdTdGFydCgpIHtcbiAgYXJlYVN0cmVhbS5wb2ludCA9IGFyZWFQb2ludEZpcnN0O1xufVxuXG5mdW5jdGlvbiBhcmVhUmluZ0VuZCgpIHtcbiAgYXJlYVBvaW50KGxhbWJkYTAwLCBwaGkwMCk7XG59XG5cbmZ1bmN0aW9uIGFyZWFQb2ludEZpcnN0KGxhbWJkYSwgcGhpKSB7XG4gIGFyZWFTdHJlYW0ucG9pbnQgPSBhcmVhUG9pbnQ7XG4gIGxhbWJkYTAwID0gbGFtYmRhLCBwaGkwMCA9IHBoaTtcbiAgbGFtYmRhICo9IHJhZGlhbnMsIHBoaSAqPSByYWRpYW5zO1xuICBsYW1iZGEwID0gbGFtYmRhLCBjb3NQaGkwID0gY29zKHBoaSA9IHBoaSAvIDIgKyBxdWFydGVyUGkpLCBzaW5QaGkwID0gc2luKHBoaSk7XG59XG5cbmZ1bmN0aW9uIGFyZWFQb2ludChsYW1iZGEsIHBoaSkge1xuICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJhZGlhbnM7XG4gIHBoaSA9IHBoaSAvIDIgKyBxdWFydGVyUGk7IC8vIGhhbGYgdGhlIGFuZ3VsYXIgZGlzdGFuY2UgZnJvbSBzb3V0aCBwb2xlXG5cbiAgLy8gU3BoZXJpY2FsIGV4Y2VzcyBFIGZvciBhIHNwaGVyaWNhbCB0cmlhbmdsZSB3aXRoIHZlcnRpY2VzOiBzb3V0aCBwb2xlLFxuICAvLyBwcmV2aW91cyBwb2ludCwgY3VycmVudCBwb2ludC4gIFVzZXMgYSBmb3JtdWxhIGRlcml2ZWQgZnJvbSBDYWdub2xp4oCZc1xuICAvLyB0aGVvcmVtLiAgU2VlIFRvZGh1bnRlciwgU3BoZXJpY2FsIFRyaWcuICgxODcxKSwgU2VjLiAxMDMsIEVxLiAoMikuXG4gIHZhciBkTGFtYmRhID0gbGFtYmRhIC0gbGFtYmRhMCxcbiAgICAgIHNkTGFtYmRhID0gZExhbWJkYSA+PSAwID8gMSA6IC0xLFxuICAgICAgYWRMYW1iZGEgPSBzZExhbWJkYSAqIGRMYW1iZGEsXG4gICAgICBjb3NQaGkgPSBjb3MocGhpKSxcbiAgICAgIHNpblBoaSA9IHNpbihwaGkpLFxuICAgICAgayA9IHNpblBoaTAgKiBzaW5QaGksXG4gICAgICB1ID0gY29zUGhpMCAqIGNvc1BoaSArIGsgKiBjb3MoYWRMYW1iZGEpLFxuICAgICAgdiA9IGsgKiBzZExhbWJkYSAqIHNpbihhZExhbWJkYSk7XG4gIGFyZWFSaW5nU3VtLmFkZChhdGFuMih2LCB1KSk7XG5cbiAgLy8gQWR2YW5jZSB0aGUgcHJldmlvdXMgcG9pbnRzLlxuICBsYW1iZGEwID0gbGFtYmRhLCBjb3NQaGkwID0gY29zUGhpLCBzaW5QaGkwID0gc2luUGhpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvYmplY3QpIHtcbiAgYXJlYVN1bS5yZXNldCgpO1xuICBzdHJlYW0ob2JqZWN0LCBhcmVhU3RyZWFtKTtcbiAgcmV0dXJuIGFyZWFTdW0gKiAyO1xufVxuIiwiaW1wb3J0IHthc2luLCBhdGFuMiwgY29zLCBzaW4sIHNxcnR9IGZyb20gXCIuL21hdGguanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNwaGVyaWNhbChjYXJ0ZXNpYW4pIHtcbiAgcmV0dXJuIFthdGFuMihjYXJ0ZXNpYW5bMV0sIGNhcnRlc2lhblswXSksIGFzaW4oY2FydGVzaWFuWzJdKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXJ0ZXNpYW4oc3BoZXJpY2FsKSB7XG4gIHZhciBsYW1iZGEgPSBzcGhlcmljYWxbMF0sIHBoaSA9IHNwaGVyaWNhbFsxXSwgY29zUGhpID0gY29zKHBoaSk7XG4gIHJldHVybiBbY29zUGhpICogY29zKGxhbWJkYSksIGNvc1BoaSAqIHNpbihsYW1iZGEpLCBzaW4ocGhpKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXJ0ZXNpYW5Eb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuQ3Jvc3MoYSwgYikge1xuICByZXR1cm4gW2FbMV0gKiBiWzJdIC0gYVsyXSAqIGJbMV0sIGFbMl0gKiBiWzBdIC0gYVswXSAqIGJbMl0sIGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF1dO1xufVxuXG4vLyBUT0RPIHJldHVybiBhXG5leHBvcnQgZnVuY3Rpb24gY2FydGVzaWFuQWRkSW5QbGFjZShhLCBiKSB7XG4gIGFbMF0gKz0gYlswXSwgYVsxXSArPSBiWzFdLCBhWzJdICs9IGJbMl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXJ0ZXNpYW5TY2FsZSh2ZWN0b3IsIGspIHtcbiAgcmV0dXJuIFt2ZWN0b3JbMF0gKiBrLCB2ZWN0b3JbMV0gKiBrLCB2ZWN0b3JbMl0gKiBrXTtcbn1cblxuLy8gVE9ETyByZXR1cm4gZFxuZXhwb3J0IGZ1bmN0aW9uIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UoZCkge1xuICB2YXIgbCA9IHNxcnQoZFswXSAqIGRbMF0gKyBkWzFdICogZFsxXSArIGRbMl0gKiBkWzJdKTtcbiAgZFswXSAvPSBsLCBkWzFdIC89IGwsIGRbMl0gLz0gbDtcbn1cbiIsImltcG9ydCBhZGRlciBmcm9tIFwiLi9hZGRlci5qc1wiO1xuaW1wb3J0IHthcmVhU3RyZWFtLCBhcmVhUmluZ1N1bX0gZnJvbSBcIi4vYXJlYS5qc1wiO1xuaW1wb3J0IHtjYXJ0ZXNpYW4sIGNhcnRlc2lhbkNyb3NzLCBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlLCBzcGhlcmljYWx9IGZyb20gXCIuL2NhcnRlc2lhbi5qc1wiO1xuaW1wb3J0IHthYnMsIGRlZ3JlZXMsIGVwc2lsb24sIHJhZGlhbnN9IGZyb20gXCIuL21hdGguanNcIjtcbmltcG9ydCBzdHJlYW0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5cbnZhciBsYW1iZGEwLCBwaGkwLCBsYW1iZGExLCBwaGkxLCAvLyBib3VuZHNcbiAgICBsYW1iZGEyLCAvLyBwcmV2aW91cyBsYW1iZGEtY29vcmRpbmF0ZVxuICAgIGxhbWJkYTAwLCBwaGkwMCwgLy8gZmlyc3QgcG9pbnRcbiAgICBwMCwgLy8gcHJldmlvdXMgM0QgcG9pbnRcbiAgICBkZWx0YVN1bSA9IGFkZGVyKCksXG4gICAgcmFuZ2VzLFxuICAgIHJhbmdlO1xuXG52YXIgYm91bmRzU3RyZWFtID0ge1xuICBwb2ludDogYm91bmRzUG9pbnQsXG4gIGxpbmVTdGFydDogYm91bmRzTGluZVN0YXJ0LFxuICBsaW5lRW5kOiBib3VuZHNMaW5lRW5kLFxuICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIGJvdW5kc1N0cmVhbS5wb2ludCA9IGJvdW5kc1JpbmdQb2ludDtcbiAgICBib3VuZHNTdHJlYW0ubGluZVN0YXJ0ID0gYm91bmRzUmluZ1N0YXJ0O1xuICAgIGJvdW5kc1N0cmVhbS5saW5lRW5kID0gYm91bmRzUmluZ0VuZDtcbiAgICBkZWx0YVN1bS5yZXNldCgpO1xuICAgIGFyZWFTdHJlYW0ucG9seWdvblN0YXJ0KCk7XG4gIH0sXG4gIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGFyZWFTdHJlYW0ucG9seWdvbkVuZCgpO1xuICAgIGJvdW5kc1N0cmVhbS5wb2ludCA9IGJvdW5kc1BvaW50O1xuICAgIGJvdW5kc1N0cmVhbS5saW5lU3RhcnQgPSBib3VuZHNMaW5lU3RhcnQ7XG4gICAgYm91bmRzU3RyZWFtLmxpbmVFbmQgPSBib3VuZHNMaW5lRW5kO1xuICAgIGlmIChhcmVhUmluZ1N1bSA8IDApIGxhbWJkYTAgPSAtKGxhbWJkYTEgPSAxODApLCBwaGkwID0gLShwaGkxID0gOTApO1xuICAgIGVsc2UgaWYgKGRlbHRhU3VtID4gZXBzaWxvbikgcGhpMSA9IDkwO1xuICAgIGVsc2UgaWYgKGRlbHRhU3VtIDwgLWVwc2lsb24pIHBoaTAgPSAtOTA7XG4gICAgcmFuZ2VbMF0gPSBsYW1iZGEwLCByYW5nZVsxXSA9IGxhbWJkYTE7XG4gIH0sXG4gIHNwaGVyZTogZnVuY3Rpb24oKSB7XG4gICAgbGFtYmRhMCA9IC0obGFtYmRhMSA9IDE4MCksIHBoaTAgPSAtKHBoaTEgPSA5MCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJvdW5kc1BvaW50KGxhbWJkYSwgcGhpKSB7XG4gIHJhbmdlcy5wdXNoKHJhbmdlID0gW2xhbWJkYTAgPSBsYW1iZGEsIGxhbWJkYTEgPSBsYW1iZGFdKTtcbiAgaWYgKHBoaSA8IHBoaTApIHBoaTAgPSBwaGk7XG4gIGlmIChwaGkgPiBwaGkxKSBwaGkxID0gcGhpO1xufVxuXG5mdW5jdGlvbiBsaW5lUG9pbnQobGFtYmRhLCBwaGkpIHtcbiAgdmFyIHAgPSBjYXJ0ZXNpYW4oW2xhbWJkYSAqIHJhZGlhbnMsIHBoaSAqIHJhZGlhbnNdKTtcbiAgaWYgKHAwKSB7XG4gICAgdmFyIG5vcm1hbCA9IGNhcnRlc2lhbkNyb3NzKHAwLCBwKSxcbiAgICAgICAgZXF1YXRvcmlhbCA9IFtub3JtYWxbMV0sIC1ub3JtYWxbMF0sIDBdLFxuICAgICAgICBpbmZsZWN0aW9uID0gY2FydGVzaWFuQ3Jvc3MoZXF1YXRvcmlhbCwgbm9ybWFsKTtcbiAgICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGluZmxlY3Rpb24pO1xuICAgIGluZmxlY3Rpb24gPSBzcGhlcmljYWwoaW5mbGVjdGlvbik7XG4gICAgdmFyIGRlbHRhID0gbGFtYmRhIC0gbGFtYmRhMixcbiAgICAgICAgc2lnbiA9IGRlbHRhID4gMCA/IDEgOiAtMSxcbiAgICAgICAgbGFtYmRhaSA9IGluZmxlY3Rpb25bMF0gKiBkZWdyZWVzICogc2lnbixcbiAgICAgICAgcGhpaSxcbiAgICAgICAgYW50aW1lcmlkaWFuID0gYWJzKGRlbHRhKSA+IDE4MDtcbiAgICBpZiAoYW50aW1lcmlkaWFuIF4gKHNpZ24gKiBsYW1iZGEyIDwgbGFtYmRhaSAmJiBsYW1iZGFpIDwgc2lnbiAqIGxhbWJkYSkpIHtcbiAgICAgIHBoaWkgPSBpbmZsZWN0aW9uWzFdICogZGVncmVlcztcbiAgICAgIGlmIChwaGlpID4gcGhpMSkgcGhpMSA9IHBoaWk7XG4gICAgfSBlbHNlIGlmIChsYW1iZGFpID0gKGxhbWJkYWkgKyAzNjApICUgMzYwIC0gMTgwLCBhbnRpbWVyaWRpYW4gXiAoc2lnbiAqIGxhbWJkYTIgPCBsYW1iZGFpICYmIGxhbWJkYWkgPCBzaWduICogbGFtYmRhKSkge1xuICAgICAgcGhpaSA9IC1pbmZsZWN0aW9uWzFdICogZGVncmVlcztcbiAgICAgIGlmIChwaGlpIDwgcGhpMCkgcGhpMCA9IHBoaWk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwaGkgPCBwaGkwKSBwaGkwID0gcGhpO1xuICAgICAgaWYgKHBoaSA+IHBoaTEpIHBoaTEgPSBwaGk7XG4gICAgfVxuICAgIGlmIChhbnRpbWVyaWRpYW4pIHtcbiAgICAgIGlmIChsYW1iZGEgPCBsYW1iZGEyKSB7XG4gICAgICAgIGlmIChhbmdsZShsYW1iZGEwLCBsYW1iZGEpID4gYW5nbGUobGFtYmRhMCwgbGFtYmRhMSkpIGxhbWJkYTEgPSBsYW1iZGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYW5nbGUobGFtYmRhLCBsYW1iZGExKSA+IGFuZ2xlKGxhbWJkYTAsIGxhbWJkYTEpKSBsYW1iZGEwID0gbGFtYmRhO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobGFtYmRhMSA+PSBsYW1iZGEwKSB7XG4gICAgICAgIGlmIChsYW1iZGEgPCBsYW1iZGEwKSBsYW1iZGEwID0gbGFtYmRhO1xuICAgICAgICBpZiAobGFtYmRhID4gbGFtYmRhMSkgbGFtYmRhMSA9IGxhbWJkYTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsYW1iZGEgPiBsYW1iZGEyKSB7XG4gICAgICAgICAgaWYgKGFuZ2xlKGxhbWJkYTAsIGxhbWJkYSkgPiBhbmdsZShsYW1iZGEwLCBsYW1iZGExKSkgbGFtYmRhMSA9IGxhbWJkYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoYW5nbGUobGFtYmRhLCBsYW1iZGExKSA+IGFuZ2xlKGxhbWJkYTAsIGxhbWJkYTEpKSBsYW1iZGEwID0gbGFtYmRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJhbmdlcy5wdXNoKHJhbmdlID0gW2xhbWJkYTAgPSBsYW1iZGEsIGxhbWJkYTEgPSBsYW1iZGFdKTtcbiAgfVxuICBpZiAocGhpIDwgcGhpMCkgcGhpMCA9IHBoaTtcbiAgaWYgKHBoaSA+IHBoaTEpIHBoaTEgPSBwaGk7XG4gIHAwID0gcCwgbGFtYmRhMiA9IGxhbWJkYTtcbn1cblxuZnVuY3Rpb24gYm91bmRzTGluZVN0YXJ0KCkge1xuICBib3VuZHNTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7XG59XG5cbmZ1bmN0aW9uIGJvdW5kc0xpbmVFbmQoKSB7XG4gIHJhbmdlWzBdID0gbGFtYmRhMCwgcmFuZ2VbMV0gPSBsYW1iZGExO1xuICBib3VuZHNTdHJlYW0ucG9pbnQgPSBib3VuZHNQb2ludDtcbiAgcDAgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBib3VuZHNSaW5nUG9pbnQobGFtYmRhLCBwaGkpIHtcbiAgaWYgKHAwKSB7XG4gICAgdmFyIGRlbHRhID0gbGFtYmRhIC0gbGFtYmRhMjtcbiAgICBkZWx0YVN1bS5hZGQoYWJzKGRlbHRhKSA+IDE4MCA/IGRlbHRhICsgKGRlbHRhID4gMCA/IDM2MCA6IC0zNjApIDogZGVsdGEpO1xuICB9IGVsc2Uge1xuICAgIGxhbWJkYTAwID0gbGFtYmRhLCBwaGkwMCA9IHBoaTtcbiAgfVxuICBhcmVhU3RyZWFtLnBvaW50KGxhbWJkYSwgcGhpKTtcbiAgbGluZVBvaW50KGxhbWJkYSwgcGhpKTtcbn1cblxuZnVuY3Rpb24gYm91bmRzUmluZ1N0YXJ0KCkge1xuICBhcmVhU3RyZWFtLmxpbmVTdGFydCgpO1xufVxuXG5mdW5jdGlvbiBib3VuZHNSaW5nRW5kKCkge1xuICBib3VuZHNSaW5nUG9pbnQobGFtYmRhMDAsIHBoaTAwKTtcbiAgYXJlYVN0cmVhbS5saW5lRW5kKCk7XG4gIGlmIChhYnMoZGVsdGFTdW0pID4gZXBzaWxvbikgbGFtYmRhMCA9IC0obGFtYmRhMSA9IDE4MCk7XG4gIHJhbmdlWzBdID0gbGFtYmRhMCwgcmFuZ2VbMV0gPSBsYW1iZGExO1xuICBwMCA9IG51bGw7XG59XG5cbi8vIEZpbmRzIHRoZSBsZWZ0LXJpZ2h0IGRpc3RhbmNlIGJldHdlZW4gdHdvIGxvbmdpdHVkZXMuXG4vLyBUaGlzIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyAobGFtYmRhMSAtIGxhbWJkYTAgKyAzNjDCsCkgJSAzNjDCsCwgZXhjZXB0IHRoYXQgd2Ugd2FudFxuLy8gdGhlIGRpc3RhbmNlIGJldHdlZW4gwrExODDCsCB0byBiZSAzNjDCsC5cbmZ1bmN0aW9uIGFuZ2xlKGxhbWJkYTAsIGxhbWJkYTEpIHtcbiAgcmV0dXJuIChsYW1iZGExIC09IGxhbWJkYTApIDwgMCA/IGxhbWJkYTEgKyAzNjAgOiBsYW1iZGExO1xufVxuXG5mdW5jdGlvbiByYW5nZUNvbXBhcmUoYSwgYikge1xuICByZXR1cm4gYVswXSAtIGJbMF07XG59XG5cbmZ1bmN0aW9uIHJhbmdlQ29udGFpbnMocmFuZ2UsIHgpIHtcbiAgcmV0dXJuIHJhbmdlWzBdIDw9IHJhbmdlWzFdID8gcmFuZ2VbMF0gPD0geCAmJiB4IDw9IHJhbmdlWzFdIDogeCA8IHJhbmdlWzBdIHx8IHJhbmdlWzFdIDwgeDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZmVhdHVyZSkge1xuICB2YXIgaSwgbiwgYSwgYiwgbWVyZ2VkLCBkZWx0YU1heCwgZGVsdGE7XG5cbiAgcGhpMSA9IGxhbWJkYTEgPSAtKGxhbWJkYTAgPSBwaGkwID0gSW5maW5pdHkpO1xuICByYW5nZXMgPSBbXTtcbiAgc3RyZWFtKGZlYXR1cmUsIGJvdW5kc1N0cmVhbSk7XG5cbiAgLy8gRmlyc3QsIHNvcnQgcmFuZ2VzIGJ5IHRoZWlyIG1pbmltdW0gbG9uZ2l0dWRlcy5cbiAgaWYgKG4gPSByYW5nZXMubGVuZ3RoKSB7XG4gICAgcmFuZ2VzLnNvcnQocmFuZ2VDb21wYXJlKTtcblxuICAgIC8vIFRoZW4sIG1lcmdlIGFueSByYW5nZXMgdGhhdCBvdmVybGFwLlxuICAgIGZvciAoaSA9IDEsIGEgPSByYW5nZXNbMF0sIG1lcmdlZCA9IFthXTsgaSA8IG47ICsraSkge1xuICAgICAgYiA9IHJhbmdlc1tpXTtcbiAgICAgIGlmIChyYW5nZUNvbnRhaW5zKGEsIGJbMF0pIHx8IHJhbmdlQ29udGFpbnMoYSwgYlsxXSkpIHtcbiAgICAgICAgaWYgKGFuZ2xlKGFbMF0sIGJbMV0pID4gYW5nbGUoYVswXSwgYVsxXSkpIGFbMV0gPSBiWzFdO1xuICAgICAgICBpZiAoYW5nbGUoYlswXSwgYVsxXSkgPiBhbmdsZShhWzBdLCBhWzFdKSkgYVswXSA9IGJbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXJnZWQucHVzaChhID0gYik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmluYWxseSwgZmluZCB0aGUgbGFyZ2VzdCBnYXAgYmV0d2VlbiB0aGUgbWVyZ2VkIHJhbmdlcy5cbiAgICAvLyBUaGUgZmluYWwgYm91bmRpbmcgYm94IHdpbGwgYmUgdGhlIGludmVyc2Ugb2YgdGhpcyBnYXAuXG4gICAgZm9yIChkZWx0YU1heCA9IC1JbmZpbml0eSwgbiA9IG1lcmdlZC5sZW5ndGggLSAxLCBpID0gMCwgYSA9IG1lcmdlZFtuXTsgaSA8PSBuOyBhID0gYiwgKytpKSB7XG4gICAgICBiID0gbWVyZ2VkW2ldO1xuICAgICAgaWYgKChkZWx0YSA9IGFuZ2xlKGFbMV0sIGJbMF0pKSA+IGRlbHRhTWF4KSBkZWx0YU1heCA9IGRlbHRhLCBsYW1iZGEwID0gYlswXSwgbGFtYmRhMSA9IGFbMV07XG4gICAgfVxuICB9XG5cbiAgcmFuZ2VzID0gcmFuZ2UgPSBudWxsO1xuXG4gIHJldHVybiBsYW1iZGEwID09PSBJbmZpbml0eSB8fCBwaGkwID09PSBJbmZpbml0eVxuICAgICAgPyBbW05hTiwgTmFOXSwgW05hTiwgTmFOXV1cbiAgICAgIDogW1tsYW1iZGEwLCBwaGkwXSwgW2xhbWJkYTEsIHBoaTFdXTtcbn1cbiIsImltcG9ydCB7YXNpbiwgYXRhbjIsIGNvcywgZGVncmVlcywgZXBzaWxvbiwgZXBzaWxvbjIsIHJhZGlhbnMsIHNpbiwgc3FydH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuaW1wb3J0IG5vb3AgZnJvbSBcIi4vbm9vcC5qc1wiO1xuaW1wb3J0IHN0cmVhbSBmcm9tIFwiLi9zdHJlYW0uanNcIjtcblxudmFyIFcwLCBXMSxcbiAgICBYMCwgWTAsIFowLFxuICAgIFgxLCBZMSwgWjEsXG4gICAgWDIsIFkyLCBaMixcbiAgICBsYW1iZGEwMCwgcGhpMDAsIC8vIGZpcnN0IHBvaW50XG4gICAgeDAsIHkwLCB6MDsgLy8gcHJldmlvdXMgcG9pbnRcblxudmFyIGNlbnRyb2lkU3RyZWFtID0ge1xuICBzcGhlcmU6IG5vb3AsXG4gIHBvaW50OiBjZW50cm9pZFBvaW50LFxuICBsaW5lU3RhcnQ6IGNlbnRyb2lkTGluZVN0YXJ0LFxuICBsaW5lRW5kOiBjZW50cm9pZExpbmVFbmQsXG4gIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgY2VudHJvaWRTdHJlYW0ubGluZVN0YXJ0ID0gY2VudHJvaWRSaW5nU3RhcnQ7XG4gICAgY2VudHJvaWRTdHJlYW0ubGluZUVuZCA9IGNlbnRyb2lkUmluZ0VuZDtcbiAgfSxcbiAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgY2VudHJvaWRTdHJlYW0ubGluZVN0YXJ0ID0gY2VudHJvaWRMaW5lU3RhcnQ7XG4gICAgY2VudHJvaWRTdHJlYW0ubGluZUVuZCA9IGNlbnRyb2lkTGluZUVuZDtcbiAgfVxufTtcblxuLy8gQXJpdGhtZXRpYyBtZWFuIG9mIENhcnRlc2lhbiB2ZWN0b3JzLlxuZnVuY3Rpb24gY2VudHJvaWRQb2ludChsYW1iZGEsIHBoaSkge1xuICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJhZGlhbnM7XG4gIHZhciBjb3NQaGkgPSBjb3MocGhpKTtcbiAgY2VudHJvaWRQb2ludENhcnRlc2lhbihjb3NQaGkgKiBjb3MobGFtYmRhKSwgY29zUGhpICogc2luKGxhbWJkYSksIHNpbihwaGkpKTtcbn1cblxuZnVuY3Rpb24gY2VudHJvaWRQb2ludENhcnRlc2lhbih4LCB5LCB6KSB7XG4gICsrVzA7XG4gIFgwICs9ICh4IC0gWDApIC8gVzA7XG4gIFkwICs9ICh5IC0gWTApIC8gVzA7XG4gIFowICs9ICh6IC0gWjApIC8gVzA7XG59XG5cbmZ1bmN0aW9uIGNlbnRyb2lkTGluZVN0YXJ0KCkge1xuICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkTGluZVBvaW50Rmlyc3Q7XG59XG5cbmZ1bmN0aW9uIGNlbnRyb2lkTGluZVBvaW50Rmlyc3QobGFtYmRhLCBwaGkpIHtcbiAgbGFtYmRhICo9IHJhZGlhbnMsIHBoaSAqPSByYWRpYW5zO1xuICB2YXIgY29zUGhpID0gY29zKHBoaSk7XG4gIHgwID0gY29zUGhpICogY29zKGxhbWJkYSk7XG4gIHkwID0gY29zUGhpICogc2luKGxhbWJkYSk7XG4gIHowID0gc2luKHBoaSk7XG4gIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0gY2VudHJvaWRMaW5lUG9pbnQ7XG4gIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4oeDAsIHkwLCB6MCk7XG59XG5cbmZ1bmN0aW9uIGNlbnRyb2lkTGluZVBvaW50KGxhbWJkYSwgcGhpKSB7XG4gIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFucztcbiAgdmFyIGNvc1BoaSA9IGNvcyhwaGkpLFxuICAgICAgeCA9IGNvc1BoaSAqIGNvcyhsYW1iZGEpLFxuICAgICAgeSA9IGNvc1BoaSAqIHNpbihsYW1iZGEpLFxuICAgICAgeiA9IHNpbihwaGkpLFxuICAgICAgdyA9IGF0YW4yKHNxcnQoKHcgPSB5MCAqIHogLSB6MCAqIHkpICogdyArICh3ID0gejAgKiB4IC0geDAgKiB6KSAqIHcgKyAodyA9IHgwICogeSAtIHkwICogeCkgKiB3KSwgeDAgKiB4ICsgeTAgKiB5ICsgejAgKiB6KTtcbiAgVzEgKz0gdztcbiAgWDEgKz0gdyAqICh4MCArICh4MCA9IHgpKTtcbiAgWTEgKz0gdyAqICh5MCArICh5MCA9IHkpKTtcbiAgWjEgKz0gdyAqICh6MCArICh6MCA9IHopKTtcbiAgY2VudHJvaWRQb2ludENhcnRlc2lhbih4MCwgeTAsIHowKTtcbn1cblxuZnVuY3Rpb24gY2VudHJvaWRMaW5lRW5kKCkge1xuICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkUG9pbnQ7XG59XG5cbi8vIFNlZSBKLiBFLiBCcm9jaywgVGhlIEluZXJ0aWEgVGVuc29yIGZvciBhIFNwaGVyaWNhbCBUcmlhbmdsZSxcbi8vIEouIEFwcGxpZWQgTWVjaGFuaWNzIDQyLCAyMzkgKDE5NzUpLlxuZnVuY3Rpb24gY2VudHJvaWRSaW5nU3RhcnQoKSB7XG4gIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0gY2VudHJvaWRSaW5nUG9pbnRGaXJzdDtcbn1cblxuZnVuY3Rpb24gY2VudHJvaWRSaW5nRW5kKCkge1xuICBjZW50cm9pZFJpbmdQb2ludChsYW1iZGEwMCwgcGhpMDApO1xuICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkUG9pbnQ7XG59XG5cbmZ1bmN0aW9uIGNlbnRyb2lkUmluZ1BvaW50Rmlyc3QobGFtYmRhLCBwaGkpIHtcbiAgbGFtYmRhMDAgPSBsYW1iZGEsIHBoaTAwID0gcGhpO1xuICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJhZGlhbnM7XG4gIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0gY2VudHJvaWRSaW5nUG9pbnQ7XG4gIHZhciBjb3NQaGkgPSBjb3MocGhpKTtcbiAgeDAgPSBjb3NQaGkgKiBjb3MobGFtYmRhKTtcbiAgeTAgPSBjb3NQaGkgKiBzaW4obGFtYmRhKTtcbiAgejAgPSBzaW4ocGhpKTtcbiAgY2VudHJvaWRQb2ludENhcnRlc2lhbih4MCwgeTAsIHowKTtcbn1cblxuZnVuY3Rpb24gY2VudHJvaWRSaW5nUG9pbnQobGFtYmRhLCBwaGkpIHtcbiAgbGFtYmRhICo9IHJhZGlhbnMsIHBoaSAqPSByYWRpYW5zO1xuICB2YXIgY29zUGhpID0gY29zKHBoaSksXG4gICAgICB4ID0gY29zUGhpICogY29zKGxhbWJkYSksXG4gICAgICB5ID0gY29zUGhpICogc2luKGxhbWJkYSksXG4gICAgICB6ID0gc2luKHBoaSksXG4gICAgICBjeCA9IHkwICogeiAtIHowICogeSxcbiAgICAgIGN5ID0gejAgKiB4IC0geDAgKiB6LFxuICAgICAgY3ogPSB4MCAqIHkgLSB5MCAqIHgsXG4gICAgICBtID0gc3FydChjeCAqIGN4ICsgY3kgKiBjeSArIGN6ICogY3opLFxuICAgICAgdyA9IGFzaW4obSksIC8vIGxpbmUgd2VpZ2h0ID0gYW5nbGVcbiAgICAgIHYgPSBtICYmIC13IC8gbTsgLy8gYXJlYSB3ZWlnaHQgbXVsdGlwbGllclxuICBYMiArPSB2ICogY3g7XG4gIFkyICs9IHYgKiBjeTtcbiAgWjIgKz0gdiAqIGN6O1xuICBXMSArPSB3O1xuICBYMSArPSB3ICogKHgwICsgKHgwID0geCkpO1xuICBZMSArPSB3ICogKHkwICsgKHkwID0geSkpO1xuICBaMSArPSB3ICogKHowICsgKHowID0geikpO1xuICBjZW50cm9pZFBvaW50Q2FydGVzaWFuKHgwLCB5MCwgejApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvYmplY3QpIHtcbiAgVzAgPSBXMSA9XG4gIFgwID0gWTAgPSBaMCA9XG4gIFgxID0gWTEgPSBaMSA9XG4gIFgyID0gWTIgPSBaMiA9IDA7XG4gIHN0cmVhbShvYmplY3QsIGNlbnRyb2lkU3RyZWFtKTtcblxuICB2YXIgeCA9IFgyLFxuICAgICAgeSA9IFkyLFxuICAgICAgeiA9IFoyLFxuICAgICAgbSA9IHggKiB4ICsgeSAqIHkgKyB6ICogejtcblxuICAvLyBJZiB0aGUgYXJlYS13ZWlnaHRlZCBjY2VudHJvaWQgaXMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbGVuZ3RoLXdlaWdodGVkIGNjZW50cm9pZC5cbiAgaWYgKG0gPCBlcHNpbG9uMikge1xuICAgIHggPSBYMSwgeSA9IFkxLCB6ID0gWjE7XG4gICAgLy8gSWYgdGhlIGZlYXR1cmUgaGFzIHplcm8gbGVuZ3RoLCBmYWxsIGJhY2sgdG8gYXJpdGhtZXRpYyBtZWFuIG9mIHBvaW50IHZlY3RvcnMuXG4gICAgaWYgKFcxIDwgZXBzaWxvbikgeCA9IFgwLCB5ID0gWTAsIHogPSBaMDtcbiAgICBtID0geCAqIHggKyB5ICogeSArIHogKiB6O1xuICAgIC8vIElmIHRoZSBmZWF0dXJlIHN0aWxsIGhhcyBhbiB1bmRlZmluZWQgY2NlbnRyb2lkLCB0aGVuIHJldHVybi5cbiAgICBpZiAobSA8IGVwc2lsb24yKSByZXR1cm4gW05hTiwgTmFOXTtcbiAgfVxuXG4gIHJldHVybiBbYXRhbjIoeSwgeCkgKiBkZWdyZWVzLCBhc2luKHogLyBzcXJ0KG0pKSAqIGRlZ3JlZXNdO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG5cbiAgZnVuY3Rpb24gY29tcG9zZSh4LCB5KSB7XG4gICAgcmV0dXJuIHggPSBhKHgsIHkpLCBiKHhbMF0sIHhbMV0pO1xuICB9XG5cbiAgaWYgKGEuaW52ZXJ0ICYmIGIuaW52ZXJ0KSBjb21wb3NlLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9IGIuaW52ZXJ0KHgsIHkpLCB4ICYmIGEuaW52ZXJ0KHhbMF0sIHhbMV0pO1xuICB9O1xuXG4gIHJldHVybiBjb21wb3NlO1xufVxuIiwiaW1wb3J0IGNvbXBvc2UgZnJvbSBcIi4vY29tcG9zZS5qc1wiO1xuaW1wb3J0IHthYnMsIGFzaW4sIGF0YW4yLCBjb3MsIGRlZ3JlZXMsIHBpLCByYWRpYW5zLCBzaW4sIHRhdX0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiByb3RhdGlvbklkZW50aXR5KGxhbWJkYSwgcGhpKSB7XG4gIHJldHVybiBbYWJzKGxhbWJkYSkgPiBwaSA/IGxhbWJkYSArIE1hdGgucm91bmQoLWxhbWJkYSAvIHRhdSkgKiB0YXUgOiBsYW1iZGEsIHBoaV07XG59XG5cbnJvdGF0aW9uSWRlbnRpdHkuaW52ZXJ0ID0gcm90YXRpb25JZGVudGl0eTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVJhZGlhbnMoZGVsdGFMYW1iZGEsIGRlbHRhUGhpLCBkZWx0YUdhbW1hKSB7XG4gIHJldHVybiAoZGVsdGFMYW1iZGEgJT0gdGF1KSA/IChkZWx0YVBoaSB8fCBkZWx0YUdhbW1hID8gY29tcG9zZShyb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSksIHJvdGF0aW9uUGhpR2FtbWEoZGVsdGFQaGksIGRlbHRhR2FtbWEpKVxuICAgIDogcm90YXRpb25MYW1iZGEoZGVsdGFMYW1iZGEpKVxuICAgIDogKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEgPyByb3RhdGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKVxuICAgIDogcm90YXRpb25JZGVudGl0eSk7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSkge1xuICByZXR1cm4gZnVuY3Rpb24obGFtYmRhLCBwaGkpIHtcbiAgICByZXR1cm4gbGFtYmRhICs9IGRlbHRhTGFtYmRhLCBbbGFtYmRhID4gcGkgPyBsYW1iZGEgLSB0YXUgOiBsYW1iZGEgPCAtcGkgPyBsYW1iZGEgKyB0YXUgOiBsYW1iZGEsIHBoaV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSB7XG4gIHZhciByb3RhdGlvbiA9IGZvcndhcmRSb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSk7XG4gIHJvdGF0aW9uLmludmVydCA9IGZvcndhcmRSb3RhdGlvbkxhbWJkYSgtZGVsdGFMYW1iZGEpO1xuICByZXR1cm4gcm90YXRpb247XG59XG5cbmZ1bmN0aW9uIHJvdGF0aW9uUGhpR2FtbWEoZGVsdGFQaGksIGRlbHRhR2FtbWEpIHtcbiAgdmFyIGNvc0RlbHRhUGhpID0gY29zKGRlbHRhUGhpKSxcbiAgICAgIHNpbkRlbHRhUGhpID0gc2luKGRlbHRhUGhpKSxcbiAgICAgIGNvc0RlbHRhR2FtbWEgPSBjb3MoZGVsdGFHYW1tYSksXG4gICAgICBzaW5EZWx0YUdhbW1hID0gc2luKGRlbHRhR2FtbWEpO1xuXG4gIGZ1bmN0aW9uIHJvdGF0aW9uKGxhbWJkYSwgcGhpKSB7XG4gICAgdmFyIGNvc1BoaSA9IGNvcyhwaGkpLFxuICAgICAgICB4ID0gY29zKGxhbWJkYSkgKiBjb3NQaGksXG4gICAgICAgIHkgPSBzaW4obGFtYmRhKSAqIGNvc1BoaSxcbiAgICAgICAgeiA9IHNpbihwaGkpLFxuICAgICAgICBrID0geiAqIGNvc0RlbHRhUGhpICsgeCAqIHNpbkRlbHRhUGhpO1xuICAgIHJldHVybiBbXG4gICAgICBhdGFuMih5ICogY29zRGVsdGFHYW1tYSAtIGsgKiBzaW5EZWx0YUdhbW1hLCB4ICogY29zRGVsdGFQaGkgLSB6ICogc2luRGVsdGFQaGkpLFxuICAgICAgYXNpbihrICogY29zRGVsdGFHYW1tYSArIHkgKiBzaW5EZWx0YUdhbW1hKVxuICAgIF07XG4gIH1cblxuICByb3RhdGlvbi5pbnZlcnQgPSBmdW5jdGlvbihsYW1iZGEsIHBoaSkge1xuICAgIHZhciBjb3NQaGkgPSBjb3MocGhpKSxcbiAgICAgICAgeCA9IGNvcyhsYW1iZGEpICogY29zUGhpLFxuICAgICAgICB5ID0gc2luKGxhbWJkYSkgKiBjb3NQaGksXG4gICAgICAgIHogPSBzaW4ocGhpKSxcbiAgICAgICAgayA9IHogKiBjb3NEZWx0YUdhbW1hIC0geSAqIHNpbkRlbHRhR2FtbWE7XG4gICAgcmV0dXJuIFtcbiAgICAgIGF0YW4yKHkgKiBjb3NEZWx0YUdhbW1hICsgeiAqIHNpbkRlbHRhR2FtbWEsIHggKiBjb3NEZWx0YVBoaSArIGsgKiBzaW5EZWx0YVBoaSksXG4gICAgICBhc2luKGsgKiBjb3NEZWx0YVBoaSAtIHggKiBzaW5EZWx0YVBoaSlcbiAgICBdO1xuICB9O1xuXG4gIHJldHVybiByb3RhdGlvbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocm90YXRlKSB7XG4gIHJvdGF0ZSA9IHJvdGF0ZVJhZGlhbnMocm90YXRlWzBdICogcmFkaWFucywgcm90YXRlWzFdICogcmFkaWFucywgcm90YXRlLmxlbmd0aCA+IDIgPyByb3RhdGVbMl0gKiByYWRpYW5zIDogMCk7XG5cbiAgZnVuY3Rpb24gZm9yd2FyZChjb29yZGluYXRlcykge1xuICAgIGNvb3JkaW5hdGVzID0gcm90YXRlKGNvb3JkaW5hdGVzWzBdICogcmFkaWFucywgY29vcmRpbmF0ZXNbMV0gKiByYWRpYW5zKTtcbiAgICByZXR1cm4gY29vcmRpbmF0ZXNbMF0gKj0gZGVncmVlcywgY29vcmRpbmF0ZXNbMV0gKj0gZGVncmVlcywgY29vcmRpbmF0ZXM7XG4gIH1cblxuICBmb3J3YXJkLmludmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7XG4gICAgY29vcmRpbmF0ZXMgPSByb3RhdGUuaW52ZXJ0KGNvb3JkaW5hdGVzWzBdICogcmFkaWFucywgY29vcmRpbmF0ZXNbMV0gKiByYWRpYW5zKTtcbiAgICByZXR1cm4gY29vcmRpbmF0ZXNbMF0gKj0gZGVncmVlcywgY29vcmRpbmF0ZXNbMV0gKj0gZGVncmVlcywgY29vcmRpbmF0ZXM7XG4gIH07XG5cbiAgcmV0dXJuIGZvcndhcmQ7XG59XG4iLCJpbXBvcnQge2NhcnRlc2lhbiwgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZSwgc3BoZXJpY2FsfSBmcm9tIFwiLi9jYXJ0ZXNpYW4uanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IHthY29zLCBjb3MsIGRlZ3JlZXMsIGVwc2lsb24sIHJhZGlhbnMsIHNpbiwgdGF1fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5pbXBvcnQge3JvdGF0ZVJhZGlhbnN9IGZyb20gXCIuL3JvdGF0aW9uLmpzXCI7XG5cbi8vIEdlbmVyYXRlcyBhIGNpcmNsZSBjZW50ZXJlZCBhdCBbMMKwLCAwwrBdLCB3aXRoIGEgZ2l2ZW4gcmFkaXVzIGFuZCBwcmVjaXNpb24uXG5leHBvcnQgZnVuY3Rpb24gY2lyY2xlU3RyZWFtKHN0cmVhbSwgcmFkaXVzLCBkZWx0YSwgZGlyZWN0aW9uLCB0MCwgdDEpIHtcbiAgaWYgKCFkZWx0YSkgcmV0dXJuO1xuICB2YXIgY29zUmFkaXVzID0gY29zKHJhZGl1cyksXG4gICAgICBzaW5SYWRpdXMgPSBzaW4ocmFkaXVzKSxcbiAgICAgIHN0ZXAgPSBkaXJlY3Rpb24gKiBkZWx0YTtcbiAgaWYgKHQwID09IG51bGwpIHtcbiAgICB0MCA9IHJhZGl1cyArIGRpcmVjdGlvbiAqIHRhdTtcbiAgICB0MSA9IHJhZGl1cyAtIHN0ZXAgLyAyO1xuICB9IGVsc2Uge1xuICAgIHQwID0gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywgdDApO1xuICAgIHQxID0gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywgdDEpO1xuICAgIGlmIChkaXJlY3Rpb24gPiAwID8gdDAgPCB0MSA6IHQwID4gdDEpIHQwICs9IGRpcmVjdGlvbiAqIHRhdTtcbiAgfVxuICBmb3IgKHZhciBwb2ludCwgdCA9IHQwOyBkaXJlY3Rpb24gPiAwID8gdCA+IHQxIDogdCA8IHQxOyB0IC09IHN0ZXApIHtcbiAgICBwb2ludCA9IHNwaGVyaWNhbChbY29zUmFkaXVzLCAtc2luUmFkaXVzICogY29zKHQpLCAtc2luUmFkaXVzICogc2luKHQpXSk7XG4gICAgc3RyZWFtLnBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7XG4gIH1cbn1cblxuLy8gUmV0dXJucyB0aGUgc2lnbmVkIGFuZ2xlIG9mIGEgY2FydGVzaWFuIHBvaW50IHJlbGF0aXZlIHRvIFtjb3NSYWRpdXMsIDAsIDBdLlxuZnVuY3Rpb24gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywgcG9pbnQpIHtcbiAgcG9pbnQgPSBjYXJ0ZXNpYW4ocG9pbnQpLCBwb2ludFswXSAtPSBjb3NSYWRpdXM7XG4gIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UocG9pbnQpO1xuICB2YXIgcmFkaXVzID0gYWNvcygtcG9pbnRbMV0pO1xuICByZXR1cm4gKCgtcG9pbnRbMl0gPCAwID8gLXJhZGl1cyA6IHJhZGl1cykgKyB0YXUgLSBlcHNpbG9uKSAlIHRhdTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBjZW50ZXIgPSBjb25zdGFudChbMCwgMF0pLFxuICAgICAgcmFkaXVzID0gY29uc3RhbnQoOTApLFxuICAgICAgcHJlY2lzaW9uID0gY29uc3RhbnQoNiksXG4gICAgICByaW5nLFxuICAgICAgcm90YXRlLFxuICAgICAgc3RyZWFtID0ge3BvaW50OiBwb2ludH07XG5cbiAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xuICAgIHJpbmcucHVzaCh4ID0gcm90YXRlKHgsIHkpKTtcbiAgICB4WzBdICo9IGRlZ3JlZXMsIHhbMV0gKj0gZGVncmVlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNpcmNsZSgpIHtcbiAgICB2YXIgYyA9IGNlbnRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICByID0gcmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKiByYWRpYW5zLFxuICAgICAgICBwID0gcHJlY2lzaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKiByYWRpYW5zO1xuICAgIHJpbmcgPSBbXTtcbiAgICByb3RhdGUgPSByb3RhdGVSYWRpYW5zKC1jWzBdICogcmFkaWFucywgLWNbMV0gKiByYWRpYW5zLCAwKS5pbnZlcnQ7XG4gICAgY2lyY2xlU3RyZWFtKHN0cmVhbSwgciwgcCwgMSk7XG4gICAgYyA9IHt0eXBlOiBcIlBvbHlnb25cIiwgY29vcmRpbmF0ZXM6IFtyaW5nXX07XG4gICAgcmluZyA9IHJvdGF0ZSA9IG51bGw7XG4gICAgcmV0dXJuIGM7XG4gIH1cblxuICBjaXJjbGUuY2VudGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNlbnRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoWytfWzBdLCArX1sxXV0pLCBjaXJjbGUpIDogY2VudGVyO1xuICB9O1xuXG4gIGNpcmNsZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGNpcmNsZSkgOiByYWRpdXM7XG4gIH07XG5cbiAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcmVjaXNpb24gPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgY2lyY2xlKSA6IHByZWNpc2lvbjtcbiAgfTtcblxuICByZXR1cm4gY2lyY2xlO1xufVxuIiwiaW1wb3J0IG5vb3AgZnJvbSBcIi4uL25vb3AuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBsaW5lcyA9IFtdLFxuICAgICAgbGluZTtcbiAgcmV0dXJuIHtcbiAgICBwb2ludDogZnVuY3Rpb24oeCwgeSwgbSkge1xuICAgICAgbGluZS5wdXNoKFt4LCB5LCBtXSk7XG4gICAgfSxcbiAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgbGluZXMucHVzaChsaW5lID0gW10pO1xuICAgIH0sXG4gICAgbGluZUVuZDogbm9vcCxcbiAgICByZWpvaW46IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEpIGxpbmVzLnB1c2gobGluZXMucG9wKCkuY29uY2F0KGxpbmVzLnNoaWZ0KCkpKTtcbiAgICB9LFxuICAgIHJlc3VsdDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbGluZXM7XG4gICAgICBsaW5lcyA9IFtdO1xuICAgICAgbGluZSA9IG51bGw7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7YWJzLCBlcHNpbG9ufSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGFicyhhWzBdIC0gYlswXSkgPCBlcHNpbG9uICYmIGFicyhhWzFdIC0gYlsxXSkgPCBlcHNpbG9uO1xufVxuIiwiaW1wb3J0IHBvaW50RXF1YWwgZnJvbSBcIi4uL3BvaW50RXF1YWwuanNcIjtcbmltcG9ydCB7ZXBzaWxvbn0gZnJvbSBcIi4uL21hdGguanNcIjtcblxuZnVuY3Rpb24gSW50ZXJzZWN0aW9uKHBvaW50LCBwb2ludHMsIG90aGVyLCBlbnRyeSkge1xuICB0aGlzLnggPSBwb2ludDtcbiAgdGhpcy56ID0gcG9pbnRzO1xuICB0aGlzLm8gPSBvdGhlcjsgLy8gYW5vdGhlciBpbnRlcnNlY3Rpb25cbiAgdGhpcy5lID0gZW50cnk7IC8vIGlzIGFuIGVudHJ5P1xuICB0aGlzLnYgPSBmYWxzZTsgLy8gdmlzaXRlZFxuICB0aGlzLm4gPSB0aGlzLnAgPSBudWxsOyAvLyBuZXh0ICYgcHJldmlvdXNcbn1cblxuLy8gQSBnZW5lcmFsaXplZCBwb2x5Z29uIGNsaXBwaW5nIGFsZ29yaXRobTogZ2l2ZW4gYSBwb2x5Z29uIHRoYXQgaGFzIGJlZW4gY3V0XG4vLyBpbnRvIGl0cyB2aXNpYmxlIGxpbmUgc2VnbWVudHMsIGFuZCByZWpvaW5zIHRoZSBzZWdtZW50cyBieSBpbnRlcnBvbGF0aW5nXG4vLyBhbG9uZyB0aGUgY2xpcCBlZGdlLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VnbWVudHMsIGNvbXBhcmVJbnRlcnNlY3Rpb24sIHN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgc3RyZWFtKSB7XG4gIHZhciBzdWJqZWN0ID0gW10sXG4gICAgICBjbGlwID0gW10sXG4gICAgICBpLFxuICAgICAgbjtcblxuICBzZWdtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHNlZ21lbnQpIHtcbiAgICBpZiAoKG4gPSBzZWdtZW50Lmxlbmd0aCAtIDEpIDw9IDApIHJldHVybjtcbiAgICB2YXIgbiwgcDAgPSBzZWdtZW50WzBdLCBwMSA9IHNlZ21lbnRbbl0sIHg7XG5cbiAgICBpZiAocG9pbnRFcXVhbChwMCwgcDEpKSB7XG4gICAgICBpZiAoIXAwWzJdICYmICFwMVsyXSkge1xuICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHN0cmVhbS5wb2ludCgocDAgPSBzZWdtZW50W2ldKVswXSwgcDBbMV0pO1xuICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBoYW5kbGUgZGVnZW5lcmF0ZSBjYXNlcyBieSBtb3ZpbmcgdGhlIHBvaW50XG4gICAgICBwMVswXSArPSAyICogZXBzaWxvbjtcbiAgICB9XG5cbiAgICBzdWJqZWN0LnB1c2goeCA9IG5ldyBJbnRlcnNlY3Rpb24ocDAsIHNlZ21lbnQsIG51bGwsIHRydWUpKTtcbiAgICBjbGlwLnB1c2goeC5vID0gbmV3IEludGVyc2VjdGlvbihwMCwgbnVsbCwgeCwgZmFsc2UpKTtcbiAgICBzdWJqZWN0LnB1c2goeCA9IG5ldyBJbnRlcnNlY3Rpb24ocDEsIHNlZ21lbnQsIG51bGwsIGZhbHNlKSk7XG4gICAgY2xpcC5wdXNoKHgubyA9IG5ldyBJbnRlcnNlY3Rpb24ocDEsIG51bGwsIHgsIHRydWUpKTtcbiAgfSk7XG5cbiAgaWYgKCFzdWJqZWN0Lmxlbmd0aCkgcmV0dXJuO1xuXG4gIGNsaXAuc29ydChjb21wYXJlSW50ZXJzZWN0aW9uKTtcbiAgbGluayhzdWJqZWN0KTtcbiAgbGluayhjbGlwKTtcblxuICBmb3IgKGkgPSAwLCBuID0gY2xpcC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBjbGlwW2ldLmUgPSBzdGFydEluc2lkZSA9ICFzdGFydEluc2lkZTtcbiAgfVxuXG4gIHZhciBzdGFydCA9IHN1YmplY3RbMF0sXG4gICAgICBwb2ludHMsXG4gICAgICBwb2ludDtcblxuICB3aGlsZSAoMSkge1xuICAgIC8vIEZpbmQgZmlyc3QgdW52aXNpdGVkIGludGVyc2VjdGlvbi5cbiAgICB2YXIgY3VycmVudCA9IHN0YXJ0LFxuICAgICAgICBpc1N1YmplY3QgPSB0cnVlO1xuICAgIHdoaWxlIChjdXJyZW50LnYpIGlmICgoY3VycmVudCA9IGN1cnJlbnQubikgPT09IHN0YXJ0KSByZXR1cm47XG4gICAgcG9pbnRzID0gY3VycmVudC56O1xuICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICBkbyB7XG4gICAgICBjdXJyZW50LnYgPSBjdXJyZW50Lm8udiA9IHRydWU7XG4gICAgICBpZiAoY3VycmVudC5lKSB7XG4gICAgICAgIGlmIChpc1N1YmplY3QpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwLCBuID0gcG9pbnRzLmxlbmd0aDsgaSA8IG47ICsraSkgc3RyZWFtLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnRlcnBvbGF0ZShjdXJyZW50LngsIGN1cnJlbnQubi54LCAxLCBzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNTdWJqZWN0KSB7XG4gICAgICAgICAgcG9pbnRzID0gY3VycmVudC5wLno7XG4gICAgICAgICAgZm9yIChpID0gcG9pbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSBzdHJlYW0ucG9pbnQoKHBvaW50ID0gcG9pbnRzW2ldKVswXSwgcG9pbnRbMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5wLngsIC0xLCBzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnA7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5vO1xuICAgICAgcG9pbnRzID0gY3VycmVudC56O1xuICAgICAgaXNTdWJqZWN0ID0gIWlzU3ViamVjdDtcbiAgICB9IHdoaWxlICghY3VycmVudC52KTtcbiAgICBzdHJlYW0ubGluZUVuZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpbmsoYXJyYXkpIHtcbiAgaWYgKCEobiA9IGFycmF5Lmxlbmd0aCkpIHJldHVybjtcbiAgdmFyIG4sXG4gICAgICBpID0gMCxcbiAgICAgIGEgPSBhcnJheVswXSxcbiAgICAgIGI7XG4gIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgYS5uID0gYiA9IGFycmF5W2ldO1xuICAgIGIucCA9IGE7XG4gICAgYSA9IGI7XG4gIH1cbiAgYS5uID0gYiA9IGFycmF5WzBdO1xuICBiLnAgPSBhO1xufVxuIiwiaW1wb3J0IGFkZGVyIGZyb20gXCIuL2FkZGVyLmpzXCI7XG5pbXBvcnQge2NhcnRlc2lhbiwgY2FydGVzaWFuQ3Jvc3MsIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2V9IGZyb20gXCIuL2NhcnRlc2lhbi5qc1wiO1xuaW1wb3J0IHthYnMsIGFzaW4sIGF0YW4yLCBjb3MsIGVwc2lsb24sIGhhbGZQaSwgcGksIHF1YXJ0ZXJQaSwgc2lnbiwgc2luLCB0YXV9IGZyb20gXCIuL21hdGguanNcIjtcblxudmFyIHN1bSA9IGFkZGVyKCk7XG5cbmZ1bmN0aW9uIGxvbmdpdHVkZShwb2ludCkge1xuICBpZiAoYWJzKHBvaW50WzBdKSA8PSBwaSlcbiAgICByZXR1cm4gcG9pbnRbMF07XG4gIGVsc2VcbiAgICByZXR1cm4gc2lnbihwb2ludFswXSkgKiAoKGFicyhwb2ludFswXSkgKyBwaSkgJSB0YXUgLSBwaSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBvbHlnb24sIHBvaW50KSB7XG4gIHZhciBsYW1iZGEgPSBsb25naXR1ZGUocG9pbnQpLFxuICAgICAgcGhpID0gcG9pbnRbMV0sXG4gICAgICBzaW5QaGkgPSBzaW4ocGhpKSxcbiAgICAgIG5vcm1hbCA9IFtzaW4obGFtYmRhKSwgLWNvcyhsYW1iZGEpLCAwXSxcbiAgICAgIGFuZ2xlID0gMCxcbiAgICAgIHdpbmRpbmcgPSAwO1xuXG4gIHN1bS5yZXNldCgpO1xuXG4gIGlmIChzaW5QaGkgPT09IDEpIHBoaSA9IGhhbGZQaSArIGVwc2lsb247XG4gIGVsc2UgaWYgKHNpblBoaSA9PT0gLTEpIHBoaSA9IC1oYWxmUGkgLSBlcHNpbG9uO1xuXG4gIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoIShtID0gKHJpbmcgPSBwb2x5Z29uW2ldKS5sZW5ndGgpKSBjb250aW51ZTtcbiAgICB2YXIgcmluZyxcbiAgICAgICAgbSxcbiAgICAgICAgcG9pbnQwID0gcmluZ1ttIC0gMV0sXG4gICAgICAgIGxhbWJkYTAgPSBsb25naXR1ZGUocG9pbnQwKSxcbiAgICAgICAgcGhpMCA9IHBvaW50MFsxXSAvIDIgKyBxdWFydGVyUGksXG4gICAgICAgIHNpblBoaTAgPSBzaW4ocGhpMCksXG4gICAgICAgIGNvc1BoaTAgPSBjb3MocGhpMCk7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG07ICsraiwgbGFtYmRhMCA9IGxhbWJkYTEsIHNpblBoaTAgPSBzaW5QaGkxLCBjb3NQaGkwID0gY29zUGhpMSwgcG9pbnQwID0gcG9pbnQxKSB7XG4gICAgICB2YXIgcG9pbnQxID0gcmluZ1tqXSxcbiAgICAgICAgICBsYW1iZGExID0gbG9uZ2l0dWRlKHBvaW50MSksXG4gICAgICAgICAgcGhpMSA9IHBvaW50MVsxXSAvIDIgKyBxdWFydGVyUGksXG4gICAgICAgICAgc2luUGhpMSA9IHNpbihwaGkxKSxcbiAgICAgICAgICBjb3NQaGkxID0gY29zKHBoaTEpLFxuICAgICAgICAgIGRlbHRhID0gbGFtYmRhMSAtIGxhbWJkYTAsXG4gICAgICAgICAgc2lnbiA9IGRlbHRhID49IDAgPyAxIDogLTEsXG4gICAgICAgICAgYWJzRGVsdGEgPSBzaWduICogZGVsdGEsXG4gICAgICAgICAgYW50aW1lcmlkaWFuID0gYWJzRGVsdGEgPiBwaSxcbiAgICAgICAgICBrID0gc2luUGhpMCAqIHNpblBoaTE7XG5cbiAgICAgIHN1bS5hZGQoYXRhbjIoayAqIHNpZ24gKiBzaW4oYWJzRGVsdGEpLCBjb3NQaGkwICogY29zUGhpMSArIGsgKiBjb3MoYWJzRGVsdGEpKSk7XG4gICAgICBhbmdsZSArPSBhbnRpbWVyaWRpYW4gPyBkZWx0YSArIHNpZ24gKiB0YXUgOiBkZWx0YTtcblxuICAgICAgLy8gQXJlIHRoZSBsb25naXR1ZGVzIGVpdGhlciBzaWRlIG9mIHRoZSBwb2ludOKAmXMgbWVyaWRpYW4gKGxhbWJkYSksXG4gICAgICAvLyBhbmQgYXJlIHRoZSBsYXRpdHVkZXMgc21hbGxlciB0aGFuIHRoZSBwYXJhbGxlbCAocGhpKT9cbiAgICAgIGlmIChhbnRpbWVyaWRpYW4gXiBsYW1iZGEwID49IGxhbWJkYSBeIGxhbWJkYTEgPj0gbGFtYmRhKSB7XG4gICAgICAgIHZhciBhcmMgPSBjYXJ0ZXNpYW5Dcm9zcyhjYXJ0ZXNpYW4ocG9pbnQwKSwgY2FydGVzaWFuKHBvaW50MSkpO1xuICAgICAgICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGFyYyk7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjYXJ0ZXNpYW5Dcm9zcyhub3JtYWwsIGFyYyk7XG4gICAgICAgIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UoaW50ZXJzZWN0aW9uKTtcbiAgICAgICAgdmFyIHBoaUFyYyA9IChhbnRpbWVyaWRpYW4gXiBkZWx0YSA+PSAwID8gLTEgOiAxKSAqIGFzaW4oaW50ZXJzZWN0aW9uWzJdKTtcbiAgICAgICAgaWYgKHBoaSA+IHBoaUFyYyB8fCBwaGkgPT09IHBoaUFyYyAmJiAoYXJjWzBdIHx8IGFyY1sxXSkpIHtcbiAgICAgICAgICB3aW5kaW5nICs9IGFudGltZXJpZGlhbiBeIGRlbHRhID49IDAgPyAxIDogLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFNvdXRoIHBvbGUgaXMgaW5zaWRlIG9yIG91dHNpZGU6XG4gIC8vXG4gIC8vIEl0IGlzIGluc2lkZSBpZjpcbiAgLy8gKiB0aGUgcG9seWdvbiB3aW5kcyBhcm91bmQgaXQgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uLlxuICAvLyAqIHRoZSBwb2x5Z29uIGRvZXMgbm90IChjdW11bGF0aXZlbHkpIHdpbmQgYXJvdW5kIGl0LCBidXQgaGFzIGEgbmVnYXRpdmVcbiAgLy8gICAoY291bnRlci1jbG9ja3dpc2UpIGFyZWEuXG4gIC8vXG4gIC8vIFNlY29uZCwgY291bnQgdGhlIChzaWduZWQpIG51bWJlciBvZiB0aW1lcyBhIHNlZ21lbnQgY3Jvc3NlcyBhIGxhbWJkYVxuICAvLyBmcm9tIHRoZSBwb2ludCB0byB0aGUgU291dGggcG9sZS4gIElmIGl0IGlzIHplcm8sIHRoZW4gdGhlIHBvaW50IGlzIHRoZVxuICAvLyBzYW1lIHNpZGUgYXMgdGhlIFNvdXRoIHBvbGUuXG5cbiAgcmV0dXJuIChhbmdsZSA8IC1lcHNpbG9uIHx8IGFuZ2xlIDwgZXBzaWxvbiAmJiBzdW0gPCAtZXBzaWxvbikgXiAod2luZGluZyAmIDEpO1xufVxuIiwiaW1wb3J0IGNsaXBCdWZmZXIgZnJvbSBcIi4vYnVmZmVyLmpzXCI7XG5pbXBvcnQgY2xpcFJlam9pbiBmcm9tIFwiLi9yZWpvaW4uanNcIjtcbmltcG9ydCB7ZXBzaWxvbiwgaGFsZlBpfSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHBvbHlnb25Db250YWlucyBmcm9tIFwiLi4vcG9seWdvbkNvbnRhaW5zLmpzXCI7XG5pbXBvcnQge21lcmdlfSBmcm9tIFwiZDMtYXJyYXlcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocG9pbnRWaXNpYmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUsIHN0YXJ0KSB7XG4gIHJldHVybiBmdW5jdGlvbihzaW5rKSB7XG4gICAgdmFyIGxpbmUgPSBjbGlwTGluZShzaW5rKSxcbiAgICAgICAgcmluZ0J1ZmZlciA9IGNsaXBCdWZmZXIoKSxcbiAgICAgICAgcmluZ1NpbmsgPSBjbGlwTGluZShyaW5nQnVmZmVyKSxcbiAgICAgICAgcG9seWdvblN0YXJ0ZWQgPSBmYWxzZSxcbiAgICAgICAgcG9seWdvbixcbiAgICAgICAgc2VnbWVudHMsXG4gICAgICAgIHJpbmc7XG5cbiAgICB2YXIgY2xpcCA9IHtcbiAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgbGluZUVuZDogbGluZUVuZCxcbiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsaXAucG9pbnQgPSBwb2ludFJpbmc7XG4gICAgICAgIGNsaXAubGluZVN0YXJ0ID0gcmluZ1N0YXJ0O1xuICAgICAgICBjbGlwLmxpbmVFbmQgPSByaW5nRW5kO1xuICAgICAgICBzZWdtZW50cyA9IFtdO1xuICAgICAgICBwb2x5Z29uID0gW107XG4gICAgICB9LFxuICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsaXAucG9pbnQgPSBwb2ludDtcbiAgICAgICAgY2xpcC5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7XG4gICAgICAgIGNsaXAubGluZUVuZCA9IGxpbmVFbmQ7XG4gICAgICAgIHNlZ21lbnRzID0gbWVyZ2Uoc2VnbWVudHMpO1xuICAgICAgICB2YXIgc3RhcnRJbnNpZGUgPSBwb2x5Z29uQ29udGFpbnMocG9seWdvbiwgc3RhcnQpO1xuICAgICAgICBpZiAoc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIGNsaXBSZWpvaW4oc2VnbWVudHMsIGNvbXBhcmVJbnRlcnNlY3Rpb24sIHN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgc2luayk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhcnRJbnNpZGUpIHtcbiAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgc2luay5saW5lU3RhcnQoKTtcbiAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBzaW5rKTtcbiAgICAgICAgICBzaW5rLmxpbmVFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvbkVuZCgpLCBwb2x5Z29uU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBzZWdtZW50cyA9IHBvbHlnb24gPSBudWxsO1xuICAgICAgfSxcbiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHNpbmsucG9seWdvblN0YXJ0KCk7XG4gICAgICAgIHNpbmsubGluZVN0YXJ0KCk7XG4gICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHNpbmspO1xuICAgICAgICBzaW5rLmxpbmVFbmQoKTtcbiAgICAgICAgc2luay5wb2x5Z29uRW5kKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHBvaW50KGxhbWJkYSwgcGhpKSB7XG4gICAgICBpZiAocG9pbnRWaXNpYmxlKGxhbWJkYSwgcGhpKSkgc2luay5wb2ludChsYW1iZGEsIHBoaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9pbnRMaW5lKGxhbWJkYSwgcGhpKSB7XG4gICAgICBsaW5lLnBvaW50KGxhbWJkYSwgcGhpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XG4gICAgICBjbGlwLnBvaW50ID0gcG9pbnRMaW5lO1xuICAgICAgbGluZS5saW5lU3RhcnQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xuICAgICAgY2xpcC5wb2ludCA9IHBvaW50O1xuICAgICAgbGluZS5saW5lRW5kKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9pbnRSaW5nKGxhbWJkYSwgcGhpKSB7XG4gICAgICByaW5nLnB1c2goW2xhbWJkYSwgcGhpXSk7XG4gICAgICByaW5nU2luay5wb2ludChsYW1iZGEsIHBoaSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkge1xuICAgICAgcmluZ1NpbmsubGluZVN0YXJ0KCk7XG4gICAgICByaW5nID0gW107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcbiAgICAgIHBvaW50UmluZyhyaW5nWzBdWzBdLCByaW5nWzBdWzFdKTtcbiAgICAgIHJpbmdTaW5rLmxpbmVFbmQoKTtcblxuICAgICAgdmFyIGNsZWFuID0gcmluZ1NpbmsuY2xlYW4oKSxcbiAgICAgICAgICByaW5nU2VnbWVudHMgPSByaW5nQnVmZmVyLnJlc3VsdCgpLFxuICAgICAgICAgIGksIG4gPSByaW5nU2VnbWVudHMubGVuZ3RoLCBtLFxuICAgICAgICAgIHNlZ21lbnQsXG4gICAgICAgICAgcG9pbnQ7XG5cbiAgICAgIHJpbmcucG9wKCk7XG4gICAgICBwb2x5Z29uLnB1c2gocmluZyk7XG4gICAgICByaW5nID0gbnVsbDtcblxuICAgICAgaWYgKCFuKSByZXR1cm47XG5cbiAgICAgIC8vIE5vIGludGVyc2VjdGlvbnMuXG4gICAgICBpZiAoY2xlYW4gJiAxKSB7XG4gICAgICAgIHNlZ21lbnQgPSByaW5nU2VnbWVudHNbMF07XG4gICAgICAgIGlmICgobSA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPiAwKSB7XG4gICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIHNpbmsubGluZVN0YXJ0KCk7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgc2luay5wb2ludCgocG9pbnQgPSBzZWdtZW50W2ldKVswXSwgcG9pbnRbMV0pO1xuICAgICAgICAgIHNpbmsubGluZUVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVqb2luIGNvbm5lY3RlZCBzZWdtZW50cy5cbiAgICAgIC8vIFRPRE8gcmV1c2UgcmluZ0J1ZmZlci5yZWpvaW4oKT9cbiAgICAgIGlmIChuID4gMSAmJiBjbGVhbiAmIDIpIHJpbmdTZWdtZW50cy5wdXNoKHJpbmdTZWdtZW50cy5wb3AoKS5jb25jYXQocmluZ1NlZ21lbnRzLnNoaWZ0KCkpKTtcblxuICAgICAgc2VnbWVudHMucHVzaChyaW5nU2VnbWVudHMuZmlsdGVyKHZhbGlkU2VnbWVudCkpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGlwO1xuICB9O1xufVxuXG5mdW5jdGlvbiB2YWxpZFNlZ21lbnQoc2VnbWVudCkge1xuICByZXR1cm4gc2VnbWVudC5sZW5ndGggPiAxO1xufVxuXG4vLyBJbnRlcnNlY3Rpb25zIGFyZSBzb3J0ZWQgYWxvbmcgdGhlIGNsaXAgZWRnZS4gRm9yIGJvdGggYW50aW1lcmlkaWFuIGN1dHRpbmdcbi8vIGFuZCBjaXJjbGUgY2xpcHBpbmcsIHRoZSBzYW1lIGNvbXBhcmlzb24gaXMgdXNlZC5cbmZ1bmN0aW9uIGNvbXBhcmVJbnRlcnNlY3Rpb24oYSwgYikge1xuICByZXR1cm4gKChhID0gYS54KVswXSA8IDAgPyBhWzFdIC0gaGFsZlBpIC0gZXBzaWxvbiA6IGhhbGZQaSAtIGFbMV0pXG4gICAgICAgLSAoKGIgPSBiLngpWzBdIDwgMCA/IGJbMV0gLSBoYWxmUGkgLSBlcHNpbG9uIDogaGFsZlBpIC0gYlsxXSk7XG59XG4iLCJpbXBvcnQgY2xpcCBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHthYnMsIGF0YW4sIGNvcywgZXBzaWxvbiwgaGFsZlBpLCBwaSwgc2lufSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGlwKFxuICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0sXG4gIGNsaXBBbnRpbWVyaWRpYW5MaW5lLFxuICBjbGlwQW50aW1lcmlkaWFuSW50ZXJwb2xhdGUsXG4gIFstcGksIC1oYWxmUGldXG4pO1xuXG4vLyBUYWtlcyBhIGxpbmUgYW5kIGN1dHMgaW50byB2aXNpYmxlIHNlZ21lbnRzLiBSZXR1cm4gdmFsdWVzOiAwIC0gdGhlcmUgd2VyZVxuLy8gaW50ZXJzZWN0aW9ucyBvciB0aGUgbGluZSB3YXMgZW1wdHk7IDEgLSBubyBpbnRlcnNlY3Rpb25zOyAyIC0gdGhlcmUgd2VyZVxuLy8gaW50ZXJzZWN0aW9ucywgYW5kIHRoZSBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cyBzaG91bGQgYmUgcmVqb2luZWQuXG5mdW5jdGlvbiBjbGlwQW50aW1lcmlkaWFuTGluZShzdHJlYW0pIHtcbiAgdmFyIGxhbWJkYTAgPSBOYU4sXG4gICAgICBwaGkwID0gTmFOLFxuICAgICAgc2lnbjAgPSBOYU4sXG4gICAgICBjbGVhbjsgLy8gbm8gaW50ZXJzZWN0aW9uc1xuXG4gIHJldHVybiB7XG4gICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgIGNsZWFuID0gMTtcbiAgICB9LFxuICAgIHBvaW50OiBmdW5jdGlvbihsYW1iZGExLCBwaGkxKSB7XG4gICAgICB2YXIgc2lnbjEgPSBsYW1iZGExID4gMCA/IHBpIDogLXBpLFxuICAgICAgICAgIGRlbHRhID0gYWJzKGxhbWJkYTEgLSBsYW1iZGEwKTtcbiAgICAgIGlmIChhYnMoZGVsdGEgLSBwaSkgPCBlcHNpbG9uKSB7IC8vIGxpbmUgY3Jvc3NlcyBhIHBvbGVcbiAgICAgICAgc3RyZWFtLnBvaW50KGxhbWJkYTAsIHBoaTAgPSAocGhpMCArIHBoaTEpIC8gMiA+IDAgPyBoYWxmUGkgOiAtaGFsZlBpKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24wLCBwaGkwKTtcbiAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjEsIHBoaTApO1xuICAgICAgICBzdHJlYW0ucG9pbnQobGFtYmRhMSwgcGhpMCk7XG4gICAgICAgIGNsZWFuID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoc2lnbjAgIT09IHNpZ24xICYmIGRlbHRhID49IHBpKSB7IC8vIGxpbmUgY3Jvc3NlcyBhbnRpbWVyaWRpYW5cbiAgICAgICAgaWYgKGFicyhsYW1iZGEwIC0gc2lnbjApIDwgZXBzaWxvbikgbGFtYmRhMCAtPSBzaWduMCAqIGVwc2lsb247IC8vIGhhbmRsZSBkZWdlbmVyYWNpZXNcbiAgICAgICAgaWYgKGFicyhsYW1iZGExIC0gc2lnbjEpIDwgZXBzaWxvbikgbGFtYmRhMSAtPSBzaWduMSAqIGVwc2lsb247XG4gICAgICAgIHBoaTAgPSBjbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0KGxhbWJkYTAsIHBoaTAsIGxhbWJkYTEsIHBoaTEpO1xuICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjAsIHBoaTApO1xuICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgIHN0cmVhbS5wb2ludChzaWduMSwgcGhpMCk7XG4gICAgICAgIGNsZWFuID0gMDtcbiAgICAgIH1cbiAgICAgIHN0cmVhbS5wb2ludChsYW1iZGEwID0gbGFtYmRhMSwgcGhpMCA9IHBoaTEpO1xuICAgICAgc2lnbjAgPSBzaWduMTtcbiAgICB9LFxuICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgIGxhbWJkYTAgPSBwaGkwID0gTmFOO1xuICAgIH0sXG4gICAgY2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIDIgLSBjbGVhbjsgLy8gaWYgaW50ZXJzZWN0aW9ucywgcmVqb2luIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzXG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0KGxhbWJkYTAsIHBoaTAsIGxhbWJkYTEsIHBoaTEpIHtcbiAgdmFyIGNvc1BoaTAsXG4gICAgICBjb3NQaGkxLFxuICAgICAgc2luTGFtYmRhMExhbWJkYTEgPSBzaW4obGFtYmRhMCAtIGxhbWJkYTEpO1xuICByZXR1cm4gYWJzKHNpbkxhbWJkYTBMYW1iZGExKSA+IGVwc2lsb25cbiAgICAgID8gYXRhbigoc2luKHBoaTApICogKGNvc1BoaTEgPSBjb3MocGhpMSkpICogc2luKGxhbWJkYTEpXG4gICAgICAgICAgLSBzaW4ocGhpMSkgKiAoY29zUGhpMCA9IGNvcyhwaGkwKSkgKiBzaW4obGFtYmRhMCkpXG4gICAgICAgICAgLyAoY29zUGhpMCAqIGNvc1BoaTEgKiBzaW5MYW1iZGEwTGFtYmRhMSkpXG4gICAgICA6IChwaGkwICsgcGhpMSkgLyAyO1xufVxuXG5mdW5jdGlvbiBjbGlwQW50aW1lcmlkaWFuSW50ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7XG4gIHZhciBwaGk7XG4gIGlmIChmcm9tID09IG51bGwpIHtcbiAgICBwaGkgPSBkaXJlY3Rpb24gKiBoYWxmUGk7XG4gICAgc3RyZWFtLnBvaW50KC1waSwgcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQoMCwgcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQocGksIHBoaSk7XG4gICAgc3RyZWFtLnBvaW50KHBpLCAwKTtcbiAgICBzdHJlYW0ucG9pbnQocGksIC1waGkpO1xuICAgIHN0cmVhbS5wb2ludCgwLCAtcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQoLXBpLCAtcGhpKTtcbiAgICBzdHJlYW0ucG9pbnQoLXBpLCAwKTtcbiAgICBzdHJlYW0ucG9pbnQoLXBpLCBwaGkpO1xuICB9IGVsc2UgaWYgKGFicyhmcm9tWzBdIC0gdG9bMF0pID4gZXBzaWxvbikge1xuICAgIHZhciBsYW1iZGEgPSBmcm9tWzBdIDwgdG9bMF0gPyBwaSA6IC1waTtcbiAgICBwaGkgPSBkaXJlY3Rpb24gKiBsYW1iZGEgLyAyO1xuICAgIHN0cmVhbS5wb2ludCgtbGFtYmRhLCBwaGkpO1xuICAgIHN0cmVhbS5wb2ludCgwLCBwaGkpO1xuICAgIHN0cmVhbS5wb2ludChsYW1iZGEsIHBoaSk7XG4gIH0gZWxzZSB7XG4gICAgc3RyZWFtLnBvaW50KHRvWzBdLCB0b1sxXSk7XG4gIH1cbn1cbiIsImltcG9ydCB7Y2FydGVzaWFuLCBjYXJ0ZXNpYW5BZGRJblBsYWNlLCBjYXJ0ZXNpYW5Dcm9zcywgY2FydGVzaWFuRG90LCBjYXJ0ZXNpYW5TY2FsZSwgc3BoZXJpY2FsfSBmcm9tIFwiLi4vY2FydGVzaWFuLmpzXCI7XG5pbXBvcnQge2NpcmNsZVN0cmVhbX0gZnJvbSBcIi4uL2NpcmNsZS5qc1wiO1xuaW1wb3J0IHthYnMsIGNvcywgZXBzaWxvbiwgcGksIHJhZGlhbnMsIHNxcnR9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQgcG9pbnRFcXVhbCBmcm9tIFwiLi4vcG9pbnRFcXVhbC5qc1wiO1xuaW1wb3J0IGNsaXAgZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocmFkaXVzKSB7XG4gIHZhciBjciA9IGNvcyhyYWRpdXMpLFxuICAgICAgZGVsdGEgPSA2ICogcmFkaWFucyxcbiAgICAgIHNtYWxsUmFkaXVzID0gY3IgPiAwLFxuICAgICAgbm90SGVtaXNwaGVyZSA9IGFicyhjcikgPiBlcHNpbG9uOyAvLyBUT0RPIG9wdGltaXNlIGZvciB0aGlzIGNvbW1vbiBjYXNlXG5cbiAgZnVuY3Rpb24gaW50ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7XG4gICAgY2lyY2xlU3RyZWFtKHN0cmVhbSwgcmFkaXVzLCBkZWx0YSwgZGlyZWN0aW9uLCBmcm9tLCB0byk7XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlKGxhbWJkYSwgcGhpKSB7XG4gICAgcmV0dXJuIGNvcyhsYW1iZGEpICogY29zKHBoaSkgPiBjcjtcbiAgfVxuXG4gIC8vIFRha2VzIGEgbGluZSBhbmQgY3V0cyBpbnRvIHZpc2libGUgc2VnbWVudHMuIFJldHVybiB2YWx1ZXMgdXNlZCBmb3IgcG9seWdvblxuICAvLyBjbGlwcGluZzogMCAtIHRoZXJlIHdlcmUgaW50ZXJzZWN0aW9ucyBvciB0aGUgbGluZSB3YXMgZW1wdHk7IDEgLSBub1xuICAvLyBpbnRlcnNlY3Rpb25zIDIgLSB0aGVyZSB3ZXJlIGludGVyc2VjdGlvbnMsIGFuZCB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHNcbiAgLy8gc2hvdWxkIGJlIHJlam9pbmVkLlxuICBmdW5jdGlvbiBjbGlwTGluZShzdHJlYW0pIHtcbiAgICB2YXIgcG9pbnQwLCAvLyBwcmV2aW91cyBwb2ludFxuICAgICAgICBjMCwgLy8gY29kZSBmb3IgcHJldmlvdXMgcG9pbnRcbiAgICAgICAgdjAsIC8vIHZpc2liaWxpdHkgb2YgcHJldmlvdXMgcG9pbnRcbiAgICAgICAgdjAwLCAvLyB2aXNpYmlsaXR5IG9mIGZpcnN0IHBvaW50XG4gICAgICAgIGNsZWFuOyAvLyBubyBpbnRlcnNlY3Rpb25zXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHYwMCA9IHYwID0gZmFsc2U7XG4gICAgICAgIGNsZWFuID0gMTtcbiAgICAgIH0sXG4gICAgICBwb2ludDogZnVuY3Rpb24obGFtYmRhLCBwaGkpIHtcbiAgICAgICAgdmFyIHBvaW50MSA9IFtsYW1iZGEsIHBoaV0sXG4gICAgICAgICAgICBwb2ludDIsXG4gICAgICAgICAgICB2ID0gdmlzaWJsZShsYW1iZGEsIHBoaSksXG4gICAgICAgICAgICBjID0gc21hbGxSYWRpdXNcbiAgICAgICAgICAgICAgPyB2ID8gMCA6IGNvZGUobGFtYmRhLCBwaGkpXG4gICAgICAgICAgICAgIDogdiA/IGNvZGUobGFtYmRhICsgKGxhbWJkYSA8IDAgPyBwaSA6IC1waSksIHBoaSkgOiAwO1xuICAgICAgICBpZiAoIXBvaW50MCAmJiAodjAwID0gdjAgPSB2KSkgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICBpZiAodiAhPT0gdjApIHtcbiAgICAgICAgICBwb2ludDIgPSBpbnRlcnNlY3QocG9pbnQwLCBwb2ludDEpO1xuICAgICAgICAgIGlmICghcG9pbnQyIHx8IHBvaW50RXF1YWwocG9pbnQwLCBwb2ludDIpIHx8IHBvaW50RXF1YWwocG9pbnQxLCBwb2ludDIpKVxuICAgICAgICAgICAgcG9pbnQxWzJdID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodiAhPT0gdjApIHtcbiAgICAgICAgICBjbGVhbiA9IDA7XG4gICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIC8vIG91dHNpZGUgZ29pbmcgaW5cbiAgICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCk7XG4gICAgICAgICAgICBzdHJlYW0ucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpbnNpZGUgZ29pbmcgb3V0XG4gICAgICAgICAgICBwb2ludDIgPSBpbnRlcnNlY3QocG9pbnQwLCBwb2ludDEpO1xuICAgICAgICAgICAgc3RyZWFtLnBvaW50KHBvaW50MlswXSwgcG9pbnQyWzFdLCAyKTtcbiAgICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50MCA9IHBvaW50MjtcbiAgICAgICAgfSBlbHNlIGlmIChub3RIZW1pc3BoZXJlICYmIHBvaW50MCAmJiBzbWFsbFJhZGl1cyBeIHYpIHtcbiAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAvLyBJZiB0aGUgY29kZXMgZm9yIHR3byBwb2ludHMgYXJlIGRpZmZlcmVudCwgb3IgYXJlIGJvdGggemVybyxcbiAgICAgICAgICAvLyBhbmQgdGhlcmUgdGhpcyBzZWdtZW50IGludGVyc2VjdHMgd2l0aCB0aGUgc21hbGwgY2lyY2xlLlxuICAgICAgICAgIGlmICghKGMgJiBjMCkgJiYgKHQgPSBpbnRlcnNlY3QocG9pbnQxLCBwb2ludDAsIHRydWUpKSkge1xuICAgICAgICAgICAgY2xlYW4gPSAwO1xuICAgICAgICAgICAgaWYgKHNtYWxsUmFkaXVzKSB7XG4gICAgICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMF1bMF0sIHRbMF1bMV0pO1xuICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFsxXVswXSwgdFsxXVsxXSk7XG4gICAgICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFsxXVswXSwgdFsxXVsxXSk7XG4gICAgICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMF1bMF0sIHRbMF1bMV0sIDMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodiAmJiAoIXBvaW50MCB8fCAhcG9pbnRFcXVhbChwb2ludDAsIHBvaW50MSkpKSB7XG4gICAgICAgICAgc3RyZWFtLnBvaW50KHBvaW50MVswXSwgcG9pbnQxWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBwb2ludDAgPSBwb2ludDEsIHYwID0gdiwgYzAgPSBjO1xuICAgICAgfSxcbiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodjApIHN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgIHBvaW50MCA9IG51bGw7XG4gICAgICB9LFxuICAgICAgLy8gUmVqb2luIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzIGlmIHRoZXJlIHdlcmUgaW50ZXJzZWN0aW9ucyBhbmQgdGhlIGZpcnN0XG4gICAgICAvLyBhbmQgbGFzdCBwb2ludHMgd2VyZSB2aXNpYmxlLlxuICAgICAgY2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gY2xlYW4gfCAoKHYwMCAmJiB2MCkgPDwgMSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIEludGVyc2VjdHMgdGhlIGdyZWF0IGNpcmNsZSBiZXR3ZWVuIGEgYW5kIGIgd2l0aCB0aGUgY2xpcCBjaXJjbGUuXG4gIGZ1bmN0aW9uIGludGVyc2VjdChhLCBiLCB0d28pIHtcbiAgICB2YXIgcGEgPSBjYXJ0ZXNpYW4oYSksXG4gICAgICAgIHBiID0gY2FydGVzaWFuKGIpO1xuXG4gICAgLy8gV2UgaGF2ZSB0d28gcGxhbmVzLCBuMS5wID0gZDEgYW5kIG4yLnAgPSBkMi5cbiAgICAvLyBGaW5kIGludGVyc2VjdGlvbiBsaW5lIHAodCkgPSBjMSBuMSArIGMyIG4yICsgdCAobjEg4qivIG4yKS5cbiAgICB2YXIgbjEgPSBbMSwgMCwgMF0sIC8vIG5vcm1hbFxuICAgICAgICBuMiA9IGNhcnRlc2lhbkNyb3NzKHBhLCBwYiksXG4gICAgICAgIG4ybjIgPSBjYXJ0ZXNpYW5Eb3QobjIsIG4yKSxcbiAgICAgICAgbjFuMiA9IG4yWzBdLCAvLyBjYXJ0ZXNpYW5Eb3QobjEsIG4yKSxcbiAgICAgICAgZGV0ZXJtaW5hbnQgPSBuMm4yIC0gbjFuMiAqIG4xbjI7XG5cbiAgICAvLyBUd28gcG9sYXIgcG9pbnRzLlxuICAgIGlmICghZGV0ZXJtaW5hbnQpIHJldHVybiAhdHdvICYmIGE7XG5cbiAgICB2YXIgYzEgPSAgY3IgKiBuMm4yIC8gZGV0ZXJtaW5hbnQsXG4gICAgICAgIGMyID0gLWNyICogbjFuMiAvIGRldGVybWluYW50LFxuICAgICAgICBuMXhuMiA9IGNhcnRlc2lhbkNyb3NzKG4xLCBuMiksXG4gICAgICAgIEEgPSBjYXJ0ZXNpYW5TY2FsZShuMSwgYzEpLFxuICAgICAgICBCID0gY2FydGVzaWFuU2NhbGUobjIsIGMyKTtcbiAgICBjYXJ0ZXNpYW5BZGRJblBsYWNlKEEsIEIpO1xuXG4gICAgLy8gU29sdmUgfHAodCl8XjIgPSAxLlxuICAgIHZhciB1ID0gbjF4bjIsXG4gICAgICAgIHcgPSBjYXJ0ZXNpYW5Eb3QoQSwgdSksXG4gICAgICAgIHV1ID0gY2FydGVzaWFuRG90KHUsIHUpLFxuICAgICAgICB0MiA9IHcgKiB3IC0gdXUgKiAoY2FydGVzaWFuRG90KEEsIEEpIC0gMSk7XG5cbiAgICBpZiAodDIgPCAwKSByZXR1cm47XG5cbiAgICB2YXIgdCA9IHNxcnQodDIpLFxuICAgICAgICBxID0gY2FydGVzaWFuU2NhbGUodSwgKC13IC0gdCkgLyB1dSk7XG4gICAgY2FydGVzaWFuQWRkSW5QbGFjZShxLCBBKTtcbiAgICBxID0gc3BoZXJpY2FsKHEpO1xuXG4gICAgaWYgKCF0d28pIHJldHVybiBxO1xuXG4gICAgLy8gVHdvIGludGVyc2VjdGlvbiBwb2ludHMuXG4gICAgdmFyIGxhbWJkYTAgPSBhWzBdLFxuICAgICAgICBsYW1iZGExID0gYlswXSxcbiAgICAgICAgcGhpMCA9IGFbMV0sXG4gICAgICAgIHBoaTEgPSBiWzFdLFxuICAgICAgICB6O1xuXG4gICAgaWYgKGxhbWJkYTEgPCBsYW1iZGEwKSB6ID0gbGFtYmRhMCwgbGFtYmRhMCA9IGxhbWJkYTEsIGxhbWJkYTEgPSB6O1xuXG4gICAgdmFyIGRlbHRhID0gbGFtYmRhMSAtIGxhbWJkYTAsXG4gICAgICAgIHBvbGFyID0gYWJzKGRlbHRhIC0gcGkpIDwgZXBzaWxvbixcbiAgICAgICAgbWVyaWRpYW4gPSBwb2xhciB8fCBkZWx0YSA8IGVwc2lsb247XG5cbiAgICBpZiAoIXBvbGFyICYmIHBoaTEgPCBwaGkwKSB6ID0gcGhpMCwgcGhpMCA9IHBoaTEsIHBoaTEgPSB6O1xuXG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgZmlyc3QgcG9pbnQgaXMgYmV0d2VlbiBhIGFuZCBiLlxuICAgIGlmIChtZXJpZGlhblxuICAgICAgICA/IHBvbGFyXG4gICAgICAgICAgPyBwaGkwICsgcGhpMSA+IDAgXiBxWzFdIDwgKGFicyhxWzBdIC0gbGFtYmRhMCkgPCBlcHNpbG9uID8gcGhpMCA6IHBoaTEpXG4gICAgICAgICAgOiBwaGkwIDw9IHFbMV0gJiYgcVsxXSA8PSBwaGkxXG4gICAgICAgIDogZGVsdGEgPiBwaSBeIChsYW1iZGEwIDw9IHFbMF0gJiYgcVswXSA8PSBsYW1iZGExKSkge1xuICAgICAgdmFyIHExID0gY2FydGVzaWFuU2NhbGUodSwgKC13ICsgdCkgLyB1dSk7XG4gICAgICBjYXJ0ZXNpYW5BZGRJblBsYWNlKHExLCBBKTtcbiAgICAgIHJldHVybiBbcSwgc3BoZXJpY2FsKHExKV07XG4gICAgfVxuICB9XG5cbiAgLy8gR2VuZXJhdGVzIGEgNC1iaXQgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgYSBwb2ludCByZWxhdGl2ZSB0b1xuICAvLyB0aGUgc21hbGwgY2lyY2xlJ3MgYm91bmRpbmcgYm94LlxuICBmdW5jdGlvbiBjb2RlKGxhbWJkYSwgcGhpKSB7XG4gICAgdmFyIHIgPSBzbWFsbFJhZGl1cyA/IHJhZGl1cyA6IHBpIC0gcmFkaXVzLFxuICAgICAgICBjb2RlID0gMDtcbiAgICBpZiAobGFtYmRhIDwgLXIpIGNvZGUgfD0gMTsgLy8gbGVmdFxuICAgIGVsc2UgaWYgKGxhbWJkYSA+IHIpIGNvZGUgfD0gMjsgLy8gcmlnaHRcbiAgICBpZiAocGhpIDwgLXIpIGNvZGUgfD0gNDsgLy8gYmVsb3dcbiAgICBlbHNlIGlmIChwaGkgPiByKSBjb2RlIHw9IDg7IC8vIGFib3ZlXG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cblxuICByZXR1cm4gY2xpcCh2aXNpYmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUsIHNtYWxsUmFkaXVzID8gWzAsIC1yYWRpdXNdIDogWy1waSwgcmFkaXVzIC0gcGldKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICB0MCA9IDAsXG4gICAgICB0MSA9IDEsXG4gICAgICBkeCA9IGJ4IC0gYXgsXG4gICAgICBkeSA9IGJ5IC0gYXksXG4gICAgICByO1xuXG4gIHIgPSB4MCAtIGF4O1xuICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47XG4gIHIgLz0gZHg7XG4gIGlmIChkeCA8IDApIHtcbiAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICB9IGVsc2UgaWYgKGR4ID4gMCkge1xuICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICBpZiAociA+IHQwKSB0MCA9IHI7XG4gIH1cblxuICByID0geDEgLSBheDtcbiAgaWYgKCFkeCAmJiByIDwgMCkgcmV0dXJuO1xuICByIC89IGR4O1xuICBpZiAoZHggPCAwKSB7XG4gICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgfSBlbHNlIGlmIChkeCA+IDApIHtcbiAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICB9XG5cbiAgciA9IHkwIC0gYXk7XG4gIGlmICghZHkgJiYgciA+IDApIHJldHVybjtcbiAgciAvPSBkeTtcbiAgaWYgKGR5IDwgMCkge1xuICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICBpZiAociA8IHQxKSB0MSA9IHI7XG4gIH0gZWxzZSBpZiAoZHkgPiAwKSB7XG4gICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgfVxuXG4gIHIgPSB5MSAtIGF5O1xuICBpZiAoIWR5ICYmIHIgPCAwKSByZXR1cm47XG4gIHIgLz0gZHk7XG4gIGlmIChkeSA8IDApIHtcbiAgICBpZiAociA+IHQxKSByZXR1cm47XG4gICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICB9IGVsc2UgaWYgKGR5ID4gMCkge1xuICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICBpZiAociA8IHQxKSB0MSA9IHI7XG4gIH1cblxuICBpZiAodDAgPiAwKSBhWzBdID0gYXggKyB0MCAqIGR4LCBhWzFdID0gYXkgKyB0MCAqIGR5O1xuICBpZiAodDEgPCAxKSBiWzBdID0gYXggKyB0MSAqIGR4LCBiWzFdID0gYXkgKyB0MSAqIGR5O1xuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7YWJzLCBlcHNpbG9ufSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IGNsaXBCdWZmZXIgZnJvbSBcIi4vYnVmZmVyLmpzXCI7XG5pbXBvcnQgY2xpcExpbmUgZnJvbSBcIi4vbGluZS5qc1wiO1xuaW1wb3J0IGNsaXBSZWpvaW4gZnJvbSBcIi4vcmVqb2luLmpzXCI7XG5pbXBvcnQge21lcmdlfSBmcm9tIFwiZDMtYXJyYXlcIjtcblxudmFyIGNsaXBNYXggPSAxZTksIGNsaXBNaW4gPSAtY2xpcE1heDtcblxuLy8gVE9ETyBVc2UgZDMtcG9seWdvbuKAmXMgcG9seWdvbkNvbnRhaW5zIGhlcmUgZm9yIHRoZSByaW5nIGNoZWNrP1xuLy8gVE9ETyBFbGltaW5hdGUgZHVwbGljYXRlIGJ1ZmZlcmluZyBpbiBjbGlwQnVmZmVyIGFuZCBwb2x5Z29uLnB1c2g/XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsaXBSZWN0YW5nbGUoeDAsIHkwLCB4MSwgeTEpIHtcblxuICBmdW5jdGlvbiB2aXNpYmxlKHgsIHkpIHtcbiAgICByZXR1cm4geDAgPD0geCAmJiB4IDw9IHgxICYmIHkwIDw9IHkgJiYgeSA8PSB5MTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIHN0cmVhbSkge1xuICAgIHZhciBhID0gMCwgYTEgPSAwO1xuICAgIGlmIChmcm9tID09IG51bGxcbiAgICAgICAgfHwgKGEgPSBjb3JuZXIoZnJvbSwgZGlyZWN0aW9uKSkgIT09IChhMSA9IGNvcm5lcih0bywgZGlyZWN0aW9uKSlcbiAgICAgICAgfHwgY29tcGFyZVBvaW50KGZyb20sIHRvKSA8IDAgXiBkaXJlY3Rpb24gPiAwKSB7XG4gICAgICBkbyBzdHJlYW0ucG9pbnQoYSA9PT0gMCB8fCBhID09PSAzID8geDAgOiB4MSwgYSA+IDEgPyB5MSA6IHkwKTtcbiAgICAgIHdoaWxlICgoYSA9IChhICsgZGlyZWN0aW9uICsgNCkgJSA0KSAhPT0gYTEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW0ucG9pbnQodG9bMF0sIHRvWzFdKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb3JuZXIocCwgZGlyZWN0aW9uKSB7XG4gICAgcmV0dXJuIGFicyhwWzBdIC0geDApIDwgZXBzaWxvbiA/IGRpcmVjdGlvbiA+IDAgPyAwIDogM1xuICAgICAgICA6IGFicyhwWzBdIC0geDEpIDwgZXBzaWxvbiA/IGRpcmVjdGlvbiA+IDAgPyAyIDogMVxuICAgICAgICA6IGFicyhwWzFdIC0geTApIDwgZXBzaWxvbiA/IGRpcmVjdGlvbiA+IDAgPyAxIDogMFxuICAgICAgICA6IGRpcmVjdGlvbiA+IDAgPyAzIDogMjsgLy8gYWJzKHBbMV0gLSB5MSkgPCBlcHNpbG9uXG4gIH1cblxuICBmdW5jdGlvbiBjb21wYXJlSW50ZXJzZWN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gY29tcGFyZVBvaW50KGEueCwgYi54KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBhcmVQb2ludChhLCBiKSB7XG4gICAgdmFyIGNhID0gY29ybmVyKGEsIDEpLFxuICAgICAgICBjYiA9IGNvcm5lcihiLCAxKTtcbiAgICByZXR1cm4gY2EgIT09IGNiID8gY2EgLSBjYlxuICAgICAgICA6IGNhID09PSAwID8gYlsxXSAtIGFbMV1cbiAgICAgICAgOiBjYSA9PT0gMSA/IGFbMF0gLSBiWzBdXG4gICAgICAgIDogY2EgPT09IDIgPyBhWzFdIC0gYlsxXVxuICAgICAgICA6IGJbMF0gLSBhWzBdO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIHZhciBhY3RpdmVTdHJlYW0gPSBzdHJlYW0sXG4gICAgICAgIGJ1ZmZlclN0cmVhbSA9IGNsaXBCdWZmZXIoKSxcbiAgICAgICAgc2VnbWVudHMsXG4gICAgICAgIHBvbHlnb24sXG4gICAgICAgIHJpbmcsXG4gICAgICAgIHhfXywgeV9fLCB2X18sIC8vIGZpcnN0IHBvaW50XG4gICAgICAgIHhfLCB5Xywgdl8sIC8vIHByZXZpb3VzIHBvaW50XG4gICAgICAgIGZpcnN0LFxuICAgICAgICBjbGVhbjtcblxuICAgIHZhciBjbGlwU3RyZWFtID0ge1xuICAgICAgcG9pbnQ6IHBvaW50LFxuICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICBsaW5lRW5kOiBsaW5lRW5kLFxuICAgICAgcG9seWdvblN0YXJ0OiBwb2x5Z29uU3RhcnQsXG4gICAgICBwb2x5Z29uRW5kOiBwb2x5Z29uRW5kXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHtcbiAgICAgIGlmICh2aXNpYmxlKHgsIHkpKSBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9seWdvbkluc2lkZSgpIHtcbiAgICAgIHZhciB3aW5kaW5nID0gMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBwb2x5Z29uLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBmb3IgKHZhciByaW5nID0gcG9seWdvbltpXSwgaiA9IDEsIG0gPSByaW5nLmxlbmd0aCwgcG9pbnQgPSByaW5nWzBdLCBhMCwgYTEsIGIwID0gcG9pbnRbMF0sIGIxID0gcG9pbnRbMV07IGogPCBtOyArK2opIHtcbiAgICAgICAgICBhMCA9IGIwLCBhMSA9IGIxLCBwb2ludCA9IHJpbmdbal0sIGIwID0gcG9pbnRbMF0sIGIxID0gcG9pbnRbMV07XG4gICAgICAgICAgaWYgKGExIDw9IHkxKSB7IGlmIChiMSA+IHkxICYmIChiMCAtIGEwKSAqICh5MSAtIGExKSA+IChiMSAtIGExKSAqICh4MCAtIGEwKSkgKyt3aW5kaW5nOyB9XG4gICAgICAgICAgZWxzZSB7IGlmIChiMSA8PSB5MSAmJiAoYjAgLSBhMCkgKiAoeTEgLSBhMSkgPCAoYjEgLSBhMSkgKiAoeDAgLSBhMCkpIC0td2luZGluZzsgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3aW5kaW5nO1xuICAgIH1cblxuICAgIC8vIEJ1ZmZlciBnZW9tZXRyeSB3aXRoaW4gYSBwb2x5Z29uIGFuZCB0aGVuIGNsaXAgaXQgZW4gbWFzc2UuXG4gICAgZnVuY3Rpb24gcG9seWdvblN0YXJ0KCkge1xuICAgICAgYWN0aXZlU3RyZWFtID0gYnVmZmVyU3RyZWFtLCBzZWdtZW50cyA9IFtdLCBwb2x5Z29uID0gW10sIGNsZWFuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2x5Z29uRW5kKCkge1xuICAgICAgdmFyIHN0YXJ0SW5zaWRlID0gcG9seWdvbkluc2lkZSgpLFxuICAgICAgICAgIGNsZWFuSW5zaWRlID0gY2xlYW4gJiYgc3RhcnRJbnNpZGUsXG4gICAgICAgICAgdmlzaWJsZSA9IChzZWdtZW50cyA9IG1lcmdlKHNlZ21lbnRzKSkubGVuZ3RoO1xuICAgICAgaWYgKGNsZWFuSW5zaWRlIHx8IHZpc2libGUpIHtcbiAgICAgICAgc3RyZWFtLnBvbHlnb25TdGFydCgpO1xuICAgICAgICBpZiAoY2xlYW5JbnNpZGUpIHtcbiAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgc3RyZWFtKTtcbiAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgY2xpcFJlam9pbihzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiwgc3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbS5wb2x5Z29uRW5kKCk7XG4gICAgICB9XG4gICAgICBhY3RpdmVTdHJlYW0gPSBzdHJlYW0sIHNlZ21lbnRzID0gcG9seWdvbiA9IHJpbmcgPSBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVTdGFydCgpIHtcbiAgICAgIGNsaXBTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7XG4gICAgICBpZiAocG9seWdvbikgcG9seWdvbi5wdXNoKHJpbmcgPSBbXSk7XG4gICAgICBmaXJzdCA9IHRydWU7XG4gICAgICB2XyA9IGZhbHNlO1xuICAgICAgeF8gPSB5XyA9IE5hTjtcbiAgICB9XG5cbiAgICAvLyBUT0RPIHJhdGhlciB0aGFuIHNwZWNpYWwtY2FzZSBwb2x5Z29ucywgc2ltcGx5IGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkuXG4gICAgLy8gSWRlYWxseSwgY29pbmNpZGVudCBpbnRlcnNlY3Rpb24gcG9pbnRzIHNob3VsZCBiZSBqaXR0ZXJlZCB0byBhdm9pZFxuICAgIC8vIGNsaXBwaW5nIGlzc3Vlcy5cbiAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xuICAgICAgaWYgKHNlZ21lbnRzKSB7XG4gICAgICAgIGxpbmVQb2ludCh4X18sIHlfXyk7XG4gICAgICAgIGlmICh2X18gJiYgdl8pIGJ1ZmZlclN0cmVhbS5yZWpvaW4oKTtcbiAgICAgICAgc2VnbWVudHMucHVzaChidWZmZXJTdHJlYW0ucmVzdWx0KCkpO1xuICAgICAgfVxuICAgICAgY2xpcFN0cmVhbS5wb2ludCA9IHBvaW50O1xuICAgICAgaWYgKHZfKSBhY3RpdmVTdHJlYW0ubGluZUVuZCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVQb2ludCh4LCB5KSB7XG4gICAgICB2YXIgdiA9IHZpc2libGUoeCwgeSk7XG4gICAgICBpZiAocG9seWdvbikgcmluZy5wdXNoKFt4LCB5XSk7XG4gICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgeF9fID0geCwgeV9fID0geSwgdl9fID0gdjtcbiAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodiAmJiB2XykgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgYSA9IFt4XyA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHhfKSksIHlfID0gTWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeV8pKV0sXG4gICAgICAgICAgICAgIGIgPSBbeCA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHgpKSwgeSA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHkpKV07XG4gICAgICAgICAgaWYgKGNsaXBMaW5lKGEsIGIsIHgwLCB5MCwgeDEsIHkxKSkge1xuICAgICAgICAgICAgaWYgKCF2Xykge1xuICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5wb2ludChhWzBdLCBhWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5wb2ludChiWzBdLCBiWzFdKTtcbiAgICAgICAgICAgIGlmICghdikgYWN0aXZlU3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmICh2KSB7XG4gICAgICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7XG4gICAgICAgICAgICBjbGVhbiA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgeF8gPSB4LCB5XyA9IHksIHZfID0gdjtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcFN0cmVhbTtcbiAgfTtcbn1cbiIsImltcG9ydCBjbGlwUmVjdGFuZ2xlIGZyb20gXCIuL3JlY3RhbmdsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHgwID0gMCxcbiAgICAgIHkwID0gMCxcbiAgICAgIHgxID0gOTYwLFxuICAgICAgeTEgPSA1MDAsXG4gICAgICBjYWNoZSxcbiAgICAgIGNhY2hlU3RyZWFtLFxuICAgICAgY2xpcDtcblxuICByZXR1cm4gY2xpcCA9IHtcbiAgICBzdHJlYW06IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJlYW0gPyBjYWNoZSA6IGNhY2hlID0gY2xpcFJlY3RhbmdsZSh4MCwgeTAsIHgxLCB5MSkoY2FjaGVTdHJlYW0gPSBzdHJlYW0pO1xuICAgIH0sXG4gICAgZXh0ZW50OiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9ICtfWzBdWzBdLCB5MCA9ICtfWzBdWzFdLCB4MSA9ICtfWzFdWzBdLCB5MSA9ICtfWzFdWzFdLCBjYWNoZSA9IGNhY2hlU3RyZWFtID0gbnVsbCwgY2xpcCkgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgYWRkZXIgZnJvbSBcIi4vYWRkZXIuanNcIjtcbmltcG9ydCB7YWJzLCBhdGFuMiwgY29zLCByYWRpYW5zLCBzaW4sIHNxcnR9IGZyb20gXCIuL21hdGguanNcIjtcbmltcG9ydCBub29wIGZyb20gXCIuL25vb3AuanNcIjtcbmltcG9ydCBzdHJlYW0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5cbnZhciBsZW5ndGhTdW0gPSBhZGRlcigpLFxuICAgIGxhbWJkYTAsXG4gICAgc2luUGhpMCxcbiAgICBjb3NQaGkwO1xuXG52YXIgbGVuZ3RoU3RyZWFtID0ge1xuICBzcGhlcmU6IG5vb3AsXG4gIHBvaW50OiBub29wLFxuICBsaW5lU3RhcnQ6IGxlbmd0aExpbmVTdGFydCxcbiAgbGluZUVuZDogbm9vcCxcbiAgcG9seWdvblN0YXJ0OiBub29wLFxuICBwb2x5Z29uRW5kOiBub29wXG59O1xuXG5mdW5jdGlvbiBsZW5ndGhMaW5lU3RhcnQoKSB7XG4gIGxlbmd0aFN0cmVhbS5wb2ludCA9IGxlbmd0aFBvaW50Rmlyc3Q7XG4gIGxlbmd0aFN0cmVhbS5saW5lRW5kID0gbGVuZ3RoTGluZUVuZDtcbn1cblxuZnVuY3Rpb24gbGVuZ3RoTGluZUVuZCgpIHtcbiAgbGVuZ3RoU3RyZWFtLnBvaW50ID0gbGVuZ3RoU3RyZWFtLmxpbmVFbmQgPSBub29wO1xufVxuXG5mdW5jdGlvbiBsZW5ndGhQb2ludEZpcnN0KGxhbWJkYSwgcGhpKSB7XG4gIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFucztcbiAgbGFtYmRhMCA9IGxhbWJkYSwgc2luUGhpMCA9IHNpbihwaGkpLCBjb3NQaGkwID0gY29zKHBoaSk7XG4gIGxlbmd0aFN0cmVhbS5wb2ludCA9IGxlbmd0aFBvaW50O1xufVxuXG5mdW5jdGlvbiBsZW5ndGhQb2ludChsYW1iZGEsIHBoaSkge1xuICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJhZGlhbnM7XG4gIHZhciBzaW5QaGkgPSBzaW4ocGhpKSxcbiAgICAgIGNvc1BoaSA9IGNvcyhwaGkpLFxuICAgICAgZGVsdGEgPSBhYnMobGFtYmRhIC0gbGFtYmRhMCksXG4gICAgICBjb3NEZWx0YSA9IGNvcyhkZWx0YSksXG4gICAgICBzaW5EZWx0YSA9IHNpbihkZWx0YSksXG4gICAgICB4ID0gY29zUGhpICogc2luRGVsdGEsXG4gICAgICB5ID0gY29zUGhpMCAqIHNpblBoaSAtIHNpblBoaTAgKiBjb3NQaGkgKiBjb3NEZWx0YSxcbiAgICAgIHogPSBzaW5QaGkwICogc2luUGhpICsgY29zUGhpMCAqIGNvc1BoaSAqIGNvc0RlbHRhO1xuICBsZW5ndGhTdW0uYWRkKGF0YW4yKHNxcnQoeCAqIHggKyB5ICogeSksIHopKTtcbiAgbGFtYmRhMCA9IGxhbWJkYSwgc2luUGhpMCA9IHNpblBoaSwgY29zUGhpMCA9IGNvc1BoaTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob2JqZWN0KSB7XG4gIGxlbmd0aFN1bS5yZXNldCgpO1xuICBzdHJlYW0ob2JqZWN0LCBsZW5ndGhTdHJlYW0pO1xuICByZXR1cm4gK2xlbmd0aFN1bTtcbn1cbiIsImltcG9ydCBsZW5ndGggZnJvbSBcIi4vbGVuZ3RoLmpzXCI7XG5cbnZhciBjb29yZGluYXRlcyA9IFtudWxsLCBudWxsXSxcbiAgICBvYmplY3QgPSB7dHlwZTogXCJMaW5lU3RyaW5nXCIsIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc307XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgY29vcmRpbmF0ZXNbMF0gPSBhO1xuICBjb29yZGluYXRlc1sxXSA9IGI7XG4gIHJldHVybiBsZW5ndGgob2JqZWN0KTtcbn1cbiIsImltcG9ydCB7ZGVmYXVsdCBhcyBwb2x5Z29uQ29udGFpbnN9IGZyb20gXCIuL3BvbHlnb25Db250YWlucy5qc1wiO1xuaW1wb3J0IHtkZWZhdWx0IGFzIGRpc3RhbmNlfSBmcm9tIFwiLi9kaXN0YW5jZS5qc1wiO1xuaW1wb3J0IHtlcHNpbG9uMiwgcmFkaWFuc30gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG52YXIgY29udGFpbnNPYmplY3RUeXBlID0ge1xuICBGZWF0dXJlOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zR2VvbWV0cnkob2JqZWN0Lmdlb21ldHJ5LCBwb2ludCk7XG4gIH0sXG4gIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7XG4gICAgdmFyIGZlYXR1cmVzID0gb2JqZWN0LmZlYXR1cmVzLCBpID0gLTEsIG4gPSBmZWF0dXJlcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmIChjb250YWluc0dlb21ldHJ5KGZlYXR1cmVzW2ldLmdlb21ldHJ5LCBwb2ludCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxudmFyIGNvbnRhaW5zR2VvbWV0cnlUeXBlID0ge1xuICBTcGhlcmU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkge1xuICAgIHJldHVybiBjb250YWluc1BvaW50KG9iamVjdC5jb29yZGluYXRlcywgcG9pbnQpO1xuICB9LFxuICBNdWx0aVBvaW50OiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7XG4gICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmIChjb250YWluc1BvaW50KGNvb3JkaW5hdGVzW2ldLCBwb2ludCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkge1xuICAgIHJldHVybiBjb250YWluc0xpbmUob2JqZWN0LmNvb3JkaW5hdGVzLCBwb2ludCk7XG4gIH0sXG4gIE11bHRpTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkge1xuICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoY29udGFpbnNMaW5lKGNvb3JkaW5hdGVzW2ldLCBwb2ludCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkge1xuICAgIHJldHVybiBjb250YWluc1BvbHlnb24ob2JqZWN0LmNvb3JkaW5hdGVzLCBwb2ludCk7XG4gIH0sXG4gIE11bHRpUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkge1xuICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoY29udGFpbnNQb2x5Z29uKGNvb3JkaW5hdGVzW2ldLCBwb2ludCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7XG4gICAgdmFyIGdlb21ldHJpZXMgPSBvYmplY3QuZ2VvbWV0cmllcywgaSA9IC0xLCBuID0gZ2VvbWV0cmllcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmIChjb250YWluc0dlb21ldHJ5KGdlb21ldHJpZXNbaV0sIHBvaW50KSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjb250YWluc0dlb21ldHJ5KGdlb21ldHJ5LCBwb2ludCkge1xuICByZXR1cm4gZ2VvbWV0cnkgJiYgY29udGFpbnNHZW9tZXRyeVR5cGUuaGFzT3duUHJvcGVydHkoZ2VvbWV0cnkudHlwZSlcbiAgICAgID8gY29udGFpbnNHZW9tZXRyeVR5cGVbZ2VvbWV0cnkudHlwZV0oZ2VvbWV0cnksIHBvaW50KVxuICAgICAgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNQb2ludChjb29yZGluYXRlcywgcG9pbnQpIHtcbiAgcmV0dXJuIGRpc3RhbmNlKGNvb3JkaW5hdGVzLCBwb2ludCkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTGluZShjb29yZGluYXRlcywgcG9pbnQpIHtcbiAgdmFyIGFvLCBibywgYWI7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgYm8gPSBkaXN0YW5jZShjb29yZGluYXRlc1tpXSwgcG9pbnQpO1xuICAgIGlmIChibyA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGkgPiAwKSB7XG4gICAgICBhYiA9IGRpc3RhbmNlKGNvb3JkaW5hdGVzW2ldLCBjb29yZGluYXRlc1tpIC0gMV0pO1xuICAgICAgaWYgKFxuICAgICAgICBhYiA+IDAgJiZcbiAgICAgICAgYW8gPD0gYWIgJiZcbiAgICAgICAgYm8gPD0gYWIgJiZcbiAgICAgICAgKGFvICsgYm8gLSBhYikgKiAoMSAtIE1hdGgucG93KChhbyAtIGJvKSAvIGFiLCAyKSkgPCBlcHNpbG9uMiAqIGFiXG4gICAgICApXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhbyA9IGJvO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNQb2x5Z29uKGNvb3JkaW5hdGVzLCBwb2ludCkge1xuICByZXR1cm4gISFwb2x5Z29uQ29udGFpbnMoY29vcmRpbmF0ZXMubWFwKHJpbmdSYWRpYW5zKSwgcG9pbnRSYWRpYW5zKHBvaW50KSk7XG59XG5cbmZ1bmN0aW9uIHJpbmdSYWRpYW5zKHJpbmcpIHtcbiAgcmV0dXJuIHJpbmcgPSByaW5nLm1hcChwb2ludFJhZGlhbnMpLCByaW5nLnBvcCgpLCByaW5nO1xufVxuXG5mdW5jdGlvbiBwb2ludFJhZGlhbnMocG9pbnQpIHtcbiAgcmV0dXJuIFtwb2ludFswXSAqIHJhZGlhbnMsIHBvaW50WzFdICogcmFkaWFuc107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9iamVjdCwgcG9pbnQpIHtcbiAgcmV0dXJuIChvYmplY3QgJiYgY29udGFpbnNPYmplY3RUeXBlLmhhc093blByb3BlcnR5KG9iamVjdC50eXBlKVxuICAgICAgPyBjb250YWluc09iamVjdFR5cGVbb2JqZWN0LnR5cGVdXG4gICAgICA6IGNvbnRhaW5zR2VvbWV0cnkpKG9iamVjdCwgcG9pbnQpO1xufVxuIiwiaW1wb3J0IHtyYW5nZX0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2FicywgY2VpbCwgZXBzaWxvbn0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBncmF0aWN1bGVYKHkwLCB5MSwgZHkpIHtcbiAgdmFyIHkgPSByYW5nZSh5MCwgeTEgLSBlcHNpbG9uLCBkeSkuY29uY2F0KHkxKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHkubWFwKGZ1bmN0aW9uKHkpIHsgcmV0dXJuIFt4LCB5XTsgfSk7IH07XG59XG5cbmZ1bmN0aW9uIGdyYXRpY3VsZVkoeDAsIHgxLCBkeCkge1xuICB2YXIgeCA9IHJhbmdlKHgwLCB4MSAtIGVwc2lsb24sIGR4KS5jb25jYXQoeDEpO1xuICByZXR1cm4gZnVuY3Rpb24oeSkgeyByZXR1cm4geC5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4gW3gsIHldOyB9KTsgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3JhdGljdWxlKCkge1xuICB2YXIgeDEsIHgwLCBYMSwgWDAsXG4gICAgICB5MSwgeTAsIFkxLCBZMCxcbiAgICAgIGR4ID0gMTAsIGR5ID0gZHgsIERYID0gOTAsIERZID0gMzYwLFxuICAgICAgeCwgeSwgWCwgWSxcbiAgICAgIHByZWNpc2lvbiA9IDIuNTtcblxuICBmdW5jdGlvbiBncmF0aWN1bGUoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiBcIk11bHRpTGluZVN0cmluZ1wiLCBjb29yZGluYXRlczogbGluZXMoKX07XG4gIH1cblxuICBmdW5jdGlvbiBsaW5lcygpIHtcbiAgICByZXR1cm4gcmFuZ2UoY2VpbChYMCAvIERYKSAqIERYLCBYMSwgRFgpLm1hcChYKVxuICAgICAgICAuY29uY2F0KHJhbmdlKGNlaWwoWTAgLyBEWSkgKiBEWSwgWTEsIERZKS5tYXAoWSkpXG4gICAgICAgIC5jb25jYXQocmFuZ2UoY2VpbCh4MCAvIGR4KSAqIGR4LCB4MSwgZHgpLmZpbHRlcihmdW5jdGlvbih4KSB7IHJldHVybiBhYnMoeCAlIERYKSA+IGVwc2lsb247IH0pLm1hcCh4KSlcbiAgICAgICAgLmNvbmNhdChyYW5nZShjZWlsKHkwIC8gZHkpICogZHksIHkxLCBkeSkuZmlsdGVyKGZ1bmN0aW9uKHkpIHsgcmV0dXJuIGFicyh5ICUgRFkpID4gZXBzaWxvbjsgfSkubWFwKHkpKTtcbiAgfVxuXG4gIGdyYXRpY3VsZS5saW5lcyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBsaW5lcygpLm1hcChmdW5jdGlvbihjb29yZGluYXRlcykgeyByZXR1cm4ge3R5cGU6IFwiTGluZVN0cmluZ1wiLCBjb29yZGluYXRlczogY29vcmRpbmF0ZXN9OyB9KTtcbiAgfTtcblxuICBncmF0aWN1bGUub3V0bGluZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIlBvbHlnb25cIixcbiAgICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICAgIFgoWDApLmNvbmNhdChcbiAgICAgICAgWShZMSkuc2xpY2UoMSksXG4gICAgICAgIFgoWDEpLnJldmVyc2UoKS5zbGljZSgxKSxcbiAgICAgICAgWShZMCkucmV2ZXJzZSgpLnNsaWNlKDEpKVxuICAgICAgXVxuICAgIH07XG4gIH07XG5cbiAgZ3JhdGljdWxlLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBncmF0aWN1bGUuZXh0ZW50TWlub3IoKTtcbiAgICByZXR1cm4gZ3JhdGljdWxlLmV4dGVudE1ham9yKF8pLmV4dGVudE1pbm9yKF8pO1xuICB9O1xuXG4gIGdyYXRpY3VsZS5leHRlbnRNYWpvciA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbW1gwLCBZMF0sIFtYMSwgWTFdXTtcbiAgICBYMCA9ICtfWzBdWzBdLCBYMSA9ICtfWzFdWzBdO1xuICAgIFkwID0gK19bMF1bMV0sIFkxID0gK19bMV1bMV07XG4gICAgaWYgKFgwID4gWDEpIF8gPSBYMCwgWDAgPSBYMSwgWDEgPSBfO1xuICAgIGlmIChZMCA+IFkxKSBfID0gWTAsIFkwID0gWTEsIFkxID0gXztcbiAgICByZXR1cm4gZ3JhdGljdWxlLnByZWNpc2lvbihwcmVjaXNpb24pO1xuICB9O1xuXG4gIGdyYXRpY3VsZS5leHRlbnRNaW5vciA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbW3gwLCB5MF0sIFt4MSwgeTFdXTtcbiAgICB4MCA9ICtfWzBdWzBdLCB4MSA9ICtfWzFdWzBdO1xuICAgIHkwID0gK19bMF1bMV0sIHkxID0gK19bMV1bMV07XG4gICAgaWYgKHgwID4geDEpIF8gPSB4MCwgeDAgPSB4MSwgeDEgPSBfO1xuICAgIGlmICh5MCA+IHkxKSBfID0geTAsIHkwID0geTEsIHkxID0gXztcbiAgICByZXR1cm4gZ3JhdGljdWxlLnByZWNpc2lvbihwcmVjaXNpb24pO1xuICB9O1xuXG4gIGdyYXRpY3VsZS5zdGVwID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGdyYXRpY3VsZS5zdGVwTWlub3IoKTtcbiAgICByZXR1cm4gZ3JhdGljdWxlLnN0ZXBNYWpvcihfKS5zdGVwTWlub3IoXyk7XG4gIH07XG5cbiAgZ3JhdGljdWxlLnN0ZXBNYWpvciA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbRFgsIERZXTtcbiAgICBEWCA9ICtfWzBdLCBEWSA9ICtfWzFdO1xuICAgIHJldHVybiBncmF0aWN1bGU7XG4gIH07XG5cbiAgZ3JhdGljdWxlLnN0ZXBNaW5vciA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbZHgsIGR5XTtcbiAgICBkeCA9ICtfWzBdLCBkeSA9ICtfWzFdO1xuICAgIHJldHVybiBncmF0aWN1bGU7XG4gIH07XG5cbiAgZ3JhdGljdWxlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwcmVjaXNpb247XG4gICAgcHJlY2lzaW9uID0gK187XG4gICAgeCA9IGdyYXRpY3VsZVgoeTAsIHkxLCA5MCk7XG4gICAgeSA9IGdyYXRpY3VsZVkoeDAsIHgxLCBwcmVjaXNpb24pO1xuICAgIFggPSBncmF0aWN1bGVYKFkwLCBZMSwgOTApO1xuICAgIFkgPSBncmF0aWN1bGVZKFgwLCBYMSwgcHJlY2lzaW9uKTtcbiAgICByZXR1cm4gZ3JhdGljdWxlO1xuICB9O1xuXG4gIHJldHVybiBncmF0aWN1bGVcbiAgICAgIC5leHRlbnRNYWpvcihbWy0xODAsIC05MCArIGVwc2lsb25dLCBbMTgwLCA5MCAtIGVwc2lsb25dXSlcbiAgICAgIC5leHRlbnRNaW5vcihbWy0xODAsIC04MCAtIGVwc2lsb25dLCBbMTgwLCA4MCArIGVwc2lsb25dXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmF0aWN1bGUxMCgpIHtcbiAgcmV0dXJuIGdyYXRpY3VsZSgpKCk7XG59XG4iLCJpbXBvcnQge2FzaW4sIGF0YW4yLCBjb3MsIGRlZ3JlZXMsIGhhdmVyc2luLCByYWRpYW5zLCBzaW4sIHNxcnR9IGZyb20gXCIuL21hdGguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgeDAgPSBhWzBdICogcmFkaWFucyxcbiAgICAgIHkwID0gYVsxXSAqIHJhZGlhbnMsXG4gICAgICB4MSA9IGJbMF0gKiByYWRpYW5zLFxuICAgICAgeTEgPSBiWzFdICogcmFkaWFucyxcbiAgICAgIGN5MCA9IGNvcyh5MCksXG4gICAgICBzeTAgPSBzaW4oeTApLFxuICAgICAgY3kxID0gY29zKHkxKSxcbiAgICAgIHN5MSA9IHNpbih5MSksXG4gICAgICBreDAgPSBjeTAgKiBjb3MoeDApLFxuICAgICAga3kwID0gY3kwICogc2luKHgwKSxcbiAgICAgIGt4MSA9IGN5MSAqIGNvcyh4MSksXG4gICAgICBreTEgPSBjeTEgKiBzaW4oeDEpLFxuICAgICAgZCA9IDIgKiBhc2luKHNxcnQoaGF2ZXJzaW4oeTEgLSB5MCkgKyBjeTAgKiBjeTEgKiBoYXZlcnNpbih4MSAtIHgwKSkpLFxuICAgICAgayA9IHNpbihkKTtcblxuICB2YXIgaW50ZXJwb2xhdGUgPSBkID8gZnVuY3Rpb24odCkge1xuICAgIHZhciBCID0gc2luKHQgKj0gZCkgLyBrLFxuICAgICAgICBBID0gc2luKGQgLSB0KSAvIGssXG4gICAgICAgIHggPSBBICoga3gwICsgQiAqIGt4MSxcbiAgICAgICAgeSA9IEEgKiBreTAgKyBCICoga3kxLFxuICAgICAgICB6ID0gQSAqIHN5MCArIEIgKiBzeTE7XG4gICAgcmV0dXJuIFtcbiAgICAgIGF0YW4yKHksIHgpICogZGVncmVlcyxcbiAgICAgIGF0YW4yKHosIHNxcnQoeCAqIHggKyB5ICogeSkpICogZGVncmVlc1xuICAgIF07XG4gIH0gOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gW3gwICogZGVncmVlcywgeTAgKiBkZWdyZWVzXTtcbiAgfTtcblxuICBpbnRlcnBvbGF0ZS5kaXN0YW5jZSA9IGQ7XG5cbiAgcmV0dXJuIGludGVycG9sYXRlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cbiIsImltcG9ydCBhZGRlciBmcm9tIFwiLi4vYWRkZXIuanNcIjtcbmltcG9ydCB7YWJzfSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IG5vb3AgZnJvbSBcIi4uL25vb3AuanNcIjtcblxudmFyIGFyZWFTdW0gPSBhZGRlcigpLFxuICAgIGFyZWFSaW5nU3VtID0gYWRkZXIoKSxcbiAgICB4MDAsXG4gICAgeTAwLFxuICAgIHgwLFxuICAgIHkwO1xuXG52YXIgYXJlYVN0cmVhbSA9IHtcbiAgcG9pbnQ6IG5vb3AsXG4gIGxpbmVTdGFydDogbm9vcCxcbiAgbGluZUVuZDogbm9vcCxcbiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICBhcmVhU3RyZWFtLmxpbmVTdGFydCA9IGFyZWFSaW5nU3RhcnQ7XG4gICAgYXJlYVN0cmVhbS5saW5lRW5kID0gYXJlYVJpbmdFbmQ7XG4gIH0sXG4gIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGFyZWFTdHJlYW0ubGluZVN0YXJ0ID0gYXJlYVN0cmVhbS5saW5lRW5kID0gYXJlYVN0cmVhbS5wb2ludCA9IG5vb3A7XG4gICAgYXJlYVN1bS5hZGQoYWJzKGFyZWFSaW5nU3VtKSk7XG4gICAgYXJlYVJpbmdTdW0ucmVzZXQoKTtcbiAgfSxcbiAgcmVzdWx0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJlYSA9IGFyZWFTdW0gLyAyO1xuICAgIGFyZWFTdW0ucmVzZXQoKTtcbiAgICByZXR1cm4gYXJlYTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYXJlYVJpbmdTdGFydCgpIHtcbiAgYXJlYVN0cmVhbS5wb2ludCA9IGFyZWFQb2ludEZpcnN0O1xufVxuXG5mdW5jdGlvbiBhcmVhUG9pbnRGaXJzdCh4LCB5KSB7XG4gIGFyZWFTdHJlYW0ucG9pbnQgPSBhcmVhUG9pbnQ7XG4gIHgwMCA9IHgwID0geCwgeTAwID0geTAgPSB5O1xufVxuXG5mdW5jdGlvbiBhcmVhUG9pbnQoeCwgeSkge1xuICBhcmVhUmluZ1N1bS5hZGQoeTAgKiB4IC0geDAgKiB5KTtcbiAgeDAgPSB4LCB5MCA9IHk7XG59XG5cbmZ1bmN0aW9uIGFyZWFSaW5nRW5kKCkge1xuICBhcmVhUG9pbnQoeDAwLCB5MDApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcmVhU3RyZWFtO1xuIiwiaW1wb3J0IG5vb3AgZnJvbSBcIi4uL25vb3AuanNcIjtcblxudmFyIHgwID0gSW5maW5pdHksXG4gICAgeTAgPSB4MCxcbiAgICB4MSA9IC14MCxcbiAgICB5MSA9IHgxO1xuXG52YXIgYm91bmRzU3RyZWFtID0ge1xuICBwb2ludDogYm91bmRzUG9pbnQsXG4gIGxpbmVTdGFydDogbm9vcCxcbiAgbGluZUVuZDogbm9vcCxcbiAgcG9seWdvblN0YXJ0OiBub29wLFxuICBwb2x5Z29uRW5kOiBub29wLFxuICByZXN1bHQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBib3VuZHMgPSBbW3gwLCB5MF0sIFt4MSwgeTFdXTtcbiAgICB4MSA9IHkxID0gLSh5MCA9IHgwID0gSW5maW5pdHkpO1xuICAgIHJldHVybiBib3VuZHM7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJvdW5kc1BvaW50KHgsIHkpIHtcbiAgaWYgKHggPCB4MCkgeDAgPSB4O1xuICBpZiAoeCA+IHgxKSB4MSA9IHg7XG4gIGlmICh5IDwgeTApIHkwID0geTtcbiAgaWYgKHkgPiB5MSkgeTEgPSB5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBib3VuZHNTdHJlYW07XG4iLCJpbXBvcnQge3NxcnR9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5cbi8vIFRPRE8gRW5mb3JjZSBwb3NpdGl2ZSBhcmVhIGZvciBleHRlcmlvciwgbmVnYXRpdmUgYXJlYSBmb3IgaW50ZXJpb3I/XG5cbnZhciBYMCA9IDAsXG4gICAgWTAgPSAwLFxuICAgIFowID0gMCxcbiAgICBYMSA9IDAsXG4gICAgWTEgPSAwLFxuICAgIFoxID0gMCxcbiAgICBYMiA9IDAsXG4gICAgWTIgPSAwLFxuICAgIFoyID0gMCxcbiAgICB4MDAsXG4gICAgeTAwLFxuICAgIHgwLFxuICAgIHkwO1xuXG52YXIgY2VudHJvaWRTdHJlYW0gPSB7XG4gIHBvaW50OiBjZW50cm9pZFBvaW50LFxuICBsaW5lU3RhcnQ6IGNlbnRyb2lkTGluZVN0YXJ0LFxuICBsaW5lRW5kOiBjZW50cm9pZExpbmVFbmQsXG4gIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgY2VudHJvaWRTdHJlYW0ubGluZVN0YXJ0ID0gY2VudHJvaWRSaW5nU3RhcnQ7XG4gICAgY2VudHJvaWRTdHJlYW0ubGluZUVuZCA9IGNlbnRyb2lkUmluZ0VuZDtcbiAgfSxcbiAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgY2VudHJvaWRTdHJlYW0ucG9pbnQgPSBjZW50cm9pZFBvaW50O1xuICAgIGNlbnRyb2lkU3RyZWFtLmxpbmVTdGFydCA9IGNlbnRyb2lkTGluZVN0YXJ0O1xuICAgIGNlbnRyb2lkU3RyZWFtLmxpbmVFbmQgPSBjZW50cm9pZExpbmVFbmQ7XG4gIH0sXG4gIHJlc3VsdDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNlbnRyb2lkID0gWjIgPyBbWDIgLyBaMiwgWTIgLyBaMl1cbiAgICAgICAgOiBaMSA/IFtYMSAvIFoxLCBZMSAvIFoxXVxuICAgICAgICA6IFowID8gW1gwIC8gWjAsIFkwIC8gWjBdXG4gICAgICAgIDogW05hTiwgTmFOXTtcbiAgICBYMCA9IFkwID0gWjAgPVxuICAgIFgxID0gWTEgPSBaMSA9XG4gICAgWDIgPSBZMiA9IFoyID0gMDtcbiAgICByZXR1cm4gY2VudHJvaWQ7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnQoeCwgeSkge1xuICBYMCArPSB4O1xuICBZMCArPSB5O1xuICArK1owO1xufVxuXG5mdW5jdGlvbiBjZW50cm9pZExpbmVTdGFydCgpIHtcbiAgY2VudHJvaWRTdHJlYW0ucG9pbnQgPSBjZW50cm9pZFBvaW50Rmlyc3RMaW5lO1xufVxuXG5mdW5jdGlvbiBjZW50cm9pZFBvaW50Rmlyc3RMaW5lKHgsIHkpIHtcbiAgY2VudHJvaWRTdHJlYW0ucG9pbnQgPSBjZW50cm9pZFBvaW50TGluZTtcbiAgY2VudHJvaWRQb2ludCh4MCA9IHgsIHkwID0geSk7XG59XG5cbmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRMaW5lKHgsIHkpIHtcbiAgdmFyIGR4ID0geCAtIHgwLCBkeSA9IHkgLSB5MCwgeiA9IHNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICBYMSArPSB6ICogKHgwICsgeCkgLyAyO1xuICBZMSArPSB6ICogKHkwICsgeSkgLyAyO1xuICBaMSArPSB6O1xuICBjZW50cm9pZFBvaW50KHgwID0geCwgeTAgPSB5KTtcbn1cblxuZnVuY3Rpb24gY2VudHJvaWRMaW5lRW5kKCkge1xuICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkUG9pbnQ7XG59XG5cbmZ1bmN0aW9uIGNlbnRyb2lkUmluZ1N0YXJ0KCkge1xuICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkUG9pbnRGaXJzdFJpbmc7XG59XG5cbmZ1bmN0aW9uIGNlbnRyb2lkUmluZ0VuZCgpIHtcbiAgY2VudHJvaWRQb2ludFJpbmcoeDAwLCB5MDApO1xufVxuXG5mdW5jdGlvbiBjZW50cm9pZFBvaW50Rmlyc3RSaW5nKHgsIHkpIHtcbiAgY2VudHJvaWRTdHJlYW0ucG9pbnQgPSBjZW50cm9pZFBvaW50UmluZztcbiAgY2VudHJvaWRQb2ludCh4MDAgPSB4MCA9IHgsIHkwMCA9IHkwID0geSk7XG59XG5cbmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRSaW5nKHgsIHkpIHtcbiAgdmFyIGR4ID0geCAtIHgwLFxuICAgICAgZHkgPSB5IC0geTAsXG4gICAgICB6ID0gc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG5cbiAgWDEgKz0geiAqICh4MCArIHgpIC8gMjtcbiAgWTEgKz0geiAqICh5MCArIHkpIC8gMjtcbiAgWjEgKz0gejtcblxuICB6ID0geTAgKiB4IC0geDAgKiB5O1xuICBYMiArPSB6ICogKHgwICsgeCk7XG4gIFkyICs9IHogKiAoeTAgKyB5KTtcbiAgWjIgKz0geiAqIDM7XG4gIGNlbnRyb2lkUG9pbnQoeDAgPSB4LCB5MCA9IHkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjZW50cm9pZFN0cmVhbTtcbiIsImltcG9ydCB7dGF1fSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IG5vb3AgZnJvbSBcIi4uL25vb3AuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUGF0aENvbnRleHQoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbn1cblxuUGF0aENvbnRleHQucHJvdG90eXBlID0ge1xuICBfcmFkaXVzOiA0LjUsXG4gIHBvaW50UmFkaXVzOiBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhZGl1cyA9IF8sIHRoaXM7XG4gIH0sXG4gIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fbGluZSA9PT0gMCkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9wb2ludCA9IE5hTjtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHtcbiAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgIHRoaXMuX3BvaW50ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDE6IHtcbiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4ICsgdGhpcy5fcmFkaXVzLCB5KTtcbiAgICAgICAgdGhpcy5fY29udGV4dC5hcmMoeCwgeSwgdGhpcy5fcmFkaXVzLCAwLCB0YXUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHJlc3VsdDogbm9vcFxufTtcbiIsImltcG9ydCBhZGRlciBmcm9tIFwiLi4vYWRkZXIuanNcIjtcbmltcG9ydCB7c3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCBub29wIGZyb20gXCIuLi9ub29wLmpzXCI7XG5cbnZhciBsZW5ndGhTdW0gPSBhZGRlcigpLFxuICAgIGxlbmd0aFJpbmcsXG4gICAgeDAwLFxuICAgIHkwMCxcbiAgICB4MCxcbiAgICB5MDtcblxudmFyIGxlbmd0aFN0cmVhbSA9IHtcbiAgcG9pbnQ6IG5vb3AsXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgbGVuZ3RoU3RyZWFtLnBvaW50ID0gbGVuZ3RoUG9pbnRGaXJzdDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKGxlbmd0aFJpbmcpIGxlbmd0aFBvaW50KHgwMCwgeTAwKTtcbiAgICBsZW5ndGhTdHJlYW0ucG9pbnQgPSBub29wO1xuICB9LFxuICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIGxlbmd0aFJpbmcgPSB0cnVlO1xuICB9LFxuICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICBsZW5ndGhSaW5nID0gbnVsbDtcbiAgfSxcbiAgcmVzdWx0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVuZ3RoID0gK2xlbmd0aFN1bTtcbiAgICBsZW5ndGhTdW0ucmVzZXQoKTtcbiAgICByZXR1cm4gbGVuZ3RoO1xuICB9XG59O1xuXG5mdW5jdGlvbiBsZW5ndGhQb2ludEZpcnN0KHgsIHkpIHtcbiAgbGVuZ3RoU3RyZWFtLnBvaW50ID0gbGVuZ3RoUG9pbnQ7XG4gIHgwMCA9IHgwID0geCwgeTAwID0geTAgPSB5O1xufVxuXG5mdW5jdGlvbiBsZW5ndGhQb2ludCh4LCB5KSB7XG4gIHgwIC09IHgsIHkwIC09IHk7XG4gIGxlbmd0aFN1bS5hZGQoc3FydCh4MCAqIHgwICsgeTAgKiB5MCkpO1xuICB4MCA9IHgsIHkwID0geTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGVuZ3RoU3RyZWFtO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUGF0aFN0cmluZygpIHtcbiAgdGhpcy5fc3RyaW5nID0gW107XG59XG5cblBhdGhTdHJpbmcucHJvdG90eXBlID0ge1xuICBfcmFkaXVzOiA0LjUsXG4gIF9jaXJjbGU6IGNpcmNsZSg0LjUpLFxuICBwb2ludFJhZGl1czogZnVuY3Rpb24oXykge1xuICAgIGlmICgoXyA9ICtfKSAhPT0gdGhpcy5fcmFkaXVzKSB0aGlzLl9yYWRpdXMgPSBfLCB0aGlzLl9jaXJjbGUgPSBudWxsO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2xpbmUgPT09IDApIHRoaXMuX3N0cmluZy5wdXNoKFwiWlwiKTtcbiAgICB0aGlzLl9wb2ludCA9IE5hTjtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHtcbiAgICAgICAgdGhpcy5fc3RyaW5nLnB1c2goXCJNXCIsIHgsIFwiLFwiLCB5KTtcbiAgICAgICAgdGhpcy5fcG9pbnQgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMToge1xuICAgICAgICB0aGlzLl9zdHJpbmcucHVzaChcIkxcIiwgeCwgXCIsXCIsIHkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKHRoaXMuX2NpcmNsZSA9PSBudWxsKSB0aGlzLl9jaXJjbGUgPSBjaXJjbGUodGhpcy5fcmFkaXVzKTtcbiAgICAgICAgdGhpcy5fc3RyaW5nLnB1c2goXCJNXCIsIHgsIFwiLFwiLCB5LCB0aGlzLl9jaXJjbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHJlc3VsdDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3N0cmluZy5sZW5ndGgpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9zdHJpbmcuam9pbihcIlwiKTtcbiAgICAgIHRoaXMuX3N0cmluZyA9IFtdO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjaXJjbGUocmFkaXVzKSB7XG4gIHJldHVybiBcIm0wLFwiICsgcmFkaXVzXG4gICAgICArIFwiYVwiICsgcmFkaXVzICsgXCIsXCIgKyByYWRpdXMgKyBcIiAwIDEsMSAwLFwiICsgLTIgKiByYWRpdXNcbiAgICAgICsgXCJhXCIgKyByYWRpdXMgKyBcIixcIiArIHJhZGl1cyArIFwiIDAgMSwxIDAsXCIgKyAyICogcmFkaXVzXG4gICAgICArIFwielwiO1xufVxuIiwiaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuLi9pZGVudGl0eS5qc1wiO1xuaW1wb3J0IHN0cmVhbSBmcm9tIFwiLi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgcGF0aEFyZWEgZnJvbSBcIi4vYXJlYS5qc1wiO1xuaW1wb3J0IHBhdGhCb3VuZHMgZnJvbSBcIi4vYm91bmRzLmpzXCI7XG5pbXBvcnQgcGF0aENlbnRyb2lkIGZyb20gXCIuL2NlbnRyb2lkLmpzXCI7XG5pbXBvcnQgUGF0aENvbnRleHQgZnJvbSBcIi4vY29udGV4dC5qc1wiO1xuaW1wb3J0IHBhdGhNZWFzdXJlIGZyb20gXCIuL21lYXN1cmUuanNcIjtcbmltcG9ydCBQYXRoU3RyaW5nIGZyb20gXCIuL3N0cmluZy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwcm9qZWN0aW9uLCBjb250ZXh0KSB7XG4gIHZhciBwb2ludFJhZGl1cyA9IDQuNSxcbiAgICAgIHByb2plY3Rpb25TdHJlYW0sXG4gICAgICBjb250ZXh0U3RyZWFtO1xuXG4gIGZ1bmN0aW9uIHBhdGgob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdCkge1xuICAgICAgaWYgKHR5cGVvZiBwb2ludFJhZGl1cyA9PT0gXCJmdW5jdGlvblwiKSBjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKCtwb2ludFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICAgIHN0cmVhbShvYmplY3QsIHByb2plY3Rpb25TdHJlYW0oY29udGV4dFN0cmVhbSkpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dFN0cmVhbS5yZXN1bHQoKTtcbiAgfVxuXG4gIHBhdGguYXJlYSA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHN0cmVhbShvYmplY3QsIHByb2plY3Rpb25TdHJlYW0ocGF0aEFyZWEpKTtcbiAgICByZXR1cm4gcGF0aEFyZWEucmVzdWx0KCk7XG4gIH07XG5cbiAgcGF0aC5tZWFzdXJlID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgc3RyZWFtKG9iamVjdCwgcHJvamVjdGlvblN0cmVhbShwYXRoTWVhc3VyZSkpO1xuICAgIHJldHVybiBwYXRoTWVhc3VyZS5yZXN1bHQoKTtcbiAgfTtcblxuICBwYXRoLmJvdW5kcyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHN0cmVhbShvYmplY3QsIHByb2plY3Rpb25TdHJlYW0ocGF0aEJvdW5kcykpO1xuICAgIHJldHVybiBwYXRoQm91bmRzLnJlc3VsdCgpO1xuICB9O1xuXG4gIHBhdGguY2VudHJvaWQgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICBzdHJlYW0ob2JqZWN0LCBwcm9qZWN0aW9uU3RyZWFtKHBhdGhDZW50cm9pZCkpO1xuICAgIHJldHVybiBwYXRoQ2VudHJvaWQucmVzdWx0KCk7XG4gIH07XG5cbiAgcGF0aC5wcm9qZWN0aW9uID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByb2plY3Rpb25TdHJlYW0gPSBfID09IG51bGwgPyAocHJvamVjdGlvbiA9IG51bGwsIGlkZW50aXR5KSA6IChwcm9qZWN0aW9uID0gXykuc3RyZWFtLCBwYXRoKSA6IHByb2plY3Rpb247XG4gIH07XG5cbiAgcGF0aC5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNvbnRleHQ7XG4gICAgY29udGV4dFN0cmVhbSA9IF8gPT0gbnVsbCA/IChjb250ZXh0ID0gbnVsbCwgbmV3IFBhdGhTdHJpbmcpIDogbmV3IFBhdGhDb250ZXh0KGNvbnRleHQgPSBfKTtcbiAgICBpZiAodHlwZW9mIHBvaW50UmFkaXVzICE9PSBcImZ1bmN0aW9uXCIpIGNvbnRleHRTdHJlYW0ucG9pbnRSYWRpdXMocG9pbnRSYWRpdXMpO1xuICAgIHJldHVybiBwYXRoO1xuICB9O1xuXG4gIHBhdGgucG9pbnRSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcG9pbnRSYWRpdXM7XG4gICAgcG9pbnRSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IChjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKCtfKSwgK18pO1xuICAgIHJldHVybiBwYXRoO1xuICB9O1xuXG4gIHJldHVybiBwYXRoLnByb2plY3Rpb24ocHJvamVjdGlvbikuY29udGV4dChjb250ZXh0KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1ldGhvZHMpIHtcbiAgcmV0dXJuIHtcbiAgICBzdHJlYW06IHRyYW5zZm9ybWVyKG1ldGhvZHMpXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1lcihtZXRob2RzKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICB2YXIgcyA9IG5ldyBUcmFuc2Zvcm1TdHJlYW07XG4gICAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHNba2V5XSA9IG1ldGhvZHNba2V5XTtcbiAgICBzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICByZXR1cm4gcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtU3RyZWFtKCkge31cblxuVHJhbnNmb3JtU3RyZWFtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybVN0cmVhbSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsgdGhpcy5zdHJlYW0ucG9pbnQoeCwgeSk7IH0sXG4gIHNwaGVyZTogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnNwaGVyZSgpOyB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5saW5lU3RhcnQoKTsgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLmxpbmVFbmQoKTsgfSxcbiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCk7IH0sXG4gIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCk7IH1cbn07XG4iLCJpbXBvcnQge2RlZmF1bHQgYXMgZ2VvU3RyZWFtfSBmcm9tIFwiLi4vc3RyZWFtLmpzXCI7XG5pbXBvcnQgYm91bmRzU3RyZWFtIGZyb20gXCIuLi9wYXRoL2JvdW5kcy5qc1wiO1xuXG5mdW5jdGlvbiBmaXQocHJvamVjdGlvbiwgZml0Qm91bmRzLCBvYmplY3QpIHtcbiAgdmFyIGNsaXAgPSBwcm9qZWN0aW9uLmNsaXBFeHRlbnQgJiYgcHJvamVjdGlvbi5jbGlwRXh0ZW50KCk7XG4gIHByb2plY3Rpb24uc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsIDBdKTtcbiAgaWYgKGNsaXAgIT0gbnVsbCkgcHJvamVjdGlvbi5jbGlwRXh0ZW50KG51bGwpO1xuICBnZW9TdHJlYW0ob2JqZWN0LCBwcm9qZWN0aW9uLnN0cmVhbShib3VuZHNTdHJlYW0pKTtcbiAgZml0Qm91bmRzKGJvdW5kc1N0cmVhbS5yZXN1bHQoKSk7XG4gIGlmIChjbGlwICE9IG51bGwpIHByb2plY3Rpb24uY2xpcEV4dGVudChjbGlwKTtcbiAgcmV0dXJuIHByb2plY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXRFeHRlbnQocHJvamVjdGlvbiwgZXh0ZW50LCBvYmplY3QpIHtcbiAgcmV0dXJuIGZpdChwcm9qZWN0aW9uLCBmdW5jdGlvbihiKSB7XG4gICAgdmFyIHcgPSBleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0sXG4gICAgICAgIGggPSBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0sXG4gICAgICAgIGsgPSBNYXRoLm1pbih3IC8gKGJbMV1bMF0gLSBiWzBdWzBdKSwgaCAvIChiWzFdWzFdIC0gYlswXVsxXSkpLFxuICAgICAgICB4ID0gK2V4dGVudFswXVswXSArICh3IC0gayAqIChiWzFdWzBdICsgYlswXVswXSkpIC8gMixcbiAgICAgICAgeSA9ICtleHRlbnRbMF1bMV0gKyAoaCAtIGsgKiAoYlsxXVsxXSArIGJbMF1bMV0pKSAvIDI7XG4gICAgcHJvamVjdGlvbi5zY2FsZSgxNTAgKiBrKS50cmFuc2xhdGUoW3gsIHldKTtcbiAgfSwgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpdFNpemUocHJvamVjdGlvbiwgc2l6ZSwgb2JqZWN0KSB7XG4gIHJldHVybiBmaXRFeHRlbnQocHJvamVjdGlvbiwgW1swLCAwXSwgc2l6ZV0sIG9iamVjdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXRXaWR0aChwcm9qZWN0aW9uLCB3aWR0aCwgb2JqZWN0KSB7XG4gIHJldHVybiBmaXQocHJvamVjdGlvbiwgZnVuY3Rpb24oYikge1xuICAgIHZhciB3ID0gK3dpZHRoLFxuICAgICAgICBrID0gdyAvIChiWzFdWzBdIC0gYlswXVswXSksXG4gICAgICAgIHggPSAodyAtIGsgKiAoYlsxXVswXSArIGJbMF1bMF0pKSAvIDIsXG4gICAgICAgIHkgPSAtayAqIGJbMF1bMV07XG4gICAgcHJvamVjdGlvbi5zY2FsZSgxNTAgKiBrKS50cmFuc2xhdGUoW3gsIHldKTtcbiAgfSwgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpdEhlaWdodChwcm9qZWN0aW9uLCBoZWlnaHQsIG9iamVjdCkge1xuICByZXR1cm4gZml0KHByb2plY3Rpb24sIGZ1bmN0aW9uKGIpIHtcbiAgICB2YXIgaCA9ICtoZWlnaHQsXG4gICAgICAgIGsgPSBoIC8gKGJbMV1bMV0gLSBiWzBdWzFdKSxcbiAgICAgICAgeCA9IC1rICogYlswXVswXSxcbiAgICAgICAgeSA9IChoIC0gayAqIChiWzFdWzFdICsgYlswXVsxXSkpIC8gMjtcbiAgICBwcm9qZWN0aW9uLnNjYWxlKDE1MCAqIGspLnRyYW5zbGF0ZShbeCwgeV0pO1xuICB9LCBvYmplY3QpO1xufVxuIiwiaW1wb3J0IHtjYXJ0ZXNpYW59IGZyb20gXCIuLi9jYXJ0ZXNpYW4uanNcIjtcbmltcG9ydCB7YWJzLCBhc2luLCBhdGFuMiwgY29zLCBlcHNpbG9uLCByYWRpYW5zLCBzcXJ0fSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHt0cmFuc2Zvcm1lcn0gZnJvbSBcIi4uL3RyYW5zZm9ybS5qc1wiO1xuXG52YXIgbWF4RGVwdGggPSAxNiwgLy8gbWF4aW11bSBkZXB0aCBvZiBzdWJkaXZpc2lvblxuICAgIGNvc01pbkRpc3RhbmNlID0gY29zKDMwICogcmFkaWFucyk7IC8vIGNvcyhtaW5pbXVtIGFuZ3VsYXIgZGlzdGFuY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHByb2plY3QsIGRlbHRhMikge1xuICByZXR1cm4gK2RlbHRhMiA/IHJlc2FtcGxlKHByb2plY3QsIGRlbHRhMikgOiByZXNhbXBsZU5vbmUocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIHJlc2FtcGxlTm9uZShwcm9qZWN0KSB7XG4gIHJldHVybiB0cmFuc2Zvcm1lcih7XG4gICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIHggPSBwcm9qZWN0KHgsIHkpO1xuICAgICAgdGhpcy5zdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzYW1wbGUocHJvamVjdCwgZGVsdGEyKSB7XG5cbiAgZnVuY3Rpb24gcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MSwgeTEsIGxhbWJkYTEsIGExLCBiMSwgYzEsIGRlcHRoLCBzdHJlYW0pIHtcbiAgICB2YXIgZHggPSB4MSAtIHgwLFxuICAgICAgICBkeSA9IHkxIC0geTAsXG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgaWYgKGQyID4gNCAqIGRlbHRhMiAmJiBkZXB0aC0tKSB7XG4gICAgICB2YXIgYSA9IGEwICsgYTEsXG4gICAgICAgICAgYiA9IGIwICsgYjEsXG4gICAgICAgICAgYyA9IGMwICsgYzEsXG4gICAgICAgICAgbSA9IHNxcnQoYSAqIGEgKyBiICogYiArIGMgKiBjKSxcbiAgICAgICAgICBwaGkyID0gYXNpbihjIC89IG0pLFxuICAgICAgICAgIGxhbWJkYTIgPSBhYnMoYWJzKGMpIC0gMSkgPCBlcHNpbG9uIHx8IGFicyhsYW1iZGEwIC0gbGFtYmRhMSkgPCBlcHNpbG9uID8gKGxhbWJkYTAgKyBsYW1iZGExKSAvIDIgOiBhdGFuMihiLCBhKSxcbiAgICAgICAgICBwID0gcHJvamVjdChsYW1iZGEyLCBwaGkyKSxcbiAgICAgICAgICB4MiA9IHBbMF0sXG4gICAgICAgICAgeTIgPSBwWzFdLFxuICAgICAgICAgIGR4MiA9IHgyIC0geDAsXG4gICAgICAgICAgZHkyID0geTIgLSB5MCxcbiAgICAgICAgICBkeiA9IGR5ICogZHgyIC0gZHggKiBkeTI7XG4gICAgICBpZiAoZHogKiBkeiAvIGQyID4gZGVsdGEyIC8vIHBlcnBlbmRpY3VsYXIgcHJvamVjdGVkIGRpc3RhbmNlXG4gICAgICAgICAgfHwgYWJzKChkeCAqIGR4MiArIGR5ICogZHkyKSAvIGQyIC0gMC41KSA+IDAuMyAvLyBtaWRwb2ludCBjbG9zZSB0byBhbiBlbmRcbiAgICAgICAgICB8fCBhMCAqIGExICsgYjAgKiBiMSArIGMwICogYzEgPCBjb3NNaW5EaXN0YW5jZSkgeyAvLyBhbmd1bGFyIGRpc3RhbmNlXG4gICAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDIsIHkyLCBsYW1iZGEyLCBhIC89IG0sIGIgLz0gbSwgYywgZGVwdGgsIHN0cmVhbSk7XG4gICAgICAgIHN0cmVhbS5wb2ludCh4MiwgeTIpO1xuICAgICAgICByZXNhbXBsZUxpbmVUbyh4MiwgeTIsIGxhbWJkYTIsIGEsIGIsIGMsIHgxLCB5MSwgbGFtYmRhMSwgYTEsIGIxLCBjMSwgZGVwdGgsIHN0cmVhbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICB2YXIgbGFtYmRhMDAsIHgwMCwgeTAwLCBhMDAsIGIwMCwgYzAwLCAvLyBmaXJzdCBwb2ludFxuICAgICAgICBsYW1iZGEwLCB4MCwgeTAsIGEwLCBiMCwgYzA7IC8vIHByZXZpb3VzIHBvaW50XG5cbiAgICB2YXIgcmVzYW1wbGVTdHJlYW0gPSB7XG4gICAgICBwb2ludDogcG9pbnQsXG4gICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsXG4gICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgeyBzdHJlYW0ucG9seWdvblN0YXJ0KCk7IHJlc2FtcGxlU3RyZWFtLmxpbmVTdGFydCA9IHJpbmdTdGFydDsgfSxcbiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgeyBzdHJlYW0ucG9seWdvbkVuZCgpOyByZXNhbXBsZVN0cmVhbS5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7IH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xuICAgICAgeCA9IHByb2plY3QoeCwgeSk7XG4gICAgICBzdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkge1xuICAgICAgeDAgPSBOYU47XG4gICAgICByZXNhbXBsZVN0cmVhbS5wb2ludCA9IGxpbmVQb2ludDtcbiAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lUG9pbnQobGFtYmRhLCBwaGkpIHtcbiAgICAgIHZhciBjID0gY2FydGVzaWFuKFtsYW1iZGEsIHBoaV0pLCBwID0gcHJvamVjdChsYW1iZGEsIHBoaSk7XG4gICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIGxhbWJkYTAsIGEwLCBiMCwgYzAsIHgwID0gcFswXSwgeTAgPSBwWzFdLCBsYW1iZGEwID0gbGFtYmRhLCBhMCA9IGNbMF0sIGIwID0gY1sxXSwgYzAgPSBjWzJdLCBtYXhEZXB0aCwgc3RyZWFtKTtcbiAgICAgIHN0cmVhbS5wb2ludCh4MCwgeTApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7XG4gICAgICByZXNhbXBsZVN0cmVhbS5wb2ludCA9IHBvaW50O1xuICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByaW5nU3RhcnQoKSB7XG4gICAgICBsaW5lU3RhcnQoKTtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gcmluZ1BvaW50O1xuICAgICAgcmVzYW1wbGVTdHJlYW0ubGluZUVuZCA9IHJpbmdFbmQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmluZ1BvaW50KGxhbWJkYSwgcGhpKSB7XG4gICAgICBsaW5lUG9pbnQobGFtYmRhMDAgPSBsYW1iZGEsIHBoaSksIHgwMCA9IHgwLCB5MDAgPSB5MCwgYTAwID0gYTAsIGIwMCA9IGIwLCBjMDAgPSBjMDtcbiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gbGluZVBvaW50O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7XG4gICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIGxhbWJkYTAsIGEwLCBiMCwgYzAsIHgwMCwgeTAwLCBsYW1iZGEwMCwgYTAwLCBiMDAsIGMwMCwgbWF4RGVwdGgsIHN0cmVhbSk7XG4gICAgICByZXNhbXBsZVN0cmVhbS5saW5lRW5kID0gbGluZUVuZDtcbiAgICAgIGxpbmVFbmQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzYW1wbGVTdHJlYW07XG4gIH07XG59XG4iLCJpbXBvcnQgY2xpcEFudGltZXJpZGlhbiBmcm9tIFwiLi4vY2xpcC9hbnRpbWVyaWRpYW4uanNcIjtcbmltcG9ydCBjbGlwQ2lyY2xlIGZyb20gXCIuLi9jbGlwL2NpcmNsZS5qc1wiO1xuaW1wb3J0IGNsaXBSZWN0YW5nbGUgZnJvbSBcIi4uL2NsaXAvcmVjdGFuZ2xlLmpzXCI7XG5pbXBvcnQgY29tcG9zZSBmcm9tIFwiLi4vY29tcG9zZS5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuLi9pZGVudGl0eS5qc1wiO1xuaW1wb3J0IHtjb3MsIGRlZ3JlZXMsIHJhZGlhbnMsIHNpbiwgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7cm90YXRlUmFkaWFuc30gZnJvbSBcIi4uL3JvdGF0aW9uLmpzXCI7XG5pbXBvcnQge3RyYW5zZm9ybWVyfSBmcm9tIFwiLi4vdHJhbnNmb3JtLmpzXCI7XG5pbXBvcnQge2ZpdEV4dGVudCwgZml0U2l6ZSwgZml0V2lkdGgsIGZpdEhlaWdodH0gZnJvbSBcIi4vZml0LmpzXCI7XG5pbXBvcnQgcmVzYW1wbGUgZnJvbSBcIi4vcmVzYW1wbGUuanNcIjtcblxudmFyIHRyYW5zZm9ybVJhZGlhbnMgPSB0cmFuc2Zvcm1lcih7XG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdGhpcy5zdHJlYW0ucG9pbnQoeCAqIHJhZGlhbnMsIHkgKiByYWRpYW5zKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVJvdGF0ZShyb3RhdGUpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybWVyKHtcbiAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgdmFyIHIgPSByb3RhdGUoeCwgeSk7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ucG9pbnQoclswXSwgclsxXSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2NhbGVUcmFuc2xhdGUoaywgZHgsIGR5LCBzeCwgc3kpIHtcbiAgZnVuY3Rpb24gdHJhbnNmb3JtKHgsIHkpIHtcbiAgICB4ICo9IHN4OyB5ICo9IHN5O1xuICAgIHJldHVybiBbZHggKyBrICogeCwgZHkgLSBrICogeV07XG4gIH1cbiAgdHJhbnNmb3JtLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4gWyh4IC0gZHgpIC8gayAqIHN4LCAoZHkgLSB5KSAvIGsgKiBzeV07XG4gIH07XG4gIHJldHVybiB0cmFuc2Zvcm07XG59XG5cbmZ1bmN0aW9uIHNjYWxlVHJhbnNsYXRlUm90YXRlKGssIGR4LCBkeSwgc3gsIHN5LCBhbHBoYSkge1xuICB2YXIgY29zQWxwaGEgPSBjb3MoYWxwaGEpLFxuICAgICAgc2luQWxwaGEgPSBzaW4oYWxwaGEpLFxuICAgICAgYSA9IGNvc0FscGhhICogayxcbiAgICAgIGIgPSBzaW5BbHBoYSAqIGssXG4gICAgICBhaSA9IGNvc0FscGhhIC8gayxcbiAgICAgIGJpID0gc2luQWxwaGEgLyBrLFxuICAgICAgY2kgPSAoc2luQWxwaGEgKiBkeSAtIGNvc0FscGhhICogZHgpIC8gayxcbiAgICAgIGZpID0gKHNpbkFscGhhICogZHggKyBjb3NBbHBoYSAqIGR5KSAvIGs7XG4gIGZ1bmN0aW9uIHRyYW5zZm9ybSh4LCB5KSB7XG4gICAgeCAqPSBzeDsgeSAqPSBzeTtcbiAgICByZXR1cm4gW2EgKiB4IC0gYiAqIHkgKyBkeCwgZHkgLSBiICogeCAtIGEgKiB5XTtcbiAgfVxuICB0cmFuc2Zvcm0uaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiBbc3ggKiAoYWkgKiB4IC0gYmkgKiB5ICsgY2kpLCBzeSAqIChmaSAtIGJpICogeCAtIGFpICogeSldO1xuICB9O1xuICByZXR1cm4gdHJhbnNmb3JtO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwcm9qZWN0aW9uKHByb2plY3QpIHtcbiAgcmV0dXJuIHByb2plY3Rpb25NdXRhdG9yKGZ1bmN0aW9uKCkgeyByZXR1cm4gcHJvamVjdDsgfSkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2plY3Rpb25NdXRhdG9yKHByb2plY3RBdCkge1xuICB2YXIgcHJvamVjdCxcbiAgICAgIGsgPSAxNTAsIC8vIHNjYWxlXG4gICAgICB4ID0gNDgwLCB5ID0gMjUwLCAvLyB0cmFuc2xhdGVcbiAgICAgIGxhbWJkYSA9IDAsIHBoaSA9IDAsIC8vIGNlbnRlclxuICAgICAgZGVsdGFMYW1iZGEgPSAwLCBkZWx0YVBoaSA9IDAsIGRlbHRhR2FtbWEgPSAwLCByb3RhdGUsIC8vIHByZS1yb3RhdGVcbiAgICAgIGFscGhhID0gMCwgLy8gcG9zdC1yb3RhdGUgYW5nbGVcbiAgICAgIHN4ID0gMSwgLy8gcmVmbGVjdFhcbiAgICAgIHN5ID0gMSwgLy8gcmVmbGVjdFhcbiAgICAgIHRoZXRhID0gbnVsbCwgcHJlY2xpcCA9IGNsaXBBbnRpbWVyaWRpYW4sIC8vIHByZS1jbGlwIGFuZ2xlXG4gICAgICB4MCA9IG51bGwsIHkwLCB4MSwgeTEsIHBvc3RjbGlwID0gaWRlbnRpdHksIC8vIHBvc3QtY2xpcCBleHRlbnRcbiAgICAgIGRlbHRhMiA9IDAuNSwgLy8gcHJlY2lzaW9uXG4gICAgICBwcm9qZWN0UmVzYW1wbGUsXG4gICAgICBwcm9qZWN0VHJhbnNmb3JtLFxuICAgICAgcHJvamVjdFJvdGF0ZVRyYW5zZm9ybSxcbiAgICAgIGNhY2hlLFxuICAgICAgY2FjaGVTdHJlYW07XG5cbiAgZnVuY3Rpb24gcHJvamVjdGlvbihwb2ludCkge1xuICAgIHJldHVybiBwcm9qZWN0Um90YXRlVHJhbnNmb3JtKHBvaW50WzBdICogcmFkaWFucywgcG9pbnRbMV0gKiByYWRpYW5zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludmVydChwb2ludCkge1xuICAgIHBvaW50ID0gcHJvamVjdFJvdGF0ZVRyYW5zZm9ybS5pbnZlcnQocG9pbnRbMF0sIHBvaW50WzFdKTtcbiAgICByZXR1cm4gcG9pbnQgJiYgW3BvaW50WzBdICogZGVncmVlcywgcG9pbnRbMV0gKiBkZWdyZWVzXTtcbiAgfVxuXG4gIHByb2plY3Rpb24uc3RyZWFtID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJlYW0gPyBjYWNoZSA6IGNhY2hlID0gdHJhbnNmb3JtUmFkaWFucyh0cmFuc2Zvcm1Sb3RhdGUocm90YXRlKShwcmVjbGlwKHByb2plY3RSZXNhbXBsZShwb3N0Y2xpcChjYWNoZVN0cmVhbSA9IHN0cmVhbSkpKSkpO1xuICB9O1xuXG4gIHByb2plY3Rpb24ucHJlY2xpcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcmVjbGlwID0gXywgdGhldGEgPSB1bmRlZmluZWQsIHJlc2V0KCkpIDogcHJlY2xpcDtcbiAgfTtcblxuICBwcm9qZWN0aW9uLnBvc3RjbGlwID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvc3RjbGlwID0gXywgeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCByZXNldCgpKSA6IHBvc3RjbGlwO1xuICB9O1xuXG4gIHByb2plY3Rpb24uY2xpcEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByZWNsaXAgPSArXyA/IGNsaXBDaXJjbGUodGhldGEgPSBfICogcmFkaWFucykgOiAodGhldGEgPSBudWxsLCBjbGlwQW50aW1lcmlkaWFuKSwgcmVzZXQoKSkgOiB0aGV0YSAqIGRlZ3JlZXM7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvc3RjbGlwID0gXyA9PSBudWxsID8gKHgwID0geTAgPSB4MSA9IHkxID0gbnVsbCwgaWRlbnRpdHkpIDogY2xpcFJlY3RhbmdsZSh4MCA9ICtfWzBdWzBdLCB5MCA9ICtfWzBdWzFdLCB4MSA9ICtfWzFdWzBdLCB5MSA9ICtfWzFdWzFdKSwgcmVzZXQoKSkgOiB4MCA9PSBudWxsID8gbnVsbCA6IFtbeDAsIHkwXSwgW3gxLCB5MV1dO1xuICB9O1xuXG4gIHByb2plY3Rpb24uc2NhbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoayA9ICtfLCByZWNlbnRlcigpKSA6IGs7XG4gIH07XG5cbiAgcHJvamVjdGlvbi50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9ICtfWzBdLCB5ID0gK19bMV0sIHJlY2VudGVyKCkpIDogW3gsIHldO1xuICB9O1xuXG4gIHByb2plY3Rpb24uY2VudGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGxhbWJkYSA9IF9bMF0gJSAzNjAgKiByYWRpYW5zLCBwaGkgPSBfWzFdICUgMzYwICogcmFkaWFucywgcmVjZW50ZXIoKSkgOiBbbGFtYmRhICogZGVncmVlcywgcGhpICogZGVncmVlc107XG4gIH07XG5cbiAgcHJvamVjdGlvbi5yb3RhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGVsdGFMYW1iZGEgPSBfWzBdICUgMzYwICogcmFkaWFucywgZGVsdGFQaGkgPSBfWzFdICUgMzYwICogcmFkaWFucywgZGVsdGFHYW1tYSA9IF8ubGVuZ3RoID4gMiA/IF9bMl0gJSAzNjAgKiByYWRpYW5zIDogMCwgcmVjZW50ZXIoKSkgOiBbZGVsdGFMYW1iZGEgKiBkZWdyZWVzLCBkZWx0YVBoaSAqIGRlZ3JlZXMsIGRlbHRhR2FtbWEgKiBkZWdyZWVzXTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhID0gXyAlIDM2MCAqIHJhZGlhbnMsIHJlY2VudGVyKCkpIDogYWxwaGEgKiBkZWdyZWVzO1xuICB9O1xuXG4gIHByb2plY3Rpb24ucmVmbGVjdFggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3ggPSBfID8gLTEgOiAxLCByZWNlbnRlcigpKSA6IHN4IDwgMDtcbiAgfTtcblxuICBwcm9qZWN0aW9uLnJlZmxlY3RZID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN5ID0gXyA/IC0xIDogMSwgcmVjZW50ZXIoKSkgOiBzeSA8IDA7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJvamVjdFJlc2FtcGxlID0gcmVzYW1wbGUocHJvamVjdFRyYW5zZm9ybSwgZGVsdGEyID0gXyAqIF8pLCByZXNldCgpKSA6IHNxcnQoZGVsdGEyKTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmZpdEV4dGVudCA9IGZ1bmN0aW9uKGV4dGVudCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdEV4dGVudChwcm9qZWN0aW9uLCBleHRlbnQsIG9iamVjdCk7XG4gIH07XG5cbiAgcHJvamVjdGlvbi5maXRTaXplID0gZnVuY3Rpb24oc2l6ZSwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdFNpemUocHJvamVjdGlvbiwgc2l6ZSwgb2JqZWN0KTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmZpdFdpZHRoID0gZnVuY3Rpb24od2lkdGgsIG9iamVjdCkge1xuICAgIHJldHVybiBmaXRXaWR0aChwcm9qZWN0aW9uLCB3aWR0aCwgb2JqZWN0KTtcbiAgfTtcblxuICBwcm9qZWN0aW9uLmZpdEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdEhlaWdodChwcm9qZWN0aW9uLCBoZWlnaHQsIG9iamVjdCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVjZW50ZXIoKSB7XG4gICAgdmFyIGNlbnRlciA9IHNjYWxlVHJhbnNsYXRlUm90YXRlKGssIDAsIDAsIHN4LCBzeSwgYWxwaGEpLmFwcGx5KG51bGwsIHByb2plY3QobGFtYmRhLCBwaGkpKSxcbiAgICAgICAgdHJhbnNmb3JtID0gKGFscGhhID8gc2NhbGVUcmFuc2xhdGVSb3RhdGUgOiBzY2FsZVRyYW5zbGF0ZSkoaywgeCAtIGNlbnRlclswXSwgeSAtIGNlbnRlclsxXSwgc3gsIHN5LCBhbHBoYSk7XG4gICAgcm90YXRlID0gcm90YXRlUmFkaWFucyhkZWx0YUxhbWJkYSwgZGVsdGFQaGksIGRlbHRhR2FtbWEpO1xuICAgIHByb2plY3RUcmFuc2Zvcm0gPSBjb21wb3NlKHByb2plY3QsIHRyYW5zZm9ybSk7XG4gICAgcHJvamVjdFJvdGF0ZVRyYW5zZm9ybSA9IGNvbXBvc2Uocm90YXRlLCBwcm9qZWN0VHJhbnNmb3JtKTtcbiAgICBwcm9qZWN0UmVzYW1wbGUgPSByZXNhbXBsZShwcm9qZWN0VHJhbnNmb3JtLCBkZWx0YTIpO1xuICAgIHJldHVybiByZXNldCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgY2FjaGUgPSBjYWNoZVN0cmVhbSA9IG51bGw7XG4gICAgcmV0dXJuIHByb2plY3Rpb247XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcHJvamVjdCA9IHByb2plY3RBdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHByb2plY3Rpb24uaW52ZXJ0ID0gcHJvamVjdC5pbnZlcnQgJiYgaW52ZXJ0O1xuICAgIHJldHVybiByZWNlbnRlcigpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtkZWdyZWVzLCBwaSwgcmFkaWFuc30gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7cHJvamVjdGlvbk11dGF0b3J9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25pY1Byb2plY3Rpb24ocHJvamVjdEF0KSB7XG4gIHZhciBwaGkwID0gMCxcbiAgICAgIHBoaTEgPSBwaSAvIDMsXG4gICAgICBtID0gcHJvamVjdGlvbk11dGF0b3IocHJvamVjdEF0KSxcbiAgICAgIHAgPSBtKHBoaTAsIHBoaTEpO1xuXG4gIHAucGFyYWxsZWxzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gbShwaGkwID0gX1swXSAqIHJhZGlhbnMsIHBoaTEgPSBfWzFdICogcmFkaWFucykgOiBbcGhpMCAqIGRlZ3JlZXMsIHBoaTEgKiBkZWdyZWVzXTtcbiAgfTtcblxuICByZXR1cm4gcDtcbn1cbiIsImltcG9ydCB7YXNpbiwgY29zLCBzaW59IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjeWxpbmRyaWNhbEVxdWFsQXJlYVJhdyhwaGkwKSB7XG4gIHZhciBjb3NQaGkwID0gY29zKHBoaTApO1xuXG4gIGZ1bmN0aW9uIGZvcndhcmQobGFtYmRhLCBwaGkpIHtcbiAgICByZXR1cm4gW2xhbWJkYSAqIGNvc1BoaTAsIHNpbihwaGkpIC8gY29zUGhpMF07XG4gIH1cblxuICBmb3J3YXJkLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4gW3ggLyBjb3NQaGkwLCBhc2luKHkgKiBjb3NQaGkwKV07XG4gIH07XG5cbiAgcmV0dXJuIGZvcndhcmQ7XG59XG4iLCJpbXBvcnQge2FicywgYXNpbiwgYXRhbjIsIGNvcywgZXBzaWxvbiwgcGksIHNpZ24sIHNpbiwgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7Y29uaWNQcm9qZWN0aW9ufSBmcm9tIFwiLi9jb25pYy5qc1wiO1xuaW1wb3J0IHtjeWxpbmRyaWNhbEVxdWFsQXJlYVJhd30gZnJvbSBcIi4vY3lsaW5kcmljYWxFcXVhbEFyZWEuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmljRXF1YWxBcmVhUmF3KHkwLCB5MSkge1xuICB2YXIgc3kwID0gc2luKHkwKSwgbiA9IChzeTAgKyBzaW4oeTEpKSAvIDI7XG5cbiAgLy8gQXJlIHRoZSBwYXJhbGxlbHMgc3ltbWV0cmljYWwgYXJvdW5kIHRoZSBFcXVhdG9yP1xuICBpZiAoYWJzKG4pIDwgZXBzaWxvbikgcmV0dXJuIGN5bGluZHJpY2FsRXF1YWxBcmVhUmF3KHkwKTtcblxuICB2YXIgYyA9IDEgKyBzeTAgKiAoMiAqIG4gLSBzeTApLCByMCA9IHNxcnQoYykgLyBuO1xuXG4gIGZ1bmN0aW9uIHByb2plY3QoeCwgeSkge1xuICAgIHZhciByID0gc3FydChjIC0gMiAqIG4gKiBzaW4oeSkpIC8gbjtcbiAgICByZXR1cm4gW3IgKiBzaW4oeCAqPSBuKSwgcjAgLSByICogY29zKHgpXTtcbiAgfVxuXG4gIHByb2plY3QuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHZhciByMHkgPSByMCAtIHksXG4gICAgICAgIGwgPSBhdGFuMih4LCBhYnMocjB5KSkgKiBzaWduKHIweSk7XG4gICAgaWYgKHIweSAqIG4gPCAwKVxuICAgICAgbCAtPSBwaSAqIHNpZ24oeCkgKiBzaWduKHIweSk7XG4gICAgcmV0dXJuIFtsIC8gbiwgYXNpbigoYyAtICh4ICogeCArIHIweSAqIHIweSkgKiBuICogbikgLyAoMiAqIG4pKV07XG4gIH07XG5cbiAgcmV0dXJuIHByb2plY3Q7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gY29uaWNQcm9qZWN0aW9uKGNvbmljRXF1YWxBcmVhUmF3KVxuICAgICAgLnNjYWxlKDE1NS40MjQpXG4gICAgICAuY2VudGVyKFswLCAzMy42NDQyXSk7XG59XG4iLCJpbXBvcnQgY29uaWNFcXVhbEFyZWEgZnJvbSBcIi4vY29uaWNFcXVhbEFyZWEuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBjb25pY0VxdWFsQXJlYSgpXG4gICAgICAucGFyYWxsZWxzKFsyOS41LCA0NS41XSlcbiAgICAgIC5zY2FsZSgxMDcwKVxuICAgICAgLnRyYW5zbGF0ZShbNDgwLCAyNTBdKVxuICAgICAgLnJvdGF0ZShbOTYsIDBdKVxuICAgICAgLmNlbnRlcihbLTAuNiwgMzguN10pO1xufVxuIiwiaW1wb3J0IHtlcHNpbG9ufSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IGFsYmVycyBmcm9tIFwiLi9hbGJlcnMuanNcIjtcbmltcG9ydCBjb25pY0VxdWFsQXJlYSBmcm9tIFwiLi9jb25pY0VxdWFsQXJlYS5qc1wiO1xuaW1wb3J0IHtmaXRFeHRlbnQsIGZpdFNpemUsIGZpdFdpZHRoLCBmaXRIZWlnaHR9IGZyb20gXCIuL2ZpdC5qc1wiO1xuXG4vLyBUaGUgcHJvamVjdGlvbnMgbXVzdCBoYXZlIG11dHVhbGx5IGV4Y2x1c2l2ZSBjbGlwIHJlZ2lvbnMgb24gdGhlIHNwaGVyZSxcbi8vIGFzIHRoaXMgd2lsbCBhdm9pZCBlbWl0dGluZyBpbnRlcmxlYXZpbmcgbGluZXMgYW5kIHBvbHlnb25zLlxuZnVuY3Rpb24gbXVsdGlwbGV4KHN0cmVhbXMpIHtcbiAgdmFyIG4gPSBzdHJlYW1zLmxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgeyB2YXIgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgc3RyZWFtc1tpXS5wb2ludCh4LCB5KTsgfSxcbiAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgeyB2YXIgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgc3RyZWFtc1tpXS5zcGhlcmUoKTsgfSxcbiAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgeyB2YXIgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgc3RyZWFtc1tpXS5saW5lU3RhcnQoKTsgfSxcbiAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsgdmFyIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHN0cmVhbXNbaV0ubGluZUVuZCgpOyB9LFxuICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBvbHlnb25TdGFydCgpOyB9LFxuICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgeyB2YXIgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgc3RyZWFtc1tpXS5wb2x5Z29uRW5kKCk7IH1cbiAgfTtcbn1cblxuLy8gQSBjb21wb3NpdGUgcHJvamVjdGlvbiBmb3IgdGhlIFVuaXRlZCBTdGF0ZXMsIGNvbmZpZ3VyZWQgYnkgZGVmYXVsdCBmb3Jcbi8vIDk2MMOXNTAwLiBUaGUgcHJvamVjdGlvbiBhbHNvIHdvcmtzIHF1aXRlIHdlbGwgYXQgOTYww5c2MDAgaWYgeW91IGNoYW5nZSB0aGVcbi8vIHNjYWxlIHRvIDEyODUgYW5kIGFkanVzdCB0aGUgdHJhbnNsYXRlIGFjY29yZGluZ2x5LiBUaGUgc2V0IG9mIHN0YW5kYXJkXG4vLyBwYXJhbGxlbHMgZm9yIGVhY2ggcmVnaW9uIGNvbWVzIGZyb20gVVNHUywgd2hpY2ggaXMgcHVibGlzaGVkIGhlcmU6XG4vLyBodHRwOi8vZWdzYy51c2dzLmdvdi9pc2IvcHVicy9NYXBQcm9qZWN0aW9ucy9wcm9qZWN0aW9ucy5odG1sI2FsYmVyc1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBjYWNoZSxcbiAgICAgIGNhY2hlU3RyZWFtLFxuICAgICAgbG93ZXI0OCA9IGFsYmVycygpLCBsb3dlcjQ4UG9pbnQsXG4gICAgICBhbGFza2EgPSBjb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU0LCAwXSkuY2VudGVyKFstMiwgNTguNV0pLnBhcmFsbGVscyhbNTUsIDY1XSksIGFsYXNrYVBvaW50LCAvLyBFUFNHOjMzMzhcbiAgICAgIGhhd2FpaSA9IGNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsIDBdKS5jZW50ZXIoWy0zLCAxOS45XSkucGFyYWxsZWxzKFs4LCAxOF0pLCBoYXdhaWlQb2ludCwgLy8gRVNSSToxMDIwMDdcbiAgICAgIHBvaW50LCBwb2ludFN0cmVhbSA9IHtwb2ludDogZnVuY3Rpb24oeCwgeSkgeyBwb2ludCA9IFt4LCB5XTsgfX07XG5cbiAgZnVuY3Rpb24gYWxiZXJzVXNhKGNvb3JkaW5hdGVzKSB7XG4gICAgdmFyIHggPSBjb29yZGluYXRlc1swXSwgeSA9IGNvb3JkaW5hdGVzWzFdO1xuICAgIHJldHVybiBwb2ludCA9IG51bGwsXG4gICAgICAgIChsb3dlcjQ4UG9pbnQucG9pbnQoeCwgeSksIHBvaW50KVxuICAgICAgICB8fCAoYWxhc2thUG9pbnQucG9pbnQoeCwgeSksIHBvaW50KVxuICAgICAgICB8fCAoaGF3YWlpUG9pbnQucG9pbnQoeCwgeSksIHBvaW50KTtcbiAgfVxuXG4gIGFsYmVyc1VzYS5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykge1xuICAgIHZhciBrID0gbG93ZXI0OC5zY2FsZSgpLFxuICAgICAgICB0ID0gbG93ZXI0OC50cmFuc2xhdGUoKSxcbiAgICAgICAgeCA9IChjb29yZGluYXRlc1swXSAtIHRbMF0pIC8gayxcbiAgICAgICAgeSA9IChjb29yZGluYXRlc1sxXSAtIHRbMV0pIC8gaztcbiAgICByZXR1cm4gKHkgPj0gMC4xMjAgJiYgeSA8IDAuMjM0ICYmIHggPj0gLTAuNDI1ICYmIHggPCAtMC4yMTQgPyBhbGFza2FcbiAgICAgICAgOiB5ID49IDAuMTY2ICYmIHkgPCAwLjIzNCAmJiB4ID49IC0wLjIxNCAmJiB4IDwgLTAuMTE1ID8gaGF3YWlpXG4gICAgICAgIDogbG93ZXI0OCkuaW52ZXJ0KGNvb3JkaW5hdGVzKTtcbiAgfTtcblxuICBhbGJlcnNVc2Euc3RyZWFtID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJlYW0gPyBjYWNoZSA6IGNhY2hlID0gbXVsdGlwbGV4KFtsb3dlcjQ4LnN0cmVhbShjYWNoZVN0cmVhbSA9IHN0cmVhbSksIGFsYXNrYS5zdHJlYW0oc3RyZWFtKSwgaGF3YWlpLnN0cmVhbShzdHJlYW0pXSk7XG4gIH07XG5cbiAgYWxiZXJzVXNhLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnByZWNpc2lvbigpO1xuICAgIGxvd2VyNDgucHJlY2lzaW9uKF8pLCBhbGFza2EucHJlY2lzaW9uKF8pLCBoYXdhaWkucHJlY2lzaW9uKF8pO1xuICAgIHJldHVybiByZXNldCgpO1xuICB9O1xuXG4gIGFsYmVyc1VzYS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnNjYWxlKCk7XG4gICAgbG93ZXI0OC5zY2FsZShfKSwgYWxhc2thLnNjYWxlKF8gKiAwLjM1KSwgaGF3YWlpLnNjYWxlKF8pO1xuICAgIHJldHVybiBhbGJlcnNVc2EudHJhbnNsYXRlKGxvd2VyNDgudHJhbnNsYXRlKCkpO1xuICB9O1xuXG4gIGFsYmVyc1VzYS50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC50cmFuc2xhdGUoKTtcbiAgICB2YXIgayA9IGxvd2VyNDguc2NhbGUoKSwgeCA9ICtfWzBdLCB5ID0gK19bMV07XG5cbiAgICBsb3dlcjQ4UG9pbnQgPSBsb3dlcjQ4XG4gICAgICAgIC50cmFuc2xhdGUoXylcbiAgICAgICAgLmNsaXBFeHRlbnQoW1t4IC0gMC40NTUgKiBrLCB5IC0gMC4yMzggKiBrXSwgW3ggKyAwLjQ1NSAqIGssIHkgKyAwLjIzOCAqIGtdXSlcbiAgICAgICAgLnN0cmVhbShwb2ludFN0cmVhbSk7XG5cbiAgICBhbGFza2FQb2ludCA9IGFsYXNrYVxuICAgICAgICAudHJhbnNsYXRlKFt4IC0gMC4zMDcgKiBrLCB5ICsgMC4yMDEgKiBrXSlcbiAgICAgICAgLmNsaXBFeHRlbnQoW1t4IC0gMC40MjUgKiBrICsgZXBzaWxvbiwgeSArIDAuMTIwICogayArIGVwc2lsb25dLCBbeCAtIDAuMjE0ICogayAtIGVwc2lsb24sIHkgKyAwLjIzNCAqIGsgLSBlcHNpbG9uXV0pXG4gICAgICAgIC5zdHJlYW0ocG9pbnRTdHJlYW0pO1xuXG4gICAgaGF3YWlpUG9pbnQgPSBoYXdhaWlcbiAgICAgICAgLnRyYW5zbGF0ZShbeCAtIDAuMjA1ICogaywgeSArIDAuMjEyICoga10pXG4gICAgICAgIC5jbGlwRXh0ZW50KFtbeCAtIDAuMjE0ICogayArIGVwc2lsb24sIHkgKyAwLjE2NiAqIGsgKyBlcHNpbG9uXSwgW3ggLSAwLjExNSAqIGsgLSBlcHNpbG9uLCB5ICsgMC4yMzQgKiBrIC0gZXBzaWxvbl1dKVxuICAgICAgICAuc3RyZWFtKHBvaW50U3RyZWFtKTtcblxuICAgIHJldHVybiByZXNldCgpO1xuICB9O1xuXG4gIGFsYmVyc1VzYS5maXRFeHRlbnQgPSBmdW5jdGlvbihleHRlbnQsIG9iamVjdCkge1xuICAgIHJldHVybiBmaXRFeHRlbnQoYWxiZXJzVXNhLCBleHRlbnQsIG9iamVjdCk7XG4gIH07XG5cbiAgYWxiZXJzVXNhLmZpdFNpemUgPSBmdW5jdGlvbihzaXplLCBvYmplY3QpIHtcbiAgICByZXR1cm4gZml0U2l6ZShhbGJlcnNVc2EsIHNpemUsIG9iamVjdCk7XG4gIH07XG5cbiAgYWxiZXJzVXNhLmZpdFdpZHRoID0gZnVuY3Rpb24od2lkdGgsIG9iamVjdCkge1xuICAgIHJldHVybiBmaXRXaWR0aChhbGJlcnNVc2EsIHdpZHRoLCBvYmplY3QpO1xuICB9O1xuXG4gIGFsYmVyc1VzYS5maXRIZWlnaHQgPSBmdW5jdGlvbihoZWlnaHQsIG9iamVjdCkge1xuICAgIHJldHVybiBmaXRIZWlnaHQoYWxiZXJzVXNhLCBoZWlnaHQsIG9iamVjdCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgY2FjaGUgPSBjYWNoZVN0cmVhbSA9IG51bGw7XG4gICAgcmV0dXJuIGFsYmVyc1VzYTtcbiAgfVxuXG4gIHJldHVybiBhbGJlcnNVc2Euc2NhbGUoMTA3MCk7XG59XG4iLCJpbXBvcnQge2FzaW4sIGF0YW4yLCBjb3MsIHNpbiwgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGF6aW11dGhhbFJhdyhzY2FsZSkge1xuICByZXR1cm4gZnVuY3Rpb24oeCwgeSkge1xuICAgIHZhciBjeCA9IGNvcyh4KSxcbiAgICAgICAgY3kgPSBjb3MoeSksXG4gICAgICAgIGsgPSBzY2FsZShjeCAqIGN5KTtcbiAgICByZXR1cm4gW1xuICAgICAgayAqIGN5ICogc2luKHgpLFxuICAgICAgayAqIHNpbih5KVxuICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF6aW11dGhhbEludmVydChhbmdsZSkge1xuICByZXR1cm4gZnVuY3Rpb24oeCwgeSkge1xuICAgIHZhciB6ID0gc3FydCh4ICogeCArIHkgKiB5KSxcbiAgICAgICAgYyA9IGFuZ2xlKHopLFxuICAgICAgICBzYyA9IHNpbihjKSxcbiAgICAgICAgY2MgPSBjb3MoYyk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGF0YW4yKHggKiBzYywgeiAqIGNjKSxcbiAgICAgIGFzaW4oeiAmJiB5ICogc2MgLyB6KVxuICAgIF07XG4gIH1cbn1cbiIsImltcG9ydCB7YXNpbiwgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7YXppbXV0aGFsUmF3LCBhemltdXRoYWxJbnZlcnR9IGZyb20gXCIuL2F6aW11dGhhbC5qc1wiO1xuaW1wb3J0IHByb2plY3Rpb24gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IHZhciBhemltdXRoYWxFcXVhbEFyZWFSYXcgPSBhemltdXRoYWxSYXcoZnVuY3Rpb24oY3hjeSkge1xuICByZXR1cm4gc3FydCgyIC8gKDEgKyBjeGN5KSk7XG59KTtcblxuYXppbXV0aGFsRXF1YWxBcmVhUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChmdW5jdGlvbih6KSB7XG4gIHJldHVybiAyICogYXNpbih6IC8gMik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBwcm9qZWN0aW9uKGF6aW11dGhhbEVxdWFsQXJlYVJhdylcbiAgICAgIC5zY2FsZSgxMjQuNzUpXG4gICAgICAuY2xpcEFuZ2xlKDE4MCAtIDFlLTMpO1xufVxuIiwiaW1wb3J0IHthY29zLCBzaW59IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQge2F6aW11dGhhbFJhdywgYXppbXV0aGFsSW52ZXJ0fSBmcm9tIFwiLi9hemltdXRoYWwuanNcIjtcbmltcG9ydCBwcm9qZWN0aW9uIGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCB2YXIgYXppbXV0aGFsRXF1aWRpc3RhbnRSYXcgPSBhemltdXRoYWxSYXcoZnVuY3Rpb24oYykge1xuICByZXR1cm4gKGMgPSBhY29zKGMpKSAmJiBjIC8gc2luKGMpO1xufSk7XG5cbmF6aW11dGhhbEVxdWlkaXN0YW50UmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChmdW5jdGlvbih6KSB7XG4gIHJldHVybiB6O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcHJvamVjdGlvbihhemltdXRoYWxFcXVpZGlzdGFudFJhdylcbiAgICAgIC5zY2FsZSg3OS40MTg4KVxuICAgICAgLmNsaXBBbmdsZSgxODAgLSAxZS0zKTtcbn1cbiIsImltcG9ydCB7YXRhbiwgZXhwLCBoYWxmUGksIGxvZywgcGksIHRhbiwgdGF1fSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHJvdGF0aW9uIGZyb20gXCIuLi9yb3RhdGlvbi5qc1wiO1xuaW1wb3J0IHByb2plY3Rpb24gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmNhdG9yUmF3KGxhbWJkYSwgcGhpKSB7XG4gIHJldHVybiBbbGFtYmRhLCBsb2codGFuKChoYWxmUGkgKyBwaGkpIC8gMikpXTtcbn1cblxubWVyY2F0b3JSYXcuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICByZXR1cm4gW3gsIDIgKiBhdGFuKGV4cCh5KSkgLSBoYWxmUGldO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBtZXJjYXRvclByb2plY3Rpb24obWVyY2F0b3JSYXcpXG4gICAgICAuc2NhbGUoOTYxIC8gdGF1KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmNhdG9yUHJvamVjdGlvbihwcm9qZWN0KSB7XG4gIHZhciBtID0gcHJvamVjdGlvbihwcm9qZWN0KSxcbiAgICAgIGNlbnRlciA9IG0uY2VudGVyLFxuICAgICAgc2NhbGUgPSBtLnNjYWxlLFxuICAgICAgdHJhbnNsYXRlID0gbS50cmFuc2xhdGUsXG4gICAgICBjbGlwRXh0ZW50ID0gbS5jbGlwRXh0ZW50LFxuICAgICAgeDAgPSBudWxsLCB5MCwgeDEsIHkxOyAvLyBjbGlwIGV4dGVudFxuXG4gIG0uc2NhbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUoXyksIHJlY2xpcCgpKSA6IHNjYWxlKCk7XG4gIH07XG5cbiAgbS50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNsYXRlKF8pLCByZWNsaXAoKSkgOiB0cmFuc2xhdGUoKTtcbiAgfTtcblxuICBtLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjZW50ZXIoXyksIHJlY2xpcCgpKSA6IGNlbnRlcigpO1xuICB9O1xuXG4gIG0uY2xpcEV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoXyA9PSBudWxsID8geDAgPSB5MCA9IHgxID0geTEgPSBudWxsIDogKHgwID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0pKSwgcmVjbGlwKCkpIDogeDAgPT0gbnVsbCA/IG51bGwgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTtcbiAgfTtcblxuICBmdW5jdGlvbiByZWNsaXAoKSB7XG4gICAgdmFyIGsgPSBwaSAqIHNjYWxlKCksXG4gICAgICAgIHQgPSBtKHJvdGF0aW9uKG0ucm90YXRlKCkpLmludmVydChbMCwgMF0pKTtcbiAgICByZXR1cm4gY2xpcEV4dGVudCh4MCA9PSBudWxsXG4gICAgICAgID8gW1t0WzBdIC0gaywgdFsxXSAtIGtdLCBbdFswXSArIGssIHRbMV0gKyBrXV0gOiBwcm9qZWN0ID09PSBtZXJjYXRvclJhd1xuICAgICAgICA/IFtbTWF0aC5tYXgodFswXSAtIGssIHgwKSwgeTBdLCBbTWF0aC5taW4odFswXSArIGssIHgxKSwgeTFdXVxuICAgICAgICA6IFtbeDAsIE1hdGgubWF4KHRbMV0gLSBrLCB5MCldLCBbeDEsIE1hdGgubWluKHRbMV0gKyBrLCB5MSldXSk7XG4gIH1cblxuICByZXR1cm4gcmVjbGlwKCk7XG59XG4iLCJpbXBvcnQge2FicywgYXRhbiwgYXRhbjIsIGNvcywgZXBzaWxvbiwgaGFsZlBpLCBsb2csIHBpLCBwb3csIHNpZ24sIHNpbiwgc3FydCwgdGFufSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuaW1wb3J0IHtjb25pY1Byb2plY3Rpb259IGZyb20gXCIuL2NvbmljLmpzXCI7XG5pbXBvcnQge21lcmNhdG9yUmF3fSBmcm9tIFwiLi9tZXJjYXRvci5qc1wiO1xuXG5mdW5jdGlvbiB0YW55KHkpIHtcbiAgcmV0dXJuIHRhbigoaGFsZlBpICsgeSkgLyAyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmljQ29uZm9ybWFsUmF3KHkwLCB5MSkge1xuICB2YXIgY3kwID0gY29zKHkwKSxcbiAgICAgIG4gPSB5MCA9PT0geTEgPyBzaW4oeTApIDogbG9nKGN5MCAvIGNvcyh5MSkpIC8gbG9nKHRhbnkoeTEpIC8gdGFueSh5MCkpLFxuICAgICAgZiA9IGN5MCAqIHBvdyh0YW55KHkwKSwgbikgLyBuO1xuXG4gIGlmICghbikgcmV0dXJuIG1lcmNhdG9yUmF3O1xuXG4gIGZ1bmN0aW9uIHByb2plY3QoeCwgeSkge1xuICAgIGlmIChmID4gMCkgeyBpZiAoeSA8IC1oYWxmUGkgKyBlcHNpbG9uKSB5ID0gLWhhbGZQaSArIGVwc2lsb247IH1cbiAgICBlbHNlIHsgaWYgKHkgPiBoYWxmUGkgLSBlcHNpbG9uKSB5ID0gaGFsZlBpIC0gZXBzaWxvbjsgfVxuICAgIHZhciByID0gZiAvIHBvdyh0YW55KHkpLCBuKTtcbiAgICByZXR1cm4gW3IgKiBzaW4obiAqIHgpLCBmIC0gciAqIGNvcyhuICogeCldO1xuICB9XG5cbiAgcHJvamVjdC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgdmFyIGZ5ID0gZiAtIHksIHIgPSBzaWduKG4pICogc3FydCh4ICogeCArIGZ5ICogZnkpLFxuICAgICAgbCA9IGF0YW4yKHgsIGFicyhmeSkpICogc2lnbihmeSk7XG4gICAgaWYgKGZ5ICogbiA8IDApXG4gICAgICBsIC09IHBpICogc2lnbih4KSAqIHNpZ24oZnkpO1xuICAgIHJldHVybiBbbCAvIG4sIDIgKiBhdGFuKHBvdyhmIC8gciwgMSAvIG4pKSAtIGhhbGZQaV07XG4gIH07XG5cbiAgcmV0dXJuIHByb2plY3Q7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gY29uaWNQcm9qZWN0aW9uKGNvbmljQ29uZm9ybWFsUmF3KVxuICAgICAgLnNjYWxlKDEwOS41KVxuICAgICAgLnBhcmFsbGVscyhbMzAsIDMwXSk7XG59XG4iLCJpbXBvcnQgcHJvamVjdGlvbiBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1aXJlY3Rhbmd1bGFyUmF3KGxhbWJkYSwgcGhpKSB7XG4gIHJldHVybiBbbGFtYmRhLCBwaGldO1xufVxuXG5lcXVpcmVjdGFuZ3VsYXJSYXcuaW52ZXJ0ID0gZXF1aXJlY3Rhbmd1bGFyUmF3O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHByb2plY3Rpb24oZXF1aXJlY3Rhbmd1bGFyUmF3KVxuICAgICAgLnNjYWxlKDE1Mi42Myk7XG59XG4iLCJpbXBvcnQge2FicywgYXRhbjIsIGNvcywgZXBzaWxvbiwgcGksIHNpZ24sIHNpbiwgc3FydH0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7Y29uaWNQcm9qZWN0aW9ufSBmcm9tIFwiLi9jb25pYy5qc1wiO1xuaW1wb3J0IHtlcXVpcmVjdGFuZ3VsYXJSYXd9IGZyb20gXCIuL2VxdWlyZWN0YW5ndWxhci5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY29uaWNFcXVpZGlzdGFudFJhdyh5MCwgeTEpIHtcbiAgdmFyIGN5MCA9IGNvcyh5MCksXG4gICAgICBuID0geTAgPT09IHkxID8gc2luKHkwKSA6IChjeTAgLSBjb3MoeTEpKSAvICh5MSAtIHkwKSxcbiAgICAgIGcgPSBjeTAgLyBuICsgeTA7XG5cbiAgaWYgKGFicyhuKSA8IGVwc2lsb24pIHJldHVybiBlcXVpcmVjdGFuZ3VsYXJSYXc7XG5cbiAgZnVuY3Rpb24gcHJvamVjdCh4LCB5KSB7XG4gICAgdmFyIGd5ID0gZyAtIHksIG54ID0gbiAqIHg7XG4gICAgcmV0dXJuIFtneSAqIHNpbihueCksIGcgLSBneSAqIGNvcyhueCldO1xuICB9XG5cbiAgcHJvamVjdC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgdmFyIGd5ID0gZyAtIHksXG4gICAgICAgIGwgPSBhdGFuMih4LCBhYnMoZ3kpKSAqIHNpZ24oZ3kpO1xuICAgIGlmIChneSAqIG4gPCAwKVxuICAgICAgbCAtPSBwaSAqIHNpZ24oeCkgKiBzaWduKGd5KTtcbiAgICByZXR1cm4gW2wgLyBuLCBnIC0gc2lnbihuKSAqIHNxcnQoeCAqIHggKyBneSAqIGd5KV07XG4gIH07XG5cbiAgcmV0dXJuIHByb2plY3Q7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gY29uaWNQcm9qZWN0aW9uKGNvbmljRXF1aWRpc3RhbnRSYXcpXG4gICAgICAuc2NhbGUoMTMxLjE1NClcbiAgICAgIC5jZW50ZXIoWzAsIDEzLjkzODldKTtcbn1cbiIsImltcG9ydCBwcm9qZWN0aW9uIGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQge2FicywgYXNpbiwgY29zLCBlcHNpbG9uMiwgc2luLCBzcXJ0fSBmcm9tIFwiLi4vbWF0aC5qc1wiO1xuXG52YXIgQTEgPSAxLjM0MDI2NCxcbiAgICBBMiA9IC0wLjA4MTEwNixcbiAgICBBMyA9IDAuMDAwODkzLFxuICAgIEE0ID0gMC4wMDM3OTYsXG4gICAgTSA9IHNxcnQoMykgLyAyLFxuICAgIGl0ZXJhdGlvbnMgPSAxMjtcblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsRWFydGhSYXcobGFtYmRhLCBwaGkpIHtcbiAgdmFyIGwgPSBhc2luKE0gKiBzaW4ocGhpKSksIGwyID0gbCAqIGwsIGw2ID0gbDIgKiBsMiAqIGwyO1xuICByZXR1cm4gW1xuICAgIGxhbWJkYSAqIGNvcyhsKSAvIChNICogKEExICsgMyAqIEEyICogbDIgKyBsNiAqICg3ICogQTMgKyA5ICogQTQgKiBsMikpKSxcbiAgICBsICogKEExICsgQTIgKiBsMiArIGw2ICogKEEzICsgQTQgKiBsMikpXG4gIF07XG59XG5cbmVxdWFsRWFydGhSYXcuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICB2YXIgbCA9IHksIGwyID0gbCAqIGwsIGw2ID0gbDIgKiBsMiAqIGwyO1xuICBmb3IgKHZhciBpID0gMCwgZGVsdGEsIGZ5LCBmcHk7IGkgPCBpdGVyYXRpb25zOyArK2kpIHtcbiAgICBmeSA9IGwgKiAoQTEgKyBBMiAqIGwyICsgbDYgKiAoQTMgKyBBNCAqIGwyKSkgLSB5O1xuICAgIGZweSA9IEExICsgMyAqIEEyICogbDIgKyBsNiAqICg3ICogQTMgKyA5ICogQTQgKiBsMik7XG4gICAgbCAtPSBkZWx0YSA9IGZ5IC8gZnB5LCBsMiA9IGwgKiBsLCBsNiA9IGwyICogbDIgKiBsMjtcbiAgICBpZiAoYWJzKGRlbHRhKSA8IGVwc2lsb24yKSBicmVhaztcbiAgfVxuICByZXR1cm4gW1xuICAgIE0gKiB4ICogKEExICsgMyAqIEEyICogbDIgKyBsNiAqICg3ICogQTMgKyA5ICogQTQgKiBsMikpIC8gY29zKGwpLFxuICAgIGFzaW4oc2luKGwpIC8gTSlcbiAgXTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcHJvamVjdGlvbihlcXVhbEVhcnRoUmF3KVxuICAgICAgLnNjYWxlKDE3Ny4xNTgpO1xufVxuIiwiaW1wb3J0IHthdGFuLCBjb3MsIHNpbn0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7YXppbXV0aGFsSW52ZXJ0fSBmcm9tIFwiLi9hemltdXRoYWwuanNcIjtcbmltcG9ydCBwcm9qZWN0aW9uIGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnbm9tb25pY1Jhdyh4LCB5KSB7XG4gIHZhciBjeSA9IGNvcyh5KSwgayA9IGNvcyh4KSAqIGN5O1xuICByZXR1cm4gW2N5ICogc2luKHgpIC8gaywgc2luKHkpIC8ga107XG59XG5cbmdub21vbmljUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChhdGFuKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBwcm9qZWN0aW9uKGdub21vbmljUmF3KVxuICAgICAgLnNjYWxlKDE0NC4wNDkpXG4gICAgICAuY2xpcEFuZ2xlKDYwKTtcbn1cbiIsImltcG9ydCBjbGlwUmVjdGFuZ2xlIGZyb20gXCIuLi9jbGlwL3JlY3RhbmdsZS5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuLi9pZGVudGl0eS5qc1wiO1xuaW1wb3J0IHt0cmFuc2Zvcm1lcn0gZnJvbSBcIi4uL3RyYW5zZm9ybS5qc1wiO1xuaW1wb3J0IHtmaXRFeHRlbnQsIGZpdFNpemUsIGZpdFdpZHRoLCBmaXRIZWlnaHR9IGZyb20gXCIuL2ZpdC5qc1wiO1xuaW1wb3J0IHtjb3MsIGRlZ3JlZXMsIHJhZGlhbnMsIHNpbn0gZnJvbSBcIi4uL21hdGguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBrID0gMSwgdHggPSAwLCB0eSA9IDAsIHN4ID0gMSwgc3kgPSAxLCAvLyBzY2FsZSwgdHJhbnNsYXRlIGFuZCByZWZsZWN0XG4gICAgICBhbHBoYSA9IDAsIGNhLCBzYSwgLy8gYW5nbGVcbiAgICAgIHgwID0gbnVsbCwgeTAsIHgxLCB5MSwgLy8gY2xpcCBleHRlbnRcbiAgICAgIGt4ID0gMSwga3kgPSAxLFxuICAgICAgdHJhbnNmb3JtID0gdHJhbnNmb3JtZXIoe1xuICAgICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICAgIHZhciBwID0gcHJvamVjdGlvbihbeCwgeV0pXG4gICAgICAgICAgdGhpcy5zdHJlYW0ucG9pbnQocFswXSwgcFsxXSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgcG9zdGNsaXAgPSBpZGVudGl0eSxcbiAgICAgIGNhY2hlLFxuICAgICAgY2FjaGVTdHJlYW07XG5cbiAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAga3ggPSBrICogc3g7XG4gICAga3kgPSBrICogc3k7XG4gICAgY2FjaGUgPSBjYWNoZVN0cmVhbSA9IG51bGw7XG4gICAgcmV0dXJuIHByb2plY3Rpb247XG4gIH1cblxuICBmdW5jdGlvbiBwcm9qZWN0aW9uIChwKSB7XG4gICAgdmFyIHggPSBwWzBdICoga3gsIHkgPSBwWzFdICoga3k7XG4gICAgaWYgKGFscGhhKSB7XG4gICAgICB2YXIgdCA9IHkgKiBjYSAtIHggKiBzYTtcbiAgICAgIHggPSB4ICogY2EgKyB5ICogc2E7XG4gICAgICB5ID0gdDtcbiAgICB9ICAgIFxuICAgIHJldHVybiBbeCArIHR4LCB5ICsgdHldO1xuICB9XG4gIHByb2plY3Rpb24uaW52ZXJ0ID0gZnVuY3Rpb24ocCkge1xuICAgIHZhciB4ID0gcFswXSAtIHR4LCB5ID0gcFsxXSAtIHR5O1xuICAgIGlmIChhbHBoYSkge1xuICAgICAgdmFyIHQgPSB5ICogY2EgKyB4ICogc2E7XG4gICAgICB4ID0geCAqIGNhIC0geSAqIHNhO1xuICAgICAgeSA9IHQ7XG4gICAgfVxuICAgIHJldHVybiBbeCAvIGt4LCB5IC8ga3ldO1xuICB9O1xuICBwcm9qZWN0aW9uLnN0cmVhbSA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIHJldHVybiBjYWNoZSAmJiBjYWNoZVN0cmVhbSA9PT0gc3RyZWFtID8gY2FjaGUgOiBjYWNoZSA9IHRyYW5zZm9ybShwb3N0Y2xpcChjYWNoZVN0cmVhbSA9IHN0cmVhbSkpO1xuICB9O1xuICBwcm9qZWN0aW9uLnBvc3RjbGlwID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvc3RjbGlwID0gXywgeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCByZXNldCgpKSA6IHBvc3RjbGlwO1xuICB9O1xuICBwcm9qZWN0aW9uLmNsaXBFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfID09IG51bGwgPyAoeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCBpZGVudGl0eSkgOiBjbGlwUmVjdGFuZ2xlKHgwID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0pLCByZXNldCgpKSA6IHgwID09IG51bGwgPyBudWxsIDogW1t4MCwgeTBdLCBbeDEsIHkxXV07XG4gIH07XG4gIHByb2plY3Rpb24uc2NhbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoayA9ICtfLCByZXNldCgpKSA6IGs7XG4gIH07XG4gIHByb2plY3Rpb24udHJhbnNsYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHR4ID0gK19bMF0sIHR5ID0gK19bMV0sIHJlc2V0KCkpIDogW3R4LCB0eV07XG4gIH1cbiAgcHJvamVjdGlvbi5hbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYSA9IF8gJSAzNjAgKiByYWRpYW5zLCBzYSA9IHNpbihhbHBoYSksIGNhID0gY29zKGFscGhhKSwgcmVzZXQoKSkgOiBhbHBoYSAqIGRlZ3JlZXM7XG4gIH07XG4gIHByb2plY3Rpb24ucmVmbGVjdFggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3ggPSBfID8gLTEgOiAxLCByZXNldCgpKSA6IHN4IDwgMDtcbiAgfTtcbiAgcHJvamVjdGlvbi5yZWZsZWN0WSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzeSA9IF8gPyAtMSA6IDEsIHJlc2V0KCkpIDogc3kgPCAwO1xuICB9O1xuICBwcm9qZWN0aW9uLmZpdEV4dGVudCA9IGZ1bmN0aW9uKGV4dGVudCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdEV4dGVudChwcm9qZWN0aW9uLCBleHRlbnQsIG9iamVjdCk7XG4gIH07XG4gIHByb2plY3Rpb24uZml0U2l6ZSA9IGZ1bmN0aW9uKHNpemUsIG9iamVjdCkge1xuICAgIHJldHVybiBmaXRTaXplKHByb2plY3Rpb24sIHNpemUsIG9iamVjdCk7XG4gIH07XG4gIHByb2plY3Rpb24uZml0V2lkdGggPSBmdW5jdGlvbih3aWR0aCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdFdpZHRoKHByb2plY3Rpb24sIHdpZHRoLCBvYmplY3QpO1xuICB9O1xuICBwcm9qZWN0aW9uLmZpdEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGZpdEhlaWdodChwcm9qZWN0aW9uLCBoZWlnaHQsIG9iamVjdCk7XG4gIH07XG5cbiAgcmV0dXJuIHByb2plY3Rpb247XG59XG4iLCJpbXBvcnQgcHJvamVjdGlvbiBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHthYnMsIGVwc2lsb259IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBuYXR1cmFsRWFydGgxUmF3KGxhbWJkYSwgcGhpKSB7XG4gIHZhciBwaGkyID0gcGhpICogcGhpLCBwaGk0ID0gcGhpMiAqIHBoaTI7XG4gIHJldHVybiBbXG4gICAgbGFtYmRhICogKDAuODcwNyAtIDAuMTMxOTc5ICogcGhpMiArIHBoaTQgKiAoLTAuMDEzNzkxICsgcGhpNCAqICgwLjAwMzk3MSAqIHBoaTIgLSAwLjAwMTUyOSAqIHBoaTQpKSksXG4gICAgcGhpICogKDEuMDA3MjI2ICsgcGhpMiAqICgwLjAxNTA4NSArIHBoaTQgKiAoLTAuMDQ0NDc1ICsgMC4wMjg4NzQgKiBwaGkyIC0gMC4wMDU5MTYgKiBwaGk0KSkpXG4gIF07XG59XG5cbm5hdHVyYWxFYXJ0aDFSYXcuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICB2YXIgcGhpID0geSwgaSA9IDI1LCBkZWx0YTtcbiAgZG8ge1xuICAgIHZhciBwaGkyID0gcGhpICogcGhpLCBwaGk0ID0gcGhpMiAqIHBoaTI7XG4gICAgcGhpIC09IGRlbHRhID0gKHBoaSAqICgxLjAwNzIyNiArIHBoaTIgKiAoMC4wMTUwODUgKyBwaGk0ICogKC0wLjA0NDQ3NSArIDAuMDI4ODc0ICogcGhpMiAtIDAuMDA1OTE2ICogcGhpNCkpKSAtIHkpIC9cbiAgICAgICAgKDEuMDA3MjI2ICsgcGhpMiAqICgwLjAxNTA4NSAqIDMgKyBwaGk0ICogKC0wLjA0NDQ3NSAqIDcgKyAwLjAyODg3NCAqIDkgKiBwaGkyIC0gMC4wMDU5MTYgKiAxMSAqIHBoaTQpKSk7XG4gIH0gd2hpbGUgKGFicyhkZWx0YSkgPiBlcHNpbG9uICYmIC0taSA+IDApO1xuICByZXR1cm4gW1xuICAgIHggLyAoMC44NzA3ICsgKHBoaTIgPSBwaGkgKiBwaGkpICogKC0wLjEzMTk3OSArIHBoaTIgKiAoLTAuMDEzNzkxICsgcGhpMiAqIHBoaTIgKiBwaGkyICogKDAuMDAzOTcxIC0gMC4wMDE1MjkgKiBwaGkyKSkpKSxcbiAgICBwaGlcbiAgXTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcHJvamVjdGlvbihuYXR1cmFsRWFydGgxUmF3KVxuICAgICAgLnNjYWxlKDE3NS4yOTUpO1xufVxuIiwiaW1wb3J0IHthc2luLCBjb3MsIGVwc2lsb24sIHNpbn0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7YXppbXV0aGFsSW52ZXJ0fSBmcm9tIFwiLi9hemltdXRoYWwuanNcIjtcbmltcG9ydCBwcm9qZWN0aW9uIGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBvcnRob2dyYXBoaWNSYXcoeCwgeSkge1xuICByZXR1cm4gW2Nvcyh5KSAqIHNpbih4KSwgc2luKHkpXTtcbn1cblxub3J0aG9ncmFwaGljUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChhc2luKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBwcm9qZWN0aW9uKG9ydGhvZ3JhcGhpY1JhdylcbiAgICAgIC5zY2FsZSgyNDkuNSlcbiAgICAgIC5jbGlwQW5nbGUoOTAgKyBlcHNpbG9uKTtcbn1cbiIsImltcG9ydCB7YXRhbiwgY29zLCBzaW59IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQge2F6aW11dGhhbEludmVydH0gZnJvbSBcIi4vYXppbXV0aGFsLmpzXCI7XG5pbXBvcnQgcHJvamVjdGlvbiBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RlcmVvZ3JhcGhpY1Jhdyh4LCB5KSB7XG4gIHZhciBjeSA9IGNvcyh5KSwgayA9IDEgKyBjb3MoeCkgKiBjeTtcbiAgcmV0dXJuIFtjeSAqIHNpbih4KSAvIGssIHNpbih5KSAvIGtdO1xufVxuXG5zdGVyZW9ncmFwaGljUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChmdW5jdGlvbih6KSB7XG4gIHJldHVybiAyICogYXRhbih6KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHByb2plY3Rpb24oc3RlcmVvZ3JhcGhpY1JhdylcbiAgICAgIC5zY2FsZSgyNTApXG4gICAgICAuY2xpcEFuZ2xlKDE0Mik7XG59XG4iLCJpbXBvcnQge2F0YW4sIGV4cCwgaGFsZlBpLCBsb2csIHRhbn0gZnJvbSBcIi4uL21hdGguanNcIjtcbmltcG9ydCB7bWVyY2F0b3JQcm9qZWN0aW9ufSBmcm9tIFwiLi9tZXJjYXRvci5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnN2ZXJzZU1lcmNhdG9yUmF3KGxhbWJkYSwgcGhpKSB7XG4gIHJldHVybiBbbG9nKHRhbigoaGFsZlBpICsgcGhpKSAvIDIpKSwgLWxhbWJkYV07XG59XG5cbnRyYW5zdmVyc2VNZXJjYXRvclJhdy5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gIHJldHVybiBbLXksIDIgKiBhdGFuKGV4cCh4KSkgLSBoYWxmUGldO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBtID0gbWVyY2F0b3JQcm9qZWN0aW9uKHRyYW5zdmVyc2VNZXJjYXRvclJhdyksXG4gICAgICBjZW50ZXIgPSBtLmNlbnRlcixcbiAgICAgIHJvdGF0ZSA9IG0ucm90YXRlO1xuXG4gIG0uY2VudGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gY2VudGVyKFstX1sxXSwgX1swXV0pIDogKF8gPSBjZW50ZXIoKSwgW19bMV0sIC1fWzBdXSk7XG4gIH07XG5cbiAgbS5yb3RhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByb3RhdGUoW19bMF0sIF9bMV0sIF8ubGVuZ3RoID4gMiA/IF9bMl0gKyA5MCA6IDkwXSkgOiAoXyA9IHJvdGF0ZSgpLCBbX1swXSwgX1sxXSwgX1syXSAtIDkwXSk7XG4gIH07XG5cbiAgcmV0dXJuIHJvdGF0ZShbMCwgMCwgOTBdKVxuICAgICAgLnNjYWxlKDE1OS4xNTUpO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0FyZWF9IGZyb20gXCIuL2FyZWEuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBnZW9Cb3VuZHN9IGZyb20gXCIuL2JvdW5kcy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0NlbnRyb2lkfSBmcm9tIFwiLi9jZW50cm9pZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0NpcmNsZX0gZnJvbSBcIi4vY2lyY2xlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZ2VvQ2xpcEFudGltZXJpZGlhbn0gZnJvbSBcIi4vY2xpcC9hbnRpbWVyaWRpYW4uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBnZW9DbGlwQ2lyY2xlfSBmcm9tIFwiLi9jbGlwL2NpcmNsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0NsaXBFeHRlbnR9IGZyb20gXCIuL2NsaXAvZXh0ZW50LmpzXCI7IC8vIERFUFJFQ0FURUQhIFVzZSBkMy5nZW9JZGVudGl0eSgpLmNsaXBFeHRlbnQo4oCmKS5cbmV4cG9ydCB7ZGVmYXVsdCBhcyBnZW9DbGlwUmVjdGFuZ2xlfSBmcm9tIFwiLi9jbGlwL3JlY3RhbmdsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0NvbnRhaW5zfSBmcm9tIFwiLi9jb250YWlucy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0Rpc3RhbmNlfSBmcm9tIFwiLi9kaXN0YW5jZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0dyYXRpY3VsZSwgZ3JhdGljdWxlMTAgYXMgZ2VvR3JhdGljdWxlMTB9IGZyb20gXCIuL2dyYXRpY3VsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0ludGVycG9sYXRlfSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0xlbmd0aH0gZnJvbSBcIi4vbGVuZ3RoLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZ2VvUGF0aH0gZnJvbSBcIi4vcGF0aC9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0FsYmVyc30gZnJvbSBcIi4vcHJvamVjdGlvbi9hbGJlcnMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBnZW9BbGJlcnNVc2F9IGZyb20gXCIuL3Byb2plY3Rpb24vYWxiZXJzVXNhLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZ2VvQXppbXV0aGFsRXF1YWxBcmVhLCBhemltdXRoYWxFcXVhbEFyZWFSYXcgYXMgZ2VvQXppbXV0aGFsRXF1YWxBcmVhUmF3fSBmcm9tIFwiLi9wcm9qZWN0aW9uL2F6aW11dGhhbEVxdWFsQXJlYS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0F6aW11dGhhbEVxdWlkaXN0YW50LCBhemltdXRoYWxFcXVpZGlzdGFudFJhdyBhcyBnZW9BemltdXRoYWxFcXVpZGlzdGFudFJhd30gZnJvbSBcIi4vcHJvamVjdGlvbi9hemltdXRoYWxFcXVpZGlzdGFudC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0NvbmljQ29uZm9ybWFsLCBjb25pY0NvbmZvcm1hbFJhdyBhcyBnZW9Db25pY0NvbmZvcm1hbFJhd30gZnJvbSBcIi4vcHJvamVjdGlvbi9jb25pY0NvbmZvcm1hbC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0NvbmljRXF1YWxBcmVhLCBjb25pY0VxdWFsQXJlYVJhdyBhcyBnZW9Db25pY0VxdWFsQXJlYVJhd30gZnJvbSBcIi4vcHJvamVjdGlvbi9jb25pY0VxdWFsQXJlYS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb0NvbmljRXF1aWRpc3RhbnQsIGNvbmljRXF1aWRpc3RhbnRSYXcgYXMgZ2VvQ29uaWNFcXVpZGlzdGFudFJhd30gZnJvbSBcIi4vcHJvamVjdGlvbi9jb25pY0VxdWlkaXN0YW50LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZ2VvRXF1YWxFYXJ0aCwgZXF1YWxFYXJ0aFJhdyBhcyBnZW9FcXVhbEVhcnRoUmF3fSBmcm9tIFwiLi9wcm9qZWN0aW9uL2VxdWFsRWFydGguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBnZW9FcXVpcmVjdGFuZ3VsYXIsIGVxdWlyZWN0YW5ndWxhclJhdyBhcyBnZW9FcXVpcmVjdGFuZ3VsYXJSYXd9IGZyb20gXCIuL3Byb2plY3Rpb24vZXF1aXJlY3Rhbmd1bGFyLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZ2VvR25vbW9uaWMsIGdub21vbmljUmF3IGFzIGdlb0dub21vbmljUmF3fSBmcm9tIFwiLi9wcm9qZWN0aW9uL2dub21vbmljLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZ2VvSWRlbnRpdHl9IGZyb20gXCIuL3Byb2plY3Rpb24vaWRlbnRpdHkuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBnZW9Qcm9qZWN0aW9uLCBwcm9qZWN0aW9uTXV0YXRvciBhcyBnZW9Qcm9qZWN0aW9uTXV0YXRvcn0gZnJvbSBcIi4vcHJvamVjdGlvbi9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb01lcmNhdG9yLCBtZXJjYXRvclJhdyBhcyBnZW9NZXJjYXRvclJhd30gZnJvbSBcIi4vcHJvamVjdGlvbi9tZXJjYXRvci5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb05hdHVyYWxFYXJ0aDEsIG5hdHVyYWxFYXJ0aDFSYXcgYXMgZ2VvTmF0dXJhbEVhcnRoMVJhd30gZnJvbSBcIi4vcHJvamVjdGlvbi9uYXR1cmFsRWFydGgxLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZ2VvT3J0aG9ncmFwaGljLCBvcnRob2dyYXBoaWNSYXcgYXMgZ2VvT3J0aG9ncmFwaGljUmF3fSBmcm9tIFwiLi9wcm9qZWN0aW9uL29ydGhvZ3JhcGhpYy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb1N0ZXJlb2dyYXBoaWMsIHN0ZXJlb2dyYXBoaWNSYXcgYXMgZ2VvU3RlcmVvZ3JhcGhpY1Jhd30gZnJvbSBcIi4vcHJvamVjdGlvbi9zdGVyZW9ncmFwaGljLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yLCB0cmFuc3ZlcnNlTWVyY2F0b3JSYXcgYXMgZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3fSBmcm9tIFwiLi9wcm9qZWN0aW9uL3RyYW5zdmVyc2VNZXJjYXRvci5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb1JvdGF0aW9ufSBmcm9tIFwiLi9yb3RhdGlvbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGdlb1N0cmVhbX0gZnJvbSBcIi4vc3RyZWFtLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZ2VvVHJhbnNmb3JtfSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbiIsImZ1bmN0aW9uIGRlZmF1bHRTZXBhcmF0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyO1xufVxuXG5mdW5jdGlvbiBtZWFuWChjaGlsZHJlbikge1xuICByZXR1cm4gY2hpbGRyZW4ucmVkdWNlKG1lYW5YUmVkdWNlLCAwKSAvIGNoaWxkcmVuLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gbWVhblhSZWR1Y2UoeCwgYykge1xuICByZXR1cm4geCArIGMueDtcbn1cblxuZnVuY3Rpb24gbWF4WShjaGlsZHJlbikge1xuICByZXR1cm4gMSArIGNoaWxkcmVuLnJlZHVjZShtYXhZUmVkdWNlLCAwKTtcbn1cblxuZnVuY3Rpb24gbWF4WVJlZHVjZSh5LCBjKSB7XG4gIHJldHVybiBNYXRoLm1heCh5LCBjLnkpO1xufVxuXG5mdW5jdGlvbiBsZWFmTGVmdChub2RlKSB7XG4gIHZhciBjaGlsZHJlbjtcbiAgd2hpbGUgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgbm9kZSA9IGNoaWxkcmVuWzBdO1xuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gbGVhZlJpZ2h0KG5vZGUpIHtcbiAgdmFyIGNoaWxkcmVuO1xuICB3aGlsZSAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSBub2RlID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHNlcGFyYXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbixcbiAgICAgIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIG5vZGVTaXplID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gY2x1c3Rlcihyb290KSB7XG4gICAgdmFyIHByZXZpb3VzTm9kZSxcbiAgICAgICAgeCA9IDA7XG5cbiAgICAvLyBGaXJzdCB3YWxrLCBjb21wdXRpbmcgdGhlIGluaXRpYWwgeCAmIHkgdmFsdWVzLlxuICAgIHJvb3QuZWFjaEFmdGVyKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgbm9kZS54ID0gbWVhblgoY2hpbGRyZW4pO1xuICAgICAgICBub2RlLnkgPSBtYXhZKGNoaWxkcmVuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUueCA9IHByZXZpb3VzTm9kZSA/IHggKz0gc2VwYXJhdGlvbihub2RlLCBwcmV2aW91c05vZGUpIDogMDtcbiAgICAgICAgbm9kZS55ID0gMDtcbiAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBsZWZ0ID0gbGVhZkxlZnQocm9vdCksXG4gICAgICAgIHJpZ2h0ID0gbGVhZlJpZ2h0KHJvb3QpLFxuICAgICAgICB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMixcbiAgICAgICAgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyO1xuXG4gICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUuXG4gICAgcmV0dXJuIHJvb3QuZWFjaEFmdGVyKG5vZGVTaXplID8gZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZS54ID0gKG5vZGUueCAtIHJvb3QueCkgKiBkeDtcbiAgICAgIG5vZGUueSA9IChyb290LnkgLSBub2RlLnkpICogZHk7XG4gICAgfSA6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBkeDtcbiAgICAgIG5vZGUueSA9ICgxIC0gKHJvb3QueSA/IG5vZGUueSAvIHJvb3QueSA6IDEpKSAqIGR5O1xuICAgIH0pO1xuICB9XG5cbiAgY2x1c3Rlci5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlcGFyYXRpb24gPSB4LCBjbHVzdGVyKSA6IHNlcGFyYXRpb247XG4gIH07XG5cbiAgY2x1c3Rlci5zaXplID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gZmFsc2UsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIGNsdXN0ZXIpIDogKG5vZGVTaXplID8gbnVsbCA6IFtkeCwgZHldKTtcbiAgfTtcblxuICBjbHVzdGVyLm5vZGVTaXplID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gdHJ1ZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgY2x1c3RlcikgOiAobm9kZVNpemUgPyBbZHgsIGR5XSA6IG51bGwpO1xuICB9O1xuXG4gIHJldHVybiBjbHVzdGVyO1xufVxuIiwiZnVuY3Rpb24gY291bnQobm9kZSkge1xuICB2YXIgc3VtID0gMCxcbiAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbixcbiAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7XG4gIGlmICghaSkgc3VtID0gMTtcbiAgZWxzZSB3aGlsZSAoLS1pID49IDApIHN1bSArPSBjaGlsZHJlbltpXS52YWx1ZTtcbiAgbm9kZS52YWx1ZSA9IHN1bTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2hBZnRlcihjb3VudCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgbm9kZSA9IHRoaXMsIGN1cnJlbnQsIG5leHQgPSBbbm9kZV0sIGNoaWxkcmVuLCBpLCBuO1xuICBkbyB7XG4gICAgY3VycmVudCA9IG5leHQucmV2ZXJzZSgpLCBuZXh0ID0gW107XG4gICAgd2hpbGUgKG5vZGUgPSBjdXJyZW50LnBvcCgpKSB7XG4gICAgICBjYWxsYmFjayhub2RlKSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIG5leHQucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlIChuZXh0Lmxlbmd0aCk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIG5vZGUgPSB0aGlzLCBub2RlcyA9IFtub2RlXSwgY2hpbGRyZW4sIGk7XG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBjYWxsYmFjayhub2RlKSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIGlmIChjaGlsZHJlbikgZm9yIChpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIG5vZGVzLnB1c2goY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV0sIG5leHQgPSBbXSwgY2hpbGRyZW4sIGksIG47XG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBuZXh0LnB1c2gobm9kZSksIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBpZiAoY2hpbGRyZW4pIGZvciAoaSA9IDAsIG4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGVzLnB1c2goY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgfVxuICB3aGlsZSAobm9kZSA9IG5leHQucG9wKCkpIHtcbiAgICBjYWxsYmFjayhub2RlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLmVhY2hBZnRlcihmdW5jdGlvbihub2RlKSB7XG4gICAgdmFyIHN1bSA9ICt2YWx1ZShub2RlLmRhdGEpIHx8IDAsXG4gICAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbixcbiAgICAgICAgaSA9IGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aDtcbiAgICB3aGlsZSAoLS1pID49IDApIHN1bSArPSBjaGlsZHJlbltpXS52YWx1ZTtcbiAgICBub2RlLnZhbHVlID0gc3VtO1xuICB9KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBhcmUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4uc29ydChjb21wYXJlKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZW5kKSB7XG4gIHZhciBzdGFydCA9IHRoaXMsXG4gICAgICBhbmNlc3RvciA9IGxlYXN0Q29tbW9uQW5jZXN0b3Ioc3RhcnQsIGVuZCksXG4gICAgICBub2RlcyA9IFtzdGFydF07XG4gIHdoaWxlIChzdGFydCAhPT0gYW5jZXN0b3IpIHtcbiAgICBzdGFydCA9IHN0YXJ0LnBhcmVudDtcbiAgICBub2Rlcy5wdXNoKHN0YXJ0KTtcbiAgfVxuICB2YXIgayA9IG5vZGVzLmxlbmd0aDtcbiAgd2hpbGUgKGVuZCAhPT0gYW5jZXN0b3IpIHtcbiAgICBub2Rlcy5zcGxpY2UoaywgMCwgZW5kKTtcbiAgICBlbmQgPSBlbmQucGFyZW50O1xuICB9XG4gIHJldHVybiBub2Rlcztcbn1cblxuZnVuY3Rpb24gbGVhc3RDb21tb25BbmNlc3RvcihhLCBiKSB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gYTtcbiAgdmFyIGFOb2RlcyA9IGEuYW5jZXN0b3JzKCksXG4gICAgICBiTm9kZXMgPSBiLmFuY2VzdG9ycygpLFxuICAgICAgYyA9IG51bGw7XG4gIGEgPSBhTm9kZXMucG9wKCk7XG4gIGIgPSBiTm9kZXMucG9wKCk7XG4gIHdoaWxlIChhID09PSBiKSB7XG4gICAgYyA9IGE7XG4gICAgYSA9IGFOb2Rlcy5wb3AoKTtcbiAgICBiID0gYk5vZGVzLnBvcCgpO1xuICB9XG4gIHJldHVybiBjO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV07XG4gIHdoaWxlIChub2RlID0gbm9kZS5wYXJlbnQpIHtcbiAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICB9XG4gIHJldHVybiBub2Rlcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbm9kZXMgPSBbXTtcbiAgdGhpcy5lYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICB9KTtcbiAgcmV0dXJuIG5vZGVzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBsZWF2ZXMgPSBbXTtcbiAgdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGxlYXZlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsZWF2ZXM7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHJvb3QgPSB0aGlzLCBsaW5rcyA9IFtdO1xuICByb290LmVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgIGlmIChub2RlICE9PSByb290KSB7IC8vIERvbuKAmXQgaW5jbHVkZSB0aGUgcm9vdOKAmXMgcGFyZW50LCBpZiBhbnkuXG4gICAgICBsaW5rcy5wdXNoKHtzb3VyY2U6IG5vZGUucGFyZW50LCB0YXJnZXQ6IG5vZGV9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGlua3M7XG59XG4iLCJpbXBvcnQgbm9kZV9jb3VudCBmcm9tIFwiLi9jb3VudC5qc1wiO1xuaW1wb3J0IG5vZGVfZWFjaCBmcm9tIFwiLi9lYWNoLmpzXCI7XG5pbXBvcnQgbm9kZV9lYWNoQmVmb3JlIGZyb20gXCIuL2VhY2hCZWZvcmUuanNcIjtcbmltcG9ydCBub2RlX2VhY2hBZnRlciBmcm9tIFwiLi9lYWNoQWZ0ZXIuanNcIjtcbmltcG9ydCBub2RlX3N1bSBmcm9tIFwiLi9zdW0uanNcIjtcbmltcG9ydCBub2RlX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IG5vZGVfcGF0aCBmcm9tIFwiLi9wYXRoLmpzXCI7XG5pbXBvcnQgbm9kZV9hbmNlc3RvcnMgZnJvbSBcIi4vYW5jZXN0b3JzLmpzXCI7XG5pbXBvcnQgbm9kZV9kZXNjZW5kYW50cyBmcm9tIFwiLi9kZXNjZW5kYW50cy5qc1wiO1xuaW1wb3J0IG5vZGVfbGVhdmVzIGZyb20gXCIuL2xlYXZlcy5qc1wiO1xuaW1wb3J0IG5vZGVfbGlua3MgZnJvbSBcIi4vbGlua3MuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGllcmFyY2h5KGRhdGEsIGNoaWxkcmVuKSB7XG4gIHZhciByb290ID0gbmV3IE5vZGUoZGF0YSksXG4gICAgICB2YWx1ZWQgPSArZGF0YS52YWx1ZSAmJiAocm9vdC52YWx1ZSA9IGRhdGEudmFsdWUpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVzID0gW3Jvb3RdLFxuICAgICAgY2hpbGQsXG4gICAgICBjaGlsZHMsXG4gICAgICBpLFxuICAgICAgbjtcblxuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgY2hpbGRyZW4gPSBkZWZhdWx0Q2hpbGRyZW47XG5cbiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkge1xuICAgIGlmICh2YWx1ZWQpIG5vZGUudmFsdWUgPSArbm9kZS5kYXRhLnZhbHVlO1xuICAgIGlmICgoY2hpbGRzID0gY2hpbGRyZW4obm9kZS5kYXRhKSkgJiYgKG4gPSBjaGlsZHMubGVuZ3RoKSkge1xuICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheShuKTtcbiAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBub2Rlcy5wdXNoKGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXSA9IG5ldyBOb2RlKGNoaWxkc1tpXSkpO1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlO1xuICAgICAgICBjaGlsZC5kZXB0aCA9IG5vZGUuZGVwdGggKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByb290LmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCk7XG59XG5cbmZ1bmN0aW9uIG5vZGVfY29weSgpIHtcbiAgcmV0dXJuIGhpZXJhcmNoeSh0aGlzKS5lYWNoQmVmb3JlKGNvcHlEYXRhKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENoaWxkcmVuKGQpIHtcbiAgcmV0dXJuIGQuY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNvcHlEYXRhKG5vZGUpIHtcbiAgbm9kZS5kYXRhID0gbm9kZS5kYXRhLmRhdGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSGVpZ2h0KG5vZGUpIHtcbiAgdmFyIGhlaWdodCA9IDA7XG4gIGRvIG5vZGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICB3aGlsZSAoKG5vZGUgPSBub2RlLnBhcmVudCkgJiYgKG5vZGUuaGVpZ2h0IDwgKytoZWlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5vZGUoZGF0YSkge1xuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLmRlcHRoID1cbiAgdGhpcy5oZWlnaHQgPSAwO1xuICB0aGlzLnBhcmVudCA9IG51bGw7XG59XG5cbk5vZGUucHJvdG90eXBlID0gaGllcmFyY2h5LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IE5vZGUsXG4gIGNvdW50OiBub2RlX2NvdW50LFxuICBlYWNoOiBub2RlX2VhY2gsXG4gIGVhY2hBZnRlcjogbm9kZV9lYWNoQWZ0ZXIsXG4gIGVhY2hCZWZvcmU6IG5vZGVfZWFjaEJlZm9yZSxcbiAgc3VtOiBub2RlX3N1bSxcbiAgc29ydDogbm9kZV9zb3J0LFxuICBwYXRoOiBub2RlX3BhdGgsXG4gIGFuY2VzdG9yczogbm9kZV9hbmNlc3RvcnMsXG4gIGRlc2NlbmRhbnRzOiBub2RlX2Rlc2NlbmRhbnRzLFxuICBsZWF2ZXM6IG5vZGVfbGVhdmVzLFxuICBsaW5rczogbm9kZV9saW5rcyxcbiAgY29weTogbm9kZV9jb3B5XG59O1xuIiwiZXhwb3J0IHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNodWZmbGUoYXJyYXkpIHtcbiAgdmFyIG0gPSBhcnJheS5sZW5ndGgsXG4gICAgICB0LFxuICAgICAgaTtcblxuICB3aGlsZSAobSkge1xuICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDtcbiAgICB0ID0gYXJyYXlbbV07XG4gICAgYXJyYXlbbV0gPSBhcnJheVtpXTtcbiAgICBhcnJheVtpXSA9IHQ7XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59XG4iLCJpbXBvcnQge3NodWZmbGUsIHNsaWNlfSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2lyY2xlcykge1xuICB2YXIgaSA9IDAsIG4gPSAoY2lyY2xlcyA9IHNodWZmbGUoc2xpY2UuY2FsbChjaXJjbGVzKSkpLmxlbmd0aCwgQiA9IFtdLCBwLCBlO1xuXG4gIHdoaWxlIChpIDwgbikge1xuICAgIHAgPSBjaXJjbGVzW2ldO1xuICAgIGlmIChlICYmIGVuY2xvc2VzV2VhayhlLCBwKSkgKytpO1xuICAgIGVsc2UgZSA9IGVuY2xvc2VCYXNpcyhCID0gZXh0ZW5kQmFzaXMoQiwgcCkpLCBpID0gMDtcbiAgfVxuXG4gIHJldHVybiBlO1xufVxuXG5mdW5jdGlvbiBleHRlbmRCYXNpcyhCLCBwKSB7XG4gIHZhciBpLCBqO1xuXG4gIGlmIChlbmNsb3Nlc1dlYWtBbGwocCwgQikpIHJldHVybiBbcF07XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBCIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudC5cbiAgZm9yIChpID0gMDsgaSA8IEIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoZW5jbG9zZXNOb3QocCwgQltpXSlcbiAgICAgICAgJiYgZW5jbG9zZXNXZWFrQWxsKGVuY2xvc2VCYXNpczIoQltpXSwgcCksIEIpKSB7XG4gICAgICByZXR1cm4gW0JbaV0sIHBdO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHdlIGdldCBoZXJlIHRoZW4gQiBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzLlxuICBmb3IgKGkgPSAwOyBpIDwgQi5sZW5ndGggLSAxOyArK2kpIHtcbiAgICBmb3IgKGogPSBpICsgMTsgaiA8IEIubGVuZ3RoOyArK2opIHtcbiAgICAgIGlmIChlbmNsb3Nlc05vdChlbmNsb3NlQmFzaXMyKEJbaV0sIEJbal0pLCBwKVxuICAgICAgICAgICYmIGVuY2xvc2VzTm90KGVuY2xvc2VCYXNpczIoQltpXSwgcCksIEJbal0pXG4gICAgICAgICAgJiYgZW5jbG9zZXNOb3QoZW5jbG9zZUJhc2lzMihCW2pdLCBwKSwgQltpXSlcbiAgICAgICAgICAmJiBlbmNsb3Nlc1dlYWtBbGwoZW5jbG9zZUJhc2lzMyhCW2ldLCBCW2pdLCBwKSwgQikpIHtcbiAgICAgICAgcmV0dXJuIFtCW2ldLCBCW2pdLCBwXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJZiB3ZSBnZXQgaGVyZSB0aGVuIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLlxuICB0aHJvdyBuZXcgRXJyb3I7XG59XG5cbmZ1bmN0aW9uIGVuY2xvc2VzTm90KGEsIGIpIHtcbiAgdmFyIGRyID0gYS5yIC0gYi5yLCBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnk7XG4gIHJldHVybiBkciA8IDAgfHwgZHIgKiBkciA8IGR4ICogZHggKyBkeSAqIGR5O1xufVxuXG5mdW5jdGlvbiBlbmNsb3Nlc1dlYWsoYSwgYikge1xuICB2YXIgZHIgPSBhLnIgLSBiLnIgKyAxZS02LCBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnk7XG4gIHJldHVybiBkciA+IDAgJiYgZHIgKiBkciA+IGR4ICogZHggKyBkeSAqIGR5O1xufVxuXG5mdW5jdGlvbiBlbmNsb3Nlc1dlYWtBbGwoYSwgQikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IEIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIWVuY2xvc2VzV2VhayhhLCBCW2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZW5jbG9zZUJhc2lzKEIpIHtcbiAgc3dpdGNoIChCLmxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGVuY2xvc2VCYXNpczEoQlswXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gZW5jbG9zZUJhc2lzMihCWzBdLCBCWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBlbmNsb3NlQmFzaXMzKEJbMF0sIEJbMV0sIEJbMl0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuY2xvc2VCYXNpczEoYSkge1xuICByZXR1cm4ge1xuICAgIHg6IGEueCxcbiAgICB5OiBhLnksXG4gICAgcjogYS5yXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuY2xvc2VCYXNpczIoYSwgYikge1xuICB2YXIgeDEgPSBhLngsIHkxID0gYS55LCByMSA9IGEucixcbiAgICAgIHgyID0gYi54LCB5MiA9IGIueSwgcjIgPSBiLnIsXG4gICAgICB4MjEgPSB4MiAtIHgxLCB5MjEgPSB5MiAtIHkxLCByMjEgPSByMiAtIHIxLFxuICAgICAgbCA9IE1hdGguc3FydCh4MjEgKiB4MjEgKyB5MjEgKiB5MjEpO1xuICByZXR1cm4ge1xuICAgIHg6ICh4MSArIHgyICsgeDIxIC8gbCAqIHIyMSkgLyAyLFxuICAgIHk6ICh5MSArIHkyICsgeTIxIC8gbCAqIHIyMSkgLyAyLFxuICAgIHI6IChsICsgcjEgKyByMikgLyAyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuY2xvc2VCYXNpczMoYSwgYiwgYykge1xuICB2YXIgeDEgPSBhLngsIHkxID0gYS55LCByMSA9IGEucixcbiAgICAgIHgyID0gYi54LCB5MiA9IGIueSwgcjIgPSBiLnIsXG4gICAgICB4MyA9IGMueCwgeTMgPSBjLnksIHIzID0gYy5yLFxuICAgICAgYTIgPSB4MSAtIHgyLFxuICAgICAgYTMgPSB4MSAtIHgzLFxuICAgICAgYjIgPSB5MSAtIHkyLFxuICAgICAgYjMgPSB5MSAtIHkzLFxuICAgICAgYzIgPSByMiAtIHIxLFxuICAgICAgYzMgPSByMyAtIHIxLFxuICAgICAgZDEgPSB4MSAqIHgxICsgeTEgKiB5MSAtIHIxICogcjEsXG4gICAgICBkMiA9IGQxIC0geDIgKiB4MiAtIHkyICogeTIgKyByMiAqIHIyLFxuICAgICAgZDMgPSBkMSAtIHgzICogeDMgLSB5MyAqIHkzICsgcjMgKiByMyxcbiAgICAgIGFiID0gYTMgKiBiMiAtIGEyICogYjMsXG4gICAgICB4YSA9IChiMiAqIGQzIC0gYjMgKiBkMikgLyAoYWIgKiAyKSAtIHgxLFxuICAgICAgeGIgPSAoYjMgKiBjMiAtIGIyICogYzMpIC8gYWIsXG4gICAgICB5YSA9IChhMyAqIGQyIC0gYTIgKiBkMykgLyAoYWIgKiAyKSAtIHkxLFxuICAgICAgeWIgPSAoYTIgKiBjMyAtIGEzICogYzIpIC8gYWIsXG4gICAgICBBID0geGIgKiB4YiArIHliICogeWIgLSAxLFxuICAgICAgQiA9IDIgKiAocjEgKyB4YSAqIHhiICsgeWEgKiB5YiksXG4gICAgICBDID0geGEgKiB4YSArIHlhICogeWEgLSByMSAqIHIxLFxuICAgICAgciA9IC0oQSA/IChCICsgTWF0aC5zcXJ0KEIgKiBCIC0gNCAqIEEgKiBDKSkgLyAoMiAqIEEpIDogQyAvIEIpO1xuICByZXR1cm4ge1xuICAgIHg6IHgxICsgeGEgKyB4YiAqIHIsXG4gICAgeTogeTEgKyB5YSArIHliICogcixcbiAgICByOiByXG4gIH07XG59XG4iLCJpbXBvcnQgZW5jbG9zZSBmcm9tIFwiLi9lbmNsb3NlLmpzXCI7XG5cbmZ1bmN0aW9uIHBsYWNlKGIsIGEsIGMpIHtcbiAgdmFyIGR4ID0gYi54IC0gYS54LCB4LCBhMixcbiAgICAgIGR5ID0gYi55IC0gYS55LCB5LCBiMixcbiAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gIGlmIChkMikge1xuICAgIGEyID0gYS5yICsgYy5yLCBhMiAqPSBhMjtcbiAgICBiMiA9IGIuciArIGMuciwgYjIgKj0gYjI7XG4gICAgaWYgKGEyID4gYjIpIHtcbiAgICAgIHggPSAoZDIgKyBiMiAtIGEyKSAvICgyICogZDIpO1xuICAgICAgeSA9IE1hdGguc3FydChNYXRoLm1heCgwLCBiMiAvIGQyIC0geCAqIHgpKTtcbiAgICAgIGMueCA9IGIueCAtIHggKiBkeCAtIHkgKiBkeTtcbiAgICAgIGMueSA9IGIueSAtIHggKiBkeSArIHkgKiBkeDtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IChkMiArIGEyIC0gYjIpIC8gKDIgKiBkMik7XG4gICAgICB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4KDAsIGEyIC8gZDIgLSB4ICogeCkpO1xuICAgICAgYy54ID0gYS54ICsgeCAqIGR4IC0geSAqIGR5O1xuICAgICAgYy55ID0gYS55ICsgeCAqIGR5ICsgeSAqIGR4O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjLnggPSBhLnggKyBjLnI7XG4gICAgYy55ID0gYS55O1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdHMoYSwgYikge1xuICB2YXIgZHIgPSBhLnIgKyBiLnIgLSAxZS02LCBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnk7XG4gIHJldHVybiBkciA+IDAgJiYgZHIgKiBkciA+IGR4ICogZHggKyBkeSAqIGR5O1xufVxuXG5mdW5jdGlvbiBzY29yZShub2RlKSB7XG4gIHZhciBhID0gbm9kZS5fLFxuICAgICAgYiA9IG5vZGUubmV4dC5fLFxuICAgICAgYWIgPSBhLnIgKyBiLnIsXG4gICAgICBkeCA9IChhLnggKiBiLnIgKyBiLnggKiBhLnIpIC8gYWIsXG4gICAgICBkeSA9IChhLnkgKiBiLnIgKyBiLnkgKiBhLnIpIC8gYWI7XG4gIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cblxuZnVuY3Rpb24gTm9kZShjaXJjbGUpIHtcbiAgdGhpcy5fID0gY2lyY2xlO1xuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLnByZXZpb3VzID0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2tFbmNsb3NlKGNpcmNsZXMpIHtcbiAgaWYgKCEobiA9IGNpcmNsZXMubGVuZ3RoKSkgcmV0dXJuIDA7XG5cbiAgdmFyIGEsIGIsIGMsIG4sIGFhLCBjYSwgaSwgaiwgaywgc2osIHNrO1xuXG4gIC8vIFBsYWNlIHRoZSBmaXJzdCBjaXJjbGUuXG4gIGEgPSBjaXJjbGVzWzBdLCBhLnggPSAwLCBhLnkgPSAwO1xuICBpZiAoIShuID4gMSkpIHJldHVybiBhLnI7XG5cbiAgLy8gUGxhY2UgdGhlIHNlY29uZCBjaXJjbGUuXG4gIGIgPSBjaXJjbGVzWzFdLCBhLnggPSAtYi5yLCBiLnggPSBhLnIsIGIueSA9IDA7XG4gIGlmICghKG4gPiAyKSkgcmV0dXJuIGEuciArIGIucjtcblxuICAvLyBQbGFjZSB0aGUgdGhpcmQgY2lyY2xlLlxuICBwbGFjZShiLCBhLCBjID0gY2lyY2xlc1syXSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgZnJvbnQtY2hhaW4gdXNpbmcgdGhlIGZpcnN0IHRocmVlIGNpcmNsZXMgYSwgYiBhbmQgYy5cbiAgYSA9IG5ldyBOb2RlKGEpLCBiID0gbmV3IE5vZGUoYiksIGMgPSBuZXcgTm9kZShjKTtcbiAgYS5uZXh0ID0gYy5wcmV2aW91cyA9IGI7XG4gIGIubmV4dCA9IGEucHJldmlvdXMgPSBjO1xuICBjLm5leHQgPSBiLnByZXZpb3VzID0gYTtcblxuICAvLyBBdHRlbXB0IHRvIHBsYWNlIGVhY2ggcmVtYWluaW5nIGNpcmNsZeKAplxuICBwYWNrOiBmb3IgKGkgPSAzOyBpIDwgbjsgKytpKSB7XG4gICAgcGxhY2UoYS5fLCBiLl8sIGMgPSBjaXJjbGVzW2ldKSwgYyA9IG5ldyBOb2RlKGMpO1xuXG4gICAgLy8gRmluZCB0aGUgY2xvc2VzdCBpbnRlcnNlY3RpbmcgY2lyY2xlIG9uIHRoZSBmcm9udC1jaGFpbiwgaWYgYW55LlxuICAgIC8vIOKAnENsb3NlbmVzc+KAnSBpcyBkZXRlcm1pbmVkIGJ5IGxpbmVhciBkaXN0YW5jZSBhbG9uZyB0aGUgZnJvbnQtY2hhaW4uXG4gICAgLy8g4oCcQWhlYWTigJ0gb3Ig4oCcYmVoaW5k4oCdIGlzIGxpa2V3aXNlIGRldGVybWluZWQgYnkgbGluZWFyIGRpc3RhbmNlLlxuICAgIGogPSBiLm5leHQsIGsgPSBhLnByZXZpb3VzLCBzaiA9IGIuXy5yLCBzayA9IGEuXy5yO1xuICAgIGRvIHtcbiAgICAgIGlmIChzaiA8PSBzaykge1xuICAgICAgICBpZiAoaW50ZXJzZWN0cyhqLl8sIGMuXykpIHtcbiAgICAgICAgICBiID0gaiwgYS5uZXh0ID0gYiwgYi5wcmV2aW91cyA9IGEsIC0taTtcbiAgICAgICAgICBjb250aW51ZSBwYWNrO1xuICAgICAgICB9XG4gICAgICAgIHNqICs9IGouXy5yLCBqID0gai5uZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGludGVyc2VjdHMoay5fLCBjLl8pKSB7XG4gICAgICAgICAgYSA9IGssIGEubmV4dCA9IGIsIGIucHJldmlvdXMgPSBhLCAtLWk7XG4gICAgICAgICAgY29udGludWUgcGFjaztcbiAgICAgICAgfVxuICAgICAgICBzayArPSBrLl8uciwgayA9IGsucHJldmlvdXM7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoaiAhPT0gay5uZXh0KTtcblxuICAgIC8vIFN1Y2Nlc3MhIEluc2VydCB0aGUgbmV3IGNpcmNsZSBjIGJldHdlZW4gYSBhbmQgYi5cbiAgICBjLnByZXZpb3VzID0gYSwgYy5uZXh0ID0gYiwgYS5uZXh0ID0gYi5wcmV2aW91cyA9IGIgPSBjO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGNsb3Nlc3QgY2lyY2xlIHBhaXIgdG8gdGhlIGNlbnRyb2lkLlxuICAgIGFhID0gc2NvcmUoYSk7XG4gICAgd2hpbGUgKChjID0gYy5uZXh0KSAhPT0gYikge1xuICAgICAgaWYgKChjYSA9IHNjb3JlKGMpKSA8IGFhKSB7XG4gICAgICAgIGEgPSBjLCBhYSA9IGNhO1xuICAgICAgfVxuICAgIH1cbiAgICBiID0gYS5uZXh0O1xuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUgZW5jbG9zaW5nIGNpcmNsZSBvZiB0aGUgZnJvbnQgY2hhaW4uXG4gIGEgPSBbYi5fXSwgYyA9IGI7IHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIGEucHVzaChjLl8pOyBjID0gZW5jbG9zZShhKTtcblxuICAvLyBUcmFuc2xhdGUgdGhlIGNpcmNsZXMgdG8gcHV0IHRoZSBlbmNsb3NpbmcgY2lyY2xlIGFyb3VuZCB0aGUgb3JpZ2luLlxuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBhID0gY2lyY2xlc1tpXSwgYS54IC09IGMueCwgYS55IC09IGMueTtcblxuICByZXR1cm4gYy5yO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjaXJjbGVzKSB7XG4gIHBhY2tFbmNsb3NlKGNpcmNsZXMpO1xuICByZXR1cm4gY2lyY2xlcztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbChmKSB7XG4gIHJldHVybiBmID09IG51bGwgPyBudWxsIDogcmVxdWlyZWQoZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChmKSB7XG4gIGlmICh0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNvbnN0YW50WmVybygpIHtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiaW1wb3J0IHtwYWNrRW5jbG9zZX0gZnJvbSBcIi4vc2libGluZ3MuanNcIjtcbmltcG9ydCB7b3B0aW9uYWx9IGZyb20gXCIuLi9hY2Nlc3NvcnMuanNcIjtcbmltcG9ydCBjb25zdGFudCwge2NvbnN0YW50WmVyb30gZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGRlZmF1bHRSYWRpdXMoZCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KGQudmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHJhZGl1cyA9IG51bGwsXG4gICAgICBkeCA9IDEsXG4gICAgICBkeSA9IDEsXG4gICAgICBwYWRkaW5nID0gY29uc3RhbnRaZXJvO1xuXG4gIGZ1bmN0aW9uIHBhY2socm9vdCkge1xuICAgIHJvb3QueCA9IGR4IC8gMiwgcm9vdC55ID0gZHkgLyAyO1xuICAgIGlmIChyYWRpdXMpIHtcbiAgICAgIHJvb3QuZWFjaEJlZm9yZShyYWRpdXNMZWFmKHJhZGl1cykpXG4gICAgICAgICAgLmVhY2hBZnRlcihwYWNrQ2hpbGRyZW4ocGFkZGluZywgMC41KSlcbiAgICAgICAgICAuZWFjaEJlZm9yZSh0cmFuc2xhdGVDaGlsZCgxKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3QuZWFjaEJlZm9yZShyYWRpdXNMZWFmKGRlZmF1bHRSYWRpdXMpKVxuICAgICAgICAgIC5lYWNoQWZ0ZXIocGFja0NoaWxkcmVuKGNvbnN0YW50WmVybywgMSkpXG4gICAgICAgICAgLmVhY2hBZnRlcihwYWNrQ2hpbGRyZW4ocGFkZGluZywgcm9vdC5yIC8gTWF0aC5taW4oZHgsIGR5KSkpXG4gICAgICAgICAgLmVhY2hCZWZvcmUodHJhbnNsYXRlQ2hpbGQoTWF0aC5taW4oZHgsIGR5KSAvICgyICogcm9vdC5yKSkpO1xuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIHBhY2sucmFkaXVzID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhZGl1cyA9IG9wdGlvbmFsKHgpLCBwYWNrKSA6IHJhZGl1cztcbiAgfTtcblxuICBwYWNrLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgcGFjaykgOiBbZHgsIGR5XTtcbiAgfTtcblxuICBwYWNrLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZyA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogY29uc3RhbnQoK3gpLCBwYWNrKSA6IHBhZGRpbmc7XG4gIH07XG5cbiAgcmV0dXJuIHBhY2s7XG59XG5cbmZ1bmN0aW9uIHJhZGl1c0xlYWYocmFkaXVzKSB7XG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKCFub2RlLmNoaWxkcmVuKSB7XG4gICAgICBub2RlLnIgPSBNYXRoLm1heCgwLCArcmFkaXVzKG5vZGUpIHx8IDApO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFja0NoaWxkcmVuKHBhZGRpbmcsIGspIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSB7XG4gICAgICB2YXIgY2hpbGRyZW4sXG4gICAgICAgICAgaSxcbiAgICAgICAgICBuID0gY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgICAgIHIgPSBwYWRkaW5nKG5vZGUpICogayB8fCAwLFxuICAgICAgICAgIGU7XG5cbiAgICAgIGlmIChyKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGlsZHJlbltpXS5yICs9IHI7XG4gICAgICBlID0gcGFja0VuY2xvc2UoY2hpbGRyZW4pO1xuICAgICAgaWYgKHIpIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGNoaWxkcmVuW2ldLnIgLT0gcjtcbiAgICAgIG5vZGUuciA9IGUgKyByO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlQ2hpbGQoaykge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudDtcbiAgICBub2RlLnIgKj0gaztcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBub2RlLnggPSBwYXJlbnQueCArIGsgKiBub2RlLng7XG4gICAgICBub2RlLnkgPSBwYXJlbnQueSArIGsgKiBub2RlLnk7XG4gICAgfVxuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICBub2RlLngwID0gTWF0aC5yb3VuZChub2RlLngwKTtcbiAgbm9kZS55MCA9IE1hdGgucm91bmQobm9kZS55MCk7XG4gIG5vZGUueDEgPSBNYXRoLnJvdW5kKG5vZGUueDEpO1xuICBub2RlLnkxID0gTWF0aC5yb3VuZChub2RlLnkxKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgbm9kZSxcbiAgICAgIGkgPSAtMSxcbiAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICBrID0gcGFyZW50LnZhbHVlICYmICh4MSAtIHgwKSAvIHBhcmVudC52YWx1ZTtcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS55MCA9IHkwLCBub2RlLnkxID0geTE7XG4gICAgbm9kZS54MCA9IHgwLCBub2RlLngxID0geDAgKz0gbm9kZS52YWx1ZSAqIGs7XG4gIH1cbn1cbiIsImltcG9ydCByb3VuZE5vZGUgZnJvbSBcIi4vdHJlZW1hcC9yb3VuZC5qc1wiO1xuaW1wb3J0IHRyZWVtYXBEaWNlIGZyb20gXCIuL3RyZWVtYXAvZGljZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIHBhZGRpbmcgPSAwLFxuICAgICAgcm91bmQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBwYXJ0aXRpb24ocm9vdCkge1xuICAgIHZhciBuID0gcm9vdC5oZWlnaHQgKyAxO1xuICAgIHJvb3QueDAgPVxuICAgIHJvb3QueTAgPSBwYWRkaW5nO1xuICAgIHJvb3QueDEgPSBkeDtcbiAgICByb290LnkxID0gZHkgLyBuO1xuICAgIHJvb3QuZWFjaEJlZm9yZShwb3NpdGlvbk5vZGUoZHksIG4pKTtcbiAgICBpZiAocm91bmQpIHJvb3QuZWFjaEJlZm9yZShyb3VuZE5vZGUpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgZnVuY3Rpb24gcG9zaXRpb25Ob2RlKGR5LCBuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIHRyZWVtYXBEaWNlKG5vZGUsIG5vZGUueDAsIGR5ICogKG5vZGUuZGVwdGggKyAxKSAvIG4sIG5vZGUueDEsIGR5ICogKG5vZGUuZGVwdGggKyAyKSAvIG4pO1xuICAgICAgfVxuICAgICAgdmFyIHgwID0gbm9kZS54MCxcbiAgICAgICAgICB5MCA9IG5vZGUueTAsXG4gICAgICAgICAgeDEgPSBub2RlLngxIC0gcGFkZGluZyxcbiAgICAgICAgICB5MSA9IG5vZGUueTEgLSBwYWRkaW5nO1xuICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyO1xuICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyO1xuICAgICAgbm9kZS54MCA9IHgwO1xuICAgICAgbm9kZS55MCA9IHkwO1xuICAgICAgbm9kZS54MSA9IHgxO1xuICAgICAgbm9kZS55MSA9IHkxO1xuICAgIH07XG4gIH1cblxuICBwYXJ0aXRpb24ucm91bmQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIXgsIHBhcnRpdGlvbikgOiByb3VuZDtcbiAgfTtcblxuICBwYXJ0aXRpb24uc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBwYXJ0aXRpb24pIDogW2R4LCBkeV07XG4gIH07XG5cbiAgcGFydGl0aW9uLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZyA9ICt4LCBwYXJ0aXRpb24pIDogcGFkZGluZztcbiAgfTtcblxuICByZXR1cm4gcGFydGl0aW9uO1xufVxuIiwiaW1wb3J0IHtyZXF1aXJlZH0gZnJvbSBcIi4vYWNjZXNzb3JzLmpzXCI7XG5pbXBvcnQge05vZGUsIGNvbXB1dGVIZWlnaHR9IGZyb20gXCIuL2hpZXJhcmNoeS9pbmRleC5qc1wiO1xuXG52YXIga2V5UHJlZml4ID0gXCIkXCIsIC8vIFByb3RlY3QgYWdhaW5zdCBrZXlzIGxpa2Ug4oCcX19wcm90b19f4oCdLlxuICAgIHByZXJvb3QgPSB7ZGVwdGg6IC0xfSxcbiAgICBhbWJpZ3VvdXMgPSB7fTtcblxuZnVuY3Rpb24gZGVmYXVsdElkKGQpIHtcbiAgcmV0dXJuIGQuaWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQYXJlbnRJZChkKSB7XG4gIHJldHVybiBkLnBhcmVudElkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGlkID0gZGVmYXVsdElkLFxuICAgICAgcGFyZW50SWQgPSBkZWZhdWx0UGFyZW50SWQ7XG5cbiAgZnVuY3Rpb24gc3RyYXRpZnkoZGF0YSkge1xuICAgIHZhciBkLFxuICAgICAgICBpLFxuICAgICAgICBuID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIHJvb3QsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbm9kZXMgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIG5vZGVJZCxcbiAgICAgICAgbm9kZUtleSxcbiAgICAgICAgbm9kZUJ5S2V5ID0ge307XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBkID0gZGF0YVtpXSwgbm9kZSA9IG5vZGVzW2ldID0gbmV3IE5vZGUoZCk7XG4gICAgICBpZiAoKG5vZGVJZCA9IGlkKGQsIGksIGRhdGEpKSAhPSBudWxsICYmIChub2RlSWQgKz0gXCJcIikpIHtcbiAgICAgICAgbm9kZUtleSA9IGtleVByZWZpeCArIChub2RlLmlkID0gbm9kZUlkKTtcbiAgICAgICAgbm9kZUJ5S2V5W25vZGVLZXldID0gbm9kZUtleSBpbiBub2RlQnlLZXkgPyBhbWJpZ3VvdXMgOiBub2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZUlkID0gcGFyZW50SWQoZGF0YVtpXSwgaSwgZGF0YSk7XG4gICAgICBpZiAobm9kZUlkID09IG51bGwgfHwgIShub2RlSWQgKz0gXCJcIikpIHtcbiAgICAgICAgaWYgKHJvb3QpIHRocm93IG5ldyBFcnJvcihcIm11bHRpcGxlIHJvb3RzXCIpO1xuICAgICAgICByb290ID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmVudCA9IG5vZGVCeUtleVtrZXlQcmVmaXggKyBub2RlSWRdO1xuICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKFwibWlzc2luZzogXCIgKyBub2RlSWQpO1xuICAgICAgICBpZiAocGFyZW50ID09PSBhbWJpZ3VvdXMpIHRocm93IG5ldyBFcnJvcihcImFtYmlndW91czogXCIgKyBub2RlSWQpO1xuICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuKSBwYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgZWxzZSBwYXJlbnQuY2hpbGRyZW4gPSBbbm9kZV07XG4gICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKFwibm8gcm9vdFwiKTtcbiAgICByb290LnBhcmVudCA9IHByZXJvb3Q7XG4gICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsgbm9kZS5kZXB0aCA9IG5vZGUucGFyZW50LmRlcHRoICsgMTsgLS1uOyB9KS5lYWNoQmVmb3JlKGNvbXB1dGVIZWlnaHQpO1xuICAgIHJvb3QucGFyZW50ID0gbnVsbDtcbiAgICBpZiAobiA+IDApIHRocm93IG5ldyBFcnJvcihcImN5Y2xlXCIpO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBzdHJhdGlmeS5pZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBpZDtcbiAgfTtcblxuICBzdHJhdGlmeS5wYXJlbnRJZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYXJlbnRJZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBwYXJlbnRJZDtcbiAgfTtcblxuICByZXR1cm4gc3RyYXRpZnk7XG59XG4iLCJpbXBvcnQge05vZGV9IGZyb20gXCIuL2hpZXJhcmNoeS9pbmRleC5qc1wiO1xuXG5mdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbihhLCBiKSB7XG4gIHJldHVybiBhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMjtcbn1cblxuLy8gZnVuY3Rpb24gcmFkaWFsU2VwYXJhdGlvbihhLCBiKSB7XG4vLyAgIHJldHVybiAoYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMSA6IDIpIC8gYS5kZXB0aDtcbi8vIH1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYXZlcnNlIHRoZSBsZWZ0IGNvbnRvdXIgb2YgYSBzdWJ0cmVlIChvclxuLy8gc3ViZm9yZXN0KS4gSXQgcmV0dXJucyB0aGUgc3VjY2Vzc29yIG9mIHYgb24gdGhpcyBjb250b3VyLiBUaGlzIHN1Y2Nlc3NvciBpc1xuLy8gZWl0aGVyIGdpdmVuIGJ5IHRoZSBsZWZ0bW9zdCBjaGlsZCBvZiB2IG9yIGJ5IHRoZSB0aHJlYWQgb2Ygdi4gVGhlIGZ1bmN0aW9uXG4vLyByZXR1cm5zIG51bGwgaWYgYW5kIG9ubHkgaWYgdiBpcyBvbiB0aGUgaGlnaGVzdCBsZXZlbCBvZiBpdHMgc3VidHJlZS5cbmZ1bmN0aW9uIG5leHRMZWZ0KHYpIHtcbiAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbjtcbiAgcmV0dXJuIGNoaWxkcmVuID8gY2hpbGRyZW5bMF0gOiB2LnQ7XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gd29ya3MgYW5hbG9nb3VzbHkgdG8gbmV4dExlZnQuXG5mdW5jdGlvbiBuZXh0UmlnaHQodikge1xuICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuO1xuICByZXR1cm4gY2hpbGRyZW4gPyBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSA6IHYudDtcbn1cblxuLy8gU2hpZnRzIHRoZSBjdXJyZW50IHN1YnRyZWUgcm9vdGVkIGF0IHcrLiBUaGlzIGlzIGRvbmUgYnkgaW5jcmVhc2luZ1xuLy8gcHJlbGltKHcrKSBhbmQgbW9kKHcrKSBieSBzaGlmdC5cbmZ1bmN0aW9uIG1vdmVTdWJ0cmVlKHdtLCB3cCwgc2hpZnQpIHtcbiAgdmFyIGNoYW5nZSA9IHNoaWZ0IC8gKHdwLmkgLSB3bS5pKTtcbiAgd3AuYyAtPSBjaGFuZ2U7XG4gIHdwLnMgKz0gc2hpZnQ7XG4gIHdtLmMgKz0gY2hhbmdlO1xuICB3cC56ICs9IHNoaWZ0O1xuICB3cC5tICs9IHNoaWZ0O1xufVxuXG4vLyBBbGwgb3RoZXIgc2hpZnRzLCBhcHBsaWVkIHRvIHRoZSBzbWFsbGVyIHN1YnRyZWVzIGJldHdlZW4gdy0gYW5kIHcrLCBhcmVcbi8vIHBlcmZvcm1lZCBieSB0aGlzIGZ1bmN0aW9uLiBUbyBwcmVwYXJlIHRoZSBzaGlmdHMsIHdlIGhhdmUgdG8gYWRqdXN0XG4vLyBjaGFuZ2UodyspLCBzaGlmdCh3KyksIGFuZCBjaGFuZ2Uody0pLlxuZnVuY3Rpb24gZXhlY3V0ZVNoaWZ0cyh2KSB7XG4gIHZhciBzaGlmdCA9IDAsXG4gICAgICBjaGFuZ2UgPSAwLFxuICAgICAgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLFxuICAgICAgaSA9IGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgIHc7XG4gIHdoaWxlICgtLWkgPj0gMCkge1xuICAgIHcgPSBjaGlsZHJlbltpXTtcbiAgICB3LnogKz0gc2hpZnQ7XG4gICAgdy5tICs9IHNoaWZ0O1xuICAgIHNoaWZ0ICs9IHcucyArIChjaGFuZ2UgKz0gdy5jKTtcbiAgfVxufVxuXG4vLyBJZiB2aS3igJlzIGFuY2VzdG9yIGlzIGEgc2libGluZyBvZiB2LCByZXR1cm5zIHZpLeKAmXMgYW5jZXN0b3IuIE90aGVyd2lzZSxcbi8vIHJldHVybnMgdGhlIHNwZWNpZmllZCAoZGVmYXVsdCkgYW5jZXN0b3IuXG5mdW5jdGlvbiBuZXh0QW5jZXN0b3IodmltLCB2LCBhbmNlc3Rvcikge1xuICByZXR1cm4gdmltLmEucGFyZW50ID09PSB2LnBhcmVudCA/IHZpbS5hIDogYW5jZXN0b3I7XG59XG5cbmZ1bmN0aW9uIFRyZWVOb2RlKG5vZGUsIGkpIHtcbiAgdGhpcy5fID0gbm9kZTtcbiAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICB0aGlzLmNoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5BID0gbnVsbDsgLy8gZGVmYXVsdCBhbmNlc3RvclxuICB0aGlzLmEgPSB0aGlzOyAvLyBhbmNlc3RvclxuICB0aGlzLnogPSAwOyAvLyBwcmVsaW1cbiAgdGhpcy5tID0gMDsgLy8gbW9kXG4gIHRoaXMuYyA9IDA7IC8vIGNoYW5nZVxuICB0aGlzLnMgPSAwOyAvLyBzaGlmdFxuICB0aGlzLnQgPSBudWxsOyAvLyB0aHJlYWRcbiAgdGhpcy5pID0gaTsgLy8gbnVtYmVyXG59XG5cblRyZWVOb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTm9kZS5wcm90b3R5cGUpO1xuXG5mdW5jdGlvbiB0cmVlUm9vdChyb290KSB7XG4gIHZhciB0cmVlID0gbmV3IFRyZWVOb2RlKHJvb3QsIDApLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVzID0gW3RyZWVdLFxuICAgICAgY2hpbGQsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGksXG4gICAgICBuO1xuXG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBpZiAoY2hpbGRyZW4gPSBub2RlLl8uY2hpbGRyZW4pIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4gPSBuZXcgQXJyYXkobiA9IGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgbm9kZXMucHVzaChjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV0gPSBuZXcgVHJlZU5vZGUoY2hpbGRyZW5baV0sIGkpKTtcbiAgICAgICAgY2hpbGQucGFyZW50ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAodHJlZS5wYXJlbnQgPSBuZXcgVHJlZU5vZGUobnVsbCwgMCkpLmNoaWxkcmVuID0gW3RyZWVdO1xuICByZXR1cm4gdHJlZTtcbn1cblxuLy8gTm9kZS1saW5rIHRyZWUgZGlhZ3JhbSB1c2luZyB0aGUgUmVpbmdvbGQtVGlsZm9yZCBcInRpZHlcIiBhbGdvcml0aG1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VwYXJhdGlvbiA9IGRlZmF1bHRTZXBhcmF0aW9uLFxuICAgICAgZHggPSAxLFxuICAgICAgZHkgPSAxLFxuICAgICAgbm9kZVNpemUgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHRyZWUocm9vdCkge1xuICAgIHZhciB0ID0gdHJlZVJvb3Qocm9vdCk7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBsYXlvdXQgdXNpbmcgQnVjaGhlaW0gZXQgYWwu4oCZcyBhbGdvcml0aG0uXG4gICAgdC5lYWNoQWZ0ZXIoZmlyc3RXYWxrKSwgdC5wYXJlbnQubSA9IC10Lno7XG4gICAgdC5lYWNoQmVmb3JlKHNlY29uZFdhbGspO1xuXG4gICAgLy8gSWYgYSBmaXhlZCBub2RlIHNpemUgaXMgc3BlY2lmaWVkLCBzY2FsZSB4IGFuZCB5LlxuICAgIGlmIChub2RlU2l6ZSkgcm9vdC5lYWNoQmVmb3JlKHNpemVOb2RlKTtcblxuICAgIC8vIElmIGEgZml4ZWQgdHJlZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUgeCBhbmQgeSBiYXNlZCBvbiB0aGUgZXh0ZW50LlxuICAgIC8vIENvbXB1dGUgdGhlIGxlZnQtbW9zdCwgcmlnaHQtbW9zdCwgYW5kIGRlcHRoLW1vc3Qgbm9kZXMgZm9yIGV4dGVudHMuXG4gICAgZWxzZSB7XG4gICAgICB2YXIgbGVmdCA9IHJvb3QsXG4gICAgICAgICAgcmlnaHQgPSByb290LFxuICAgICAgICAgIGJvdHRvbSA9IHJvb3Q7XG4gICAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS54IDwgbGVmdC54KSBsZWZ0ID0gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUueCA+IHJpZ2h0LngpIHJpZ2h0ID0gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUuZGVwdGggPiBib3R0b20uZGVwdGgpIGJvdHRvbSA9IG5vZGU7XG4gICAgICB9KTtcbiAgICAgIHZhciBzID0gbGVmdCA9PT0gcmlnaHQgPyAxIDogc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLFxuICAgICAgICAgIHR4ID0gcyAtIGxlZnQueCxcbiAgICAgICAgICBreCA9IGR4IC8gKHJpZ2h0LnggKyBzICsgdHgpLFxuICAgICAgICAgIGt5ID0gZHkgLyAoYm90dG9tLmRlcHRoIHx8IDEpO1xuICAgICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS54ID0gKG5vZGUueCArIHR4KSAqIGt4O1xuICAgICAgICBub2RlLnkgPSBub2RlLmRlcHRoICoga3k7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8vIENvbXB1dGVzIGEgcHJlbGltaW5hcnkgeC1jb29yZGluYXRlIGZvciB2LiBCZWZvcmUgdGhhdCwgRklSU1QgV0FMSyBpc1xuICAvLyBhcHBsaWVkIHJlY3Vyc2l2ZWx5IHRvIHRoZSBjaGlsZHJlbiBvZiB2LCBhcyB3ZWxsIGFzIHRoZSBmdW5jdGlvblxuICAvLyBBUFBPUlRJT04uIEFmdGVyIHNwYWNpbmcgb3V0IHRoZSBjaGlsZHJlbiBieSBjYWxsaW5nIEVYRUNVVEUgU0hJRlRTLCB0aGVcbiAgLy8gbm9kZSB2IGlzIHBsYWNlZCB0byB0aGUgbWlkcG9pbnQgb2YgaXRzIG91dGVybW9zdCBjaGlsZHJlbi5cbiAgZnVuY3Rpb24gZmlyc3RXYWxrKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLFxuICAgICAgICBzaWJsaW5ncyA9IHYucGFyZW50LmNoaWxkcmVuLFxuICAgICAgICB3ID0gdi5pID8gc2libGluZ3Nbdi5pIC0gMV0gOiBudWxsO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgZXhlY3V0ZVNoaWZ0cyh2KTtcbiAgICAgIHZhciBtaWRwb2ludCA9IChjaGlsZHJlblswXS56ICsgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0ueikgLyAyO1xuICAgICAgaWYgKHcpIHtcbiAgICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7XG4gICAgICAgIHYubSA9IHYueiAtIG1pZHBvaW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdi56ID0gbWlkcG9pbnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh3KSB7XG4gICAgICB2LnogPSB3LnogKyBzZXBhcmF0aW9uKHYuXywgdy5fKTtcbiAgICB9XG4gICAgdi5wYXJlbnQuQSA9IGFwcG9ydGlvbih2LCB3LCB2LnBhcmVudC5BIHx8IHNpYmxpbmdzWzBdKTtcbiAgfVxuXG4gIC8vIENvbXB1dGVzIGFsbCByZWFsIHgtY29vcmRpbmF0ZXMgYnkgc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIHJlY3Vyc2l2ZWx5LlxuICBmdW5jdGlvbiBzZWNvbmRXYWxrKHYpIHtcbiAgICB2Ll8ueCA9IHYueiArIHYucGFyZW50Lm07XG4gICAgdi5tICs9IHYucGFyZW50Lm07XG4gIH1cblxuICAvLyBUaGUgY29yZSBvZiB0aGUgYWxnb3JpdGhtLiBIZXJlLCBhIG5ldyBzdWJ0cmVlIGlzIGNvbWJpbmVkIHdpdGggdGhlXG4gIC8vIHByZXZpb3VzIHN1YnRyZWVzLiBUaHJlYWRzIGFyZSB1c2VkIHRvIHRyYXZlcnNlIHRoZSBpbnNpZGUgYW5kIG91dHNpZGVcbiAgLy8gY29udG91cnMgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IHN1YnRyZWUgdXAgdG8gdGhlIGhpZ2hlc3QgY29tbW9uIGxldmVsLiBUaGVcbiAgLy8gdmVydGljZXMgdXNlZCBmb3IgdGhlIHRyYXZlcnNhbHMgYXJlIHZpKywgdmktLCB2by0sIGFuZCB2byssIHdoZXJlIHRoZVxuICAvLyBzdXBlcnNjcmlwdCBvIG1lYW5zIG91dHNpZGUgYW5kIGkgbWVhbnMgaW5zaWRlLCB0aGUgc3Vic2NyaXB0IC0gbWVhbnMgbGVmdFxuICAvLyBzdWJ0cmVlIGFuZCArIG1lYW5zIHJpZ2h0IHN1YnRyZWUuIEZvciBzdW1taW5nIHVwIHRoZSBtb2RpZmllcnMgYWxvbmcgdGhlXG4gIC8vIGNvbnRvdXIsIHdlIHVzZSByZXNwZWN0aXZlIHZhcmlhYmxlcyBzaSssIHNpLSwgc28tLCBhbmQgc28rLiBXaGVuZXZlciB0d29cbiAgLy8gbm9kZXMgb2YgdGhlIGluc2lkZSBjb250b3VycyBjb25mbGljdCwgd2UgY29tcHV0ZSB0aGUgbGVmdCBvbmUgb2YgdGhlXG4gIC8vIGdyZWF0ZXN0IHVuY29tbW9uIGFuY2VzdG9ycyB1c2luZyB0aGUgZnVuY3Rpb24gQU5DRVNUT1IgYW5kIGNhbGwgTU9WRVxuICAvLyBTVUJUUkVFIHRvIHNoaWZ0IHRoZSBzdWJ0cmVlIGFuZCBwcmVwYXJlIHRoZSBzaGlmdHMgb2Ygc21hbGxlciBzdWJ0cmVlcy5cbiAgLy8gRmluYWxseSwgd2UgYWRkIGEgbmV3IHRocmVhZCAoaWYgbmVjZXNzYXJ5KS5cbiAgZnVuY3Rpb24gYXBwb3J0aW9uKHYsIHcsIGFuY2VzdG9yKSB7XG4gICAgaWYgKHcpIHtcbiAgICAgIHZhciB2aXAgPSB2LFxuICAgICAgICAgIHZvcCA9IHYsXG4gICAgICAgICAgdmltID0gdyxcbiAgICAgICAgICB2b20gPSB2aXAucGFyZW50LmNoaWxkcmVuWzBdLFxuICAgICAgICAgIHNpcCA9IHZpcC5tLFxuICAgICAgICAgIHNvcCA9IHZvcC5tLFxuICAgICAgICAgIHNpbSA9IHZpbS5tLFxuICAgICAgICAgIHNvbSA9IHZvbS5tLFxuICAgICAgICAgIHNoaWZ0O1xuICAgICAgd2hpbGUgKHZpbSA9IG5leHRSaWdodCh2aW0pLCB2aXAgPSBuZXh0TGVmdCh2aXApLCB2aW0gJiYgdmlwKSB7XG4gICAgICAgIHZvbSA9IG5leHRMZWZ0KHZvbSk7XG4gICAgICAgIHZvcCA9IG5leHRSaWdodCh2b3ApO1xuICAgICAgICB2b3AuYSA9IHY7XG4gICAgICAgIHNoaWZ0ID0gdmltLnogKyBzaW0gLSB2aXAueiAtIHNpcCArIHNlcGFyYXRpb24odmltLl8sIHZpcC5fKTtcbiAgICAgICAgaWYgKHNoaWZ0ID4gMCkge1xuICAgICAgICAgIG1vdmVTdWJ0cmVlKG5leHRBbmNlc3Rvcih2aW0sIHYsIGFuY2VzdG9yKSwgdiwgc2hpZnQpO1xuICAgICAgICAgIHNpcCArPSBzaGlmdDtcbiAgICAgICAgICBzb3AgKz0gc2hpZnQ7XG4gICAgICAgIH1cbiAgICAgICAgc2ltICs9IHZpbS5tO1xuICAgICAgICBzaXAgKz0gdmlwLm07XG4gICAgICAgIHNvbSArPSB2b20ubTtcbiAgICAgICAgc29wICs9IHZvcC5tO1xuICAgICAgfVxuICAgICAgaWYgKHZpbSAmJiAhbmV4dFJpZ2h0KHZvcCkpIHtcbiAgICAgICAgdm9wLnQgPSB2aW07XG4gICAgICAgIHZvcC5tICs9IHNpbSAtIHNvcDtcbiAgICAgIH1cbiAgICAgIGlmICh2aXAgJiYgIW5leHRMZWZ0KHZvbSkpIHtcbiAgICAgICAgdm9tLnQgPSB2aXA7XG4gICAgICAgIHZvbS5tICs9IHNpcCAtIHNvbTtcbiAgICAgICAgYW5jZXN0b3IgPSB2O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYW5jZXN0b3I7XG4gIH1cblxuICBmdW5jdGlvbiBzaXplTm9kZShub2RlKSB7XG4gICAgbm9kZS54ICo9IGR4O1xuICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBkeTtcbiAgfVxuXG4gIHRyZWUuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZXBhcmF0aW9uID0geCwgdHJlZSkgOiBzZXBhcmF0aW9uO1xuICB9O1xuXG4gIHRyZWUuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IGZhbHNlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlKSA6IChub2RlU2l6ZSA/IG51bGwgOiBbZHgsIGR5XSk7XG4gIH07XG5cbiAgdHJlZS5ub2RlU2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IHRydWUsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIHRyZWUpIDogKG5vZGVTaXplID8gW2R4LCBkeV0gOiBudWxsKTtcbiAgfTtcblxuICByZXR1cm4gdHJlZTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgbm9kZSxcbiAgICAgIGkgPSAtMSxcbiAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICBrID0gcGFyZW50LnZhbHVlICYmICh5MSAtIHkwKSAvIHBhcmVudC52YWx1ZTtcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS54MCA9IHgwLCBub2RlLngxID0geDE7XG4gICAgbm9kZS55MCA9IHkwLCBub2RlLnkxID0geTAgKz0gbm9kZS52YWx1ZSAqIGs7XG4gIH1cbn1cbiIsImltcG9ydCB0cmVlbWFwRGljZSBmcm9tIFwiLi9kaWNlLmpzXCI7XG5pbXBvcnQgdHJlZW1hcFNsaWNlIGZyb20gXCIuL3NsaWNlLmpzXCI7XG5cbmV4cG9ydCB2YXIgcGhpID0gKDEgKyBNYXRoLnNxcnQoNSkpIC8gMjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIHJvd3MgPSBbXSxcbiAgICAgIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgcm93LFxuICAgICAgbm9kZVZhbHVlLFxuICAgICAgaTAgPSAwLFxuICAgICAgaTEgPSAwLFxuICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIGR4LCBkeSxcbiAgICAgIHZhbHVlID0gcGFyZW50LnZhbHVlLFxuICAgICAgc3VtVmFsdWUsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlLFxuICAgICAgbmV3UmF0aW8sXG4gICAgICBtaW5SYXRpbyxcbiAgICAgIGFscGhhLFxuICAgICAgYmV0YTtcblxuICB3aGlsZSAoaTAgPCBuKSB7XG4gICAgZHggPSB4MSAtIHgwLCBkeSA9IHkxIC0geTA7XG5cbiAgICAvLyBGaW5kIHRoZSBuZXh0IG5vbi1lbXB0eSBub2RlLlxuICAgIGRvIHN1bVZhbHVlID0gbm9kZXNbaTErK10udmFsdWU7IHdoaWxlICghc3VtVmFsdWUgJiYgaTEgPCBuKTtcbiAgICBtaW5WYWx1ZSA9IG1heFZhbHVlID0gc3VtVmFsdWU7XG4gICAgYWxwaGEgPSBNYXRoLm1heChkeSAvIGR4LCBkeCAvIGR5KSAvICh2YWx1ZSAqIHJhdGlvKTtcbiAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhO1xuICAgIG1pblJhdGlvID0gTWF0aC5tYXgobWF4VmFsdWUgLyBiZXRhLCBiZXRhIC8gbWluVmFsdWUpO1xuXG4gICAgLy8gS2VlcCBhZGRpbmcgbm9kZXMgd2hpbGUgdGhlIGFzcGVjdCByYXRpbyBtYWludGFpbnMgb3IgaW1wcm92ZXMuXG4gICAgZm9yICg7IGkxIDwgbjsgKytpMSkge1xuICAgICAgc3VtVmFsdWUgKz0gbm9kZVZhbHVlID0gbm9kZXNbaTFdLnZhbHVlO1xuICAgICAgaWYgKG5vZGVWYWx1ZSA8IG1pblZhbHVlKSBtaW5WYWx1ZSA9IG5vZGVWYWx1ZTtcbiAgICAgIGlmIChub2RlVmFsdWUgPiBtYXhWYWx1ZSkgbWF4VmFsdWUgPSBub2RlVmFsdWU7XG4gICAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhO1xuICAgICAgbmV3UmF0aW8gPSBNYXRoLm1heChtYXhWYWx1ZSAvIGJldGEsIGJldGEgLyBtaW5WYWx1ZSk7XG4gICAgICBpZiAobmV3UmF0aW8gPiBtaW5SYXRpbykgeyBzdW1WYWx1ZSAtPSBub2RlVmFsdWU7IGJyZWFrOyB9XG4gICAgICBtaW5SYXRpbyA9IG5ld1JhdGlvO1xuICAgIH1cblxuICAgIC8vIFBvc2l0aW9uIGFuZCByZWNvcmQgdGhlIHJvdyBvcmllbnRhdGlvbi5cbiAgICByb3dzLnB1c2gocm93ID0ge3ZhbHVlOiBzdW1WYWx1ZSwgZGljZTogZHggPCBkeSwgY2hpbGRyZW46IG5vZGVzLnNsaWNlKGkwLCBpMSl9KTtcbiAgICBpZiAocm93LmRpY2UpIHRyZWVtYXBEaWNlKHJvdywgeDAsIHkwLCB4MSwgdmFsdWUgPyB5MCArPSBkeSAqIHN1bVZhbHVlIC8gdmFsdWUgOiB5MSk7XG4gICAgZWxzZSB0cmVlbWFwU2xpY2Uocm93LCB4MCwgeTAsIHZhbHVlID8geDAgKz0gZHggKiBzdW1WYWx1ZSAvIHZhbHVlIDogeDEsIHkxKTtcbiAgICB2YWx1ZSAtPSBzdW1WYWx1ZSwgaTAgPSBpMTtcbiAgfVxuXG4gIHJldHVybiByb3dzO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKHJhdGlvKSB7XG5cbiAgZnVuY3Rpb24gc3F1YXJpZnkocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICAgIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpO1xuICB9XG5cbiAgc3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGN1c3RvbSgoeCA9ICt4KSA+IDEgPyB4IDogMSk7XG4gIH07XG5cbiAgcmV0dXJuIHNxdWFyaWZ5O1xufSkocGhpKTtcbiIsImltcG9ydCByb3VuZE5vZGUgZnJvbSBcIi4vcm91bmQuanNcIjtcbmltcG9ydCBzcXVhcmlmeSBmcm9tIFwiLi9zcXVhcmlmeS5qc1wiO1xuaW1wb3J0IHtyZXF1aXJlZH0gZnJvbSBcIi4uL2FjY2Vzc29ycy5qc1wiO1xuaW1wb3J0IGNvbnN0YW50LCB7Y29uc3RhbnRaZXJvfSBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciB0aWxlID0gc3F1YXJpZnksXG4gICAgICByb3VuZCA9IGZhbHNlLFxuICAgICAgZHggPSAxLFxuICAgICAgZHkgPSAxLFxuICAgICAgcGFkZGluZ1N0YWNrID0gWzBdLFxuICAgICAgcGFkZGluZ0lubmVyID0gY29uc3RhbnRaZXJvLFxuICAgICAgcGFkZGluZ1RvcCA9IGNvbnN0YW50WmVybyxcbiAgICAgIHBhZGRpbmdSaWdodCA9IGNvbnN0YW50WmVybyxcbiAgICAgIHBhZGRpbmdCb3R0b20gPSBjb25zdGFudFplcm8sXG4gICAgICBwYWRkaW5nTGVmdCA9IGNvbnN0YW50WmVybztcblxuICBmdW5jdGlvbiB0cmVlbWFwKHJvb3QpIHtcbiAgICByb290LngwID1cbiAgICByb290LnkwID0gMDtcbiAgICByb290LngxID0gZHg7XG4gICAgcm9vdC55MSA9IGR5O1xuICAgIHJvb3QuZWFjaEJlZm9yZShwb3NpdGlvbk5vZGUpO1xuICAgIHBhZGRpbmdTdGFjayA9IFswXTtcbiAgICBpZiAocm91bmQpIHJvb3QuZWFjaEJlZm9yZShyb3VuZE5vZGUpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgZnVuY3Rpb24gcG9zaXRpb25Ob2RlKG5vZGUpIHtcbiAgICB2YXIgcCA9IHBhZGRpbmdTdGFja1tub2RlLmRlcHRoXSxcbiAgICAgICAgeDAgPSBub2RlLngwICsgcCxcbiAgICAgICAgeTAgPSBub2RlLnkwICsgcCxcbiAgICAgICAgeDEgPSBub2RlLngxIC0gcCxcbiAgICAgICAgeTEgPSBub2RlLnkxIC0gcDtcbiAgICBpZiAoeDEgPCB4MCkgeDAgPSB4MSA9ICh4MCArIHgxKSAvIDI7XG4gICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyO1xuICAgIG5vZGUueDAgPSB4MDtcbiAgICBub2RlLnkwID0geTA7XG4gICAgbm9kZS54MSA9IHgxO1xuICAgIG5vZGUueTEgPSB5MTtcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgcCA9IHBhZGRpbmdTdGFja1tub2RlLmRlcHRoICsgMV0gPSBwYWRkaW5nSW5uZXIobm9kZSkgLyAyO1xuICAgICAgeDAgKz0gcGFkZGluZ0xlZnQobm9kZSkgLSBwO1xuICAgICAgeTAgKz0gcGFkZGluZ1RvcChub2RlKSAtIHA7XG4gICAgICB4MSAtPSBwYWRkaW5nUmlnaHQobm9kZSkgLSBwO1xuICAgICAgeTEgLT0gcGFkZGluZ0JvdHRvbShub2RlKSAtIHA7XG4gICAgICBpZiAoeDEgPCB4MCkgeDAgPSB4MSA9ICh4MCArIHgxKSAvIDI7XG4gICAgICBpZiAoeTEgPCB5MCkgeTAgPSB5MSA9ICh5MCArIHkxKSAvIDI7XG4gICAgICB0aWxlKG5vZGUsIHgwLCB5MCwgeDEsIHkxKTtcbiAgICB9XG4gIH1cblxuICB0cmVlbWFwLnJvdW5kID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISF4LCB0cmVlbWFwKSA6IHJvdW5kO1xuICB9O1xuXG4gIHRyZWVtYXAuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlbWFwKSA6IFtkeCwgZHldO1xuICB9O1xuXG4gIHRyZWVtYXAudGlsZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWxlID0gcmVxdWlyZWQoeCksIHRyZWVtYXApIDogdGlsZTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdJbm5lcih4KS5wYWRkaW5nT3V0ZXIoeCkgOiB0cmVlbWFwLnBhZGRpbmdJbm5lcigpO1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogY29uc3RhbnQoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdJbm5lcjtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdPdXRlciA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRyZWVtYXAucGFkZGluZ1RvcCh4KS5wYWRkaW5nUmlnaHQoeCkucGFkZGluZ0JvdHRvbSh4KS5wYWRkaW5nTGVmdCh4KSA6IHRyZWVtYXAucGFkZGluZ1RvcCgpO1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ1RvcCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nVG9wID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ1RvcDtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdSaWdodCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nUmlnaHQgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nUmlnaHQ7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nQm90dG9tID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdCb3R0b20gPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nQm90dG9tO1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ0xlZnQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0xlZnQgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nTGVmdDtcbiAgfTtcblxuICByZXR1cm4gdHJlZW1hcDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgaSwgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIHN1bSwgc3VtcyA9IG5ldyBBcnJheShuICsgMSk7XG5cbiAgZm9yIChzdW1zWzBdID0gc3VtID0gaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBzdW1zW2kgKyAxXSA9IHN1bSArPSBub2Rlc1tpXS52YWx1ZTtcbiAgfVxuXG4gIHBhcnRpdGlvbigwLCBuLCBwYXJlbnQudmFsdWUsIHgwLCB5MCwgeDEsIHkxKTtcblxuICBmdW5jdGlvbiBwYXJ0aXRpb24oaSwgaiwgdmFsdWUsIHgwLCB5MCwgeDEsIHkxKSB7XG4gICAgaWYgKGkgPj0gaiAtIDEpIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICBub2RlLngwID0geDAsIG5vZGUueTAgPSB5MDtcbiAgICAgIG5vZGUueDEgPSB4MSwgbm9kZS55MSA9IHkxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZU9mZnNldCA9IHN1bXNbaV0sXG4gICAgICAgIHZhbHVlVGFyZ2V0ID0gKHZhbHVlIC8gMikgKyB2YWx1ZU9mZnNldCxcbiAgICAgICAgayA9IGkgKyAxLFxuICAgICAgICBoaSA9IGogLSAxO1xuXG4gICAgd2hpbGUgKGsgPCBoaSkge1xuICAgICAgdmFyIG1pZCA9IGsgKyBoaSA+Pj4gMTtcbiAgICAgIGlmIChzdW1zW21pZF0gPCB2YWx1ZVRhcmdldCkgayA9IG1pZCArIDE7XG4gICAgICBlbHNlIGhpID0gbWlkO1xuICAgIH1cblxuICAgIGlmICgodmFsdWVUYXJnZXQgLSBzdW1zW2sgLSAxXSkgPCAoc3Vtc1trXSAtIHZhbHVlVGFyZ2V0KSAmJiBpICsgMSA8IGspIC0taztcblxuICAgIHZhciB2YWx1ZUxlZnQgPSBzdW1zW2tdIC0gdmFsdWVPZmZzZXQsXG4gICAgICAgIHZhbHVlUmlnaHQgPSB2YWx1ZSAtIHZhbHVlTGVmdDtcblxuICAgIGlmICgoeDEgLSB4MCkgPiAoeTEgLSB5MCkpIHtcbiAgICAgIHZhciB4ayA9ICh4MCAqIHZhbHVlUmlnaHQgKyB4MSAqIHZhbHVlTGVmdCkgLyB2YWx1ZTtcbiAgICAgIHBhcnRpdGlvbihpLCBrLCB2YWx1ZUxlZnQsIHgwLCB5MCwgeGssIHkxKTtcbiAgICAgIHBhcnRpdGlvbihrLCBqLCB2YWx1ZVJpZ2h0LCB4aywgeTAsIHgxLCB5MSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB5ayA9ICh5MCAqIHZhbHVlUmlnaHQgKyB5MSAqIHZhbHVlTGVmdCkgLyB2YWx1ZTtcbiAgICAgIHBhcnRpdGlvbihpLCBrLCB2YWx1ZUxlZnQsIHgwLCB5MCwgeDEsIHlrKTtcbiAgICAgIHBhcnRpdGlvbihrLCBqLCB2YWx1ZVJpZ2h0LCB4MCwgeWssIHgxLCB5MSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZGljZSBmcm9tIFwiLi9kaWNlLmpzXCI7XG5pbXBvcnQgc2xpY2UgZnJvbSBcIi4vc2xpY2UuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICAocGFyZW50LmRlcHRoICYgMSA/IHNsaWNlIDogZGljZSkocGFyZW50LCB4MCwgeTAsIHgxLCB5MSk7XG59XG4iLCJpbXBvcnQgdHJlZW1hcERpY2UgZnJvbSBcIi4vZGljZS5qc1wiO1xuaW1wb3J0IHRyZWVtYXBTbGljZSBmcm9tIFwiLi9zbGljZS5qc1wiO1xuaW1wb3J0IHtwaGksIHNxdWFyaWZ5UmF0aW99IGZyb20gXCIuL3NxdWFyaWZ5LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20ocmF0aW8pIHtcblxuICBmdW5jdGlvbiByZXNxdWFyaWZ5KHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICBpZiAoKHJvd3MgPSBwYXJlbnQuX3NxdWFyaWZ5KSAmJiAocm93cy5yYXRpbyA9PT0gcmF0aW8pKSB7XG4gICAgICB2YXIgcm93cyxcbiAgICAgICAgICByb3csXG4gICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgaSxcbiAgICAgICAgICBqID0gLTEsXG4gICAgICAgICAgbixcbiAgICAgICAgICBtID0gcm93cy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWUgPSBwYXJlbnQudmFsdWU7XG5cbiAgICAgIHdoaWxlICgrK2ogPCBtKSB7XG4gICAgICAgIHJvdyA9IHJvd3Nbal0sIG5vZGVzID0gcm93LmNoaWxkcmVuO1xuICAgICAgICBmb3IgKGkgPSByb3cudmFsdWUgPSAwLCBuID0gbm9kZXMubGVuZ3RoOyBpIDwgbjsgKytpKSByb3cudmFsdWUgKz0gbm9kZXNbaV0udmFsdWU7XG4gICAgICAgIGlmIChyb3cuZGljZSkgdHJlZW1hcERpY2Uocm93LCB4MCwgeTAsIHgxLCB5MCArPSAoeTEgLSB5MCkgKiByb3cudmFsdWUgLyB2YWx1ZSk7XG4gICAgICAgIGVsc2UgdHJlZW1hcFNsaWNlKHJvdywgeDAsIHkwLCB4MCArPSAoeDEgLSB4MCkgKiByb3cudmFsdWUgLyB2YWx1ZSwgeTEpO1xuICAgICAgICB2YWx1ZSAtPSByb3cudmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudC5fc3F1YXJpZnkgPSByb3dzID0gc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5MSk7XG4gICAgICByb3dzLnJhdGlvID0gcmF0aW87XG4gICAgfVxuICB9XG5cbiAgcmVzcXVhcmlmeS5yYXRpbyA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gY3VzdG9tKCh4ID0gK3gpID4gMSA/IHggOiAxKTtcbiAgfTtcblxuICByZXR1cm4gcmVzcXVhcmlmeTtcbn0pKHBoaSk7XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgY2x1c3Rlcn0gZnJvbSBcIi4vY2x1c3Rlci5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGhpZXJhcmNoeX0gZnJvbSBcIi4vaGllcmFyY2h5L2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcGFja30gZnJvbSBcIi4vcGFjay9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHBhY2tTaWJsaW5nc30gZnJvbSBcIi4vcGFjay9zaWJsaW5ncy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHBhY2tFbmNsb3NlfSBmcm9tIFwiLi9wYWNrL2VuY2xvc2UuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwYXJ0aXRpb259IGZyb20gXCIuL3BhcnRpdGlvbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0cmF0aWZ5fSBmcm9tIFwiLi9zdHJhdGlmeS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRyZWV9IGZyb20gXCIuL3RyZWUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmVlbWFwfSBmcm9tIFwiLi90cmVlbWFwL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJlZW1hcEJpbmFyeX0gZnJvbSBcIi4vdHJlZW1hcC9iaW5hcnkuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmVlbWFwRGljZX0gZnJvbSBcIi4vdHJlZW1hcC9kaWNlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJlZW1hcFNsaWNlfSBmcm9tIFwiLi90cmVlbWFwL3NsaWNlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJlZW1hcFNsaWNlRGljZX0gZnJvbSBcIi4vdHJlZW1hcC9zbGljZURpY2UuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmVlbWFwU3F1YXJpZnl9IGZyb20gXCIuL3RyZWVtYXAvc3F1YXJpZnkuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmVlbWFwUmVzcXVhcmlmeX0gZnJvbSBcIi4vdHJlZW1hcC9yZXNxdWFyaWZ5LmpzXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyYW5nZSkge1xuICB2YXIgbiA9IHJhbmdlLmxlbmd0aDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gcmFuZ2VbTWF0aC5tYXgoMCwgTWF0aC5taW4obiAtIDEsIE1hdGguZmxvb3IodCAqIG4pKSldO1xuICB9O1xufVxuIiwiaW1wb3J0IHtodWV9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGkgPSBodWUoK2EsICtiKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgeCA9IGkodCk7XG4gICAgcmV0dXJuIHggLSAzNjAgKiBNYXRoLmZsb29yKHggLyAzNjApO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChhICogKDEgLSB0KSArIGIgKiB0KTtcbiAgfTtcbn1cbiIsInZhciByaG8gPSBNYXRoLlNRUlQyLFxuICAgIHJobzIgPSAyLFxuICAgIHJobzQgPSA0LFxuICAgIGVwc2lsb24yID0gMWUtMTI7XG5cbmZ1bmN0aW9uIGNvc2goeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gc2luaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiB0YW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7XG59XG5cbi8vIHAwID0gW3V4MCwgdXkwLCB3MF1cbi8vIHAxID0gW3V4MSwgdXkxLCB3MV1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHAwLCBwMSkge1xuICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLFxuICAgICAgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLFxuICAgICAgZHggPSB1eDEgLSB1eDAsXG4gICAgICBkeSA9IHV5MSAtIHV5MCxcbiAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICBpLFxuICAgICAgUztcblxuICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIOKJhSB1MS5cbiAgaWYgKGQyIDwgZXBzaWxvbjIpIHtcbiAgICBTID0gTWF0aC5sb2codzEgLyB3MCkgLyByaG87XG4gICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHV4MCArIHQgKiBkeCxcbiAgICAgICAgdXkwICsgdCAqIGR5LFxuICAgICAgICB3MCAqIE1hdGguZXhwKHJobyAqIHQgKiBTKVxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICAvLyBHZW5lcmFsIGNhc2UuXG4gIGVsc2Uge1xuICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksXG4gICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLFxuICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSxcbiAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLFxuICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gICAgUyA9IChyMSAtIHIwKSAvIHJobztcbiAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIHMgPSB0ICogUyxcbiAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSxcbiAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB1eDAgKyB1ICogZHgsXG4gICAgICAgIHV5MCArIHUgKiBkeSxcbiAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMClcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwO1xuXG4gIHJldHVybiBpO1xufVxuIiwiaW1wb3J0IHtoc2wgYXMgY29sb3JIc2x9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGNvbG9yLCB7aHVlfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5mdW5jdGlvbiBoc2woaHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgdmFyIGggPSBodWUoKHN0YXJ0ID0gY29sb3JIc2woc3RhcnQpKS5oLCAoZW5kID0gY29sb3JIc2woZW5kKSkuaCksXG4gICAgICAgIHMgPSBjb2xvcihzdGFydC5zLCBlbmQucyksXG4gICAgICAgIGwgPSBjb2xvcihzdGFydC5sLCBlbmQubCksXG4gICAgICAgIG9wYWNpdHkgPSBjb2xvcihzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LmggPSBoKHQpO1xuICAgICAgc3RhcnQucyA9IHModCk7XG4gICAgICBzdGFydC5sID0gbCh0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhzbChodWUpO1xuZXhwb3J0IHZhciBoc2xMb25nID0gaHNsKGNvbG9yKTtcbiIsImltcG9ydCB7bGFiIGFzIGNvbG9yTGFifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBjb2xvciBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYWIoc3RhcnQsIGVuZCkge1xuICB2YXIgbCA9IGNvbG9yKChzdGFydCA9IGNvbG9yTGFiKHN0YXJ0KSkubCwgKGVuZCA9IGNvbG9yTGFiKGVuZCkpLmwpLFxuICAgICAgYSA9IGNvbG9yKHN0YXJ0LmEsIGVuZC5hKSxcbiAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICBvcGFjaXR5ID0gY29sb3Ioc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHN0YXJ0LmwgPSBsKHQpO1xuICAgIHN0YXJ0LmEgPSBhKHQpO1xuICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gIH07XG59XG4iLCJpbXBvcnQge2hjbCBhcyBjb2xvckhjbH0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgY29sb3IsIHtodWV9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGhjbChodWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBjb2xvckhjbChzdGFydCkpLmgsIChlbmQgPSBjb2xvckhjbChlbmQpKS5oKSxcbiAgICAgICAgYyA9IGNvbG9yKHN0YXJ0LmMsIGVuZC5jKSxcbiAgICAgICAgbCA9IGNvbG9yKHN0YXJ0LmwsIGVuZC5sKSxcbiAgICAgICAgb3BhY2l0eSA9IGNvbG9yKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuaCA9IGgodCk7XG4gICAgICBzdGFydC5jID0gYyh0KTtcbiAgICAgIHN0YXJ0LmwgPSBsKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgaGNsKGh1ZSk7XG5leHBvcnQgdmFyIGhjbExvbmcgPSBoY2woY29sb3IpO1xuIiwiaW1wb3J0IHtjdWJlaGVsaXggYXMgY29sb3JDdWJlaGVsaXh9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGNvbG9yLCB7aHVlfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5mdW5jdGlvbiBjdWJlaGVsaXgoaHVlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gY3ViZWhlbGl4R2FtbWEoeSkge1xuICAgIHkgPSAreTtcblxuICAgIGZ1bmN0aW9uIGN1YmVoZWxpeChzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBjb2xvckN1YmVoZWxpeChzdGFydCkpLmgsIChlbmQgPSBjb2xvckN1YmVoZWxpeChlbmQpKS5oKSxcbiAgICAgICAgICBzID0gY29sb3Ioc3RhcnQucywgZW5kLnMpLFxuICAgICAgICAgIGwgPSBjb2xvcihzdGFydC5sLCBlbmQubCksXG4gICAgICAgICAgb3BhY2l0eSA9IGNvbG9yKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIHN0YXJ0LmggPSBoKHQpO1xuICAgICAgICBzdGFydC5zID0gcyh0KTtcbiAgICAgICAgc3RhcnQubCA9IGwoTWF0aC5wb3codCwgeSkpO1xuICAgICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY3ViZWhlbGl4LmdhbW1hID0gY3ViZWhlbGl4R2FtbWE7XG5cbiAgICByZXR1cm4gY3ViZWhlbGl4O1xuICB9KSgxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3ViZWhlbGl4KGh1ZSk7XG5leHBvcnQgdmFyIGN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXgoY29sb3IpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGllY2V3aXNlKGludGVycG9sYXRlLCB2YWx1ZXMpIHtcbiAgdmFyIGkgPSAwLCBuID0gdmFsdWVzLmxlbmd0aCAtIDEsIHYgPSB2YWx1ZXNbMF0sIEkgPSBuZXcgQXJyYXkobiA8IDAgPyAwIDogbik7XG4gIHdoaWxlIChpIDwgbikgSVtpXSA9IGludGVycG9sYXRlKHYsIHYgPSB2YWx1ZXNbKytpXSk7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihuIC0gMSwgTWF0aC5mbG9vcih0ICo9IG4pKSk7XG4gICAgcmV0dXJuIElbaV0odCAtIGkpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW50ZXJwb2xhdG9yLCBuKSB7XG4gIHZhciBzYW1wbGVzID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgc2FtcGxlc1tpXSA9IGludGVycG9sYXRvcihpIC8gKG4gLSAxKSk7XG4gIHJldHVybiBzYW1wbGVzO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlfSBmcm9tIFwiLi92YWx1ZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVCYXNpc30gZnJvbSBcIi4vYmFzaXMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkfSBmcm9tIFwiLi9iYXNpc0Nsb3NlZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlRGF0ZX0gZnJvbSBcIi4vZGF0ZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlRGlzY3JldGV9IGZyb20gXCIuL2Rpc2NyZXRlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVIdWV9IGZyb20gXCIuL2h1ZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlTnVtYmVyfSBmcm9tIFwiLi9udW1iZXIuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZU51bWJlckFycmF5fSBmcm9tIFwiLi9udW1iZXJBcnJheS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlT2JqZWN0fSBmcm9tIFwiLi9vYmplY3QuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVJvdW5kfSBmcm9tIFwiLi9yb3VuZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiLi9zdHJpbmcuanNcIjtcbmV4cG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MsIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnfSBmcm9tIFwiLi90cmFuc2Zvcm0vaW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVpvb219IGZyb20gXCIuL3pvb20uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVJnYiwgcmdiQmFzaXMgYXMgaW50ZXJwb2xhdGVSZ2JCYXNpcywgcmdiQmFzaXNDbG9zZWQgYXMgaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZH0gZnJvbSBcIi4vcmdiLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVIc2wsIGhzbExvbmcgYXMgaW50ZXJwb2xhdGVIc2xMb25nfSBmcm9tIFwiLi9oc2wuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZUxhYn0gZnJvbSBcIi4vbGFiLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVIY2wsIGhjbExvbmcgYXMgaW50ZXJwb2xhdGVIY2xMb25nfSBmcm9tIFwiLi9oY2wuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZUN1YmVoZWxpeCwgY3ViZWhlbGl4TG9uZyBhcyBpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmd9IGZyb20gXCIuL2N1YmVoZWxpeC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHBpZWNld2lzZX0gZnJvbSBcIi4vcGllY2V3aXNlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcXVhbnRpemV9IGZyb20gXCIuL3F1YW50aXplLmpzXCI7XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgcGF0aH0gZnJvbSBcIi4vcGF0aC5qc1wiO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocG9seWdvbikge1xuICB2YXIgaSA9IC0xLFxuICAgICAgbiA9IHBvbHlnb24ubGVuZ3RoLFxuICAgICAgYSxcbiAgICAgIGIgPSBwb2x5Z29uW24gLSAxXSxcbiAgICAgIGFyZWEgPSAwO1xuXG4gIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgYSA9IGI7XG4gICAgYiA9IHBvbHlnb25baV07XG4gICAgYXJlYSArPSBhWzFdICogYlswXSAtIGFbMF0gKiBiWzFdO1xuICB9XG5cbiAgcmV0dXJuIGFyZWEgLyAyO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocG9seWdvbikge1xuICB2YXIgaSA9IC0xLFxuICAgICAgbiA9IHBvbHlnb24ubGVuZ3RoLFxuICAgICAgeCA9IDAsXG4gICAgICB5ID0gMCxcbiAgICAgIGEsXG4gICAgICBiID0gcG9seWdvbltuIC0gMV0sXG4gICAgICBjLFxuICAgICAgayA9IDA7XG5cbiAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICBhID0gYjtcbiAgICBiID0gcG9seWdvbltpXTtcbiAgICBrICs9IGMgPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdO1xuICAgIHggKz0gKGFbMF0gKyBiWzBdKSAqIGM7XG4gICAgeSArPSAoYVsxXSArIGJbMV0pICogYztcbiAgfVxuXG4gIHJldHVybiBrICo9IDMsIFt4IC8gaywgeSAvIGtdO1xufVxuIiwiLy8gUmV0dXJucyB0aGUgMkQgY3Jvc3MgcHJvZHVjdCBvZiBBQiBhbmQgQUMgdmVjdG9ycywgaS5lLiwgdGhlIHotY29tcG9uZW50IG9mXG4vLyB0aGUgM0QgY3Jvc3MgcHJvZHVjdCBpbiBhIHF1YWRyYW50IEkgQ2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtICgreCBpc1xuLy8gcmlnaHQsICt5IGlzIHVwKS4gUmV0dXJucyBhIHBvc2l0aXZlIHZhbHVlIGlmIEFCQyBpcyBjb3VudGVyLWNsb2Nrd2lzZSxcbi8vIG5lZ2F0aXZlIGlmIGNsb2Nrd2lzZSwgYW5kIHplcm8gaWYgdGhlIHBvaW50cyBhcmUgY29sbGluZWFyLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYiwgYykge1xuICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChjWzFdIC0gYVsxXSkgLSAoYlsxXSAtIGFbMV0pICogKGNbMF0gLSBhWzBdKTtcbn1cbiIsImltcG9ydCBjcm9zcyBmcm9tIFwiLi9jcm9zcy5qc1wiO1xuXG5mdW5jdGlvbiBsZXhpY29ncmFwaGljT3JkZXIoYSwgYikge1xuICByZXR1cm4gYVswXSAtIGJbMF0gfHwgYVsxXSAtIGJbMV07XG59XG5cbi8vIENvbXB1dGVzIHRoZSB1cHBlciBjb252ZXggaHVsbCBwZXIgdGhlIG1vbm90b25lIGNoYWluIGFsZ29yaXRobS5cbi8vIEFzc3VtZXMgcG9pbnRzLmxlbmd0aCA+PSAzLCBpcyBzb3J0ZWQgYnkgeCwgdW5pcXVlIGluIHkuXG4vLyBSZXR1cm5zIGFuIGFycmF5IG9mIGluZGljZXMgaW50byBwb2ludHMgaW4gbGVmdC10by1yaWdodCBvcmRlci5cbmZ1bmN0aW9uIGNvbXB1dGVVcHBlckh1bGxJbmRleGVzKHBvaW50cykge1xuICB2YXIgbiA9IHBvaW50cy5sZW5ndGgsXG4gICAgICBpbmRleGVzID0gWzAsIDFdLFxuICAgICAgc2l6ZSA9IDI7XG5cbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBuOyArK2kpIHtcbiAgICB3aGlsZSAoc2l6ZSA+IDEgJiYgY3Jvc3MocG9pbnRzW2luZGV4ZXNbc2l6ZSAtIDJdXSwgcG9pbnRzW2luZGV4ZXNbc2l6ZSAtIDFdXSwgcG9pbnRzW2ldKSA8PSAwKSAtLXNpemU7XG4gICAgaW5kZXhlc1tzaXplKytdID0gaTtcbiAgfVxuXG4gIHJldHVybiBpbmRleGVzLnNsaWNlKDAsIHNpemUpOyAvLyByZW1vdmUgcG9wcGVkIHBvaW50c1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwb2ludHMpIHtcbiAgaWYgKChuID0gcG9pbnRzLmxlbmd0aCkgPCAzKSByZXR1cm4gbnVsbDtcblxuICB2YXIgaSxcbiAgICAgIG4sXG4gICAgICBzb3J0ZWRQb2ludHMgPSBuZXcgQXJyYXkobiksXG4gICAgICBmbGlwcGVkUG9pbnRzID0gbmV3IEFycmF5KG4pO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHNvcnRlZFBvaW50c1tpXSA9IFsrcG9pbnRzW2ldWzBdLCArcG9pbnRzW2ldWzFdLCBpXTtcbiAgc29ydGVkUG9pbnRzLnNvcnQobGV4aWNvZ3JhcGhpY09yZGVyKTtcbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgZmxpcHBlZFBvaW50c1tpXSA9IFtzb3J0ZWRQb2ludHNbaV1bMF0sIC1zb3J0ZWRQb2ludHNbaV1bMV1dO1xuXG4gIHZhciB1cHBlckluZGV4ZXMgPSBjb21wdXRlVXBwZXJIdWxsSW5kZXhlcyhzb3J0ZWRQb2ludHMpLFxuICAgICAgbG93ZXJJbmRleGVzID0gY29tcHV0ZVVwcGVySHVsbEluZGV4ZXMoZmxpcHBlZFBvaW50cyk7XG5cbiAgLy8gQ29uc3RydWN0IHRoZSBodWxsIHBvbHlnb24sIHJlbW92aW5nIHBvc3NpYmxlIGR1cGxpY2F0ZSBlbmRwb2ludHMuXG4gIHZhciBza2lwTGVmdCA9IGxvd2VySW5kZXhlc1swXSA9PT0gdXBwZXJJbmRleGVzWzBdLFxuICAgICAgc2tpcFJpZ2h0ID0gbG93ZXJJbmRleGVzW2xvd2VySW5kZXhlcy5sZW5ndGggLSAxXSA9PT0gdXBwZXJJbmRleGVzW3VwcGVySW5kZXhlcy5sZW5ndGggLSAxXSxcbiAgICAgIGh1bGwgPSBbXTtcblxuICAvLyBBZGQgdXBwZXIgaHVsbCBpbiByaWdodC10by1sIG9yZGVyLlxuICAvLyBUaGVuIGFkZCBsb3dlciBodWxsIGluIGxlZnQtdG8tcmlnaHQgb3JkZXIuXG4gIGZvciAoaSA9IHVwcGVySW5kZXhlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgaHVsbC5wdXNoKHBvaW50c1tzb3J0ZWRQb2ludHNbdXBwZXJJbmRleGVzW2ldXVsyXV0pO1xuICBmb3IgKGkgPSArc2tpcExlZnQ7IGkgPCBsb3dlckluZGV4ZXMubGVuZ3RoIC0gc2tpcFJpZ2h0OyArK2kpIGh1bGwucHVzaChwb2ludHNbc29ydGVkUG9pbnRzW2xvd2VySW5kZXhlc1tpXV1bMl1dKTtcblxuICByZXR1cm4gaHVsbDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBvbHlnb24sIHBvaW50KSB7XG4gIHZhciBuID0gcG9seWdvbi5sZW5ndGgsXG4gICAgICBwID0gcG9seWdvbltuIC0gMV0sXG4gICAgICB4ID0gcG9pbnRbMF0sIHkgPSBwb2ludFsxXSxcbiAgICAgIHgwID0gcFswXSwgeTAgPSBwWzFdLFxuICAgICAgeDEsIHkxLFxuICAgICAgaW5zaWRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBwID0gcG9seWdvbltpXSwgeDEgPSBwWzBdLCB5MSA9IHBbMV07XG4gICAgaWYgKCgoeTEgPiB5KSAhPT0gKHkwID4geSkpICYmICh4IDwgKHgwIC0geDEpICogKHkgLSB5MSkgLyAoeTAgLSB5MSkgKyB4MSkpIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgeDAgPSB4MSwgeTAgPSB5MTtcbiAgfVxuXG4gIHJldHVybiBpbnNpZGU7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwb2x5Z29uKSB7XG4gIHZhciBpID0gLTEsXG4gICAgICBuID0gcG9seWdvbi5sZW5ndGgsXG4gICAgICBiID0gcG9seWdvbltuIC0gMV0sXG4gICAgICB4YSxcbiAgICAgIHlhLFxuICAgICAgeGIgPSBiWzBdLFxuICAgICAgeWIgPSBiWzFdLFxuICAgICAgcGVyaW1ldGVyID0gMDtcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIHhhID0geGI7XG4gICAgeWEgPSB5YjtcbiAgICBiID0gcG9seWdvbltpXTtcbiAgICB4YiA9IGJbMF07XG4gICAgeWIgPSBiWzFdO1xuICAgIHhhIC09IHhiO1xuICAgIHlhIC09IHliO1xuICAgIHBlcmltZXRlciArPSBNYXRoLnNxcnQoeGEgKiB4YSArIHlhICogeWEpO1xuICB9XG5cbiAgcmV0dXJuIHBlcmltZXRlcjtcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBwb2x5Z29uQXJlYX0gZnJvbSBcIi4vYXJlYS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHBvbHlnb25DZW50cm9pZH0gZnJvbSBcIi4vY2VudHJvaWQuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwb2x5Z29uSHVsbH0gZnJvbSBcIi4vaHVsbC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHBvbHlnb25Db250YWluc30gZnJvbSBcIi4vY29udGFpbnMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwb2x5Z29uTGVuZ3RofSBmcm9tIFwiLi9sZW5ndGguanNcIjtcbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBxdWFkdHJlZX0gZnJvbSBcIi4vcXVhZHRyZWUuanNcIjtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKTtcbn1cbiIsImltcG9ydCBkZWZhdWx0U291cmNlIGZyb20gXCIuL2RlZmF1bHRTb3VyY2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHNvdXJjZVJhbmRvbVVuaWZvcm0oc291cmNlKSB7XG4gIGZ1bmN0aW9uIHJhbmRvbVVuaWZvcm0obWluLCBtYXgpIHtcbiAgICBtaW4gPSBtaW4gPT0gbnVsbCA/IDAgOiArbWluO1xuICAgIG1heCA9IG1heCA9PSBudWxsID8gMSA6ICttYXg7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIG1heCA9IG1pbiwgbWluID0gMDtcbiAgICBlbHNlIG1heCAtPSBtaW47XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNvdXJjZSgpICogbWF4ICsgbWluO1xuICAgIH07XG4gIH1cblxuICByYW5kb21Vbmlmb3JtLnNvdXJjZSA9IHNvdXJjZVJhbmRvbVVuaWZvcm07XG5cbiAgcmV0dXJuIHJhbmRvbVVuaWZvcm07XG59KShkZWZhdWx0U291cmNlKTtcbiIsImltcG9ydCBkZWZhdWx0U291cmNlIGZyb20gXCIuL2RlZmF1bHRTb3VyY2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHNvdXJjZVJhbmRvbU5vcm1hbChzb3VyY2UpIHtcbiAgZnVuY3Rpb24gcmFuZG9tTm9ybWFsKG11LCBzaWdtYSkge1xuICAgIHZhciB4LCByO1xuICAgIG11ID0gbXUgPT0gbnVsbCA/IDAgOiArbXU7XG4gICAgc2lnbWEgPSBzaWdtYSA9PSBudWxsID8gMSA6ICtzaWdtYTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgeTtcblxuICAgICAgLy8gSWYgYXZhaWxhYmxlLCB1c2UgdGhlIHNlY29uZCBwcmV2aW91c2x5LWdlbmVyYXRlZCB1bmlmb3JtIHJhbmRvbS5cbiAgICAgIGlmICh4ICE9IG51bGwpIHkgPSB4LCB4ID0gbnVsbDtcblxuICAgICAgLy8gT3RoZXJ3aXNlLCBnZW5lcmF0ZSBhIG5ldyB4IGFuZCB5LlxuICAgICAgZWxzZSBkbyB7XG4gICAgICAgIHggPSBzb3VyY2UoKSAqIDIgLSAxO1xuICAgICAgICB5ID0gc291cmNlKCkgKiAyIC0gMTtcbiAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7XG4gICAgICB9IHdoaWxlICghciB8fCByID4gMSk7XG5cbiAgICAgIHJldHVybiBtdSArIHNpZ21hICogeSAqIE1hdGguc3FydCgtMiAqIE1hdGgubG9nKHIpIC8gcik7XG4gICAgfTtcbiAgfVxuXG4gIHJhbmRvbU5vcm1hbC5zb3VyY2UgPSBzb3VyY2VSYW5kb21Ob3JtYWw7XG5cbiAgcmV0dXJuIHJhbmRvbU5vcm1hbDtcbn0pKGRlZmF1bHRTb3VyY2UpO1xuIiwiaW1wb3J0IGRlZmF1bHRTb3VyY2UgZnJvbSBcIi4vZGVmYXVsdFNvdXJjZVwiO1xuaW1wb3J0IG5vcm1hbCBmcm9tIFwiLi9ub3JtYWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHNvdXJjZVJhbmRvbUxvZ05vcm1hbChzb3VyY2UpIHtcbiAgZnVuY3Rpb24gcmFuZG9tTG9nTm9ybWFsKCkge1xuICAgIHZhciByYW5kb21Ob3JtYWwgPSBub3JtYWwuc291cmNlKHNvdXJjZSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gTWF0aC5leHAocmFuZG9tTm9ybWFsKCkpO1xuICAgIH07XG4gIH1cblxuICByYW5kb21Mb2dOb3JtYWwuc291cmNlID0gc291cmNlUmFuZG9tTG9nTm9ybWFsO1xuXG4gIHJldHVybiByYW5kb21Mb2dOb3JtYWw7XG59KShkZWZhdWx0U291cmNlKTtcbiIsImltcG9ydCBkZWZhdWx0U291cmNlIGZyb20gXCIuL2RlZmF1bHRTb3VyY2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHNvdXJjZVJhbmRvbUlyd2luSGFsbChzb3VyY2UpIHtcbiAgZnVuY3Rpb24gcmFuZG9tSXJ3aW5IYWxsKG4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciBzdW0gPSAwLCBpID0gMDsgaSA8IG47ICsraSkgc3VtICs9IHNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHN1bTtcbiAgICB9O1xuICB9XG5cbiAgcmFuZG9tSXJ3aW5IYWxsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUlyd2luSGFsbDtcblxuICByZXR1cm4gcmFuZG9tSXJ3aW5IYWxsO1xufSkoZGVmYXVsdFNvdXJjZSk7XG4iLCJpbXBvcnQgZGVmYXVsdFNvdXJjZSBmcm9tIFwiLi9kZWZhdWx0U291cmNlXCI7XG5pbXBvcnQgaXJ3aW5IYWxsIGZyb20gXCIuL2lyd2luSGFsbFwiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gc291cmNlUmFuZG9tQmF0ZXMoc291cmNlKSB7XG4gIGZ1bmN0aW9uIHJhbmRvbUJhdGVzKG4pIHtcbiAgICB2YXIgcmFuZG9tSXJ3aW5IYWxsID0gaXJ3aW5IYWxsLnNvdXJjZShzb3VyY2UpKG4pO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByYW5kb21JcndpbkhhbGwoKSAvIG47XG4gICAgfTtcbiAgfVxuXG4gIHJhbmRvbUJhdGVzLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUJhdGVzO1xuXG4gIHJldHVybiByYW5kb21CYXRlcztcbn0pKGRlZmF1bHRTb3VyY2UpO1xuIiwiaW1wb3J0IGRlZmF1bHRTb3VyY2UgZnJvbSBcIi4vZGVmYXVsdFNvdXJjZVwiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gc291cmNlUmFuZG9tRXhwb25lbnRpYWwoc291cmNlKSB7XG4gIGZ1bmN0aW9uIHJhbmRvbUV4cG9uZW50aWFsKGxhbWJkYSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAtTWF0aC5sb2coMSAtIHNvdXJjZSgpKSAvIGxhbWJkYTtcbiAgICB9O1xuICB9XG5cbiAgcmFuZG9tRXhwb25lbnRpYWwuc291cmNlID0gc291cmNlUmFuZG9tRXhwb25lbnRpYWw7XG5cbiAgcmV0dXJuIHJhbmRvbUV4cG9uZW50aWFsO1xufSkoZGVmYXVsdFNvdXJjZSk7XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgcmFuZG9tVW5pZm9ybX0gZnJvbSBcIi4vdW5pZm9ybVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHJhbmRvbU5vcm1hbH0gZnJvbSBcIi4vbm9ybWFsXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcmFuZG9tTG9nTm9ybWFsfSBmcm9tIFwiLi9sb2dOb3JtYWxcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyByYW5kb21CYXRlc30gZnJvbSBcIi4vYmF0ZXNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyByYW5kb21JcndpbkhhbGx9IGZyb20gXCIuL2lyd2luSGFsbFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHJhbmRvbUV4cG9uZW50aWFsfSBmcm9tIFwiLi9leHBvbmVudGlhbFwiO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGluaXRSYW5nZShkb21haW4sIHJhbmdlKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB0aGlzLnJhbmdlKGRvbWFpbik7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IHRoaXMucmFuZ2UocmFuZ2UpLmRvbWFpbihkb21haW4pOyBicmVhaztcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRJbnRlcnBvbGF0b3IoZG9tYWluLCBpbnRlcnBvbGF0b3IpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiBicmVhaztcbiAgICBjYXNlIDE6IHRoaXMuaW50ZXJwb2xhdG9yKGRvbWFpbik7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IHRoaXMuaW50ZXJwb2xhdG9yKGludGVycG9sYXRvcikuZG9tYWluKGRvbWFpbik7IGJyZWFrO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwidmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlO1xuXG5leHBvcnQgdmFyIG1hcCA9IGFycmF5Lm1hcDtcbmV4cG9ydCB2YXIgc2xpY2UgPSBhcnJheS5zbGljZTtcbiIsImltcG9ydCB7bWFwfSBmcm9tIFwiZDMtY29sbGVjdGlvblwiO1xuaW1wb3J0IHtzbGljZX0gZnJvbSBcIi4vYXJyYXlcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0XCI7XG5cbmV4cG9ydCB2YXIgaW1wbGljaXQgPSB7bmFtZTogXCJpbXBsaWNpdFwifTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkaW5hbCgpIHtcbiAgdmFyIGluZGV4ID0gbWFwKCksXG4gICAgICBkb21haW4gPSBbXSxcbiAgICAgIHJhbmdlID0gW10sXG4gICAgICB1bmtub3duID0gaW1wbGljaXQ7XG5cbiAgZnVuY3Rpb24gc2NhbGUoZCkge1xuICAgIHZhciBrZXkgPSBkICsgXCJcIiwgaSA9IGluZGV4LmdldChrZXkpO1xuICAgIGlmICghaSkge1xuICAgICAgaWYgKHVua25vd24gIT09IGltcGxpY2l0KSByZXR1cm4gdW5rbm93bjtcbiAgICAgIGluZGV4LnNldChrZXksIGkgPSBkb21haW4ucHVzaChkKSk7XG4gICAgfVxuICAgIHJldHVybiByYW5nZVsoaSAtIDEpICUgcmFuZ2UubGVuZ3RoXTtcbiAgfVxuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTtcbiAgICBkb21haW4gPSBbXSwgaW5kZXggPSBtYXAoKTtcbiAgICB2YXIgaSA9IC0xLCBuID0gXy5sZW5ndGgsIGQsIGtleTtcbiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpbmRleC5oYXMoa2V5ID0gKGQgPSBfW2ldKSArIFwiXCIpKSBpbmRleC5zZXQoa2V5LCBkb21haW4ucHVzaChkKSk7XG4gICAgcmV0dXJuIHNjYWxlO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UuY2FsbChfKSwgc2NhbGUpIDogcmFuZ2Uuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gb3JkaW5hbChkb21haW4sIHJhbmdlKS51bmtub3duKHVua25vd24pO1xuICB9O1xuXG4gIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcblxuICByZXR1cm4gc2NhbGU7XG59XG4iLCJpbXBvcnQge3JhbmdlIGFzIHNlcXVlbmNlfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0XCI7XG5pbXBvcnQgb3JkaW5hbCBmcm9tIFwiLi9vcmRpbmFsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJhbmQoKSB7XG4gIHZhciBzY2FsZSA9IG9yZGluYWwoKS51bmtub3duKHVuZGVmaW5lZCksXG4gICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sXG4gICAgICBvcmRpbmFsUmFuZ2UgPSBzY2FsZS5yYW5nZSxcbiAgICAgIHJhbmdlID0gWzAsIDFdLFxuICAgICAgc3RlcCxcbiAgICAgIGJhbmR3aWR0aCxcbiAgICAgIHJvdW5kID0gZmFsc2UsXG4gICAgICBwYWRkaW5nSW5uZXIgPSAwLFxuICAgICAgcGFkZGluZ091dGVyID0gMCxcbiAgICAgIGFsaWduID0gMC41O1xuXG4gIGRlbGV0ZSBzY2FsZS51bmtub3duO1xuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgdmFyIG4gPSBkb21haW4oKS5sZW5ndGgsXG4gICAgICAgIHJldmVyc2UgPSByYW5nZVsxXSA8IHJhbmdlWzBdLFxuICAgICAgICBzdGFydCA9IHJhbmdlW3JldmVyc2UgLSAwXSxcbiAgICAgICAgc3RvcCA9IHJhbmdlWzEgLSByZXZlcnNlXTtcbiAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgxLCBuIC0gcGFkZGluZ0lubmVyICsgcGFkZGluZ091dGVyICogMik7XG4gICAgaWYgKHJvdW5kKSBzdGVwID0gTWF0aC5mbG9vcihzdGVwKTtcbiAgICBzdGFydCArPSAoc3RvcCAtIHN0YXJ0IC0gc3RlcCAqIChuIC0gcGFkZGluZ0lubmVyKSkgKiBhbGlnbjtcbiAgICBiYW5kd2lkdGggPSBzdGVwICogKDEgLSBwYWRkaW5nSW5uZXIpO1xuICAgIGlmIChyb3VuZCkgc3RhcnQgPSBNYXRoLnJvdW5kKHN0YXJ0KSwgYmFuZHdpZHRoID0gTWF0aC5yb3VuZChiYW5kd2lkdGgpO1xuICAgIHZhciB2YWx1ZXMgPSBzZXF1ZW5jZShuKS5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gc3RhcnQgKyBzdGVwICogaTsgfSk7XG4gICAgcmV0dXJuIG9yZGluYWxSYW5nZShyZXZlcnNlID8gdmFsdWVzLnJldmVyc2UoKSA6IHZhbHVlcyk7XG4gIH1cblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBbK19bMF0sICtfWzFdXSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gcmFuZ2UgPSBbK19bMF0sICtfWzFdXSwgcm91bmQgPSB0cnVlLCByZXNjYWxlKCk7XG4gIH07XG5cbiAgc2NhbGUuYmFuZHdpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGJhbmR3aWR0aDtcbiAgfTtcblxuICBzY2FsZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH07XG5cbiAgc2NhbGUucm91bmQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIV8sIHJlc2NhbGUoKSkgOiByb3VuZDtcbiAgfTtcblxuICBzY2FsZS5wYWRkaW5nID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IE1hdGgubWluKDEsIHBhZGRpbmdPdXRlciA9ICtfKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjtcbiAgfTtcblxuICBzY2FsZS5wYWRkaW5nSW5uZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gTWF0aC5taW4oMSwgXyksIHJlc2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7XG4gIH07XG5cbiAgc2NhbGUucGFkZGluZ091dGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdPdXRlciA9ICtfLCByZXNjYWxlKCkpIDogcGFkZGluZ091dGVyO1xuICB9O1xuXG4gIHNjYWxlLmFsaWduID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFsaWduID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogYWxpZ247XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBiYW5kKGRvbWFpbigpLCByYW5nZSlcbiAgICAgICAgLnJvdW5kKHJvdW5kKVxuICAgICAgICAucGFkZGluZ0lubmVyKHBhZGRpbmdJbm5lcilcbiAgICAgICAgLnBhZGRpbmdPdXRlcihwYWRkaW5nT3V0ZXIpXG4gICAgICAgIC5hbGlnbihhbGlnbik7XG4gIH07XG5cbiAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShyZXNjYWxlKCksIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIHBvaW50aXNoKHNjYWxlKSB7XG4gIHZhciBjb3B5ID0gc2NhbGUuY29weTtcblxuICBzY2FsZS5wYWRkaW5nID0gc2NhbGUucGFkZGluZ091dGVyO1xuICBkZWxldGUgc2NhbGUucGFkZGluZ0lubmVyO1xuICBkZWxldGUgc2NhbGUucGFkZGluZ091dGVyO1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcG9pbnRpc2goY29weSgpKTtcbiAgfTtcblxuICByZXR1cm4gc2NhbGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludCgpIHtcbiAgcmV0dXJuIHBvaW50aXNoKGJhbmQuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiAreDtcbn1cbiIsImltcG9ydCB7YmlzZWN0fSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGUgYXMgaW50ZXJwb2xhdGVWYWx1ZSwgaW50ZXJwb2xhdGVOdW1iZXIsIGludGVycG9sYXRlUm91bmR9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHttYXAsIHNsaWNlfSBmcm9tIFwiLi9hcnJheVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlclwiO1xuXG52YXIgdW5pdCA9IFswLCAxXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShhLCBiKSB7XG4gIHJldHVybiAoYiAtPSAoYSA9ICthKSlcbiAgICAgID8gZnVuY3Rpb24oeCkgeyByZXR1cm4gKHggLSBhKSAvIGI7IH1cbiAgICAgIDogY29uc3RhbnQoaXNOYU4oYikgPyBOYU4gOiAwLjUpO1xufVxuXG5mdW5jdGlvbiBjbGFtcGVyKGRvbWFpbikge1xuICB2YXIgYSA9IGRvbWFpblswXSwgYiA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV0sIHQ7XG4gIGlmIChhID4gYikgdCA9IGEsIGEgPSBiLCBiID0gdDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubWF4KGEsIE1hdGgubWluKGIsIHgpKTsgfTtcbn1cblxuLy8gbm9ybWFsaXplKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0uXG4vLyBpbnRlcnBvbGF0ZShhLCBiKSh0KSB0YWtlcyBhIHBhcmFtZXRlciB0IGluIFswLDFdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJhbmdlIHZhbHVlIHggaW4gW2EsYl0uXG5mdW5jdGlvbiBiaW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgZDAgPSBkb21haW5bMF0sIGQxID0gZG9tYWluWzFdLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdO1xuICBpZiAoZDEgPCBkMCkgZDAgPSBub3JtYWxpemUoZDEsIGQwKSwgcjAgPSBpbnRlcnBvbGF0ZShyMSwgcjApO1xuICBlbHNlIGQwID0gbm9ybWFsaXplKGQwLCBkMSksIHIwID0gaW50ZXJwb2xhdGUocjAsIHIxKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHIwKGQwKHgpKTsgfTtcbn1cblxuZnVuY3Rpb24gcG9seW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgaiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgLSAxLFxuICAgICAgZCA9IG5ldyBBcnJheShqKSxcbiAgICAgIHIgPSBuZXcgQXJyYXkoaiksXG4gICAgICBpID0gLTE7XG5cbiAgLy8gUmV2ZXJzZSBkZXNjZW5kaW5nIGRvbWFpbnMuXG4gIGlmIChkb21haW5bal0gPCBkb21haW5bMF0pIHtcbiAgICBkb21haW4gPSBkb21haW4uc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgcmFuZ2UgPSByYW5nZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgfVxuXG4gIHdoaWxlICgrK2kgPCBqKSB7XG4gICAgZFtpXSA9IG5vcm1hbGl6ZShkb21haW5baV0sIGRvbWFpbltpICsgMV0pO1xuICAgIHJbaV0gPSBpbnRlcnBvbGF0ZShyYW5nZVtpXSwgcmFuZ2VbaSArIDFdKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgdmFyIGkgPSBiaXNlY3QoZG9tYWluLCB4LCAxLCBqKSAtIDE7XG4gICAgcmV0dXJuIHJbaV0oZFtpXSh4KSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KHNvdXJjZSwgdGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXRcbiAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKVxuICAgICAgLnJhbmdlKHNvdXJjZS5yYW5nZSgpKVxuICAgICAgLmludGVycG9sYXRlKHNvdXJjZS5pbnRlcnBvbGF0ZSgpKVxuICAgICAgLmNsYW1wKHNvdXJjZS5jbGFtcCgpKVxuICAgICAgLnVua25vd24oc291cmNlLnVua25vd24oKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1lcigpIHtcbiAgdmFyIGRvbWFpbiA9IHVuaXQsXG4gICAgICByYW5nZSA9IHVuaXQsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlVmFsdWUsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB1bnRyYW5zZm9ybSxcbiAgICAgIHVua25vd24sXG4gICAgICBjbGFtcCA9IGlkZW50aXR5LFxuICAgICAgcGllY2V3aXNlLFxuICAgICAgb3V0cHV0LFxuICAgICAgaW5wdXQ7XG5cbiAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICBwaWVjZXdpc2UgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpID4gMiA/IHBvbHltYXAgOiBiaW1hcDtcbiAgICBvdXRwdXQgPSBpbnB1dCA9IG51bGw7XG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgIHJldHVybiBpc05hTih4ID0gK3gpID8gdW5rbm93biA6IChvdXRwdXQgfHwgKG91dHB1dCA9IHBpZWNld2lzZShkb21haW4ubWFwKHRyYW5zZm9ybSksIHJhbmdlLCBpbnRlcnBvbGF0ZSkpKSh0cmFuc2Zvcm0oY2xhbXAoeCkpKTtcbiAgfVxuXG4gIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gY2xhbXAodW50cmFuc2Zvcm0oKGlucHV0IHx8IChpbnB1dCA9IHBpZWNld2lzZShyYW5nZSwgZG9tYWluLm1hcCh0cmFuc2Zvcm0pLCBpbnRlcnBvbGF0ZU51bWJlcikpKSh5KSkpO1xuICB9O1xuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSBtYXAuY2FsbChfLCBudW1iZXIpLCBjbGFtcCA9PT0gaWRlbnRpdHkgfHwgKGNsYW1wID0gY2xhbXBlcihkb21haW4pKSwgcmVzY2FsZSgpKSA6IGRvbWFpbi5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UuY2FsbChfKSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gcmFuZ2UgPSBzbGljZS5jYWxsKF8pLCBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlUm91bmQsIHJlc2NhbGUoKTtcbiAgfTtcblxuICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9IF8gPyBjbGFtcGVyKGRvbWFpbikgOiBpZGVudGl0eSwgc2NhbGUpIDogY2xhbXAgIT09IGlkZW50aXR5O1xuICB9O1xuXG4gIHNjYWxlLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgcmVzY2FsZSgpKSA6IGludGVycG9sYXRlO1xuICB9O1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQsIHUpIHtcbiAgICB0cmFuc2Zvcm0gPSB0LCB1bnRyYW5zZm9ybSA9IHU7XG4gICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udGludW91cyh0cmFuc2Zvcm0sIHVudHJhbnNmb3JtKSB7XG4gIHJldHVybiB0cmFuc2Zvcm1lcigpKHRyYW5zZm9ybSwgdW50cmFuc2Zvcm0pO1xufVxuIiwiaW1wb3J0IHt0aWNrU3RlcH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2Zvcm1hdCwgZm9ybWF0UHJlZml4LCBmb3JtYXRTcGVjaWZpZXIsIHByZWNpc2lvbkZpeGVkLCBwcmVjaXNpb25QcmVmaXgsIHByZWNpc2lvblJvdW5kfSBmcm9tIFwiZDMtZm9ybWF0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBjb3VudCwgc3BlY2lmaWVyKSB7XG4gIHZhciBzdGVwID0gdGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50KSxcbiAgICAgIHByZWNpc2lvbjtcbiAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciA9PSBudWxsID8gXCIsZlwiIDogc3BlY2lmaWVyKTtcbiAgc3dpdGNoIChzcGVjaWZpZXIudHlwZSkge1xuICAgIGNhc2UgXCJzXCI6IHtcbiAgICAgIHZhciB2YWx1ZSA9IE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpO1xuICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uUHJlZml4KHN0ZXAsIHZhbHVlKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb247XG4gICAgICByZXR1cm4gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpO1xuICAgIH1cbiAgICBjYXNlIFwiXCI6XG4gICAgY2FzZSBcImVcIjpcbiAgICBjYXNlIFwiZ1wiOlxuICAgIGNhc2UgXCJwXCI6XG4gICAgY2FzZSBcInJcIjoge1xuICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uUm91bmQoc3RlcCwgTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSkpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gXCJlXCIpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJmXCI6XG4gICAgY2FzZSBcIiVcIjoge1xuICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uRml4ZWQoc3RlcCkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uIC0gKHNwZWNpZmllci50eXBlID09PSBcIiVcIikgKiAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3JtYXQoc3BlY2lmaWVyKTtcbn1cbiIsImltcG9ydCB7dGlja3MsIHRpY2tJbmNyZW1lbnR9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IGNvbnRpbnVvdXMsIHtjb3B5LCBpZGVudGl0eX0gZnJvbSBcIi4vY29udGludW91c1wiO1xuaW1wb3J0IHtpbml0UmFuZ2V9IGZyb20gXCIuL2luaXRcIjtcbmltcG9ydCB0aWNrRm9ybWF0IGZyb20gXCIuL3RpY2tGb3JtYXRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmVhcmlzaChzY2FsZSkge1xuICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluO1xuXG4gIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB2YXIgZCA9IGRvbWFpbigpO1xuICAgIHJldHVybiB0aWNrcyhkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50KTtcbiAgfTtcblxuICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikge1xuICAgIHZhciBkID0gZG9tYWluKCk7XG4gICAgcmV0dXJuIHRpY2tGb3JtYXQoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCwgc3BlY2lmaWVyKTtcbiAgfTtcblxuICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDtcblxuICAgIHZhciBkID0gZG9tYWluKCksXG4gICAgICAgIGkwID0gMCxcbiAgICAgICAgaTEgPSBkLmxlbmd0aCAtIDEsXG4gICAgICAgIHN0YXJ0ID0gZFtpMF0sXG4gICAgICAgIHN0b3AgPSBkW2kxXSxcbiAgICAgICAgc3RlcDtcblxuICAgIGlmIChzdG9wIDwgc3RhcnQpIHtcbiAgICAgIHN0ZXAgPSBzdGFydCwgc3RhcnQgPSBzdG9wLCBzdG9wID0gc3RlcDtcbiAgICAgIHN0ZXAgPSBpMCwgaTAgPSBpMSwgaTEgPSBzdGVwO1xuICAgIH1cblxuICAgIHN0ZXAgPSB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7XG5cbiAgICBpZiAoc3RlcCA+IDApIHtcbiAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAvIHN0ZXApICogc3RlcDtcbiAgICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDtcbiAgICAgIHN0ZXAgPSB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7XG4gICAgfSBlbHNlIGlmIChzdGVwIDwgMCkge1xuICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7XG4gICAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwO1xuICAgICAgc3RlcCA9IHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KTtcbiAgICB9XG5cbiAgICBpZiAoc3RlcCA+IDApIHtcbiAgICAgIGRbaTBdID0gTWF0aC5mbG9vcihzdGFydCAvIHN0ZXApICogc3RlcDtcbiAgICAgIGRbaTFdID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICBkb21haW4oZCk7XG4gICAgfSBlbHNlIGlmIChzdGVwIDwgMCkge1xuICAgICAgZFtpMF0gPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7XG4gICAgICBkW2kxXSA9IE1hdGguZmxvb3Ioc3RvcCAqIHN0ZXApIC8gc3RlcDtcbiAgICAgIGRvbWFpbihkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5lYXIoKSB7XG4gIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoaWRlbnRpdHksIGlkZW50aXR5KTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIGxpbmVhcigpKTtcbiAgfTtcblxuICBpbml0UmFuZ2UuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG5cbiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7XG59XG4iLCJpbXBvcnQge21hcH0gZnJvbSBcIi4vYXJyYXlcIjtcbmltcG9ydCB7bGluZWFyaXNofSBmcm9tIFwiLi9saW5lYXJcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlkZW50aXR5KGRvbWFpbikge1xuICB2YXIgdW5rbm93bjtcblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgcmV0dXJuIGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogeDtcbiAgfVxuXG4gIHNjYWxlLmludmVydCA9IHNjYWxlO1xuXG4gIHNjYWxlLmRvbWFpbiA9IHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IG1hcC5jYWxsKF8sIG51bWJlciksIHNjYWxlKSA6IGRvbWFpbi5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBpZGVudGl0eShkb21haW4pLnVua25vd24odW5rbm93bik7XG4gIH07XG5cbiAgZG9tYWluID0gYXJndW1lbnRzLmxlbmd0aCA/IG1hcC5jYWxsKGRvbWFpbiwgbnVtYmVyKSA6IFswLCAxXTtcblxuICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRvbWFpbiwgaW50ZXJ2YWwpIHtcbiAgZG9tYWluID0gZG9tYWluLnNsaWNlKCk7XG5cbiAgdmFyIGkwID0gMCxcbiAgICAgIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsXG4gICAgICB4MCA9IGRvbWFpbltpMF0sXG4gICAgICB4MSA9IGRvbWFpbltpMV0sXG4gICAgICB0O1xuXG4gIGlmICh4MSA8IHgwKSB7XG4gICAgdCA9IGkwLCBpMCA9IGkxLCBpMSA9IHQ7XG4gICAgdCA9IHgwLCB4MCA9IHgxLCB4MSA9IHQ7XG4gIH1cblxuICBkb21haW5baTBdID0gaW50ZXJ2YWwuZmxvb3IoeDApO1xuICBkb21haW5baTFdID0gaW50ZXJ2YWwuY2VpbCh4MSk7XG4gIHJldHVybiBkb21haW47XG59XG4iLCJpbXBvcnQge3RpY2tzfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7Zm9ybWF0fSBmcm9tIFwiZDMtZm9ybWF0XCI7XG5pbXBvcnQgbmljZSBmcm9tIFwiLi9uaWNlXCI7XG5pbXBvcnQge2NvcHksIHRyYW5zZm9ybWVyfSBmcm9tIFwiLi9jb250aW51b3VzXCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdFwiO1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Mb2coeCkge1xuICByZXR1cm4gTWF0aC5sb2coeCk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybUV4cCh4KSB7XG4gIHJldHVybiBNYXRoLmV4cCh4KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtTG9nbih4KSB7XG4gIHJldHVybiAtTWF0aC5sb2coLXgpO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1FeHBuKHgpIHtcbiAgcmV0dXJuIC1NYXRoLmV4cCgteCk7XG59XG5cbmZ1bmN0aW9uIHBvdzEwKHgpIHtcbiAgcmV0dXJuIGlzRmluaXRlKHgpID8gKyhcIjFlXCIgKyB4KSA6IHggPCAwID8gMCA6IHg7XG59XG5cbmZ1bmN0aW9uIHBvd3AoYmFzZSkge1xuICByZXR1cm4gYmFzZSA9PT0gMTAgPyBwb3cxMFxuICAgICAgOiBiYXNlID09PSBNYXRoLkUgPyBNYXRoLmV4cFxuICAgICAgOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnBvdyhiYXNlLCB4KTsgfTtcbn1cblxuZnVuY3Rpb24gbG9ncChiYXNlKSB7XG4gIHJldHVybiBiYXNlID09PSBNYXRoLkUgPyBNYXRoLmxvZ1xuICAgICAgOiBiYXNlID09PSAxMCAmJiBNYXRoLmxvZzEwXG4gICAgICB8fCBiYXNlID09PSAyICYmIE1hdGgubG9nMlxuICAgICAgfHwgKGJhc2UgPSBNYXRoLmxvZyhiYXNlKSwgZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5sb2coeCkgLyBiYXNlOyB9KTtcbn1cblxuZnVuY3Rpb24gcmVmbGVjdChmKSB7XG4gIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIC1mKC14KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dpc2godHJhbnNmb3JtKSB7XG4gIHZhciBzY2FsZSA9IHRyYW5zZm9ybSh0cmFuc2Zvcm1Mb2csIHRyYW5zZm9ybUV4cCksXG4gICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sXG4gICAgICBiYXNlID0gMTAsXG4gICAgICBsb2dzLFxuICAgICAgcG93cztcblxuICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgIGxvZ3MgPSBsb2dwKGJhc2UpLCBwb3dzID0gcG93cChiYXNlKTtcbiAgICBpZiAoZG9tYWluKClbMF0gPCAwKSB7XG4gICAgICBsb2dzID0gcmVmbGVjdChsb2dzKSwgcG93cyA9IHJlZmxlY3QocG93cyk7XG4gICAgICB0cmFuc2Zvcm0odHJhbnNmb3JtTG9nbiwgdHJhbnNmb3JtRXhwbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm1Mb2csIHRyYW5zZm9ybUV4cCk7XG4gICAgfVxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIHNjYWxlLmJhc2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFzZSA9ICtfLCByZXNjYWxlKCkpIDogYmFzZTtcbiAgfTtcblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7XG4gIH07XG5cbiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIHZhciBkID0gZG9tYWluKCksXG4gICAgICAgIHUgPSBkWzBdLFxuICAgICAgICB2ID0gZFtkLmxlbmd0aCAtIDFdLFxuICAgICAgICByO1xuXG4gICAgaWYgKHIgPSB2IDwgdSkgaSA9IHUsIHUgPSB2LCB2ID0gaTtcblxuICAgIHZhciBpID0gbG9ncyh1KSxcbiAgICAgICAgaiA9IGxvZ3ModiksXG4gICAgICAgIHAsXG4gICAgICAgIGssXG4gICAgICAgIHQsXG4gICAgICAgIG4gPSBjb3VudCA9PSBudWxsID8gMTAgOiArY291bnQsXG4gICAgICAgIHogPSBbXTtcblxuICAgIGlmICghKGJhc2UgJSAxKSAmJiBqIC0gaSA8IG4pIHtcbiAgICAgIGkgPSBNYXRoLnJvdW5kKGkpIC0gMSwgaiA9IE1hdGgucm91bmQoaikgKyAxO1xuICAgICAgaWYgKHUgPiAwKSBmb3IgKDsgaSA8IGo7ICsraSkge1xuICAgICAgICBmb3IgKGsgPSAxLCBwID0gcG93cyhpKTsgayA8IGJhc2U7ICsraykge1xuICAgICAgICAgIHQgPSBwICogaztcbiAgICAgICAgICBpZiAodCA8IHUpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICh0ID4gdikgYnJlYWs7XG4gICAgICAgICAgei5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgZm9yICg7IGkgPCBqOyArK2kpIHtcbiAgICAgICAgZm9yIChrID0gYmFzZSAtIDEsIHAgPSBwb3dzKGkpOyBrID49IDE7IC0taykge1xuICAgICAgICAgIHQgPSBwICogaztcbiAgICAgICAgICBpZiAodCA8IHUpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICh0ID4gdikgYnJlYWs7XG4gICAgICAgICAgei5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHogPSB0aWNrcyhpLCBqLCBNYXRoLm1pbihqIC0gaSwgbikpLm1hcChwb3dzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gciA/IHoucmV2ZXJzZSgpIDogejtcbiAgfTtcblxuICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikge1xuICAgIGlmIChzcGVjaWZpZXIgPT0gbnVsbCkgc3BlY2lmaWVyID0gYmFzZSA9PT0gMTAgPyBcIi4wZVwiIDogXCIsXCI7XG4gICAgaWYgKHR5cGVvZiBzcGVjaWZpZXIgIT09IFwiZnVuY3Rpb25cIikgc3BlY2lmaWVyID0gZm9ybWF0KHNwZWNpZmllcik7XG4gICAgaWYgKGNvdW50ID09PSBJbmZpbml0eSkgcmV0dXJuIHNwZWNpZmllcjtcbiAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDtcbiAgICB2YXIgayA9IE1hdGgubWF4KDEsIGJhc2UgKiBjb3VudCAvIHNjYWxlLnRpY2tzKCkubGVuZ3RoKTsgLy8gVE9ETyBmYXN0IGVzdGltYXRlP1xuICAgIHJldHVybiBmdW5jdGlvbihkKSB7XG4gICAgICB2YXIgaSA9IGQgLyBwb3dzKE1hdGgucm91bmQobG9ncyhkKSkpO1xuICAgICAgaWYgKGkgKiBiYXNlIDwgYmFzZSAtIDAuNSkgaSAqPSBiYXNlO1xuICAgICAgcmV0dXJuIGkgPD0gayA/IHNwZWNpZmllcihkKSA6IFwiXCI7XG4gICAgfTtcbiAgfTtcblxuICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRvbWFpbihuaWNlKGRvbWFpbigpLCB7XG4gICAgICBmbG9vcjogZnVuY3Rpb24oeCkgeyByZXR1cm4gcG93cyhNYXRoLmZsb29yKGxvZ3MoeCkpKTsgfSxcbiAgICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5jZWlsKGxvZ3MoeCkpKTsgfVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gc2NhbGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZygpIHtcbiAgdmFyIHNjYWxlID0gbG9nZ2lzaCh0cmFuc2Zvcm1lcigpKS5kb21haW4oWzEsIDEwXSk7XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjb3B5KHNjYWxlLCBsb2coKSkuYmFzZShzY2FsZS5iYXNlKCkpO1xuICB9O1xuXG4gIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcblxuICByZXR1cm4gc2NhbGU7XG59XG4iLCJpbXBvcnQge2xpbmVhcmlzaH0gZnJvbSBcIi4vbGluZWFyXCI7XG5pbXBvcnQge2NvcHksIHRyYW5zZm9ybWVyfSBmcm9tIFwiLi9jb250aW51b3VzXCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdFwiO1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1TeW1sb2coYykge1xuICByZXR1cm4gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBNYXRoLnNpZ24oeCkgKiBNYXRoLmxvZzFwKE1hdGguYWJzKHggLyBjKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVN5bWV4cChjKSB7XG4gIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIE1hdGguc2lnbih4KSAqIE1hdGguZXhwbTEoTWF0aC5hYnMoeCkpICogYztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN5bWxvZ2lzaCh0cmFuc2Zvcm0pIHtcbiAgdmFyIGMgPSAxLCBzY2FsZSA9IHRyYW5zZm9ybSh0cmFuc2Zvcm1TeW1sb2coYyksIHRyYW5zZm9ybVN5bWV4cChjKSk7XG5cbiAgc2NhbGUuY29uc3RhbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmFuc2Zvcm0odHJhbnNmb3JtU3ltbG9nKGMgPSArXyksIHRyYW5zZm9ybVN5bWV4cChjKSkgOiBjO1xuICB9O1xuXG4gIHJldHVybiBsaW5lYXJpc2goc2NhbGUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzeW1sb2coKSB7XG4gIHZhciBzY2FsZSA9IHN5bWxvZ2lzaCh0cmFuc2Zvcm1lcigpKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIHN5bWxvZygpKS5jb25zdGFudChzY2FsZS5jb25zdGFudCgpKTtcbiAgfTtcblxuICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xufVxuIiwiaW1wb3J0IHtsaW5lYXJpc2h9IGZyb20gXCIuL2xpbmVhclwiO1xuaW1wb3J0IHtjb3B5LCBpZGVudGl0eSwgdHJhbnNmb3JtZXJ9IGZyb20gXCIuL2NvbnRpbnVvdXNcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0XCI7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVBvdyhleHBvbmVudCkge1xuICByZXR1cm4gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4IDwgMCA/IC1NYXRoLnBvdygteCwgZXhwb25lbnQpIDogTWF0aC5wb3coeCwgZXhwb25lbnQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1TcXJ0KHgpIHtcbiAgcmV0dXJuIHggPCAwID8gLU1hdGguc3FydCgteCkgOiBNYXRoLnNxcnQoeCk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVNxdWFyZSh4KSB7XG4gIHJldHVybiB4IDwgMCA/IC14ICogeCA6IHggKiB4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG93aXNoKHRyYW5zZm9ybSkge1xuICB2YXIgc2NhbGUgPSB0cmFuc2Zvcm0oaWRlbnRpdHksIGlkZW50aXR5KSxcbiAgICAgIGV4cG9uZW50ID0gMTtcblxuICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgIHJldHVybiBleHBvbmVudCA9PT0gMSA/IHRyYW5zZm9ybShpZGVudGl0eSwgaWRlbnRpdHkpXG4gICAgICAgIDogZXhwb25lbnQgPT09IDAuNSA/IHRyYW5zZm9ybSh0cmFuc2Zvcm1TcXJ0LCB0cmFuc2Zvcm1TcXVhcmUpXG4gICAgICAgIDogdHJhbnNmb3JtKHRyYW5zZm9ybVBvdyhleHBvbmVudCksIHRyYW5zZm9ybVBvdygxIC8gZXhwb25lbnQpKTtcbiAgfVxuXG4gIHNjYWxlLmV4cG9uZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4cG9uZW50ID0gK18sIHJlc2NhbGUoKSkgOiBleHBvbmVudDtcbiAgfTtcblxuICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcG93KCkge1xuICB2YXIgc2NhbGUgPSBwb3dpc2godHJhbnNmb3JtZXIoKSk7XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjb3B5KHNjYWxlLCBwb3coKSkuZXhwb25lbnQoc2NhbGUuZXhwb25lbnQoKSk7XG4gIH07XG5cbiAgaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xuXG4gIHJldHVybiBzY2FsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNxcnQoKSB7XG4gIHJldHVybiBwb3cuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5leHBvbmVudCgwLjUpO1xufVxuIiwiaW1wb3J0IHthc2NlbmRpbmcsIGJpc2VjdCwgcXVhbnRpbGUgYXMgdGhyZXNob2xkfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7c2xpY2V9IGZyb20gXCIuL2FycmF5XCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSgpIHtcbiAgdmFyIGRvbWFpbiA9IFtdLFxuICAgICAgcmFuZ2UgPSBbXSxcbiAgICAgIHRocmVzaG9sZHMgPSBbXSxcbiAgICAgIHVua25vd247XG5cbiAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICB2YXIgaSA9IDAsIG4gPSBNYXRoLm1heCgxLCByYW5nZS5sZW5ndGgpO1xuICAgIHRocmVzaG9sZHMgPSBuZXcgQXJyYXkobiAtIDEpO1xuICAgIHdoaWxlICgrK2kgPCBuKSB0aHJlc2hvbGRzW2kgLSAxXSA9IHRocmVzaG9sZChkb21haW4sIGkgLyBuKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgcmV0dXJuIGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogcmFuZ2VbYmlzZWN0KHRocmVzaG9sZHMsIHgpXTtcbiAgfVxuXG4gIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcbiAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgcmV0dXJuIGkgPCAwID8gW05hTiwgTmFOXSA6IFtcbiAgICAgIGkgPiAwID8gdGhyZXNob2xkc1tpIC0gMV0gOiBkb21haW5bMF0sXG4gICAgICBpIDwgdGhyZXNob2xkcy5sZW5ndGggPyB0aHJlc2hvbGRzW2ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXVxuICAgIF07XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpO1xuICAgIGRvbWFpbiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gXy5sZW5ndGgsIGQ7IGkgPCBuOyArK2kpIGlmIChkID0gX1tpXSwgZCAhPSBudWxsICYmICFpc05hTihkID0gK2QpKSBkb21haW4ucHVzaChkKTtcbiAgICBkb21haW4uc29ydChhc2NlbmRpbmcpO1xuICAgIHJldHVybiByZXNjYWxlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZS5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duO1xuICB9O1xuXG4gIHNjYWxlLnF1YW50aWxlcyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aHJlc2hvbGRzLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBxdWFudGlsZSgpXG4gICAgICAgIC5kb21haW4oZG9tYWluKVxuICAgICAgICAucmFuZ2UocmFuZ2UpXG4gICAgICAgIC51bmtub3duKHVua25vd24pO1xuICB9O1xuXG4gIHJldHVybiBpbml0UmFuZ2UuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG59XG4iLCJpbXBvcnQge2Jpc2VjdH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge3NsaWNlfSBmcm9tIFwiLi9hcnJheVwiO1xuaW1wb3J0IHtsaW5lYXJpc2h9IGZyb20gXCIuL2xpbmVhclwiO1xuaW1wb3J0IHtpbml0UmFuZ2V9IGZyb20gXCIuL2luaXRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVhbnRpemUoKSB7XG4gIHZhciB4MCA9IDAsXG4gICAgICB4MSA9IDEsXG4gICAgICBuID0gMSxcbiAgICAgIGRvbWFpbiA9IFswLjVdLFxuICAgICAgcmFuZ2UgPSBbMCwgMV0sXG4gICAgICB1bmtub3duO1xuXG4gIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICByZXR1cm4geCA8PSB4ID8gcmFuZ2VbYmlzZWN0KGRvbWFpbiwgeCwgMCwgbildIDogdW5rbm93bjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgdmFyIGkgPSAtMTtcbiAgICBkb21haW4gPSBuZXcgQXJyYXkobik7XG4gICAgd2hpbGUgKCsraSA8IG4pIGRvbWFpbltpXSA9ICgoaSArIDEpICogeDEgLSAoaSAtIG4pICogeDApIC8gKG4gKyAxKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSArX1swXSwgeDEgPSArX1sxXSwgcmVzY2FsZSgpKSA6IFt4MCwgeDFdO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG4gPSAocmFuZ2UgPSBzbGljZS5jYWxsKF8pKS5sZW5ndGggLSAxLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7XG4gICAgdmFyIGkgPSByYW5nZS5pbmRleE9mKHkpO1xuICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl1cbiAgICAgICAgOiBpIDwgMSA/IFt4MCwgZG9tYWluWzBdXVxuICAgICAgICA6IGkgPj0gbiA/IFtkb21haW5bbiAtIDFdLCB4MV1cbiAgICAgICAgOiBbZG9tYWluW2kgLSAxXSwgZG9tYWluW2ldXTtcbiAgfTtcblxuICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiBzY2FsZTtcbiAgfTtcblxuICBzY2FsZS50aHJlc2hvbGRzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRvbWFpbi5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcXVhbnRpemUoKVxuICAgICAgICAuZG9tYWluKFt4MCwgeDFdKVxuICAgICAgICAucmFuZ2UocmFuZ2UpXG4gICAgICAgIC51bmtub3duKHVua25vd24pO1xuICB9O1xuXG4gIHJldHVybiBpbml0UmFuZ2UuYXBwbHkobGluZWFyaXNoKHNjYWxlKSwgYXJndW1lbnRzKTtcbn1cbiIsImltcG9ydCB7YmlzZWN0fSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7c2xpY2V9IGZyb20gXCIuL2FycmF5XCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aHJlc2hvbGQoKSB7XG4gIHZhciBkb21haW4gPSBbMC41XSxcbiAgICAgIHJhbmdlID0gWzAsIDFdLFxuICAgICAgdW5rbm93bixcbiAgICAgIG4gPSAxO1xuXG4gIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICByZXR1cm4geCA8PSB4ID8gcmFuZ2VbYmlzZWN0KGRvbWFpbiwgeCwgMCwgbildIDogdW5rbm93bjtcbiAgfVxuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSBzbGljZS5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoIC0gMSksIHNjYWxlKSA6IGRvbWFpbi5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UuY2FsbChfKSwgbiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCAtIDEpLCBzY2FsZSkgOiByYW5nZS5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcbiAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgcmV0dXJuIFtkb21haW5baSAtIDFdLCBkb21haW5baV1dO1xuICB9O1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aHJlc2hvbGQoKVxuICAgICAgICAuZG9tYWluKGRvbWFpbilcbiAgICAgICAgLnJhbmdlKHJhbmdlKVxuICAgICAgICAudW5rbm93bih1bmtub3duKTtcbiAgfTtcblxuICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xufVxuIiwidmFyIHQwID0gbmV3IERhdGUsXG4gICAgdDEgPSBuZXcgRGF0ZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbmV3SW50ZXJ2YWwoZmxvb3JpLCBvZmZzZXRpLCBjb3VudCwgZmllbGQpIHtcblxuICBmdW5jdGlvbiBpbnRlcnZhbChkYXRlKSB7XG4gICAgcmV0dXJuIGZsb29yaShkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/IG5ldyBEYXRlIDogbmV3IERhdGUoK2RhdGUpKSwgZGF0ZTtcbiAgfVxuXG4gIGludGVydmFsLmZsb29yID0gZnVuY3Rpb24oZGF0ZSkge1xuICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSksIGRhdGU7XG4gIH07XG5cbiAgaW50ZXJ2YWwuY2VpbCA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICByZXR1cm4gZmxvb3JpKGRhdGUgPSBuZXcgRGF0ZShkYXRlIC0gMSkpLCBvZmZzZXRpKGRhdGUsIDEpLCBmbG9vcmkoZGF0ZSksIGRhdGU7XG4gIH07XG5cbiAgaW50ZXJ2YWwucm91bmQgPSBmdW5jdGlvbihkYXRlKSB7XG4gICAgdmFyIGQwID0gaW50ZXJ2YWwoZGF0ZSksXG4gICAgICAgIGQxID0gaW50ZXJ2YWwuY2VpbChkYXRlKTtcbiAgICByZXR1cm4gZGF0ZSAtIGQwIDwgZDEgLSBkYXRlID8gZDAgOiBkMTtcbiAgfTtcblxuICBpbnRlcnZhbC5vZmZzZXQgPSBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gICAgcmV0dXJuIG9mZnNldGkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSwgc3RlcCA9PSBudWxsID8gMSA6IE1hdGguZmxvb3Ioc3RlcCkpLCBkYXRlO1xuICB9O1xuXG4gIGludGVydmFsLnJhbmdlID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgICB2YXIgcmFuZ2UgPSBbXSwgcHJldmlvdXM7XG4gICAgc3RhcnQgPSBpbnRlcnZhbC5jZWlsKHN0YXJ0KTtcbiAgICBzdGVwID0gc3RlcCA9PSBudWxsID8gMSA6IE1hdGguZmxvb3Ioc3RlcCk7XG4gICAgaWYgKCEoc3RhcnQgPCBzdG9wKSB8fCAhKHN0ZXAgPiAwKSkgcmV0dXJuIHJhbmdlOyAvLyBhbHNvIGhhbmRsZXMgSW52YWxpZCBEYXRlXG4gICAgZG8gcmFuZ2UucHVzaChwcmV2aW91cyA9IG5ldyBEYXRlKCtzdGFydCkpLCBvZmZzZXRpKHN0YXJ0LCBzdGVwKSwgZmxvb3JpKHN0YXJ0KTtcbiAgICB3aGlsZSAocHJldmlvdXMgPCBzdGFydCAmJiBzdGFydCA8IHN0b3ApO1xuICAgIHJldHVybiByYW5nZTtcbiAgfTtcblxuICBpbnRlcnZhbC5maWx0ZXIgPSBmdW5jdGlvbih0ZXN0KSB7XG4gICAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRpbWUoZGF0ZSAtIDEpO1xuICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgICAgIGlmIChkYXRlID49IGRhdGUpIHtcbiAgICAgICAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKytzdGVwIDw9IDApIHtcbiAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCAtMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgIH0gZWxzZSB3aGlsZSAoLS1zdGVwID49IDApIHtcbiAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCArMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBpZiAoY291bnQpIHtcbiAgICBpbnRlcnZhbC5jb3VudCA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHQwLnNldFRpbWUoK3N0YXJ0KSwgdDEuc2V0VGltZSgrZW5kKTtcbiAgICAgIGZsb29yaSh0MCksIGZsb29yaSh0MSk7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihjb3VudCh0MCwgdDEpKTtcbiAgICB9O1xuXG4gICAgaW50ZXJ2YWwuZXZlcnkgPSBmdW5jdGlvbihzdGVwKSB7XG4gICAgICBzdGVwID0gTWF0aC5mbG9vcihzdGVwKTtcbiAgICAgIHJldHVybiAhaXNGaW5pdGUoc3RlcCkgfHwgIShzdGVwID4gMCkgPyBudWxsXG4gICAgICAgICAgOiAhKHN0ZXAgPiAxKSA/IGludGVydmFsXG4gICAgICAgICAgOiBpbnRlcnZhbC5maWx0ZXIoZmllbGRcbiAgICAgICAgICAgICAgPyBmdW5jdGlvbihkKSB7IHJldHVybiBmaWVsZChkKSAlIHN0ZXAgPT09IDA7IH1cbiAgICAgICAgICAgICAgOiBmdW5jdGlvbihkKSB7IHJldHVybiBpbnRlcnZhbC5jb3VudCgwLCBkKSAlIHN0ZXAgPT09IDA7IH0pO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gaW50ZXJ2YWw7XG59XG4iLCJpbXBvcnQgaW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcblxudmFyIHllYXIgPSBpbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0TW9udGgoMCwgMSk7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgc3RlcCk7XG59LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHJldHVybiBlbmQuZ2V0RnVsbFllYXIoKSAtIHN0YXJ0LmdldEZ1bGxZZWFyKCk7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7XG59KTtcblxuLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLlxueWVhci5ldmVyeSA9IGZ1bmN0aW9uKGspIHtcbiAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIGRhdGUuc2V0RnVsbFllYXIoTWF0aC5mbG9vcihkYXRlLmdldEZ1bGxZZWFyKCkgLyBrKSAqIGspO1xuICAgIGRhdGUuc2V0TW9udGgoMCwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICAgIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgc3RlcCAqIGspO1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHllYXI7XG5leHBvcnQgdmFyIHllYXJzID0geWVhci5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuXG52YXIgbW9udGggPSBpbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0RGF0ZSgxKTtcbiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBzdGVwKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGVuZC5nZXRNb250aCgpIC0gc3RhcnQuZ2V0TW9udGgoKSArIChlbmQuZ2V0RnVsbFllYXIoKSAtIHN0YXJ0LmdldEZ1bGxZZWFyKCkpICogMTI7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldE1vbnRoKCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbW9udGg7XG5leHBvcnQgdmFyIG1vbnRocyA9IG1vbnRoLnJhbmdlO1xuIiwiZXhwb3J0IHZhciBkdXJhdGlvblNlY29uZCA9IDFlMztcbmV4cG9ydCB2YXIgZHVyYXRpb25NaW51dGUgPSA2ZTQ7XG5leHBvcnQgdmFyIGR1cmF0aW9uSG91ciA9IDM2ZTU7XG5leHBvcnQgdmFyIGR1cmF0aW9uRGF5ID0gODY0ZTU7XG5leHBvcnQgdmFyIGR1cmF0aW9uV2VlayA9IDYwNDhlNTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvbk1pbnV0ZSwgZHVyYXRpb25XZWVrfSBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuXG5mdW5jdGlvbiB3ZWVrZGF5KGkpIHtcbiAgcmV0dXJuIGludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIDcgLSBpKSAlIDcpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7XG4gIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbldlZWs7XG4gIH0pO1xufVxuXG5leHBvcnQgdmFyIHN1bmRheSA9IHdlZWtkYXkoMCk7XG5leHBvcnQgdmFyIG1vbmRheSA9IHdlZWtkYXkoMSk7XG5leHBvcnQgdmFyIHR1ZXNkYXkgPSB3ZWVrZGF5KDIpO1xuZXhwb3J0IHZhciB3ZWRuZXNkYXkgPSB3ZWVrZGF5KDMpO1xuZXhwb3J0IHZhciB0aHVyc2RheSA9IHdlZWtkYXkoNCk7XG5leHBvcnQgdmFyIGZyaWRheSA9IHdlZWtkYXkoNSk7XG5leHBvcnQgdmFyIHNhdHVyZGF5ID0gd2Vla2RheSg2KTtcblxuZXhwb3J0IHZhciBzdW5kYXlzID0gc3VuZGF5LnJhbmdlO1xuZXhwb3J0IHZhciBtb25kYXlzID0gbW9uZGF5LnJhbmdlO1xuZXhwb3J0IHZhciB0dWVzZGF5cyA9IHR1ZXNkYXkucmFuZ2U7XG5leHBvcnQgdmFyIHdlZG5lc2RheXMgPSB3ZWRuZXNkYXkucmFuZ2U7XG5leHBvcnQgdmFyIHRodXJzZGF5cyA9IHRodXJzZGF5LnJhbmdlO1xuZXhwb3J0IHZhciBmcmlkYXlzID0gZnJpZGF5LnJhbmdlO1xuZXhwb3J0IHZhciBzYXR1cmRheXMgPSBzYXR1cmRheS5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvbkRheSwgZHVyYXRpb25NaW51dGV9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbnZhciBkYXkgPSBpbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIHN0ZXApO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbkRheTtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpIC0gMTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkYXk7XG5leHBvcnQgdmFyIGRheXMgPSBkYXkucmFuZ2U7XG4iLCJpbXBvcnQgaW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcbmltcG9ydCB7ZHVyYXRpb25Ib3VyLCBkdXJhdGlvbk1pbnV0ZSwgZHVyYXRpb25TZWNvbmR9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbnZhciBob3VyID0gaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICBkYXRlLnNldFRpbWUoZGF0ZSAtIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSBkYXRlLmdldFNlY29uZHMoKSAqIGR1cmF0aW9uU2Vjb25kIC0gZGF0ZS5nZXRNaW51dGVzKCkgKiBkdXJhdGlvbk1pbnV0ZSk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbkhvdXIpO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uSG91cjtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBob3VyO1xuZXhwb3J0IHZhciBob3VycyA9IGhvdXIucmFuZ2U7XG4iLCJpbXBvcnQgaW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcbmltcG9ydCB7ZHVyYXRpb25NaW51dGUsIGR1cmF0aW9uU2Vjb25kfSBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuXG52YXIgbWludXRlID0gaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICBkYXRlLnNldFRpbWUoZGF0ZSAtIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSBkYXRlLmdldFNlY29uZHMoKSAqIGR1cmF0aW9uU2Vjb25kKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1pbnV0ZTtcbmV4cG9ydCB2YXIgbWludXRlcyA9IG1pbnV0ZS5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvblNlY29uZH0gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcblxudmFyIHNlY29uZCA9IGludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXRUaW1lKGRhdGUgLSBkYXRlLmdldE1pbGxpc2Vjb25kcygpKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uU2Vjb25kKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvblNlY29uZDtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0VVRDU2Vjb25kcygpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHNlY29uZDtcbmV4cG9ydCB2YXIgc2Vjb25kcyA9IHNlY29uZC5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuXG52YXIgbWlsbGlzZWNvbmQgPSBpbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgLy8gbm9vcFxufSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGVuZCAtIHN0YXJ0O1xufSk7XG5cbi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS5cbm1pbGxpc2Vjb25kLmV2ZXJ5ID0gZnVuY3Rpb24oaykge1xuICBrID0gTWF0aC5mbG9vcihrKTtcbiAgaWYgKCFpc0Zpbml0ZShrKSB8fCAhKGsgPiAwKSkgcmV0dXJuIG51bGw7XG4gIGlmICghKGsgPiAxKSkgcmV0dXJuIG1pbGxpc2Vjb25kO1xuICByZXR1cm4gaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBrKSAqIGspO1xuICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGspO1xuICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBrO1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pbGxpc2Vjb25kO1xuZXhwb3J0IHZhciBtaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZC5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvbldlZWt9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbmZ1bmN0aW9uIHV0Y1dlZWtkYXkoaSkge1xuICByZXR1cm4gaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIChkYXRlLmdldFVUQ0RheSgpICsgNyAtIGkpICUgNyk7XG4gICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICAgIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXAgKiA3KTtcbiAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25XZWVrO1xuICB9KTtcbn1cblxuZXhwb3J0IHZhciB1dGNTdW5kYXkgPSB1dGNXZWVrZGF5KDApO1xuZXhwb3J0IHZhciB1dGNNb25kYXkgPSB1dGNXZWVrZGF5KDEpO1xuZXhwb3J0IHZhciB1dGNUdWVzZGF5ID0gdXRjV2Vla2RheSgyKTtcbmV4cG9ydCB2YXIgdXRjV2VkbmVzZGF5ID0gdXRjV2Vla2RheSgzKTtcbmV4cG9ydCB2YXIgdXRjVGh1cnNkYXkgPSB1dGNXZWVrZGF5KDQpO1xuZXhwb3J0IHZhciB1dGNGcmlkYXkgPSB1dGNXZWVrZGF5KDUpO1xuZXhwb3J0IHZhciB1dGNTYXR1cmRheSA9IHV0Y1dlZWtkYXkoNik7XG5cbmV4cG9ydCB2YXIgdXRjU3VuZGF5cyA9IHV0Y1N1bmRheS5yYW5nZTtcbmV4cG9ydCB2YXIgdXRjTW9uZGF5cyA9IHV0Y01vbmRheS5yYW5nZTtcbmV4cG9ydCB2YXIgdXRjVHVlc2RheXMgPSB1dGNUdWVzZGF5LnJhbmdlO1xuZXhwb3J0IHZhciB1dGNXZWRuZXNkYXlzID0gdXRjV2VkbmVzZGF5LnJhbmdlO1xuZXhwb3J0IHZhciB1dGNUaHVyc2RheXMgPSB1dGNUaHVyc2RheS5yYW5nZTtcbmV4cG9ydCB2YXIgdXRjRnJpZGF5cyA9IHV0Y0ZyaWRheS5yYW5nZTtcbmV4cG9ydCB2YXIgdXRjU2F0dXJkYXlzID0gdXRjU2F0dXJkYXkucmFuZ2U7XG4iLCJpbXBvcnQgaW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcbmltcG9ydCB7ZHVyYXRpb25EYXl9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbnZhciB1dGNEYXkgPSBpbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXApO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uRGF5O1xufSwgZnVuY3Rpb24oZGF0ZSkge1xuICByZXR1cm4gZGF0ZS5nZXRVVENEYXRlKCkgLSAxO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHV0Y0RheTtcbmV4cG9ydCB2YXIgdXRjRGF5cyA9IHV0Y0RheS5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuXG52YXIgdXRjWWVhciA9IGludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTtcbiAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXRVVENGdWxsWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgKyBzdGVwKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGVuZC5nZXRVVENGdWxsWWVhcigpIC0gc3RhcnQuZ2V0VVRDRnVsbFllYXIoKTtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbn0pO1xuXG4vLyBBbiBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuXG51dGNZZWFyLmV2ZXJ5ID0gZnVuY3Rpb24oaykge1xuICByZXR1cm4gIWlzRmluaXRlKGsgPSBNYXRoLmZsb29yKGspKSB8fCAhKGsgPiAwKSA/IG51bGwgOiBpbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSAvIGspICogayk7XG4gICAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTtcbiAgICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgKyBzdGVwICogayk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgdXRjWWVhcjtcbmV4cG9ydCB2YXIgdXRjWWVhcnMgPSB1dGNZZWFyLnJhbmdlO1xuIiwiaW1wb3J0IHtcbiAgdGltZURheSxcbiAgdGltZVN1bmRheSxcbiAgdGltZU1vbmRheSxcbiAgdGltZVRodXJzZGF5LFxuICB0aW1lWWVhcixcbiAgdXRjRGF5LFxuICB1dGNTdW5kYXksXG4gIHV0Y01vbmRheSxcbiAgdXRjVGh1cnNkYXksXG4gIHV0Y1llYXJcbn0gZnJvbSBcImQzLXRpbWVcIjtcblxuZnVuY3Rpb24gbG9jYWxEYXRlKGQpIHtcbiAgaWYgKDAgPD0gZC55ICYmIGQueSA8IDEwMCkge1xuICAgIHZhciBkYXRlID0gbmV3IERhdGUoLTEsIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpO1xuICAgIGRhdGUuc2V0RnVsbFllYXIoZC55KTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuICByZXR1cm4gbmV3IERhdGUoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKTtcbn1cblxuZnVuY3Rpb24gdXRjRGF0ZShkKSB7XG4gIGlmICgwIDw9IGQueSAmJiBkLnkgPCAxMDApIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcihkLnkpO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhkLnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpKTtcbn1cblxuZnVuY3Rpb24gbmV3RGF0ZSh5LCBtLCBkKSB7XG4gIHJldHVybiB7eTogeSwgbTogbSwgZDogZCwgSDogMCwgTTogMCwgUzogMCwgTDogMH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdExvY2FsZShsb2NhbGUpIHtcbiAgdmFyIGxvY2FsZV9kYXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSxcbiAgICAgIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsXG4gICAgICBsb2NhbGVfdGltZSA9IGxvY2FsZS50aW1lLFxuICAgICAgbG9jYWxlX3BlcmlvZHMgPSBsb2NhbGUucGVyaW9kcyxcbiAgICAgIGxvY2FsZV93ZWVrZGF5cyA9IGxvY2FsZS5kYXlzLFxuICAgICAgbG9jYWxlX3Nob3J0V2Vla2RheXMgPSBsb2NhbGUuc2hvcnREYXlzLFxuICAgICAgbG9jYWxlX21vbnRocyA9IGxvY2FsZS5tb250aHMsXG4gICAgICBsb2NhbGVfc2hvcnRNb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHM7XG5cbiAgdmFyIHBlcmlvZFJlID0gZm9ybWF0UmUobG9jYWxlX3BlcmlvZHMpLFxuICAgICAgcGVyaW9kTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9wZXJpb2RzKSxcbiAgICAgIHdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV93ZWVrZGF5cyksXG4gICAgICB3ZWVrZGF5TG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV93ZWVrZGF5cyksXG4gICAgICBzaG9ydFdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSxcbiAgICAgIHNob3J0V2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRXZWVrZGF5cyksXG4gICAgICBtb250aFJlID0gZm9ybWF0UmUobG9jYWxlX21vbnRocyksXG4gICAgICBtb250aExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfbW9udGhzKSxcbiAgICAgIHNob3J0TW9udGhSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydE1vbnRocyksXG4gICAgICBzaG9ydE1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7XG5cbiAgdmFyIGZvcm1hdHMgPSB7XG4gICAgXCJhXCI6IGZvcm1hdFNob3J0V2Vla2RheSxcbiAgICBcIkFcIjogZm9ybWF0V2Vla2RheSxcbiAgICBcImJcIjogZm9ybWF0U2hvcnRNb250aCxcbiAgICBcIkJcIjogZm9ybWF0TW9udGgsXG4gICAgXCJjXCI6IG51bGwsXG4gICAgXCJkXCI6IGZvcm1hdERheU9mTW9udGgsXG4gICAgXCJlXCI6IGZvcm1hdERheU9mTW9udGgsXG4gICAgXCJmXCI6IGZvcm1hdE1pY3Jvc2Vjb25kcyxcbiAgICBcIkhcIjogZm9ybWF0SG91cjI0LFxuICAgIFwiSVwiOiBmb3JtYXRIb3VyMTIsXG4gICAgXCJqXCI6IGZvcm1hdERheU9mWWVhcixcbiAgICBcIkxcIjogZm9ybWF0TWlsbGlzZWNvbmRzLFxuICAgIFwibVwiOiBmb3JtYXRNb250aE51bWJlcixcbiAgICBcIk1cIjogZm9ybWF0TWludXRlcyxcbiAgICBcInBcIjogZm9ybWF0UGVyaW9kLFxuICAgIFwicVwiOiBmb3JtYXRRdWFydGVyLFxuICAgIFwiUVwiOiBmb3JtYXRVbml4VGltZXN0YW1wLFxuICAgIFwic1wiOiBmb3JtYXRVbml4VGltZXN0YW1wU2Vjb25kcyxcbiAgICBcIlNcIjogZm9ybWF0U2Vjb25kcyxcbiAgICBcInVcIjogZm9ybWF0V2Vla2RheU51bWJlck1vbmRheSxcbiAgICBcIlVcIjogZm9ybWF0V2Vla051bWJlclN1bmRheSxcbiAgICBcIlZcIjogZm9ybWF0V2Vla051bWJlcklTTyxcbiAgICBcIndcIjogZm9ybWF0V2Vla2RheU51bWJlclN1bmRheSxcbiAgICBcIldcIjogZm9ybWF0V2Vla051bWJlck1vbmRheSxcbiAgICBcInhcIjogbnVsbCxcbiAgICBcIlhcIjogbnVsbCxcbiAgICBcInlcIjogZm9ybWF0WWVhcixcbiAgICBcIllcIjogZm9ybWF0RnVsbFllYXIsXG4gICAgXCJaXCI6IGZvcm1hdFpvbmUsXG4gICAgXCIlXCI6IGZvcm1hdExpdGVyYWxQZXJjZW50XG4gIH07XG5cbiAgdmFyIHV0Y0Zvcm1hdHMgPSB7XG4gICAgXCJhXCI6IGZvcm1hdFVUQ1Nob3J0V2Vla2RheSxcbiAgICBcIkFcIjogZm9ybWF0VVRDV2Vla2RheSxcbiAgICBcImJcIjogZm9ybWF0VVRDU2hvcnRNb250aCxcbiAgICBcIkJcIjogZm9ybWF0VVRDTW9udGgsXG4gICAgXCJjXCI6IG51bGwsXG4gICAgXCJkXCI6IGZvcm1hdFVUQ0RheU9mTW9udGgsXG4gICAgXCJlXCI6IGZvcm1hdFVUQ0RheU9mTW9udGgsXG4gICAgXCJmXCI6IGZvcm1hdFVUQ01pY3Jvc2Vjb25kcyxcbiAgICBcIkhcIjogZm9ybWF0VVRDSG91cjI0LFxuICAgIFwiSVwiOiBmb3JtYXRVVENIb3VyMTIsXG4gICAgXCJqXCI6IGZvcm1hdFVUQ0RheU9mWWVhcixcbiAgICBcIkxcIjogZm9ybWF0VVRDTWlsbGlzZWNvbmRzLFxuICAgIFwibVwiOiBmb3JtYXRVVENNb250aE51bWJlcixcbiAgICBcIk1cIjogZm9ybWF0VVRDTWludXRlcyxcbiAgICBcInBcIjogZm9ybWF0VVRDUGVyaW9kLFxuICAgIFwicVwiOiBmb3JtYXRVVENRdWFydGVyLFxuICAgIFwiUVwiOiBmb3JtYXRVbml4VGltZXN0YW1wLFxuICAgIFwic1wiOiBmb3JtYXRVbml4VGltZXN0YW1wU2Vjb25kcyxcbiAgICBcIlNcIjogZm9ybWF0VVRDU2Vjb25kcyxcbiAgICBcInVcIjogZm9ybWF0VVRDV2Vla2RheU51bWJlck1vbmRheSxcbiAgICBcIlVcIjogZm9ybWF0VVRDV2Vla051bWJlclN1bmRheSxcbiAgICBcIlZcIjogZm9ybWF0VVRDV2Vla051bWJlcklTTyxcbiAgICBcIndcIjogZm9ybWF0VVRDV2Vla2RheU51bWJlclN1bmRheSxcbiAgICBcIldcIjogZm9ybWF0VVRDV2Vla051bWJlck1vbmRheSxcbiAgICBcInhcIjogbnVsbCxcbiAgICBcIlhcIjogbnVsbCxcbiAgICBcInlcIjogZm9ybWF0VVRDWWVhcixcbiAgICBcIllcIjogZm9ybWF0VVRDRnVsbFllYXIsXG4gICAgXCJaXCI6IGZvcm1hdFVUQ1pvbmUsXG4gICAgXCIlXCI6IGZvcm1hdExpdGVyYWxQZXJjZW50XG4gIH07XG5cbiAgdmFyIHBhcnNlcyA9IHtcbiAgICBcImFcIjogcGFyc2VTaG9ydFdlZWtkYXksXG4gICAgXCJBXCI6IHBhcnNlV2Vla2RheSxcbiAgICBcImJcIjogcGFyc2VTaG9ydE1vbnRoLFxuICAgIFwiQlwiOiBwYXJzZU1vbnRoLFxuICAgIFwiY1wiOiBwYXJzZUxvY2FsZURhdGVUaW1lLFxuICAgIFwiZFwiOiBwYXJzZURheU9mTW9udGgsXG4gICAgXCJlXCI6IHBhcnNlRGF5T2ZNb250aCxcbiAgICBcImZcIjogcGFyc2VNaWNyb3NlY29uZHMsXG4gICAgXCJIXCI6IHBhcnNlSG91cjI0LFxuICAgIFwiSVwiOiBwYXJzZUhvdXIyNCxcbiAgICBcImpcIjogcGFyc2VEYXlPZlllYXIsXG4gICAgXCJMXCI6IHBhcnNlTWlsbGlzZWNvbmRzLFxuICAgIFwibVwiOiBwYXJzZU1vbnRoTnVtYmVyLFxuICAgIFwiTVwiOiBwYXJzZU1pbnV0ZXMsXG4gICAgXCJwXCI6IHBhcnNlUGVyaW9kLFxuICAgIFwicVwiOiBwYXJzZVF1YXJ0ZXIsXG4gICAgXCJRXCI6IHBhcnNlVW5peFRpbWVzdGFtcCxcbiAgICBcInNcIjogcGFyc2VVbml4VGltZXN0YW1wU2Vjb25kcyxcbiAgICBcIlNcIjogcGFyc2VTZWNvbmRzLFxuICAgIFwidVwiOiBwYXJzZVdlZWtkYXlOdW1iZXJNb25kYXksXG4gICAgXCJVXCI6IHBhcnNlV2Vla051bWJlclN1bmRheSxcbiAgICBcIlZcIjogcGFyc2VXZWVrTnVtYmVySVNPLFxuICAgIFwid1wiOiBwYXJzZVdlZWtkYXlOdW1iZXJTdW5kYXksXG4gICAgXCJXXCI6IHBhcnNlV2Vla051bWJlck1vbmRheSxcbiAgICBcInhcIjogcGFyc2VMb2NhbGVEYXRlLFxuICAgIFwiWFwiOiBwYXJzZUxvY2FsZVRpbWUsXG4gICAgXCJ5XCI6IHBhcnNlWWVhcixcbiAgICBcIllcIjogcGFyc2VGdWxsWWVhcixcbiAgICBcIlpcIjogcGFyc2Vab25lLFxuICAgIFwiJVwiOiBwYXJzZUxpdGVyYWxQZXJjZW50XG4gIH07XG5cbiAgLy8gVGhlc2UgcmVjdXJzaXZlIGRpcmVjdGl2ZSBkZWZpbml0aW9ucyBtdXN0IGJlIGRlZmVycmVkLlxuICBmb3JtYXRzLnggPSBuZXdGb3JtYXQobG9jYWxlX2RhdGUsIGZvcm1hdHMpO1xuICBmb3JtYXRzLlggPSBuZXdGb3JtYXQobG9jYWxlX3RpbWUsIGZvcm1hdHMpO1xuICBmb3JtYXRzLmMgPSBuZXdGb3JtYXQobG9jYWxlX2RhdGVUaW1lLCBmb3JtYXRzKTtcbiAgdXRjRm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCB1dGNGb3JtYXRzKTtcbiAgdXRjRm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCB1dGNGb3JtYXRzKTtcbiAgdXRjRm9ybWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgdXRjRm9ybWF0cyk7XG5cbiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllciwgZm9ybWF0cykge1xuICAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7XG4gICAgICB2YXIgc3RyaW5nID0gW10sXG4gICAgICAgICAgaSA9IC0xLFxuICAgICAgICAgIGogPSAwLFxuICAgICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLFxuICAgICAgICAgIGMsXG4gICAgICAgICAgcGFkLFxuICAgICAgICAgIGZvcm1hdDtcblxuICAgICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSBkYXRlID0gbmV3IERhdGUoK2RhdGUpO1xuXG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBpZiAoc3BlY2lmaWVyLmNoYXJDb2RlQXQoaSkgPT09IDM3KSB7XG4gICAgICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTtcbiAgICAgICAgICBpZiAoKHBhZCA9IHBhZHNbYyA9IHNwZWNpZmllci5jaGFyQXQoKytpKV0pICE9IG51bGwpIGMgPSBzcGVjaWZpZXIuY2hhckF0KCsraSk7XG4gICAgICAgICAgZWxzZSBwYWQgPSBjID09PSBcImVcIiA/IFwiIFwiIDogXCIwXCI7XG4gICAgICAgICAgaWYgKGZvcm1hdCA9IGZvcm1hdHNbY10pIGMgPSBmb3JtYXQoZGF0ZSwgcGFkKTtcbiAgICAgICAgICBzdHJpbmcucHVzaChjKTtcbiAgICAgICAgICBqID0gaSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTtcbiAgICAgIHJldHVybiBzdHJpbmcuam9pbihcIlwiKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbmV3UGFyc2Uoc3BlY2lmaWVyLCBaKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgdmFyIGQgPSBuZXdEYXRlKDE5MDAsIHVuZGVmaW5lZCwgMSksXG4gICAgICAgICAgaSA9IHBhcnNlU3BlY2lmaWVyKGQsIHNwZWNpZmllciwgc3RyaW5nICs9IFwiXCIsIDApLFxuICAgICAgICAgIHdlZWssIGRheTtcbiAgICAgIGlmIChpICE9IHN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gICAgICAvLyBJZiBhIFVOSVggdGltZXN0YW1wIGlzIHNwZWNpZmllZCwgcmV0dXJuIGl0LlxuICAgICAgaWYgKFwiUVwiIGluIGQpIHJldHVybiBuZXcgRGF0ZShkLlEpO1xuICAgICAgaWYgKFwic1wiIGluIGQpIHJldHVybiBuZXcgRGF0ZShkLnMgKiAxMDAwICsgKFwiTFwiIGluIGQgPyBkLkwgOiAwKSk7XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgdXRjUGFyc2UsIG5ldmVyIHVzZSB0aGUgbG9jYWwgdGltZXpvbmUuXG4gICAgICBpZiAoWiAmJiAhKFwiWlwiIGluIGQpKSBkLlogPSAwO1xuXG4gICAgICAvLyBUaGUgYW0tcG0gZmxhZyBpcyAwIGZvciBBTSwgYW5kIDEgZm9yIFBNLlxuICAgICAgaWYgKFwicFwiIGluIGQpIGQuSCA9IGQuSCAlIDEyICsgZC5wICogMTI7XG5cbiAgICAgIC8vIElmIHRoZSBtb250aCB3YXMgbm90IHNwZWNpZmllZCwgaW5oZXJpdCBmcm9tIHRoZSBxdWFydGVyLlxuICAgICAgaWYgKGQubSA9PT0gdW5kZWZpbmVkKSBkLm0gPSBcInFcIiBpbiBkID8gZC5xIDogMDtcblxuICAgICAgLy8gQ29udmVydCBkYXktb2Ytd2VlayBhbmQgd2Vlay1vZi15ZWFyIHRvIGRheS1vZi15ZWFyLlxuICAgICAgaWYgKFwiVlwiIGluIGQpIHtcbiAgICAgICAgaWYgKGQuViA8IDEgfHwgZC5WID4gNTMpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIShcIndcIiBpbiBkKSkgZC53ID0gMTtcbiAgICAgICAgaWYgKFwiWlwiIGluIGQpIHtcbiAgICAgICAgICB3ZWVrID0gdXRjRGF0ZShuZXdEYXRlKGQueSwgMCwgMSkpLCBkYXkgPSB3ZWVrLmdldFVUQ0RheSgpO1xuICAgICAgICAgIHdlZWsgPSBkYXkgPiA0IHx8IGRheSA9PT0gMCA/IHV0Y01vbmRheS5jZWlsKHdlZWspIDogdXRjTW9uZGF5KHdlZWspO1xuICAgICAgICAgIHdlZWsgPSB1dGNEYXkub2Zmc2V0KHdlZWssIChkLlYgLSAxKSAqIDcpO1xuICAgICAgICAgIGQueSA9IHdlZWsuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICAgICAgICBkLm0gPSB3ZWVrLmdldFVUQ01vbnRoKCk7XG4gICAgICAgICAgZC5kID0gd2Vlay5nZXRVVENEYXRlKCkgKyAoZC53ICsgNikgJSA3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdlZWsgPSBsb2NhbERhdGUobmV3RGF0ZShkLnksIDAsIDEpKSwgZGF5ID0gd2Vlay5nZXREYXkoKTtcbiAgICAgICAgICB3ZWVrID0gZGF5ID4gNCB8fCBkYXkgPT09IDAgPyB0aW1lTW9uZGF5LmNlaWwod2VlaykgOiB0aW1lTW9uZGF5KHdlZWspO1xuICAgICAgICAgIHdlZWsgPSB0aW1lRGF5Lm9mZnNldCh3ZWVrLCAoZC5WIC0gMSkgKiA3KTtcbiAgICAgICAgICBkLnkgPSB3ZWVrLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgZC5tID0gd2Vlay5nZXRNb250aCgpO1xuICAgICAgICAgIGQuZCA9IHdlZWsuZ2V0RGF0ZSgpICsgKGQudyArIDYpICUgNztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcIldcIiBpbiBkIHx8IFwiVVwiIGluIGQpIHtcbiAgICAgICAgaWYgKCEoXCJ3XCIgaW4gZCkpIGQudyA9IFwidVwiIGluIGQgPyBkLnUgJSA3IDogXCJXXCIgaW4gZCA/IDEgOiAwO1xuICAgICAgICBkYXkgPSBcIlpcIiBpbiBkID8gdXRjRGF0ZShuZXdEYXRlKGQueSwgMCwgMSkpLmdldFVUQ0RheSgpIDogbG9jYWxEYXRlKG5ld0RhdGUoZC55LCAwLCAxKSkuZ2V0RGF5KCk7XG4gICAgICAgIGQubSA9IDA7XG4gICAgICAgIGQuZCA9IFwiV1wiIGluIGQgPyAoZC53ICsgNikgJSA3ICsgZC5XICogNyAtIChkYXkgKyA1KSAlIDcgOiBkLncgKyBkLlUgKiA3IC0gKGRheSArIDYpICUgNztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYSB0aW1lIHpvbmUgaXMgc3BlY2lmaWVkLCBhbGwgZmllbGRzIGFyZSBpbnRlcnByZXRlZCBhcyBVVEMgYW5kIHRoZW5cbiAgICAgIC8vIG9mZnNldCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0aW1lIHpvbmUuXG4gICAgICBpZiAoXCJaXCIgaW4gZCkge1xuICAgICAgICBkLkggKz0gZC5aIC8gMTAwIHwgMDtcbiAgICAgICAgZC5NICs9IGQuWiAlIDEwMDtcbiAgICAgICAgcmV0dXJuIHV0Y0RhdGUoZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgYWxsIGZpZWxkcyBhcmUgaW4gbG9jYWwgdGltZS5cbiAgICAgIHJldHVybiBsb2NhbERhdGUoZCk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlU3BlY2lmaWVyKGQsIHNwZWNpZmllciwgc3RyaW5nLCBqKSB7XG4gICAgdmFyIGkgPSAwLFxuICAgICAgICBuID0gc3BlY2lmaWVyLmxlbmd0aCxcbiAgICAgICAgbSA9IHN0cmluZy5sZW5ndGgsXG4gICAgICAgIGMsXG4gICAgICAgIHBhcnNlO1xuXG4gICAgd2hpbGUgKGkgPCBuKSB7XG4gICAgICBpZiAoaiA+PSBtKSByZXR1cm4gLTE7XG4gICAgICBjID0gc3BlY2lmaWVyLmNoYXJDb2RlQXQoaSsrKTtcbiAgICAgIGlmIChjID09PSAzNykge1xuICAgICAgICBjID0gc3BlY2lmaWVyLmNoYXJBdChpKyspO1xuICAgICAgICBwYXJzZSA9IHBhcnNlc1tjIGluIHBhZHMgPyBzcGVjaWZpZXIuY2hhckF0KGkrKykgOiBjXTtcbiAgICAgICAgaWYgKCFwYXJzZSB8fCAoKGogPSBwYXJzZShkLCBzdHJpbmcsIGopKSA8IDApKSByZXR1cm4gLTE7XG4gICAgICB9IGVsc2UgaWYgKGMgIT0gc3RyaW5nLmNoYXJDb2RlQXQoaisrKSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGo7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVBlcmlvZChkLCBzdHJpbmcsIGkpIHtcbiAgICB2YXIgbiA9IHBlcmlvZFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICByZXR1cm4gbiA/IChkLnAgPSBwZXJpb2RMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VTaG9ydFdlZWtkYXkoZCwgc3RyaW5nLCBpKSB7XG4gICAgdmFyIG4gPSBzaG9ydFdlZWtkYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgcmV0dXJuIG4gPyAoZC53ID0gc2hvcnRXZWVrZGF5TG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShkLCBzdHJpbmcsIGkpIHtcbiAgICB2YXIgbiA9IHdlZWtkYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgcmV0dXJuIG4gPyAoZC53ID0gd2Vla2RheUxvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVNob3J0TW9udGgoZCwgc3RyaW5nLCBpKSB7XG4gICAgdmFyIG4gPSBzaG9ydE1vbnRoUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICAgIHJldHVybiBuID8gKGQubSA9IHNob3J0TW9udGhMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VNb250aChkLCBzdHJpbmcsIGkpIHtcbiAgICB2YXIgbiA9IG1vbnRoUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICAgIHJldHVybiBuID8gKGQubSA9IG1vbnRoTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlTG9jYWxlRGF0ZVRpbWUoZCwgc3RyaW5nLCBpKSB7XG4gICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV9kYXRlVGltZSwgc3RyaW5nLCBpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlTG9jYWxlRGF0ZShkLCBzdHJpbmcsIGkpIHtcbiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX2RhdGUsIHN0cmluZywgaSk7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUxvY2FsZVRpbWUoZCwgc3RyaW5nLCBpKSB7XG4gICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV90aW1lLCBzdHJpbmcsIGkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0U2hvcnRXZWVrZGF5KGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX3Nob3J0V2Vla2RheXNbZC5nZXREYXkoKV07XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRXZWVrZGF5KGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2QuZ2V0RGF5KCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0U2hvcnRNb250aChkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV9zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0TW9udGgoZCkge1xuICAgIHJldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0TW9udGgoKV07XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRQZXJpb2QoZCkge1xuICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1srKGQuZ2V0SG91cnMoKSA+PSAxMildO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UXVhcnRlcihkKSB7XG4gICAgcmV0dXJuIDEgKyB+fihkLmdldE1vbnRoKCkgLyAzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ1Nob3J0V2Vla2RheShkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0VVRDRGF5KCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheShkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldFVUQ0RheSgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ1Nob3J0TW9udGgoZCkge1xuICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRVVENNb250aCgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ01vbnRoKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldFVUQ01vbnRoKCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0VVRDUGVyaW9kKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldFVUQ0hvdXJzKCkgPj0gMTIpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ1F1YXJ0ZXIoZCkge1xuICAgIHJldHVybiAxICsgfn4oZC5nZXRVVENNb250aCgpIC8gMyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvcm1hdDogZnVuY3Rpb24oc3BlY2lmaWVyKSB7XG4gICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gXCJcIiwgZm9ybWF0cyk7XG4gICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07XG4gICAgICByZXR1cm4gZjtcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBwID0gbmV3UGFyc2Uoc3BlY2lmaWVyICs9IFwiXCIsIGZhbHNlKTtcbiAgICAgIHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTtcbiAgICAgIHJldHVybiBwO1xuICAgIH0sXG4gICAgdXRjRm9ybWF0OiBmdW5jdGlvbihzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBmID0gbmV3Rm9ybWF0KHNwZWNpZmllciArPSBcIlwiLCB1dGNGb3JtYXRzKTtcbiAgICAgIGYudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTtcbiAgICAgIHJldHVybiBmO1xuICAgIH0sXG4gICAgdXRjUGFyc2U6IGZ1bmN0aW9uKHNwZWNpZmllcikge1xuICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIgKz0gXCJcIiwgdHJ1ZSk7XG4gICAgICBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH07XG59XG5cbnZhciBwYWRzID0ge1wiLVwiOiBcIlwiLCBcIl9cIjogXCIgXCIsIFwiMFwiOiBcIjBcIn0sXG4gICAgbnVtYmVyUmUgPSAvXlxccypcXGQrLywgLy8gbm90ZTogaWdub3JlcyBuZXh0IGRpcmVjdGl2ZVxuICAgIHBlcmNlbnRSZSA9IC9eJS8sXG4gICAgcmVxdW90ZVJlID0gL1tcXFxcXiQqKz98W1xcXSgpLnt9XS9nO1xuXG5mdW5jdGlvbiBwYWQodmFsdWUsIGZpbGwsIHdpZHRoKSB7XG4gIHZhciBzaWduID0gdmFsdWUgPCAwID8gXCItXCIgOiBcIlwiLFxuICAgICAgc3RyaW5nID0gKHNpZ24gPyAtdmFsdWUgOiB2YWx1ZSkgKyBcIlwiLFxuICAgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgcmV0dXJuIHNpZ24gKyAobGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpICsgc3RyaW5nIDogc3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gcmVxdW90ZShzKSB7XG4gIHJldHVybiBzLnJlcGxhY2UocmVxdW90ZVJlLCBcIlxcXFwkJlwiKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmUobmFtZXMpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoXCJeKD86XCIgKyBuYW1lcy5tYXAocmVxdW90ZSkuam9pbihcInxcIikgKyBcIilcIiwgXCJpXCIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRMb29rdXAobmFtZXMpIHtcbiAgdmFyIG1hcCA9IHt9LCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBtYXBbbmFtZXNbaV0udG9Mb3dlckNhc2UoKV0gPSBpO1xuICByZXR1cm4gbWFwO1xufVxuXG5mdW5jdGlvbiBwYXJzZVdlZWtkYXlOdW1iZXJTdW5kYXkoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTtcbiAgcmV0dXJuIG4gPyAoZC53ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXZWVrZGF5TnVtYmVyTW9uZGF5KGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7XG4gIHJldHVybiBuID8gKGQudSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2Vla051bWJlclN1bmRheShkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLlUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJJU08oZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgcmV0dXJuIG4gPyAoZC5WID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXZWVrTnVtYmVyTW9uZGF5KGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQuVyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnVsbFllYXIoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDQpKTtcbiAgcmV0dXJuIG4gPyAoZC55ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VZZWFyKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQueSA9ICtuWzBdICsgKCtuWzBdID4gNjggPyAxOTAwIDogMjAwMCksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2Vab25lKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IC9eKFopfChbKy1dXFxkXFxkKSg/Ojo/KFxcZFxcZCkpPy8uZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDYpKTtcbiAgcmV0dXJuIG4gPyAoZC5aID0gblsxXSA/IDAgOiAtKG5bMl0gKyAoblszXSB8fCBcIjAwXCIpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZVF1YXJ0ZXIoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTtcbiAgcmV0dXJuIG4gPyAoZC5xID0gblswXSAqIDMgLSAzLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTW9udGhOdW1iZXIoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgcmV0dXJuIG4gPyAoZC5tID0gblswXSAtIDEsIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXlPZk1vbnRoKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQuZCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF5T2ZZZWFyKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7XG4gIHJldHVybiBuID8gKGQubSA9IDAsIGQuZCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSG91cjI0KGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQuSCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWludXRlcyhkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLk0gPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNlY29uZHMoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgcmV0dXJuIG4gPyAoZC5TID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNaWxsaXNlY29uZHMoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTtcbiAgcmV0dXJuIG4gPyAoZC5MID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNaWNyb3NlY29uZHMoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDYpKTtcbiAgcmV0dXJuIG4gPyAoZC5MID0gTWF0aC5mbG9vcihuWzBdIC8gMTAwMCksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaXRlcmFsUGVyY2VudChkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBwZXJjZW50UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTtcbiAgcmV0dXJuIG4gPyBpICsgblswXS5sZW5ndGggOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VVbml4VGltZXN0YW1wKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgcmV0dXJuIG4gPyAoZC5RID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VVbml4VGltZXN0YW1wU2Vjb25kcyhkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gIHJldHVybiBuID8gKGQucyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERheU9mTW9udGgoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0RGF0ZSgpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0SG91cjI0KGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldEhvdXJzKCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRIb3VyMTIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF5T2ZZZWFyKGQsIHApIHtcbiAgcmV0dXJuIHBhZCgxICsgdGltZURheS5jb3VudCh0aW1lWWVhcihkKSwgZCksIHAsIDMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRNaWxsaXNlY29uZHMoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0TWlsbGlzZWNvbmRzKCksIHAsIDMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRNaWNyb3NlY29uZHMoZCwgcCkge1xuICByZXR1cm4gZm9ybWF0TWlsbGlzZWNvbmRzKGQsIHApICsgXCIwMDBcIjtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TW9udGhOdW1iZXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0TW9udGgoKSArIDEsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRNaW51dGVzKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldE1pbnV0ZXMoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlY29uZHMoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0U2Vjb25kcygpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0V2Vla2RheU51bWJlck1vbmRheShkKSB7XG4gIHZhciBkYXkgPSBkLmdldERheSgpO1xuICByZXR1cm4gZGF5ID09PSAwID8gNyA6IGRheTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlclN1bmRheShkLCBwKSB7XG4gIHJldHVybiBwYWQodGltZVN1bmRheS5jb3VudCh0aW1lWWVhcihkKSAtIDEsIGQpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlcklTTyhkLCBwKSB7XG4gIHZhciBkYXkgPSBkLmdldERheSgpO1xuICBkID0gKGRheSA+PSA0IHx8IGRheSA9PT0gMCkgPyB0aW1lVGh1cnNkYXkoZCkgOiB0aW1lVGh1cnNkYXkuY2VpbChkKTtcbiAgcmV0dXJuIHBhZCh0aW1lVGh1cnNkYXkuY291bnQodGltZVllYXIoZCksIGQpICsgKHRpbWVZZWFyKGQpLmdldERheSgpID09PSA0KSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXkoZCkge1xuICByZXR1cm4gZC5nZXREYXkoKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlck1vbmRheShkLCBwKSB7XG4gIHJldHVybiBwYWQodGltZU1vbmRheS5jb3VudCh0aW1lWWVhcihkKSAtIDEsIGQpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0WWVhcihkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRGdWxsWWVhcigpICUgMTAwLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RnVsbFllYXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0Wm9uZShkKSB7XG4gIHZhciB6ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpO1xuICByZXR1cm4gKHogPiAwID8gXCItXCIgOiAoeiAqPSAtMSwgXCIrXCIpKVxuICAgICAgKyBwYWQoeiAvIDYwIHwgMCwgXCIwXCIsIDIpXG4gICAgICArIHBhZCh6ICUgNjAsIFwiMFwiLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDRGF5T2ZNb250aChkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENEYXRlKCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENIb3VyMjQoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDSG91cnMoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ0hvdXIxMihkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENIb3VycygpICUgMTIgfHwgMTIsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENEYXlPZlllYXIoZCwgcCkge1xuICByZXR1cm4gcGFkKDEgKyB1dGNEYXkuY291bnQodXRjWWVhcihkKSwgZCksIHAsIDMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENNaWxsaXNlY29uZHMoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksIHAsIDMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENNaWNyb3NlY29uZHMoZCwgcCkge1xuICByZXR1cm4gZm9ybWF0VVRDTWlsbGlzZWNvbmRzKGQsIHApICsgXCIwMDBcIjtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDTW9udGhOdW1iZXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENNaW51dGVzKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFVUQ01pbnV0ZXMoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ1NlY29uZHMoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDU2Vjb25kcygpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheU51bWJlck1vbmRheShkKSB7XG4gIHZhciBkb3cgPSBkLmdldFVUQ0RheSgpO1xuICByZXR1cm4gZG93ID09PSAwID8gNyA6IGRvdztcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlclN1bmRheShkLCBwKSB7XG4gIHJldHVybiBwYWQodXRjU3VuZGF5LmNvdW50KHV0Y1llYXIoZCkgLSAxLCBkKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJJU08oZCwgcCkge1xuICB2YXIgZGF5ID0gZC5nZXRVVENEYXkoKTtcbiAgZCA9IChkYXkgPj0gNCB8fCBkYXkgPT09IDApID8gdXRjVGh1cnNkYXkoZCkgOiB1dGNUaHVyc2RheS5jZWlsKGQpO1xuICByZXR1cm4gcGFkKHV0Y1RodXJzZGF5LmNvdW50KHV0Y1llYXIoZCksIGQpICsgKHV0Y1llYXIoZCkuZ2V0VVRDRGF5KCkgPT09IDQpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheU51bWJlclN1bmRheShkKSB7XG4gIHJldHVybiBkLmdldFVUQ0RheSgpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVyTW9uZGF5KGQsIHApIHtcbiAgcmV0dXJuIHBhZCh1dGNNb25kYXkuY291bnQodXRjWWVhcihkKSAtIDEsIGQpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDWWVhcihkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDRnVsbFllYXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDWm9uZSgpIHtcbiAgcmV0dXJuIFwiKzAwMDBcIjtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbFBlcmNlbnQoKSB7XG4gIHJldHVybiBcIiVcIjtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VW5peFRpbWVzdGFtcChkKSB7XG4gIHJldHVybiArZDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VW5peFRpbWVzdGFtcFNlY29uZHMoZCkge1xuICByZXR1cm4gTWF0aC5mbG9vcigrZCAvIDEwMDApO1xufVxuIiwiaW1wb3J0IGZvcm1hdExvY2FsZSBmcm9tIFwiLi9sb2NhbGUuanNcIjtcblxudmFyIGxvY2FsZTtcbmV4cG9ydCB2YXIgdGltZUZvcm1hdDtcbmV4cG9ydCB2YXIgdGltZVBhcnNlO1xuZXhwb3J0IHZhciB1dGNGb3JtYXQ7XG5leHBvcnQgdmFyIHV0Y1BhcnNlO1xuXG5kZWZhdWx0TG9jYWxlKHtcbiAgZGF0ZVRpbWU6IFwiJXgsICVYXCIsXG4gIGRhdGU6IFwiJS1tLyUtZC8lWVwiLFxuICB0aW1lOiBcIiUtSTolTTolUyAlcFwiLFxuICBwZXJpb2RzOiBbXCJBTVwiLCBcIlBNXCJdLFxuICBkYXlzOiBbXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiXSxcbiAgc2hvcnREYXlzOiBbXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIl0sXG4gIG1vbnRoczogW1wiSmFudWFyeVwiLCBcIkZlYnJ1YXJ5XCIsIFwiTWFyY2hcIiwgXCJBcHJpbFwiLCBcIk1heVwiLCBcIkp1bmVcIiwgXCJKdWx5XCIsIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2N0b2JlclwiLCBcIk5vdmVtYmVyXCIsIFwiRGVjZW1iZXJcIl0sXG4gIHNob3J0TW9udGhzOiBbXCJKYW5cIiwgXCJGZWJcIiwgXCJNYXJcIiwgXCJBcHJcIiwgXCJNYXlcIiwgXCJKdW5cIiwgXCJKdWxcIiwgXCJBdWdcIiwgXCJTZXBcIiwgXCJPY3RcIiwgXCJOb3ZcIiwgXCJEZWNcIl1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHtcbiAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pO1xuICB0aW1lRm9ybWF0ID0gbG9jYWxlLmZvcm1hdDtcbiAgdGltZVBhcnNlID0gbG9jYWxlLnBhcnNlO1xuICB1dGNGb3JtYXQgPSBsb2NhbGUudXRjRm9ybWF0O1xuICB1dGNQYXJzZSA9IGxvY2FsZS51dGNQYXJzZTtcbiAgcmV0dXJuIGxvY2FsZTtcbn1cbiIsImltcG9ydCB7YmlzZWN0b3IsIHRpY2tTdGVwfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7dGltZVllYXIsIHRpbWVNb250aCwgdGltZVdlZWssIHRpbWVEYXksIHRpbWVIb3VyLCB0aW1lTWludXRlLCB0aW1lU2Vjb25kLCB0aW1lTWlsbGlzZWNvbmR9IGZyb20gXCJkMy10aW1lXCI7XG5pbXBvcnQge3RpbWVGb3JtYXR9IGZyb20gXCJkMy10aW1lLWZvcm1hdFwiO1xuaW1wb3J0IHttYXB9IGZyb20gXCIuL2FycmF5XCI7XG5pbXBvcnQgY29udGludW91cywge2NvcHksIGlkZW50aXR5fSBmcm9tIFwiLi9jb250aW51b3VzXCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdFwiO1xuaW1wb3J0IG5pY2UgZnJvbSBcIi4vbmljZVwiO1xuXG52YXIgZHVyYXRpb25TZWNvbmQgPSAxMDAwLFxuICAgIGR1cmF0aW9uTWludXRlID0gZHVyYXRpb25TZWNvbmQgKiA2MCxcbiAgICBkdXJhdGlvbkhvdXIgPSBkdXJhdGlvbk1pbnV0ZSAqIDYwLFxuICAgIGR1cmF0aW9uRGF5ID0gZHVyYXRpb25Ib3VyICogMjQsXG4gICAgZHVyYXRpb25XZWVrID0gZHVyYXRpb25EYXkgKiA3LFxuICAgIGR1cmF0aW9uTW9udGggPSBkdXJhdGlvbkRheSAqIDMwLFxuICAgIGR1cmF0aW9uWWVhciA9IGR1cmF0aW9uRGF5ICogMzY1O1xuXG5mdW5jdGlvbiBkYXRlKHQpIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHQpO1xufVxuXG5mdW5jdGlvbiBudW1iZXIodCkge1xuICByZXR1cm4gdCBpbnN0YW5jZW9mIERhdGUgPyArdCA6ICtuZXcgRGF0ZSgrdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhcih5ZWFyLCBtb250aCwgd2VlaywgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGZvcm1hdCkge1xuICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGlkZW50aXR5LCBpZGVudGl0eSksXG4gICAgICBpbnZlcnQgPSBzY2FsZS5pbnZlcnQsXG4gICAgICBkb21haW4gPSBzY2FsZS5kb21haW47XG5cbiAgdmFyIGZvcm1hdE1pbGxpc2Vjb25kID0gZm9ybWF0KFwiLiVMXCIpLFxuICAgICAgZm9ybWF0U2Vjb25kID0gZm9ybWF0KFwiOiVTXCIpLFxuICAgICAgZm9ybWF0TWludXRlID0gZm9ybWF0KFwiJUk6JU1cIiksXG4gICAgICBmb3JtYXRIb3VyID0gZm9ybWF0KFwiJUkgJXBcIiksXG4gICAgICBmb3JtYXREYXkgPSBmb3JtYXQoXCIlYSAlZFwiKSxcbiAgICAgIGZvcm1hdFdlZWsgPSBmb3JtYXQoXCIlYiAlZFwiKSxcbiAgICAgIGZvcm1hdE1vbnRoID0gZm9ybWF0KFwiJUJcIiksXG4gICAgICBmb3JtYXRZZWFyID0gZm9ybWF0KFwiJVlcIik7XG5cbiAgdmFyIHRpY2tJbnRlcnZhbHMgPSBbXG4gICAgW3NlY29uZCwgIDEsICAgICAgZHVyYXRpb25TZWNvbmRdLFxuICAgIFtzZWNvbmQsICA1LCAgNSAqIGR1cmF0aW9uU2Vjb25kXSxcbiAgICBbc2Vjb25kLCAxNSwgMTUgKiBkdXJhdGlvblNlY29uZF0sXG4gICAgW3NlY29uZCwgMzAsIDMwICogZHVyYXRpb25TZWNvbmRdLFxuICAgIFttaW51dGUsICAxLCAgICAgIGR1cmF0aW9uTWludXRlXSxcbiAgICBbbWludXRlLCAgNSwgIDUgKiBkdXJhdGlvbk1pbnV0ZV0sXG4gICAgW21pbnV0ZSwgMTUsIDE1ICogZHVyYXRpb25NaW51dGVdLFxuICAgIFttaW51dGUsIDMwLCAzMCAqIGR1cmF0aW9uTWludXRlXSxcbiAgICBbICBob3VyLCAgMSwgICAgICBkdXJhdGlvbkhvdXIgIF0sXG4gICAgWyAgaG91ciwgIDMsICAzICogZHVyYXRpb25Ib3VyICBdLFxuICAgIFsgIGhvdXIsICA2LCAgNiAqIGR1cmF0aW9uSG91ciAgXSxcbiAgICBbICBob3VyLCAxMiwgMTIgKiBkdXJhdGlvbkhvdXIgIF0sXG4gICAgWyAgIGRheSwgIDEsICAgICAgZHVyYXRpb25EYXkgICBdLFxuICAgIFsgICBkYXksICAyLCAgMiAqIGR1cmF0aW9uRGF5ICAgXSxcbiAgICBbICB3ZWVrLCAgMSwgICAgICBkdXJhdGlvbldlZWsgIF0sXG4gICAgWyBtb250aCwgIDEsICAgICAgZHVyYXRpb25Nb250aCBdLFxuICAgIFsgbW9udGgsICAzLCAgMyAqIGR1cmF0aW9uTW9udGggXSxcbiAgICBbICB5ZWFyLCAgMSwgICAgICBkdXJhdGlvblllYXIgIF1cbiAgXTtcblxuICBmdW5jdGlvbiB0aWNrRm9ybWF0KGRhdGUpIHtcbiAgICByZXR1cm4gKHNlY29uZChkYXRlKSA8IGRhdGUgPyBmb3JtYXRNaWxsaXNlY29uZFxuICAgICAgICA6IG1pbnV0ZShkYXRlKSA8IGRhdGUgPyBmb3JtYXRTZWNvbmRcbiAgICAgICAgOiBob3VyKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbnV0ZVxuICAgICAgICA6IGRheShkYXRlKSA8IGRhdGUgPyBmb3JtYXRIb3VyXG4gICAgICAgIDogbW9udGgoZGF0ZSkgPCBkYXRlID8gKHdlZWsoZGF0ZSkgPCBkYXRlID8gZm9ybWF0RGF5IDogZm9ybWF0V2VlaylcbiAgICAgICAgOiB5ZWFyKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1vbnRoXG4gICAgICAgIDogZm9ybWF0WWVhcikoZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIHN0YXJ0LCBzdG9wLCBzdGVwKSB7XG4gICAgaWYgKGludGVydmFsID09IG51bGwpIGludGVydmFsID0gMTA7XG5cbiAgICAvLyBJZiBhIGRlc2lyZWQgdGljayBjb3VudCBpcyBzcGVjaWZpZWQsIHBpY2sgYSByZWFzb25hYmxlIHRpY2sgaW50ZXJ2YWxcbiAgICAvLyBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHRoZSBkb21haW4gYW5kIGEgcm91Z2ggZXN0aW1hdGUgb2YgdGljayBzaXplLlxuICAgIC8vIE90aGVyd2lzZSwgYXNzdW1lIGludGVydmFsIGlzIGFscmVhZHkgYSB0aW1lIGludGVydmFsIGFuZCB1c2UgaXQuXG4gICAgaWYgKHR5cGVvZiBpbnRlcnZhbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdmFyIHRhcmdldCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBpbnRlcnZhbCxcbiAgICAgICAgICBpID0gYmlzZWN0b3IoZnVuY3Rpb24oaSkgeyByZXR1cm4gaVsyXTsgfSkucmlnaHQodGlja0ludGVydmFscywgdGFyZ2V0KTtcbiAgICAgIGlmIChpID09PSB0aWNrSW50ZXJ2YWxzLmxlbmd0aCkge1xuICAgICAgICBzdGVwID0gdGlja1N0ZXAoc3RhcnQgLyBkdXJhdGlvblllYXIsIHN0b3AgLyBkdXJhdGlvblllYXIsIGludGVydmFsKTtcbiAgICAgICAgaW50ZXJ2YWwgPSB5ZWFyO1xuICAgICAgfSBlbHNlIGlmIChpKSB7XG4gICAgICAgIGkgPSB0aWNrSW50ZXJ2YWxzW3RhcmdldCAvIHRpY2tJbnRlcnZhbHNbaSAtIDFdWzJdIDwgdGlja0ludGVydmFsc1tpXVsyXSAvIHRhcmdldCA/IGkgLSAxIDogaV07XG4gICAgICAgIHN0ZXAgPSBpWzFdO1xuICAgICAgICBpbnRlcnZhbCA9IGlbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGVwID0gTWF0aC5tYXgodGlja1N0ZXAoc3RhcnQsIHN0b3AsIGludGVydmFsKSwgMSk7XG4gICAgICAgIGludGVydmFsID0gbWlsbGlzZWNvbmQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ZXAgPT0gbnVsbCA/IGludGVydmFsIDogaW50ZXJ2YWwuZXZlcnkoc3RlcCk7XG4gIH1cblxuICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGludmVydCh5KSk7XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZG9tYWluKG1hcC5jYWxsKF8sIG51bWJlcikpIDogZG9tYWluKCkubWFwKGRhdGUpO1xuICB9O1xuXG4gIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oaW50ZXJ2YWwsIHN0ZXApIHtcbiAgICB2YXIgZCA9IGRvbWFpbigpLFxuICAgICAgICB0MCA9IGRbMF0sXG4gICAgICAgIHQxID0gZFtkLmxlbmd0aCAtIDFdLFxuICAgICAgICByID0gdDEgPCB0MCxcbiAgICAgICAgdDtcbiAgICBpZiAocikgdCA9IHQwLCB0MCA9IHQxLCB0MSA9IHQ7XG4gICAgdCA9IHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgdDAsIHQxLCBzdGVwKTtcbiAgICB0ID0gdCA/IHQucmFuZ2UodDAsIHQxICsgMSkgOiBbXTsgLy8gaW5jbHVzaXZlIHN0b3BcbiAgICByZXR1cm4gciA/IHQucmV2ZXJzZSgpIDogdDtcbiAgfTtcblxuICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikge1xuICAgIHJldHVybiBzcGVjaWZpZXIgPT0gbnVsbCA/IHRpY2tGb3JtYXQgOiBmb3JtYXQoc3BlY2lmaWVyKTtcbiAgfTtcblxuICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oaW50ZXJ2YWwsIHN0ZXApIHtcbiAgICB2YXIgZCA9IGRvbWFpbigpO1xuICAgIHJldHVybiAoaW50ZXJ2YWwgPSB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgc3RlcCkpXG4gICAgICAgID8gZG9tYWluKG5pY2UoZCwgaW50ZXJ2YWwpKVxuICAgICAgICA6IHNjYWxlO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gY29weShzY2FsZSwgY2FsZW5kYXIoeWVhciwgbW9udGgsIHdlZWssIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kLCBmb3JtYXQpKTtcbiAgfTtcblxuICByZXR1cm4gc2NhbGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KGNhbGVuZGFyKHRpbWVZZWFyLCB0aW1lTW9udGgsIHRpbWVXZWVrLCB0aW1lRGF5LCB0aW1lSG91ciwgdGltZU1pbnV0ZSwgdGltZVNlY29uZCwgdGltZU1pbGxpc2Vjb25kLCB0aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDIwMDAsIDAsIDEpLCBuZXcgRGF0ZSgyMDAwLCAwLCAyKV0pLCBhcmd1bWVudHMpO1xufVxuIiwiaW1wb3J0IGludGVydmFsIGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5cbnZhciB1dGNNb250aCA9IGludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXRVVENEYXRlKDEpO1xuICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xufSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICBkYXRlLnNldFVUQ01vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSArIHN0ZXApO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gZW5kLmdldFVUQ01vbnRoKCkgLSBzdGFydC5nZXRVVENNb250aCgpICsgKGVuZC5nZXRVVENGdWxsWWVhcigpIC0gc3RhcnQuZ2V0VVRDRnVsbFllYXIoKSkgKiAxMjtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0VVRDTW9udGgoKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB1dGNNb250aDtcbmV4cG9ydCB2YXIgdXRjTW9udGhzID0gdXRjTW9udGgucmFuZ2U7XG4iLCJpbXBvcnQgaW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcbmltcG9ydCB7ZHVyYXRpb25Ib3VyfSBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuXG52YXIgdXRjSG91ciA9IGludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXRVVENNaW51dGVzKDAsIDAsIDApO1xufSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldFVUQ0hvdXJzKCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdXRjSG91cjtcbmV4cG9ydCB2YXIgdXRjSG91cnMgPSB1dGNIb3VyLnJhbmdlO1xuIiwiaW1wb3J0IGludGVydmFsIGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5pbXBvcnQge2R1cmF0aW9uTWludXRlfSBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuXG52YXIgdXRjTWludXRlID0gaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICBkYXRlLnNldFVUQ1NlY29uZHMoMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbk1pbnV0ZSk7XG59LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGU7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldFVUQ01pbnV0ZXMoKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB1dGNNaW51dGU7XG5leHBvcnQgdmFyIHV0Y01pbnV0ZXMgPSB1dGNNaW51dGUucmFuZ2U7XG4iLCJpbXBvcnQge2NhbGVuZGFyfSBmcm9tIFwiLi90aW1lXCI7XG5pbXBvcnQge3V0Y0Zvcm1hdH0gZnJvbSBcImQzLXRpbWUtZm9ybWF0XCI7XG5pbXBvcnQge3V0Y1llYXIsIHV0Y01vbnRoLCB1dGNXZWVrLCB1dGNEYXksIHV0Y0hvdXIsIHV0Y01pbnV0ZSwgdXRjU2Vjb25kLCB1dGNNaWxsaXNlY29uZH0gZnJvbSBcImQzLXRpbWVcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KGNhbGVuZGFyKHV0Y1llYXIsIHV0Y01vbnRoLCB1dGNXZWVrLCB1dGNEYXksIHV0Y0hvdXIsIHV0Y01pbnV0ZSwgdXRjU2Vjb25kLCB1dGNNaWxsaXNlY29uZCwgdXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDIwMDAsIDAsIDEpLCBEYXRlLlVUQygyMDAwLCAwLCAyKV0pLCBhcmd1bWVudHMpO1xufVxuIiwiaW1wb3J0IHtpZGVudGl0eX0gZnJvbSBcIi4vY29udGludW91c1wiO1xuaW1wb3J0IHtpbml0SW50ZXJwb2xhdG9yfSBmcm9tIFwiLi9pbml0XCI7XG5pbXBvcnQge2xpbmVhcmlzaH0gZnJvbSBcIi4vbGluZWFyXCI7XG5pbXBvcnQge2xvZ2dpc2h9IGZyb20gXCIuL2xvZ1wiO1xuaW1wb3J0IHtzeW1sb2dpc2h9IGZyb20gXCIuL3N5bWxvZ1wiO1xuaW1wb3J0IHtwb3dpc2h9IGZyb20gXCIuL3Bvd1wiO1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1lcigpIHtcbiAgdmFyIHgwID0gMCxcbiAgICAgIHgxID0gMSxcbiAgICAgIHQwLFxuICAgICAgdDEsXG4gICAgICBrMTAsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICBpbnRlcnBvbGF0b3IgPSBpZGVudGl0eSxcbiAgICAgIGNsYW1wID0gZmFsc2UsXG4gICAgICB1bmtub3duO1xuXG4gIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICByZXR1cm4gaXNOYU4oeCA9ICt4KSA/IHVua25vd24gOiBpbnRlcnBvbGF0b3IoazEwID09PSAwID8gMC41IDogKHggPSAodHJhbnNmb3JtKHgpIC0gdDApICogazEwLCBjbGFtcCA/IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHgpKSA6IHgpKTtcbiAgfVxuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0MCA9IHRyYW5zZm9ybSh4MCA9ICtfWzBdKSwgdDEgPSB0cmFuc2Zvcm0oeDEgPSArX1sxXSksIGsxMCA9IHQwID09PSB0MSA/IDAgOiAxIC8gKHQxIC0gdDApLCBzY2FsZSkgOiBbeDAsIHgxXTtcbiAgfTtcblxuICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9ICEhXywgc2NhbGUpIDogY2xhbXA7XG4gIH07XG5cbiAgc2NhbGUuaW50ZXJwb2xhdG9yID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRvciA9IF8sIHNjYWxlKSA6IGludGVycG9sYXRvcjtcbiAgfTtcblxuICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdHJhbnNmb3JtID0gdCwgdDAgPSB0KHgwKSwgdDEgPSB0KHgxKSwgazEwID0gdDAgPT09IHQxID8gMCA6IDEgLyAodDEgLSB0MCk7XG4gICAgcmV0dXJuIHNjYWxlO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weShzb3VyY2UsIHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0XG4gICAgICAuZG9tYWluKHNvdXJjZS5kb21haW4oKSlcbiAgICAgIC5pbnRlcnBvbGF0b3Ioc291cmNlLmludGVycG9sYXRvcigpKVxuICAgICAgLmNsYW1wKHNvdXJjZS5jbGFtcCgpKVxuICAgICAgLnVua25vd24oc291cmNlLnVua25vd24oKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNlcXVlbnRpYWwoKSB7XG4gIHZhciBzY2FsZSA9IGxpbmVhcmlzaCh0cmFuc2Zvcm1lcigpKGlkZW50aXR5KSk7XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjb3B5KHNjYWxlLCBzZXF1ZW50aWFsKCkpO1xuICB9O1xuXG4gIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVudGlhbExvZygpIHtcbiAgdmFyIHNjYWxlID0gbG9nZ2lzaCh0cmFuc2Zvcm1lcigpKS5kb21haW4oWzEsIDEwXSk7XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjb3B5KHNjYWxlLCBzZXF1ZW50aWFsTG9nKCkpLmJhc2Uoc2NhbGUuYmFzZSgpKTtcbiAgfTtcblxuICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbnRpYWxTeW1sb2coKSB7XG4gIHZhciBzY2FsZSA9IHN5bWxvZ2lzaCh0cmFuc2Zvcm1lcigpKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIHNlcXVlbnRpYWxTeW1sb2coKSkuY29uc3RhbnQoc2NhbGUuY29uc3RhbnQoKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluaXRJbnRlcnBvbGF0b3IuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW50aWFsUG93KCkge1xuICB2YXIgc2NhbGUgPSBwb3dpc2godHJhbnNmb3JtZXIoKSk7XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjb3B5KHNjYWxlLCBzZXF1ZW50aWFsUG93KCkpLmV4cG9uZW50KHNjYWxlLmV4cG9uZW50KCkpO1xuICB9O1xuXG4gIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVudGlhbFNxcnQoKSB7XG4gIHJldHVybiBzZXF1ZW50aWFsUG93LmFwcGx5KG51bGwsIGFyZ3VtZW50cykuZXhwb25lbnQoMC41KTtcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nLCBiaXNlY3R9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSBcIi4vY29udGludW91c1wiO1xuaW1wb3J0IHtpbml0SW50ZXJwb2xhdG9yfSBmcm9tIFwiLi9pbml0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNlcXVlbnRpYWxRdWFudGlsZSgpIHtcbiAgdmFyIGRvbWFpbiA9IFtdLFxuICAgICAgaW50ZXJwb2xhdG9yID0gaWRlbnRpdHk7XG5cbiAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgIGlmICghaXNOYU4oeCA9ICt4KSkgcmV0dXJuIGludGVycG9sYXRvcigoYmlzZWN0KGRvbWFpbiwgeCkgLSAxKSAvIChkb21haW4ubGVuZ3RoIC0gMSkpO1xuICB9XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpO1xuICAgIGRvbWFpbiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gXy5sZW5ndGgsIGQ7IGkgPCBuOyArK2kpIGlmIChkID0gX1tpXSwgZCAhPSBudWxsICYmICFpc05hTihkID0gK2QpKSBkb21haW4ucHVzaChkKTtcbiAgICBkb21haW4uc29ydChhc2NlbmRpbmcpO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfTtcblxuICBzY2FsZS5pbnRlcnBvbGF0b3IgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdG9yID0gXywgc2NhbGUpIDogaW50ZXJwb2xhdG9yO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gc2VxdWVudGlhbFF1YW50aWxlKGludGVycG9sYXRvcikuZG9tYWluKGRvbWFpbik7XG4gIH07XG5cbiAgcmV0dXJuIGluaXRJbnRlcnBvbGF0b3IuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG59XG4iLCJpbXBvcnQge2lkZW50aXR5fSBmcm9tIFwiLi9jb250aW51b3VzXCI7XG5pbXBvcnQge2luaXRJbnRlcnBvbGF0b3J9IGZyb20gXCIuL2luaXRcIjtcbmltcG9ydCB7bGluZWFyaXNofSBmcm9tIFwiLi9saW5lYXJcIjtcbmltcG9ydCB7bG9nZ2lzaH0gZnJvbSBcIi4vbG9nXCI7XG5pbXBvcnQge2NvcHl9IGZyb20gXCIuL3NlcXVlbnRpYWxcIjtcbmltcG9ydCB7c3ltbG9naXNofSBmcm9tIFwiLi9zeW1sb2dcIjtcbmltcG9ydCB7cG93aXNofSBmcm9tIFwiLi9wb3dcIjtcblxuZnVuY3Rpb24gdHJhbnNmb3JtZXIoKSB7XG4gIHZhciB4MCA9IDAsXG4gICAgICB4MSA9IDAuNSxcbiAgICAgIHgyID0gMSxcbiAgICAgIHQwLFxuICAgICAgdDEsXG4gICAgICB0MixcbiAgICAgIGsxMCxcbiAgICAgIGsyMSxcbiAgICAgIGludGVycG9sYXRvciA9IGlkZW50aXR5LFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgY2xhbXAgPSBmYWxzZSxcbiAgICAgIHVua25vd247XG5cbiAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgIHJldHVybiBpc05hTih4ID0gK3gpID8gdW5rbm93biA6ICh4ID0gMC41ICsgKCh4ID0gK3RyYW5zZm9ybSh4KSkgLSB0MSkgKiAoeCA8IHQxID8gazEwIDogazIxKSwgaW50ZXJwb2xhdG9yKGNsYW1wID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgeCkpIDogeCkpO1xuICB9XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHQwID0gdHJhbnNmb3JtKHgwID0gK19bMF0pLCB0MSA9IHRyYW5zZm9ybSh4MSA9ICtfWzFdKSwgdDIgPSB0cmFuc2Zvcm0oeDIgPSArX1syXSksIGsxMCA9IHQwID09PSB0MSA/IDAgOiAwLjUgLyAodDEgLSB0MCksIGsyMSA9IHQxID09PSB0MiA/IDAgOiAwLjUgLyAodDIgLSB0MSksIHNjYWxlKSA6IFt4MCwgeDEsIHgyXTtcbiAgfTtcblxuICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9ICEhXywgc2NhbGUpIDogY2xhbXA7XG4gIH07XG5cbiAgc2NhbGUuaW50ZXJwb2xhdG9yID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRvciA9IF8sIHNjYWxlKSA6IGludGVycG9sYXRvcjtcbiAgfTtcblxuICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdHJhbnNmb3JtID0gdCwgdDAgPSB0KHgwKSwgdDEgPSB0KHgxKSwgdDIgPSB0KHgyKSwgazEwID0gdDAgPT09IHQxID8gMCA6IDAuNSAvICh0MSAtIHQwKSwgazIxID0gdDEgPT09IHQyID8gMCA6IDAuNSAvICh0MiAtIHQxKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRpdmVyZ2luZygpIHtcbiAgdmFyIHNjYWxlID0gbGluZWFyaXNoKHRyYW5zZm9ybWVyKCkoaWRlbnRpdHkpKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIGRpdmVyZ2luZygpKTtcbiAgfTtcblxuICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmVyZ2luZ0xvZygpIHtcbiAgdmFyIHNjYWxlID0gbG9nZ2lzaCh0cmFuc2Zvcm1lcigpKS5kb21haW4oWzAuMSwgMSwgMTBdKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIGRpdmVyZ2luZ0xvZygpKS5iYXNlKHNjYWxlLmJhc2UoKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluaXRJbnRlcnBvbGF0b3IuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZlcmdpbmdTeW1sb2coKSB7XG4gIHZhciBzY2FsZSA9IHN5bWxvZ2lzaCh0cmFuc2Zvcm1lcigpKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIGRpdmVyZ2luZ1N5bWxvZygpKS5jb25zdGFudChzY2FsZS5jb25zdGFudCgpKTtcbiAgfTtcblxuICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmVyZ2luZ1BvdygpIHtcbiAgdmFyIHNjYWxlID0gcG93aXNoKHRyYW5zZm9ybWVyKCkpO1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gY29weShzY2FsZSwgZGl2ZXJnaW5nUG93KCkpLmV4cG9uZW50KHNjYWxlLmV4cG9uZW50KCkpO1xuICB9O1xuXG4gIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGl2ZXJnaW5nU3FydCgpIHtcbiAgcmV0dXJuIGRpdmVyZ2luZ1Bvdy5hcHBseShudWxsLCBhcmd1bWVudHMpLmV4cG9uZW50KDAuNSk7XG59XG4iLCJleHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlQmFuZCxcbiAgcG9pbnQgYXMgc2NhbGVQb2ludFxufSBmcm9tIFwiLi9iYW5kXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVJZGVudGl0eVxufSBmcm9tIFwiLi9pZGVudGl0eVwiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlTGluZWFyXG59IGZyb20gXCIuL2xpbmVhclwiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlTG9nXG59IGZyb20gXCIuL2xvZ1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlU3ltbG9nXG59IGZyb20gXCIuL3N5bWxvZ1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlT3JkaW5hbCxcbiAgaW1wbGljaXQgYXMgc2NhbGVJbXBsaWNpdFxufSBmcm9tIFwiLi9vcmRpbmFsXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVQb3csXG4gIHNxcnQgYXMgc2NhbGVTcXJ0XG59IGZyb20gXCIuL3Bvd1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlUXVhbnRpbGVcbn0gZnJvbSBcIi4vcXVhbnRpbGVcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZVF1YW50aXplXG59IGZyb20gXCIuL3F1YW50aXplXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVUaHJlc2hvbGRcbn0gZnJvbSBcIi4vdGhyZXNob2xkXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVUaW1lXG59IGZyb20gXCIuL3RpbWVcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZVV0Y1xufSBmcm9tIFwiLi91dGNUaW1lXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVTZXF1ZW50aWFsLFxuICBzZXF1ZW50aWFsTG9nIGFzIHNjYWxlU2VxdWVudGlhbExvZyxcbiAgc2VxdWVudGlhbFBvdyBhcyBzY2FsZVNlcXVlbnRpYWxQb3csXG4gIHNlcXVlbnRpYWxTcXJ0IGFzIHNjYWxlU2VxdWVudGlhbFNxcnQsXG4gIHNlcXVlbnRpYWxTeW1sb2cgYXMgc2NhbGVTZXF1ZW50aWFsU3ltbG9nXG59IGZyb20gXCIuL3NlcXVlbnRpYWxcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZVNlcXVlbnRpYWxRdWFudGlsZVxufSBmcm9tIFwiLi9zZXF1ZW50aWFsUXVhbnRpbGVcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZURpdmVyZ2luZyxcbiAgZGl2ZXJnaW5nTG9nIGFzIHNjYWxlRGl2ZXJnaW5nTG9nLFxuICBkaXZlcmdpbmdQb3cgYXMgc2NhbGVEaXZlcmdpbmdQb3csXG4gIGRpdmVyZ2luZ1NxcnQgYXMgc2NhbGVEaXZlcmdpbmdTcXJ0LFxuICBkaXZlcmdpbmdTeW1sb2cgYXMgc2NhbGVEaXZlcmdpbmdTeW1sb2dcbn0gZnJvbSBcIi4vZGl2ZXJnaW5nXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgdGlja0Zvcm1hdFxufSBmcm9tIFwiLi90aWNrRm9ybWF0XCI7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzcGVjaWZpZXIpIHtcbiAgdmFyIG4gPSBzcGVjaWZpZXIubGVuZ3RoIC8gNiB8IDAsIGNvbG9ycyA9IG5ldyBBcnJheShuKSwgaSA9IDA7XG4gIHdoaWxlIChpIDwgbikgY29sb3JzW2ldID0gXCIjXCIgKyBzcGVjaWZpZXIuc2xpY2UoaSAqIDYsICsraSAqIDYpO1xuICByZXR1cm4gY29sb3JzO1xufVxuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbG9ycyhcIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZlwiKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjb2xvcnMoXCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjZcIik7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY29sb3JzKFwiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2XCIpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbG9ycyhcImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOFwiKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjb2xvcnMoXCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjJcIik7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY29sb3JzKFwiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjXCIpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbG9ycyhcImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OVwiKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjb2xvcnMoXCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjNcIik7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY29sb3JzKFwiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmXCIpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbG9ycyhcIjRlNzlhN2YyOGUyY2UxNTc1OTc2YjdiMjU5YTE0ZmVkYzk0OWFmN2FhMWZmOWRhNzljNzU1ZmJhYjBhYlwiKTtcbiIsImltcG9ydCB7aW50ZXJwb2xhdGVSZ2JCYXNpc30gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNjaGVtZSkge1xuICByZXR1cm4gaW50ZXJwb2xhdGVSZ2JCYXNpcyhzY2hlbWVbc2NoZW1lLmxlbmd0aCAtIDFdKTtcbn1cbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuaW1wb3J0IHJhbXAgZnJvbSBcIi4uL3JhbXAuanNcIjtcblxuZXhwb3J0IHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KFxuICBcImQ4YjM2NWY1ZjVmNTVhYjRhY1wiLFxuICBcImE2NjExYWRmYzI3ZDgwY2RjMTAxODU3MVwiLFxuICBcImE2NjExYWRmYzI3ZGY1ZjVmNTgwY2RjMTAxODU3MVwiLFxuICBcIjhjNTEwYWQ4YjM2NWY2ZThjM2M3ZWFlNTVhYjRhYzAxNjY1ZVwiLFxuICBcIjhjNTEwYWQ4YjM2NWY2ZThjM2Y1ZjVmNWM3ZWFlNTVhYjRhYzAxNjY1ZVwiLFxuICBcIjhjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZVwiLFxuICBcIjhjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2Y1ZjVmNWM3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZVwiLFxuICBcIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMFwiLFxuICBcIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2Y1ZjVmNWM3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMFwiXG4pLm1hcChjb2xvcnMpO1xuXG5leHBvcnQgZGVmYXVsdCByYW1wKHNjaGVtZSk7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcbmltcG9ydCByYW1wIGZyb20gXCIuLi9yYW1wLmpzXCI7XG5cbmV4cG9ydCB2YXIgc2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdChcbiAgXCJhZjhkYzNmN2Y3Zjc3ZmJmN2JcIixcbiAgXCI3YjMyOTRjMmE1Y2ZhNmRiYTAwMDg4MzdcIixcbiAgXCI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4MzdcIixcbiAgXCI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzdcIixcbiAgXCI3NjJhODNhZjhkYzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzdcIixcbiAgXCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzdcIixcbiAgXCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzdcIixcbiAgXCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWJcIixcbiAgXCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWJcIlxuKS5tYXAoY29sb3JzKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFtcChzY2hlbWUpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5pbXBvcnQgcmFtcCBmcm9tIFwiLi4vcmFtcC5qc1wiO1xuXG5leHBvcnQgdmFyIHNjaGVtZSA9IG5ldyBBcnJheSgzKS5jb25jYXQoXG4gIFwiZTlhM2M5ZjdmN2Y3YTFkNzZhXCIsXG4gIFwiZDAxYzhiZjFiNmRhYjhlMTg2NGRhYzI2XCIsXG4gIFwiZDAxYzhiZjFiNmRhZjdmN2Y3YjhlMTg2NGRhYzI2XCIsXG4gIFwiYzUxYjdkZTlhM2M5ZmRlMGVmZTZmNWQwYTFkNzZhNGQ5MjIxXCIsXG4gIFwiYzUxYjdkZTlhM2M5ZmRlMGVmZjdmN2Y3ZTZmNWQwYTFkNzZhNGQ5MjIxXCIsXG4gIFwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxXCIsXG4gIFwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxXCIsXG4gIFwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5XCIsXG4gIFwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5XCJcbikubWFwKGNvbG9ycyk7XG5cbmV4cG9ydCBkZWZhdWx0IHJhbXAoc2NoZW1lKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuaW1wb3J0IHJhbXAgZnJvbSBcIi4uL3JhbXAuanNcIjtcblxuZXhwb3J0IHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KFxuICBcIjk5OGVjM2Y3ZjdmN2YxYTM0MFwiLFxuICBcIjVlM2M5OWIyYWJkMmZkYjg2M2U2NjEwMVwiLFxuICBcIjVlM2M5OWIyYWJkMmY3ZjdmN2ZkYjg2M2U2NjEwMVwiLFxuICBcIjU0Mjc4ODk5OGVjM2Q4ZGFlYmZlZTBiNmYxYTM0MGIzNTgwNlwiLFxuICBcIjU0Mjc4ODk5OGVjM2Q4ZGFlYmY3ZjdmN2ZlZTBiNmYxYTM0MGIzNTgwNlwiLFxuICBcIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNlwiLFxuICBcIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNlwiLFxuICBcIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOFwiLFxuICBcIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOFwiXG4pLm1hcChjb2xvcnMpO1xuXG5leHBvcnQgZGVmYXVsdCByYW1wKHNjaGVtZSk7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcbmltcG9ydCByYW1wIGZyb20gXCIuLi9yYW1wLmpzXCI7XG5cbmV4cG9ydCB2YXIgc2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdChcbiAgXCJlZjhhNjJmN2Y3Zjc2N2E5Y2ZcIixcbiAgXCJjYTAwMjBmNGE1ODI5MmM1ZGUwNTcxYjBcIixcbiAgXCJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjBcIixcbiAgXCJiMjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWNcIixcbiAgXCJiMjE4MmJlZjhhNjJmZGRiYzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWNcIixcbiAgXCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWNcIixcbiAgXCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWNcIixcbiAgXCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjFcIixcbiAgXCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjFcIlxuKS5tYXAoY29sb3JzKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFtcChzY2hlbWUpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5pbXBvcnQgcmFtcCBmcm9tIFwiLi4vcmFtcC5qc1wiO1xuXG5leHBvcnQgdmFyIHNjaGVtZSA9IG5ldyBBcnJheSgzKS5jb25jYXQoXG4gIFwiZWY4YTYyZmZmZmZmOTk5OTk5XCIsXG4gIFwiY2EwMDIwZjRhNTgyYmFiYWJhNDA0MDQwXCIsXG4gIFwiY2EwMDIwZjRhNTgyZmZmZmZmYmFiYWJhNDA0MDQwXCIsXG4gIFwiYjIxODJiZWY4YTYyZmRkYmM3ZTBlMGUwOTk5OTk5NGQ0ZDRkXCIsXG4gIFwiYjIxODJiZWY4YTYyZmRkYmM3ZmZmZmZmZTBlMGUwOTk5OTk5NGQ0ZDRkXCIsXG4gIFwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkXCIsXG4gIFwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkXCIsXG4gIFwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhXCIsXG4gIFwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhXCJcbikubWFwKGNvbG9ycyk7XG5cbmV4cG9ydCBkZWZhdWx0IHJhbXAoc2NoZW1lKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuaW1wb3J0IHJhbXAgZnJvbSBcIi4uL3JhbXAuanNcIjtcblxuZXhwb3J0IHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KFxuICBcImZjOGQ1OWZmZmZiZjkxYmZkYlwiLFxuICBcImQ3MTkxY2ZkYWU2MWFiZDllOTJjN2JiNlwiLFxuICBcImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZDllOTJjN2JiNlwiLFxuICBcImQ3MzAyN2ZjOGQ1OWZlZTA5MGUwZjNmODkxYmZkYjQ1NzViNFwiLFxuICBcImQ3MzAyN2ZjOGQ1OWZlZTA5MGZmZmZiZmUwZjNmODkxYmZkYjQ1NzViNFwiLFxuICBcImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNFwiLFxuICBcImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNFwiLFxuICBcImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NVwiLFxuICBcImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NVwiXG4pLm1hcChjb2xvcnMpO1xuXG5leHBvcnQgZGVmYXVsdCByYW1wKHNjaGVtZSk7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcbmltcG9ydCByYW1wIGZyb20gXCIuLi9yYW1wLmpzXCI7XG5cbmV4cG9ydCB2YXIgc2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdChcbiAgXCJmYzhkNTlmZmZmYmY5MWNmNjBcIixcbiAgXCJkNzE5MWNmZGFlNjFhNmQ5NmExYTk2NDFcIixcbiAgXCJkNzE5MWNmZGFlNjFmZmZmYmZhNmQ5NmExYTk2NDFcIixcbiAgXCJkNzMwMjdmYzhkNTlmZWUwOGJkOWVmOGI5MWNmNjAxYTk4NTBcIixcbiAgXCJkNzMwMjdmYzhkNTlmZWUwOGJmZmZmYmZkOWVmOGI5MWNmNjAxYTk4NTBcIixcbiAgXCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTBcIixcbiAgXCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTBcIixcbiAgXCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzdcIixcbiAgXCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzdcIlxuKS5tYXAoY29sb3JzKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFtcChzY2hlbWUpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5pbXBvcnQgcmFtcCBmcm9tIFwiLi4vcmFtcC5qc1wiO1xuXG5leHBvcnQgdmFyIHNjaGVtZSA9IG5ldyBBcnJheSgzKS5jb25jYXQoXG4gIFwiZmM4ZDU5ZmZmZmJmOTlkNTk0XCIsXG4gIFwiZDcxOTFjZmRhZTYxYWJkZGE0MmI4M2JhXCIsXG4gIFwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkZGE0MmI4M2JhXCIsXG4gIFwiZDUzZTRmZmM4ZDU5ZmVlMDhiZTZmNTk4OTlkNTk0MzI4OGJkXCIsXG4gIFwiZDUzZTRmZmM4ZDU5ZmVlMDhiZmZmZmJmZTZmNTk4OTlkNTk0MzI4OGJkXCIsXG4gIFwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkXCIsXG4gIFwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkXCIsXG4gIFwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyXCIsXG4gIFwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyXCJcbikubWFwKGNvbG9ycyk7XG5cbmV4cG9ydCBkZWZhdWx0IHJhbXAoc2NoZW1lKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuaW1wb3J0IHJhbXAgZnJvbSBcIi4uL3JhbXAuanNcIjtcblxuZXhwb3J0IHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KFxuICBcImU1ZjVmOTk5ZDhjOTJjYTI1ZlwiLFxuICBcImVkZjhmYmIyZTJlMjY2YzJhNDIzOGI0NVwiLFxuICBcImVkZjhmYmIyZTJlMjY2YzJhNDJjYTI1ZjAwNmQyY1wiLFxuICBcImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDJjYTI1ZjAwNmQyY1wiLFxuICBcImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNFwiLFxuICBcImY3ZmNmZGU1ZjVmOWNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNFwiLFxuICBcImY3ZmNmZGU1ZjVmOWNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNmQyYzAwNDQxYlwiXG4pLm1hcChjb2xvcnMpO1xuXG5leHBvcnQgZGVmYXVsdCByYW1wKHNjaGVtZSk7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcbmltcG9ydCByYW1wIGZyb20gXCIuLi9yYW1wLmpzXCI7XG5cbmV4cG9ydCB2YXIgc2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdChcbiAgXCJlMGVjZjQ5ZWJjZGE4ODU2YTdcIixcbiAgXCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODQxOWRcIixcbiAgXCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODU2YTc4MTBmN2NcIixcbiAgXCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4ODU2YTc4MTBmN2NcIixcbiAgXCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmJcIixcbiAgXCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmJcIixcbiAgXCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ4MTBmN2M0ZDAwNGJcIlxuKS5tYXAoY29sb3JzKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFtcChzY2hlbWUpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5pbXBvcnQgcmFtcCBmcm9tIFwiLi4vcmFtcC5qc1wiO1xuXG5leHBvcnQgdmFyIHNjaGVtZSA9IG5ldyBBcnJheSgzKS5jb25jYXQoXG4gIFwiZTBmM2RiYThkZGI1NDNhMmNhXCIsXG4gIFwiZjBmOWU4YmFlNGJjN2JjY2M0MmI4Y2JlXCIsXG4gIFwiZjBmOWU4YmFlNGJjN2JjY2M0NDNhMmNhMDg2OGFjXCIsXG4gIFwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NDNhMmNhMDg2OGFjXCIsXG4gIFwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllXCIsXG4gIFwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllXCIsXG4gIFwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg2OGFjMDg0MDgxXCJcbikubWFwKGNvbG9ycyk7XG5cbmV4cG9ydCBkZWZhdWx0IHJhbXAoc2NoZW1lKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuaW1wb3J0IHJhbXAgZnJvbSBcIi4uL3JhbXAuanNcIjtcblxuZXhwb3J0IHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KFxuICBcImZlZThjOGZkYmI4NGUzNGEzM1wiLFxuICBcImZlZjBkOWZkY2M4YWZjOGQ1OWQ3MzAxZlwiLFxuICBcImZlZjBkOWZkY2M4YWZjOGQ1OWUzNGEzM2IzMDAwMFwiLFxuICBcImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWUzNGEzM2IzMDAwMFwiLFxuICBcImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMFwiLFxuICBcImZmZjdlY2ZlZThjOGZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMFwiLFxuICBcImZmZjdlY2ZlZThjOGZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZmIzMDAwMDdmMDAwMFwiXG4pLm1hcChjb2xvcnMpO1xuXG5leHBvcnQgZGVmYXVsdCByYW1wKHNjaGVtZSk7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcbmltcG9ydCByYW1wIGZyb20gXCIuLi9yYW1wLmpzXCI7XG5cbmV4cG9ydCB2YXIgc2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdChcbiAgXCJlY2UyZjBhNmJkZGIxYzkwOTlcIixcbiAgXCJmNmVmZjdiZGM5ZTE2N2E5Y2YwMjgxOGFcIixcbiAgXCJmNmVmZjdiZGM5ZTE2N2E5Y2YxYzkwOTkwMTZjNTlcIixcbiAgXCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YxYzkwOTkwMTZjNTlcIixcbiAgXCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTBcIixcbiAgXCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTBcIixcbiAgXCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTZjNTkwMTQ2MzZcIlxuKS5tYXAoY29sb3JzKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFtcChzY2hlbWUpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5pbXBvcnQgcmFtcCBmcm9tIFwiLi4vcmFtcC5qc1wiO1xuXG5leHBvcnQgdmFyIHNjaGVtZSA9IG5ldyBBcnJheSgzKS5jb25jYXQoXG4gIFwiZWNlN2YyYTZiZGRiMmI4Y2JlXCIsXG4gIFwiZjFlZWY2YmRjOWUxNzRhOWNmMDU3MGIwXCIsXG4gIFwiZjFlZWY2YmRjOWUxNzRhOWNmMmI4Y2JlMDQ1YThkXCIsXG4gIFwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMmI4Y2JlMDQ1YThkXCIsXG4gIFwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiXCIsXG4gIFwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiXCIsXG4gIFwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDQ1YThkMDIzODU4XCJcbikubWFwKGNvbG9ycyk7XG5cbmV4cG9ydCBkZWZhdWx0IHJhbXAoc2NoZW1lKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuaW1wb3J0IHJhbXAgZnJvbSBcIi4uL3JhbXAuanNcIjtcblxuZXhwb3J0IHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KFxuICBcImU3ZTFlZmM5OTRjN2RkMWM3N1wiLFxuICBcImYxZWVmNmQ3YjVkOGRmNjViMGNlMTI1NlwiLFxuICBcImYxZWVmNmQ3YjVkOGRmNjViMGRkMWM3Nzk4MDA0M1wiLFxuICBcImYxZWVmNmQ0YjlkYWM5OTRjN2RmNjViMGRkMWM3Nzk4MDA0M1wiLFxuICBcImYxZWVmNmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZlwiLFxuICBcImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZlwiLFxuICBcImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1Njk4MDA0MzY3MDAxZlwiXG4pLm1hcChjb2xvcnMpO1xuXG5leHBvcnQgZGVmYXVsdCByYW1wKHNjaGVtZSk7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcbmltcG9ydCByYW1wIGZyb20gXCIuLi9yYW1wLmpzXCI7XG5cbmV4cG9ydCB2YXIgc2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdChcbiAgXCJmZGUwZGRmYTlmYjVjNTFiOGFcIixcbiAgXCJmZWViZTJmYmI0YjlmNzY4YTFhZTAxN2VcIixcbiAgXCJmZWViZTJmYmI0YjlmNzY4YTFjNTFiOGE3YTAxNzdcIixcbiAgXCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFjNTFiOGE3YTAxNzdcIixcbiAgXCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzdcIixcbiAgXCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzdcIixcbiAgXCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzc0OTAwNmFcIlxuKS5tYXAoY29sb3JzKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFtcChzY2hlbWUpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5pbXBvcnQgcmFtcCBmcm9tIFwiLi4vcmFtcC5qc1wiO1xuXG5leHBvcnQgdmFyIHNjaGVtZSA9IG5ldyBBcnJheSgzKS5jb25jYXQoXG4gIFwiZWRmOGIxN2ZjZGJiMmM3ZmI4XCIsXG4gIFwiZmZmZmNjYTFkYWI0NDFiNmM0MjI1ZWE4XCIsXG4gIFwiZmZmZmNjYTFkYWI0NDFiNmM0MmM3ZmI4MjUzNDk0XCIsXG4gIFwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MmM3ZmI4MjUzNDk0XCIsXG4gIFwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0XCIsXG4gIFwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0XCIsXG4gIFwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MjUzNDk0MDgxZDU4XCJcbikubWFwKGNvbG9ycyk7XG5cbmV4cG9ydCBkZWZhdWx0IHJhbXAoc2NoZW1lKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuaW1wb3J0IHJhbXAgZnJvbSBcIi4uL3JhbXAuanNcIjtcblxuZXhwb3J0IHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KFxuICBcImY3ZmNiOWFkZGQ4ZTMxYTM1NFwiLFxuICBcImZmZmZjY2MyZTY5OTc4YzY3OTIzODQ0M1wiLFxuICBcImZmZmZjY2MyZTY5OTc4YzY3OTMxYTM1NDAwNjgzN1wiLFxuICBcImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTMxYTM1NDAwNjgzN1wiLFxuICBcImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMlwiLFxuICBcImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMlwiLFxuICBcImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNjgzNzAwNDUyOVwiXG4pLm1hcChjb2xvcnMpO1xuXG5leHBvcnQgZGVmYXVsdCByYW1wKHNjaGVtZSk7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcbmltcG9ydCByYW1wIGZyb20gXCIuLi9yYW1wLmpzXCI7XG5cbmV4cG9ydCB2YXIgc2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdChcbiAgXCJmZmY3YmNmZWM0NGZkOTVmMGVcIixcbiAgXCJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDJcIixcbiAgXCJmZmZmZDRmZWQ5OGVmZTk5MjlkOTVmMGU5OTM0MDRcIixcbiAgXCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5OTM0MDRcIixcbiAgXCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDRcIixcbiAgXCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDRcIixcbiAgXCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDZcIlxuKS5tYXAoY29sb3JzKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFtcChzY2hlbWUpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5pbXBvcnQgcmFtcCBmcm9tIFwiLi4vcmFtcC5qc1wiO1xuXG5leHBvcnQgdmFyIHNjaGVtZSA9IG5ldyBBcnJheSgzKS5jb25jYXQoXG4gIFwiZmZlZGEwZmViMjRjZjAzYjIwXCIsXG4gIFwiZmZmZmIyZmVjYzVjZmQ4ZDNjZTMxYTFjXCIsXG4gIFwiZmZmZmIyZmVjYzVjZmQ4ZDNjZjAzYjIwYmQwMDI2XCIsXG4gIFwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZjAzYjIwYmQwMDI2XCIsXG4gIFwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2XCIsXG4gIFwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2XCIsXG4gIFwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYmQwMDI2ODAwMDI2XCJcbikubWFwKGNvbG9ycyk7XG5cbmV4cG9ydCBkZWZhdWx0IHJhbXAoc2NoZW1lKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuaW1wb3J0IHJhbXAgZnJvbSBcIi4uL3JhbXAuanNcIjtcblxuZXhwb3J0IHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KFxuICBcImRlZWJmNzllY2FlMTMxODJiZFwiLFxuICBcImVmZjNmZmJkZDdlNzZiYWVkNjIxNzFiNVwiLFxuICBcImVmZjNmZmJkZDdlNzZiYWVkNjMxODJiZDA4NTE5Y1wiLFxuICBcImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjMxODJiZDA4NTE5Y1wiLFxuICBcImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NFwiLFxuICBcImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NFwiLFxuICBcImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NTE5YzA4MzA2YlwiXG4pLm1hcChjb2xvcnMpO1xuXG5leHBvcnQgZGVmYXVsdCByYW1wKHNjaGVtZSk7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcbmltcG9ydCByYW1wIGZyb20gXCIuLi9yYW1wLmpzXCI7XG5cbmV4cG9ydCB2YXIgc2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdChcbiAgXCJlNWY1ZTBhMWQ5OWIzMWEzNTRcIixcbiAgXCJlZGY4ZTliYWU0YjM3NGM0NzYyMzhiNDVcIixcbiAgXCJlZGY4ZTliYWU0YjM3NGM0NzYzMWEzNTQwMDZkMmNcIixcbiAgXCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmNcIixcbiAgXCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzJcIixcbiAgXCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzJcIixcbiAgXCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWJcIlxuKS5tYXAoY29sb3JzKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFtcChzY2hlbWUpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5pbXBvcnQgcmFtcCBmcm9tIFwiLi4vcmFtcC5qc1wiO1xuXG5leHBvcnQgdmFyIHNjaGVtZSA9IG5ldyBBcnJheSgzKS5jb25jYXQoXG4gIFwiZjBmMGYwYmRiZGJkNjM2MzYzXCIsXG4gIFwiZjdmN2Y3Y2NjY2NjOTY5Njk2NTI1MjUyXCIsXG4gIFwiZjdmN2Y3Y2NjY2NjOTY5Njk2NjM2MzYzMjUyNTI1XCIsXG4gIFwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NjM2MzYzMjUyNTI1XCIsXG4gIFwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1XCIsXG4gIFwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1XCIsXG4gIFwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1MDAwMDAwXCJcbikubWFwKGNvbG9ycyk7XG5cbmV4cG9ydCBkZWZhdWx0IHJhbXAoc2NoZW1lKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuaW1wb3J0IHJhbXAgZnJvbSBcIi4uL3JhbXAuanNcIjtcblxuZXhwb3J0IHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KFxuICBcImVmZWRmNWJjYmRkYzc1NmJiMVwiLFxuICBcImYyZjBmN2NiYzllMjllOWFjODZhNTFhM1wiLFxuICBcImYyZjBmN2NiYzllMjllOWFjODc1NmJiMTU0Mjc4ZlwiLFxuICBcImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODc1NmJiMTU0Mjc4ZlwiLFxuICBcImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NlwiLFxuICBcImZjZmJmZGVmZWRmNWRhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NlwiLFxuICBcImZjZmJmZGVmZWRmNWRhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzU0Mjc4ZjNmMDA3ZFwiXG4pLm1hcChjb2xvcnMpO1xuXG5leHBvcnQgZGVmYXVsdCByYW1wKHNjaGVtZSk7XG4iLCJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcbmltcG9ydCByYW1wIGZyb20gXCIuLi9yYW1wLmpzXCI7XG5cbmV4cG9ydCB2YXIgc2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdChcbiAgXCJmZWUwZDJmYzkyNzJkZTJkMjZcIixcbiAgXCJmZWU1ZDlmY2FlOTFmYjZhNGFjYjE4MWRcIixcbiAgXCJmZWU1ZDlmY2FlOTFmYjZhNGFkZTJkMjZhNTBmMTVcIixcbiAgXCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFkZTJkMjZhNTBmMTVcIixcbiAgXCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGRcIixcbiAgXCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGRcIixcbiAgXCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWRhNTBmMTU2NzAwMGRcIlxuKS5tYXAoY29sb3JzKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFtcChzY2hlbWUpO1xuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5pbXBvcnQgcmFtcCBmcm9tIFwiLi4vcmFtcC5qc1wiO1xuXG5leHBvcnQgdmFyIHNjaGVtZSA9IG5ldyBBcnJheSgzKS5jb25jYXQoXG4gIFwiZmVlNmNlZmRhZTZiZTY1NTBkXCIsXG4gIFwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZDk0NzAxXCIsXG4gIFwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZTY1NTBkYTYzNjAzXCIsXG4gIFwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZTY1NTBkYTYzNjAzXCIsXG4gIFwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0XCIsXG4gIFwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0XCIsXG4gIFwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxYTYzNjAzN2YyNzA0XCJcbikubWFwKGNvbG9ycyk7XG5cbmV4cG9ydCBkZWZhdWx0IHJhbXAoc2NoZW1lKTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHQpIHtcbiAgdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHQpKTtcbiAgcmV0dXJuIFwicmdiKFwiXG4gICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCgtNC41NCAtIHQgKiAoMzUuMzQgLSB0ICogKDIzODEuNzMgLSB0ICogKDY0MDIuNyAtIHQgKiAoNzAyNC43MiAtIHQgKiAyNzEwLjU3KSkpKSkpKSArIFwiLCBcIlxuICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoMzIuNDkgKyB0ICogKDE3MC43MyArIHQgKiAoNTIuODIgLSB0ICogKDEzMS40NiAtIHQgKiAoMTc2LjU4IC0gdCAqIDY3LjM3KSkpKSkpKSArIFwiLCBcIlxuICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoODEuMjQgKyB0ICogKDQ0Mi4zNiAtIHQgKiAoMjQ4Mi40MyAtIHQgKiAoNjE2Ny4yNCAtIHQgKiAoNjYxNC45NCAtIHQgKiAyNDc1LjY3KSkpKSkpKVxuICAgICAgKyBcIilcIjtcbn1cbiIsImltcG9ydCB7Y3ViZWhlbGl4fSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgzMDAsIDAuNSwgMC4wKSwgY3ViZWhlbGl4KC0yNDAsIDAuNSwgMS4wKSk7XG4iLCJpbXBvcnQge2N1YmVoZWxpeH0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlQ3ViZWhlbGl4TG9uZ30gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5cbmV4cG9ydCB2YXIgd2FybSA9IGludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhjdWJlaGVsaXgoLTEwMCwgMC43NSwgMC4zNSksIGN1YmVoZWxpeCg4MCwgMS41MCwgMC44KSk7XG5cbmV4cG9ydCB2YXIgY29vbCA9IGludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhjdWJlaGVsaXgoMjYwLCAwLjc1LCAwLjM1KSwgY3ViZWhlbGl4KDgwLCAxLjUwLCAwLjgpKTtcblxudmFyIGMgPSBjdWJlaGVsaXgoKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odCkge1xuICBpZiAodCA8IDAgfHwgdCA+IDEpIHQgLT0gTWF0aC5mbG9vcih0KTtcbiAgdmFyIHRzID0gTWF0aC5hYnModCAtIDAuNSk7XG4gIGMuaCA9IDM2MCAqIHQgLSAxMDA7XG4gIGMucyA9IDEuNSAtIDEuNSAqIHRzO1xuICBjLmwgPSAwLjggLSAwLjkgKiB0cztcbiAgcmV0dXJuIGMgKyBcIlwiO1xufVxuIiwiaW1wb3J0IHtyZ2J9IGZyb20gXCJkMy1jb2xvclwiO1xuXG52YXIgYyA9IHJnYigpLFxuICAgIHBpXzFfMyA9IE1hdGguUEkgLyAzLFxuICAgIHBpXzJfMyA9IE1hdGguUEkgKiAyIC8gMztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odCkge1xuICB2YXIgeDtcbiAgdCA9ICgwLjUgLSB0KSAqIE1hdGguUEk7XG4gIGMuciA9IDI1NSAqICh4ID0gTWF0aC5zaW4odCkpICogeDtcbiAgYy5nID0gMjU1ICogKHggPSBNYXRoLnNpbih0ICsgcGlfMV8zKSkgKiB4O1xuICBjLmIgPSAyNTUgKiAoeCA9IE1hdGguc2luKHQgKyBwaV8yXzMpKSAqIHg7XG4gIHJldHVybiBjICsgXCJcIjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHQpIHtcbiAgdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHQpKTtcbiAgcmV0dXJuIFwicmdiKFwiXG4gICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCgzNC42MSArIHQgKiAoMTE3Mi4zMyAtIHQgKiAoMTA3OTMuNTYgLSB0ICogKDMzMzAwLjEyIC0gdCAqICgzODM5NC40OSAtIHQgKiAxNDgyNS4wNSkpKSkpKSkgKyBcIiwgXCJcbiAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKDIzLjMxICsgdCAqICg1NTcuMzMgKyB0ICogKDEyMjUuMzMgLSB0ICogKDM1NzQuOTYgLSB0ICogKDEwNzMuNzcgKyB0ICogNzA3LjU2KSkpKSkpKSArIFwiLCBcIlxuICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoMjcuMiArIHQgKiAoMzIxMS4xIC0gdCAqICgxNTMyNy45NyAtIHQgKiAoMjc4MTQgLSB0ICogKDIyNTY5LjE4IC0gdCAqIDY4MzguNjYpKSkpKSkpXG4gICAgICArIFwiKVwiO1xufVxuIiwiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi4vY29sb3JzLmpzXCI7XG5cbmZ1bmN0aW9uIHJhbXAocmFuZ2UpIHtcbiAgdmFyIG4gPSByYW5nZS5sZW5ndGg7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIHJhbmdlW01hdGgubWF4KDAsIE1hdGgubWluKG4gLSAxLCBNYXRoLmZsb29yKHQgKiBuKSkpXTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmFtcChjb2xvcnMoXCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjVcIikpO1xuXG5leHBvcnQgdmFyIG1hZ21hID0gcmFtcChjb2xvcnMoXCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmZcIikpO1xuXG5leHBvcnQgdmFyIGluZmVybm8gPSByYW1wKGNvbG9ycyhcIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNFwiKSk7XG5cbmV4cG9ydCB2YXIgcGxhc21hID0gcmFtcChjb2xvcnMoXCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjFcIikpO1xuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHNjaGVtZUNhdGVnb3J5MTB9IGZyb20gXCIuL2NhdGVnb3JpY2FsL2NhdGVnb3J5MTAuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzY2hlbWVBY2NlbnR9IGZyb20gXCIuL2NhdGVnb3JpY2FsL0FjY2VudC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNjaGVtZURhcmsyfSBmcm9tIFwiLi9jYXRlZ29yaWNhbC9EYXJrMi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNjaGVtZVBhaXJlZH0gZnJvbSBcIi4vY2F0ZWdvcmljYWwvUGFpcmVkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2NoZW1lUGFzdGVsMX0gZnJvbSBcIi4vY2F0ZWdvcmljYWwvUGFzdGVsMS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNjaGVtZVBhc3RlbDJ9IGZyb20gXCIuL2NhdGVnb3JpY2FsL1Bhc3RlbDIuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzY2hlbWVTZXQxfSBmcm9tIFwiLi9jYXRlZ29yaWNhbC9TZXQxLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2NoZW1lU2V0Mn0gZnJvbSBcIi4vY2F0ZWdvcmljYWwvU2V0Mi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNjaGVtZVNldDN9IGZyb20gXCIuL2NhdGVnb3JpY2FsL1NldDMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzY2hlbWVUYWJsZWF1MTB9IGZyb20gXCIuL2NhdGVnb3JpY2FsL1RhYmxlYXUxMC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQnJCRywgc2NoZW1lIGFzIHNjaGVtZUJyQkd9IGZyb20gXCIuL2RpdmVyZ2luZy9CckJHLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVQUkduLCBzY2hlbWUgYXMgc2NoZW1lUFJHbn0gZnJvbSBcIi4vZGl2ZXJnaW5nL1BSR24uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVBpWUcsIHNjaGVtZSBhcyBzY2hlbWVQaVlHfSBmcm9tIFwiLi9kaXZlcmdpbmcvUGlZRy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUHVPciwgc2NoZW1lIGFzIHNjaGVtZVB1T3J9IGZyb20gXCIuL2RpdmVyZ2luZy9QdU9yLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVSZEJ1LCBzY2hlbWUgYXMgc2NoZW1lUmRCdX0gZnJvbSBcIi4vZGl2ZXJnaW5nL1JkQnUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVJkR3ksIHNjaGVtZSBhcyBzY2hlbWVSZEd5fSBmcm9tIFwiLi9kaXZlcmdpbmcvUmRHeS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUmRZbEJ1LCBzY2hlbWUgYXMgc2NoZW1lUmRZbEJ1fSBmcm9tIFwiLi9kaXZlcmdpbmcvUmRZbEJ1LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVSZFlsR24sIHNjaGVtZSBhcyBzY2hlbWVSZFlsR259IGZyb20gXCIuL2RpdmVyZ2luZy9SZFlsR24uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVNwZWN0cmFsLCBzY2hlbWUgYXMgc2NoZW1lU3BlY3RyYWx9IGZyb20gXCIuL2RpdmVyZ2luZy9TcGVjdHJhbC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQnVHbiwgc2NoZW1lIGFzIHNjaGVtZUJ1R259IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvQnVHbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQnVQdSwgc2NoZW1lIGFzIHNjaGVtZUJ1UHV9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvQnVQdS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlR25CdSwgc2NoZW1lIGFzIHNjaGVtZUduQnV9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvR25CdS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlT3JSZCwgc2NoZW1lIGFzIHNjaGVtZU9yUmR9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvT3JSZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUHVCdUduLCBzY2hlbWUgYXMgc2NoZW1lUHVCdUdufSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL1B1QnVHbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUHVCdSwgc2NoZW1lIGFzIHNjaGVtZVB1QnV9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvUHVCdS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUHVSZCwgc2NoZW1lIGFzIHNjaGVtZVB1UmR9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvUHVSZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUmRQdSwgc2NoZW1lIGFzIHNjaGVtZVJkUHV9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvUmRQdS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlWWxHbkJ1LCBzY2hlbWUgYXMgc2NoZW1lWWxHbkJ1fSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL1lsR25CdS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlWWxHbiwgc2NoZW1lIGFzIHNjaGVtZVlsR259IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvWWxHbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlWWxPckJyLCBzY2hlbWUgYXMgc2NoZW1lWWxPckJyfSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL1lsT3JCci5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlWWxPclJkLCBzY2hlbWUgYXMgc2NoZW1lWWxPclJkfSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL1lsT3JSZC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQmx1ZXMsIHNjaGVtZSBhcyBzY2hlbWVCbHVlc30gZnJvbSBcIi4vc2VxdWVudGlhbC1zaW5nbGUvQmx1ZXMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZUdyZWVucywgc2NoZW1lIGFzIHNjaGVtZUdyZWVuc30gZnJvbSBcIi4vc2VxdWVudGlhbC1zaW5nbGUvR3JlZW5zLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVHcmV5cywgc2NoZW1lIGFzIHNjaGVtZUdyZXlzfSBmcm9tIFwiLi9zZXF1ZW50aWFsLXNpbmdsZS9HcmV5cy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUHVycGxlcywgc2NoZW1lIGFzIHNjaGVtZVB1cnBsZXN9IGZyb20gXCIuL3NlcXVlbnRpYWwtc2luZ2xlL1B1cnBsZXMuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVJlZHMsIHNjaGVtZSBhcyBzY2hlbWVSZWRzfSBmcm9tIFwiLi9zZXF1ZW50aWFsLXNpbmdsZS9SZWRzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVPcmFuZ2VzLCBzY2hlbWUgYXMgc2NoZW1lT3Jhbmdlc30gZnJvbSBcIi4vc2VxdWVudGlhbC1zaW5nbGUvT3Jhbmdlcy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQ2l2aWRpc30gZnJvbSBcIi4vc2VxdWVudGlhbC1tdWx0aS9jaXZpZGlzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0fSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL2N1YmVoZWxpeC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlUmFpbmJvdywgd2FybSBhcyBpbnRlcnBvbGF0ZVdhcm0sIGNvb2wgYXMgaW50ZXJwb2xhdGVDb29sfSBmcm9tIFwiLi9zZXF1ZW50aWFsLW11bHRpL3JhaW5ib3cuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVNpbmVib3d9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvc2luZWJvdy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlVHVyYm99IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvdHVyYm8uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVZpcmlkaXMsIG1hZ21hIGFzIGludGVycG9sYXRlTWFnbWEsIGluZmVybm8gYXMgaW50ZXJwb2xhdGVJbmZlcm5vLCBwbGFzbWEgYXMgaW50ZXJwb2xhdGVQbGFzbWF9IGZyb20gXCIuL3NlcXVlbnRpYWwtbXVsdGkvdmlyaWRpcy5qc1wiO1xuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4vY3JlYXRvclwiO1xuaW1wb3J0IHNlbGVjdCBmcm9tIFwiLi9zZWxlY3RcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0KGNyZWF0b3IobmFtZSkuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKTtcbn1cbiIsInZhciBuZXh0SWQgPSAwO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2NhbCgpIHtcbiAgcmV0dXJuIG5ldyBMb2NhbDtcbn1cblxuZnVuY3Rpb24gTG9jYWwoKSB7XG4gIHRoaXMuXyA9IFwiQFwiICsgKCsrbmV4dElkKS50b1N0cmluZygzNik7XG59XG5cbkxvY2FsLnByb3RvdHlwZSA9IGxvY2FsLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IExvY2FsLFxuICBnZXQ6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB2YXIgaWQgPSB0aGlzLl87XG4gICAgd2hpbGUgKCEoaWQgaW4gbm9kZSkpIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm47XG4gICAgcmV0dXJuIG5vZGVbaWRdO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKG5vZGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIG5vZGVbdGhpcy5fXSA9IHZhbHVlO1xuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5fIGluIG5vZGUgJiYgZGVsZXRlIG5vZGVbdGhpcy5fXTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl87XG4gIH1cbn07XG4iLCJpbXBvcnQge1NlbGVjdGlvbiwgcm9vdH0gZnJvbSBcIi4vc2VsZWN0aW9uL2luZGV4XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbmV3IFNlbGVjdGlvbihbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcildLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSlcbiAgICAgIDogbmV3IFNlbGVjdGlvbihbc2VsZWN0b3IgPT0gbnVsbCA/IFtdIDogc2VsZWN0b3JdLCByb290KTtcbn1cbiIsImltcG9ydCBzb3VyY2VFdmVudCBmcm9tIFwiLi9zb3VyY2VFdmVudFwiO1xuaW1wb3J0IHBvaW50IGZyb20gXCIuL3BvaW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIHRvdWNoZXMpIHtcbiAgaWYgKHRvdWNoZXMgPT0gbnVsbCkgdG91Y2hlcyA9IHNvdXJjZUV2ZW50KCkudG91Y2hlcztcblxuICBmb3IgKHZhciBpID0gMCwgbiA9IHRvdWNoZXMgPyB0b3VjaGVzLmxlbmd0aCA6IDAsIHBvaW50cyA9IG5ldyBBcnJheShuKTsgaSA8IG47ICsraSkge1xuICAgIHBvaW50c1tpXSA9IHBvaW50KG5vZGUsIHRvdWNoZXNbaV0pO1xuICB9XG5cbiAgcmV0dXJuIHBvaW50cztcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBjcmVhdGV9IGZyb20gXCIuL2NyZWF0ZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGNyZWF0b3J9IGZyb20gXCIuL2NyZWF0b3JcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBsb2NhbH0gZnJvbSBcIi4vbG9jYWxcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBtYXRjaGVyfSBmcm9tIFwiLi9tYXRjaGVyXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbW91c2V9IGZyb20gXCIuL21vdXNlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbmFtZXNwYWNlfSBmcm9tIFwiLi9uYW1lc3BhY2VcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBuYW1lc3BhY2VzfSBmcm9tIFwiLi9uYW1lc3BhY2VzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY2xpZW50UG9pbnR9IGZyb20gXCIuL3BvaW50XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2VsZWN0fSBmcm9tIFwiLi9zZWxlY3RcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzZWxlY3RBbGx9IGZyb20gXCIuL3NlbGVjdEFsbFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNlbGVjdGlvbn0gZnJvbSBcIi4vc2VsZWN0aW9uL2luZGV4XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2VsZWN0b3J9IGZyb20gXCIuL3NlbGVjdG9yXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2VsZWN0b3JBbGx9IGZyb20gXCIuL3NlbGVjdG9yQWxsXCI7XG5leHBvcnQge3N0eWxlVmFsdWUgYXMgc3R5bGV9IGZyb20gXCIuL3NlbGVjdGlvbi9zdHlsZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRvdWNofSBmcm9tIFwiLi90b3VjaFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRvdWNoZXN9IGZyb20gXCIuL3RvdWNoZXNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB3aW5kb3d9IGZyb20gXCIuL3dpbmRvd1wiO1xuZXhwb3J0IHtldmVudCwgY3VzdG9tRXZlbnR9IGZyb20gXCIuL3NlbGVjdGlvbi9vblwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24gY29uc3RhbnQoKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgdmFyIGFicyA9IE1hdGguYWJzO1xuZXhwb3J0IHZhciBhdGFuMiA9IE1hdGguYXRhbjI7XG5leHBvcnQgdmFyIGNvcyA9IE1hdGguY29zO1xuZXhwb3J0IHZhciBtYXggPSBNYXRoLm1heDtcbmV4cG9ydCB2YXIgbWluID0gTWF0aC5taW47XG5leHBvcnQgdmFyIHNpbiA9IE1hdGguc2luO1xuZXhwb3J0IHZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuXG5leHBvcnQgdmFyIGVwc2lsb24gPSAxZS0xMjtcbmV4cG9ydCB2YXIgcGkgPSBNYXRoLlBJO1xuZXhwb3J0IHZhciBoYWxmUGkgPSBwaSAvIDI7XG5leHBvcnQgdmFyIHRhdSA9IDIgKiBwaTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFjb3MoeCkge1xuICByZXR1cm4geCA+IDEgPyAwIDogeCA8IC0xID8gcGkgOiBNYXRoLmFjb3MoeCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc2luKHgpIHtcbiAgcmV0dXJuIHggPj0gMSA/IGhhbGZQaSA6IHggPD0gLTEgPyAtaGFsZlBpIDogTWF0aC5hc2luKHgpO1xufVxuIiwiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQge2FicywgYWNvcywgYXNpbiwgYXRhbjIsIGNvcywgZXBzaWxvbiwgaGFsZlBpLCBtYXgsIG1pbiwgcGksIHNpbiwgc3FydCwgdGF1fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGFyY0lubmVyUmFkaXVzKGQpIHtcbiAgcmV0dXJuIGQuaW5uZXJSYWRpdXM7XG59XG5cbmZ1bmN0aW9uIGFyY091dGVyUmFkaXVzKGQpIHtcbiAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7XG59XG5cbmZ1bmN0aW9uIGFyY1N0YXJ0QW5nbGUoZCkge1xuICByZXR1cm4gZC5zdGFydEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmNFbmRBbmdsZShkKSB7XG4gIHJldHVybiBkLmVuZEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmNQYWRBbmdsZShkKSB7XG4gIHJldHVybiBkICYmIGQucGFkQW5nbGU7IC8vIE5vdGU6IG9wdGlvbmFsIVxufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3QoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gIHZhciB4MTAgPSB4MSAtIHgwLCB5MTAgPSB5MSAtIHkwLFxuICAgICAgeDMyID0geDMgLSB4MiwgeTMyID0geTMgLSB5MixcbiAgICAgIHQgPSB5MzIgKiB4MTAgLSB4MzIgKiB5MTA7XG4gIGlmICh0ICogdCA8IGVwc2lsb24pIHJldHVybjtcbiAgdCA9ICh4MzIgKiAoeTAgLSB5MikgLSB5MzIgKiAoeDAgLSB4MikpIC8gdDtcbiAgcmV0dXJuIFt4MCArIHQgKiB4MTAsIHkwICsgdCAqIHkxMF07XG59XG5cbi8vIENvbXB1dGUgcGVycGVuZGljdWxhciBvZmZzZXQgbGluZSBvZiBsZW5ndGggcmMuXG4vLyBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0NpcmNsZS1MaW5lSW50ZXJzZWN0aW9uLmh0bWxcbmZ1bmN0aW9uIGNvcm5lclRhbmdlbnRzKHgwLCB5MCwgeDEsIHkxLCByMSwgcmMsIGN3KSB7XG4gIHZhciB4MDEgPSB4MCAtIHgxLFxuICAgICAgeTAxID0geTAgLSB5MSxcbiAgICAgIGxvID0gKGN3ID8gcmMgOiAtcmMpIC8gc3FydCh4MDEgKiB4MDEgKyB5MDEgKiB5MDEpLFxuICAgICAgb3ggPSBsbyAqIHkwMSxcbiAgICAgIG95ID0gLWxvICogeDAxLFxuICAgICAgeDExID0geDAgKyBveCxcbiAgICAgIHkxMSA9IHkwICsgb3ksXG4gICAgICB4MTAgPSB4MSArIG94LFxuICAgICAgeTEwID0geTEgKyBveSxcbiAgICAgIHgwMCA9ICh4MTEgKyB4MTApIC8gMixcbiAgICAgIHkwMCA9ICh5MTEgKyB5MTApIC8gMixcbiAgICAgIGR4ID0geDEwIC0geDExLFxuICAgICAgZHkgPSB5MTAgLSB5MTEsXG4gICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgciA9IHIxIC0gcmMsXG4gICAgICBEID0geDExICogeTEwIC0geDEwICogeTExLFxuICAgICAgZCA9IChkeSA8IDAgPyAtMSA6IDEpICogc3FydChtYXgoMCwgciAqIHIgKiBkMiAtIEQgKiBEKSksXG4gICAgICBjeDAgPSAoRCAqIGR5IC0gZHggKiBkKSAvIGQyLFxuICAgICAgY3kwID0gKC1EICogZHggLSBkeSAqIGQpIC8gZDIsXG4gICAgICBjeDEgPSAoRCAqIGR5ICsgZHggKiBkKSAvIGQyLFxuICAgICAgY3kxID0gKC1EICogZHggKyBkeSAqIGQpIC8gZDIsXG4gICAgICBkeDAgPSBjeDAgLSB4MDAsXG4gICAgICBkeTAgPSBjeTAgLSB5MDAsXG4gICAgICBkeDEgPSBjeDEgLSB4MDAsXG4gICAgICBkeTEgPSBjeTEgLSB5MDA7XG5cbiAgLy8gUGljayB0aGUgY2xvc2VyIG9mIHRoZSB0d28gaW50ZXJzZWN0aW9uIHBvaW50cy5cbiAgLy8gVE9ETyBJcyB0aGVyZSBhIGZhc3RlciB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIGludGVyc2VjdGlvbiB0byB1c2U/XG4gIGlmIChkeDAgKiBkeDAgKyBkeTAgKiBkeTAgPiBkeDEgKiBkeDEgKyBkeTEgKiBkeTEpIGN4MCA9IGN4MSwgY3kwID0gY3kxO1xuXG4gIHJldHVybiB7XG4gICAgY3g6IGN4MCxcbiAgICBjeTogY3kwLFxuICAgIHgwMTogLW94LFxuICAgIHkwMTogLW95LFxuICAgIHgxMTogY3gwICogKHIxIC8gciAtIDEpLFxuICAgIHkxMTogY3kwICogKHIxIC8gciAtIDEpXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgaW5uZXJSYWRpdXMgPSBhcmNJbm5lclJhZGl1cyxcbiAgICAgIG91dGVyUmFkaXVzID0gYXJjT3V0ZXJSYWRpdXMsXG4gICAgICBjb3JuZXJSYWRpdXMgPSBjb25zdGFudCgwKSxcbiAgICAgIHBhZFJhZGl1cyA9IG51bGwsXG4gICAgICBzdGFydEFuZ2xlID0gYXJjU3RhcnRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlID0gYXJjRW5kQW5nbGUsXG4gICAgICBwYWRBbmdsZSA9IGFyY1BhZEFuZ2xlLFxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gYXJjKCkge1xuICAgIHZhciBidWZmZXIsXG4gICAgICAgIHIsXG4gICAgICAgIHIwID0gK2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIHIxID0gK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIGEwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gaGFsZlBpLFxuICAgICAgICBhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGksXG4gICAgICAgIGRhID0gYWJzKGExIC0gYTApLFxuICAgICAgICBjdyA9IGExID4gYTA7XG5cbiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3V0ZXIgcmFkaXVzIGlzIGFsd2F5cyBsYXJnZXIgdGhhbiB0aGUgaW5uZXIgcmFkaXVzLlxuICAgIGlmIChyMSA8IHIwKSByID0gcjEsIHIxID0gcjAsIHIwID0gcjtcblxuICAgIC8vIElzIGl0IGEgcG9pbnQ/XG4gICAgaWYgKCEocjEgPiBlcHNpbG9uKSkgY29udGV4dC5tb3ZlVG8oMCwgMCk7XG5cbiAgICAvLyBPciBpcyBpdCBhIGNpcmNsZSBvciBhbm51bHVzP1xuICAgIGVsc2UgaWYgKGRhID4gdGF1IC0gZXBzaWxvbikge1xuICAgICAgY29udGV4dC5tb3ZlVG8ocjEgKiBjb3MoYTApLCByMSAqIHNpbihhMCkpO1xuICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwLCBhMSwgIWN3KTtcbiAgICAgIGlmIChyMCA+IGVwc2lsb24pIHtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8ocjAgKiBjb3MoYTEpLCByMCAqIHNpbihhMSkpO1xuICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEsIGEwLCBjdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3IgaXMgaXQgYSBjaXJjdWxhciBvciBhbm51bGFyIHNlY3Rvcj9cbiAgICBlbHNlIHtcbiAgICAgIHZhciBhMDEgPSBhMCxcbiAgICAgICAgICBhMTEgPSBhMSxcbiAgICAgICAgICBhMDAgPSBhMCxcbiAgICAgICAgICBhMTAgPSBhMSxcbiAgICAgICAgICBkYTAgPSBkYSxcbiAgICAgICAgICBkYTEgPSBkYSxcbiAgICAgICAgICBhcCA9IHBhZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLyAyLFxuICAgICAgICAgIHJwID0gKGFwID4gZXBzaWxvbikgJiYgKHBhZFJhZGl1cyA/ICtwYWRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNxcnQocjAgKiByMCArIHIxICogcjEpKSxcbiAgICAgICAgICByYyA9IG1pbihhYnMocjEgLSByMCkgLyAyLCArY29ybmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpLFxuICAgICAgICAgIHJjMCA9IHJjLFxuICAgICAgICAgIHJjMSA9IHJjLFxuICAgICAgICAgIHQwLFxuICAgICAgICAgIHQxO1xuXG4gICAgICAvLyBBcHBseSBwYWRkaW5nPyBOb3RlIHRoYXQgc2luY2UgcjEg4omlIHIwLCBkYTEg4omlIGRhMC5cbiAgICAgIGlmIChycCA+IGVwc2lsb24pIHtcbiAgICAgICAgdmFyIHAwID0gYXNpbihycCAvIHIwICogc2luKGFwKSksXG4gICAgICAgICAgICBwMSA9IGFzaW4ocnAgLyByMSAqIHNpbihhcCkpO1xuICAgICAgICBpZiAoKGRhMCAtPSBwMCAqIDIpID4gZXBzaWxvbikgcDAgKj0gKGN3ID8gMSA6IC0xKSwgYTAwICs9IHAwLCBhMTAgLT0gcDA7XG4gICAgICAgIGVsc2UgZGEwID0gMCwgYTAwID0gYTEwID0gKGEwICsgYTEpIC8gMjtcbiAgICAgICAgaWYgKChkYTEgLT0gcDEgKiAyKSA+IGVwc2lsb24pIHAxICo9IChjdyA/IDEgOiAtMSksIGEwMSArPSBwMSwgYTExIC09IHAxO1xuICAgICAgICBlbHNlIGRhMSA9IDAsIGEwMSA9IGExMSA9IChhMCArIGExKSAvIDI7XG4gICAgICB9XG5cbiAgICAgIHZhciB4MDEgPSByMSAqIGNvcyhhMDEpLFxuICAgICAgICAgIHkwMSA9IHIxICogc2luKGEwMSksXG4gICAgICAgICAgeDEwID0gcjAgKiBjb3MoYTEwKSxcbiAgICAgICAgICB5MTAgPSByMCAqIHNpbihhMTApO1xuXG4gICAgICAvLyBBcHBseSByb3VuZGVkIGNvcm5lcnM/XG4gICAgICBpZiAocmMgPiBlcHNpbG9uKSB7XG4gICAgICAgIHZhciB4MTEgPSByMSAqIGNvcyhhMTEpLFxuICAgICAgICAgICAgeTExID0gcjEgKiBzaW4oYTExKSxcbiAgICAgICAgICAgIHgwMCA9IHIwICogY29zKGEwMCksXG4gICAgICAgICAgICB5MDAgPSByMCAqIHNpbihhMDApLFxuICAgICAgICAgICAgb2M7XG5cbiAgICAgICAgLy8gUmVzdHJpY3QgdGhlIGNvcm5lciByYWRpdXMgYWNjb3JkaW5nIHRvIHRoZSBzZWN0b3IgYW5nbGUuXG4gICAgICAgIGlmIChkYSA8IHBpICYmIChvYyA9IGludGVyc2VjdCh4MDEsIHkwMSwgeDAwLCB5MDAsIHgxMSwgeTExLCB4MTAsIHkxMCkpKSB7XG4gICAgICAgICAgdmFyIGF4ID0geDAxIC0gb2NbMF0sXG4gICAgICAgICAgICAgIGF5ID0geTAxIC0gb2NbMV0sXG4gICAgICAgICAgICAgIGJ4ID0geDExIC0gb2NbMF0sXG4gICAgICAgICAgICAgIGJ5ID0geTExIC0gb2NbMV0sXG4gICAgICAgICAgICAgIGtjID0gMSAvIHNpbihhY29zKChheCAqIGJ4ICsgYXkgKiBieSkgLyAoc3FydChheCAqIGF4ICsgYXkgKiBheSkgKiBzcXJ0KGJ4ICogYnggKyBieSAqIGJ5KSkpIC8gMiksXG4gICAgICAgICAgICAgIGxjID0gc3FydChvY1swXSAqIG9jWzBdICsgb2NbMV0gKiBvY1sxXSk7XG4gICAgICAgICAgcmMwID0gbWluKHJjLCAocjAgLSBsYykgLyAoa2MgLSAxKSk7XG4gICAgICAgICAgcmMxID0gbWluKHJjLCAocjEgLSBsYykgLyAoa2MgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSXMgdGhlIHNlY3RvciBjb2xsYXBzZWQgdG8gYSBsaW5lP1xuICAgICAgaWYgKCEoZGExID4gZXBzaWxvbikpIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKTtcblxuICAgICAgLy8gRG9lcyB0aGUgc2VjdG9y4oCZcyBvdXRlciByaW5nIGhhdmUgcm91bmRlZCBjb3JuZXJzP1xuICAgICAgZWxzZSBpZiAocmMxID4gZXBzaWxvbikge1xuICAgICAgICB0MCA9IGNvcm5lclRhbmdlbnRzKHgwMCwgeTAwLCB4MDEsIHkwMSwgcjEsIHJjMSwgY3cpO1xuICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgxMSwgeTExLCB4MTAsIHkxMCwgcjEsIHJjMSwgY3cpO1xuXG4gICAgICAgIGNvbnRleHQubW92ZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkwMSk7XG5cbiAgICAgICAgLy8gSGF2ZSB0aGUgY29ybmVycyBtZXJnZWQ/XG4gICAgICAgIGlmIChyYzEgPCByYykgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzEsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgZHJhdyB0aGUgdHdvIGNvcm5lcnMgYW5kIHRoZSByaW5nLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMSwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MC55MTEsIHQwLngxMSksICFjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGF0YW4yKHQwLmN5ICsgdDAueTExLCB0MC5jeCArIHQwLngxMSksIGF0YW4yKHQxLmN5ICsgdDEueTExLCB0MS5jeCArIHQxLngxMSksICFjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmModDEuY3gsIHQxLmN5LCByYzEsIGF0YW4yKHQxLnkxMSwgdDEueDExKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9yIGlzIHRoZSBvdXRlciByaW5nIGp1c3QgYSBjaXJjdWxhciBhcmM/XG4gICAgICBlbHNlIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKSwgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwMSwgYTExLCAhY3cpO1xuXG4gICAgICAvLyBJcyB0aGVyZSBubyBpbm5lciByaW5nLCBhbmQgaXTigJlzIGEgY2lyY3VsYXIgc2VjdG9yP1xuICAgICAgLy8gT3IgcGVyaGFwcyBpdOKAmXMgYW4gYW5udWxhciBzZWN0b3IgY29sbGFwc2VkIGR1ZSB0byBwYWRkaW5nP1xuICAgICAgaWYgKCEocjAgPiBlcHNpbG9uKSB8fCAhKGRhMCA+IGVwc2lsb24pKSBjb250ZXh0LmxpbmVUbyh4MTAsIHkxMCk7XG5cbiAgICAgIC8vIERvZXMgdGhlIHNlY3RvcuKAmXMgaW5uZXIgcmluZyAob3IgcG9pbnQpIGhhdmUgcm91bmRlZCBjb3JuZXJzP1xuICAgICAgZWxzZSBpZiAocmMwID4gZXBzaWxvbikge1xuICAgICAgICB0MCA9IGNvcm5lclRhbmdlbnRzKHgxMCwgeTEwLCB4MTEsIHkxMSwgcjAsIC1yYzAsIGN3KTtcbiAgICAgICAgdDEgPSBjb3JuZXJUYW5nZW50cyh4MDEsIHkwMSwgeDAwLCB5MDAsIHIwLCAtcmMwLCBjdyk7XG5cbiAgICAgICAgY29udGV4dC5saW5lVG8odDAuY3ggKyB0MC54MDEsIHQwLmN5ICsgdDAueTAxKTtcblxuICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD9cbiAgICAgICAgaWYgKHJjMCA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMwLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQwLnkxMSwgdDAueDExKSwgIWN3KTtcbiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMCwgYXRhbjIodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgY3cpO1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMwLCBhdGFuMih0MS55MTEsIHQxLngxMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPciBpcyB0aGUgaW5uZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjP1xuICAgICAgZWxzZSBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEwLCBhMDAsIGN3KTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGNvbnRleHQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBhcmMuY2VudHJvaWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9ICgraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIsXG4gICAgICAgIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBwaSAvIDI7XG4gICAgcmV0dXJuIFtjb3MoYSkgKiByLCBzaW4oYSkgKiByXTtcbiAgfTtcblxuICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW5uZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGlubmVyUmFkaXVzO1xuICB9O1xuXG4gIGFyYy5vdXRlclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdXRlclJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogb3V0ZXJSYWRpdXM7XG4gIH07XG5cbiAgYXJjLmNvcm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb3JuZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGNvcm5lclJhZGl1cztcbiAgfTtcblxuICBhcmMucGFkUmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZFJhZGl1cyA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IHBhZFJhZGl1cztcbiAgfTtcblxuICBhcmMuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBzdGFydEFuZ2xlO1xuICB9O1xuXG4gIGFyYy5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlbmRBbmdsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogZW5kQW5nbGU7XG4gIH07XG5cbiAgYXJjLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBwYWRBbmdsZTtcbiAgfTtcblxuICBhcmMuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgYXJjKSA6IGNvbnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIGFyYztcbn1cbiIsImZ1bmN0aW9uIExpbmVhcihjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5MaW5lYXIucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpOyBicmVhaztcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBMaW5lYXIoY29udGV4dCk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24geChwKSB7XG4gIHJldHVybiBwWzBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24geShwKSB7XG4gIHJldHVybiBwWzFdO1xufVxuIiwiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgY3VydmVMaW5lYXIgZnJvbSBcIi4vY3VydmUvbGluZWFyLmpzXCI7XG5pbXBvcnQge3ggYXMgcG9pbnRYLCB5IGFzIHBvaW50WX0gZnJvbSBcIi4vcG9pbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciB4ID0gcG9pbnRYLFxuICAgICAgeSA9IHBvaW50WSxcbiAgICAgIGRlZmluZWQgPSBjb25zdGFudCh0cnVlKSxcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhcixcbiAgICAgIG91dHB1dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gbGluZShkYXRhKSB7XG4gICAgdmFyIGksXG4gICAgICAgIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZCxcbiAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSxcbiAgICAgICAgYnVmZmVyO1xuXG4gICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgb3V0cHV0ID0gY3VydmUoYnVmZmVyID0gcGF0aCgpKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytpKSB7XG4gICAgICBpZiAoIShpIDwgbiAmJiBkZWZpbmVkKGQgPSBkYXRhW2ldLCBpLCBkYXRhKSkgPT09IGRlZmluZWQwKSB7XG4gICAgICAgIGlmIChkZWZpbmVkMCA9ICFkZWZpbmVkMCkgb3V0cHV0LmxpbmVTdGFydCgpO1xuICAgICAgICBlbHNlIG91dHB1dC5saW5lRW5kKCk7XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5lZDApIG91dHB1dC5wb2ludCgreChkLCBpLCBkYXRhKSwgK3koZCwgaSwgZGF0YSkpO1xuICAgIH1cblxuICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBsaW5lLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5lKSA6IHg7XG4gIH07XG5cbiAgbGluZS55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluZSkgOiB5O1xuICB9O1xuXG4gIGxpbmUuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBsaW5lKSA6IGRlZmluZWQ7XG4gIH07XG5cbiAgbGluZS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJ2ZSA9IF8sIGNvbnRleHQgIT0gbnVsbCAmJiAob3V0cHV0ID0gY3VydmUoY29udGV4dCkpLCBsaW5lKSA6IGN1cnZlO1xuICB9O1xuXG4gIGxpbmUuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBjb250ZXh0ID0gb3V0cHV0ID0gbnVsbCA6IG91dHB1dCA9IGN1cnZlKGNvbnRleHQgPSBfKSwgbGluZSkgOiBjb250ZXh0O1xuICB9O1xuXG4gIHJldHVybiBsaW5lO1xufVxuIiwiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgY3VydmVMaW5lYXIgZnJvbSBcIi4vY3VydmUvbGluZWFyLmpzXCI7XG5pbXBvcnQgbGluZSBmcm9tIFwiLi9saW5lLmpzXCI7XG5pbXBvcnQge3ggYXMgcG9pbnRYLCB5IGFzIHBvaW50WX0gZnJvbSBcIi4vcG9pbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciB4MCA9IHBvaW50WCxcbiAgICAgIHgxID0gbnVsbCxcbiAgICAgIHkwID0gY29uc3RhbnQoMCksXG4gICAgICB5MSA9IHBvaW50WSxcbiAgICAgIGRlZmluZWQgPSBjb25zdGFudCh0cnVlKSxcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhcixcbiAgICAgIG91dHB1dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gYXJlYShkYXRhKSB7XG4gICAgdmFyIGksXG4gICAgICAgIGosXG4gICAgICAgIGssXG4gICAgICAgIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZCxcbiAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSxcbiAgICAgICAgYnVmZmVyLFxuICAgICAgICB4MHogPSBuZXcgQXJyYXkobiksXG4gICAgICAgIHkweiA9IG5ldyBBcnJheShuKTtcblxuICAgIGlmIChjb250ZXh0ID09IG51bGwpIG91dHB1dCA9IGN1cnZlKGJ1ZmZlciA9IHBhdGgoKSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDw9IG47ICsraSkge1xuICAgICAgaWYgKCEoaSA8IG4gJiYgZGVmaW5lZChkID0gZGF0YVtpXSwgaSwgZGF0YSkpID09PSBkZWZpbmVkMCkge1xuICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIHtcbiAgICAgICAgICBqID0gaTtcbiAgICAgICAgICBvdXRwdXQuYXJlYVN0YXJ0KCk7XG4gICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dC5saW5lRW5kKCk7XG4gICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpO1xuICAgICAgICAgIGZvciAoayA9IGkgLSAxOyBrID49IGo7IC0taykge1xuICAgICAgICAgICAgb3V0cHV0LnBvaW50KHgweltrXSwgeTB6W2tdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0cHV0LmxpbmVFbmQoKTtcbiAgICAgICAgICBvdXRwdXQuYXJlYUVuZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5lZDApIHtcbiAgICAgICAgeDB6W2ldID0gK3gwKGQsIGksIGRhdGEpLCB5MHpbaV0gPSAreTAoZCwgaSwgZGF0YSk7XG4gICAgICAgIG91dHB1dC5wb2ludCh4MSA/ICt4MShkLCBpLCBkYXRhKSA6IHgweltpXSwgeTEgPyAreTEoZCwgaSwgZGF0YSkgOiB5MHpbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBhcmVhbGluZSgpIHtcbiAgICByZXR1cm4gbGluZSgpLmRlZmluZWQoZGVmaW5lZCkuY3VydmUoY3VydmUpLmNvbnRleHQoY29udGV4dCk7XG4gIH1cblxuICBhcmVhLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgeDEgPSBudWxsLCBhcmVhKSA6IHgwO1xuICB9O1xuXG4gIGFyZWEueDAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJlYSkgOiB4MDtcbiAgfTtcblxuICBhcmVhLngxID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgxID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHgxO1xuICB9O1xuXG4gIGFyZWEueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB5MSA9IG51bGwsIGFyZWEpIDogeTA7XG4gIH07XG5cbiAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHkwO1xuICB9O1xuXG4gIGFyZWEueTEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTEgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyZWEpIDogeTE7XG4gIH07XG5cbiAgYXJlYS5saW5lWDAgPVxuICBhcmVhLmxpbmVZMCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhcmVhbGluZSgpLngoeDApLnkoeTApO1xuICB9O1xuXG4gIGFyZWEubGluZVkxID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4MCkueSh5MSk7XG4gIH07XG5cbiAgYXJlYS5saW5lWDEgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgxKS55KHkwKTtcbiAgfTtcblxuICBhcmVhLmRlZmluZWQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGVmaW5lZCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgYXJlYSkgOiBkZWZpbmVkO1xuICB9O1xuXG4gIGFyZWEuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY3VydmUgPSBfLCBjb250ZXh0ICE9IG51bGwgJiYgKG91dHB1dCA9IGN1cnZlKGNvbnRleHQpKSwgYXJlYSkgOiBjdXJ2ZTtcbiAgfTtcblxuICBhcmVhLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGFyZWEpIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gYXJlYTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICByZXR1cm4gZDtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IGRlc2NlbmRpbmcgZnJvbSBcIi4vZGVzY2VuZGluZy5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5pbXBvcnQge3RhdX0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHZhbHVlID0gaWRlbnRpdHksXG4gICAgICBzb3J0VmFsdWVzID0gZGVzY2VuZGluZyxcbiAgICAgIHNvcnQgPSBudWxsLFxuICAgICAgc3RhcnRBbmdsZSA9IGNvbnN0YW50KDApLFxuICAgICAgZW5kQW5nbGUgPSBjb25zdGFudCh0YXUpLFxuICAgICAgcGFkQW5nbGUgPSBjb25zdGFudCgwKTtcblxuICBmdW5jdGlvbiBwaWUoZGF0YSkge1xuICAgIHZhciBpLFxuICAgICAgICBuID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIGosXG4gICAgICAgIGssXG4gICAgICAgIHN1bSA9IDAsXG4gICAgICAgIGluZGV4ID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBhcmNzID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBhMCA9ICtzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIGRhID0gTWF0aC5taW4odGF1LCBNYXRoLm1heCgtdGF1LCBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gYTApKSxcbiAgICAgICAgYTEsXG4gICAgICAgIHAgPSBNYXRoLm1pbihNYXRoLmFicyhkYSkgLyBuLCBwYWRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSxcbiAgICAgICAgcGEgPSBwICogKGRhIDwgMCA/IC0xIDogMSksXG4gICAgICAgIHY7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHYgPSBhcmNzW2luZGV4W2ldID0gaV0gPSArdmFsdWUoZGF0YVtpXSwgaSwgZGF0YSkpID4gMCkge1xuICAgICAgICBzdW0gKz0gdjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPcHRpb25hbGx5IHNvcnQgdGhlIGFyY3MgYnkgcHJldmlvdXNseS1jb21wdXRlZCB2YWx1ZXMgb3IgYnkgZGF0YS5cbiAgICBpZiAoc29ydFZhbHVlcyAhPSBudWxsKSBpbmRleC5zb3J0KGZ1bmN0aW9uKGksIGopIHsgcmV0dXJuIHNvcnRWYWx1ZXMoYXJjc1tpXSwgYXJjc1tqXSk7IH0pO1xuICAgIGVsc2UgaWYgKHNvcnQgIT0gbnVsbCkgaW5kZXguc29ydChmdW5jdGlvbihpLCBqKSB7IHJldHVybiBzb3J0KGRhdGFbaV0sIGRhdGFbal0pOyB9KTtcblxuICAgIC8vIENvbXB1dGUgdGhlIGFyY3MhIFRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgb3JpZ2luYWwgZGF0YSdzIG9yZGVyLlxuICAgIGZvciAoaSA9IDAsIGsgPSBzdW0gPyAoZGEgLSBuICogcGEpIC8gc3VtIDogMDsgaSA8IG47ICsraSwgYTAgPSBhMSkge1xuICAgICAgaiA9IGluZGV4W2ldLCB2ID0gYXJjc1tqXSwgYTEgPSBhMCArICh2ID4gMCA/IHYgKiBrIDogMCkgKyBwYSwgYXJjc1tqXSA9IHtcbiAgICAgICAgZGF0YTogZGF0YVtqXSxcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIHZhbHVlOiB2LFxuICAgICAgICBzdGFydEFuZ2xlOiBhMCxcbiAgICAgICAgZW5kQW5nbGU6IGExLFxuICAgICAgICBwYWRBbmdsZTogcFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJjcztcbiAgfVxuXG4gIHBpZS52YWx1ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBwaWUpIDogdmFsdWU7XG4gIH07XG5cbiAgcGllLnNvcnRWYWx1ZXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydFZhbHVlcyA9IF8sIHNvcnQgPSBudWxsLCBwaWUpIDogc29ydFZhbHVlcztcbiAgfTtcblxuICBwaWUuc29ydCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0ID0gXywgc29ydFZhbHVlcyA9IG51bGwsIHBpZSkgOiBzb3J0O1xuICB9O1xuXG4gIHBpZS5zdGFydEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0YXJ0QW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgcGllKSA6IHN0YXJ0QW5nbGU7XG4gIH07XG5cbiAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHBpZSkgOiBlbmRBbmdsZTtcbiAgfTtcblxuICBwaWUucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkQW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgcGllKSA6IHBhZEFuZ2xlO1xuICB9O1xuXG4gIHJldHVybiBwaWU7XG59XG4iLCJpbXBvcnQgY3VydmVMaW5lYXIgZnJvbSBcIi4vbGluZWFyLmpzXCI7XG5cbmV4cG9ydCB2YXIgY3VydmVSYWRpYWxMaW5lYXIgPSBjdXJ2ZVJhZGlhbChjdXJ2ZUxpbmVhcik7XG5cbmZ1bmN0aW9uIFJhZGlhbChjdXJ2ZSkge1xuICB0aGlzLl9jdXJ2ZSA9IGN1cnZlO1xufVxuXG5SYWRpYWwucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2N1cnZlLmFyZWFTdGFydCgpO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdXJ2ZS5hcmVhRW5kKCk7XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fY3VydmUubGluZVN0YXJ0KCk7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2N1cnZlLmxpbmVFbmQoKTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKGEsIHIpIHtcbiAgICB0aGlzLl9jdXJ2ZS5wb2ludChyICogTWF0aC5zaW4oYSksIHIgKiAtTWF0aC5jb3MoYSkpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJ2ZVJhZGlhbChjdXJ2ZSkge1xuXG4gIGZ1bmN0aW9uIHJhZGlhbChjb250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBSYWRpYWwoY3VydmUoY29udGV4dCkpO1xuICB9XG5cbiAgcmFkaWFsLl9jdXJ2ZSA9IGN1cnZlO1xuXG4gIHJldHVybiByYWRpYWw7XG59XG4iLCJpbXBvcnQgY3VydmVSYWRpYWwsIHtjdXJ2ZVJhZGlhbExpbmVhcn0gZnJvbSBcIi4vY3VydmUvcmFkaWFsLmpzXCI7XG5pbXBvcnQgbGluZSBmcm9tIFwiLi9saW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lUmFkaWFsKGwpIHtcbiAgdmFyIGMgPSBsLmN1cnZlO1xuXG4gIGwuYW5nbGUgPSBsLngsIGRlbGV0ZSBsLng7XG4gIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55O1xuXG4gIGwuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7XG4gIH07XG5cbiAgcmV0dXJuIGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbGluZVJhZGlhbChsaW5lKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpKTtcbn1cbiIsImltcG9ydCBjdXJ2ZVJhZGlhbCwge2N1cnZlUmFkaWFsTGluZWFyfSBmcm9tIFwiLi9jdXJ2ZS9yYWRpYWwuanNcIjtcbmltcG9ydCBhcmVhIGZyb20gXCIuL2FyZWEuanNcIjtcbmltcG9ydCB7bGluZVJhZGlhbH0gZnJvbSBcIi4vbGluZVJhZGlhbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGEgPSBhcmVhKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpLFxuICAgICAgYyA9IGEuY3VydmUsXG4gICAgICB4MCA9IGEubGluZVgwLFxuICAgICAgeDEgPSBhLmxpbmVYMSxcbiAgICAgIHkwID0gYS5saW5lWTAsXG4gICAgICB5MSA9IGEubGluZVkxO1xuXG4gIGEuYW5nbGUgPSBhLngsIGRlbGV0ZSBhLng7XG4gIGEuc3RhcnRBbmdsZSA9IGEueDAsIGRlbGV0ZSBhLngwO1xuICBhLmVuZEFuZ2xlID0gYS54MSwgZGVsZXRlIGEueDE7XG4gIGEucmFkaXVzID0gYS55LCBkZWxldGUgYS55O1xuICBhLmlubmVyUmFkaXVzID0gYS55MCwgZGVsZXRlIGEueTA7XG4gIGEub3V0ZXJSYWRpdXMgPSBhLnkxLCBkZWxldGUgYS55MTtcbiAgYS5saW5lU3RhcnRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MCgpKTsgfSwgZGVsZXRlIGEubGluZVgwO1xuICBhLmxpbmVFbmRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MSgpKTsgfSwgZGVsZXRlIGEubGluZVgxO1xuICBhLmxpbmVJbm5lclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5MCgpKTsgfSwgZGVsZXRlIGEubGluZVkwO1xuICBhLmxpbmVPdXRlclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5MSgpKTsgfSwgZGVsZXRlIGEubGluZVkxO1xuXG4gIGEuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7XG4gIH07XG5cbiAgcmV0dXJuIGE7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCB5KSB7XG4gIHJldHVybiBbKHkgPSAreSkgKiBNYXRoLmNvcyh4IC09IE1hdGguUEkgLyAyKSwgeSAqIE1hdGguc2luKHgpXTtcbn1cbiIsImV4cG9ydCB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG4iLCJpbXBvcnQge3BhdGh9IGZyb20gXCJkMy1wYXRoXCI7XG5pbXBvcnQge3NsaWNlfSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCB7eCBhcyBwb2ludFgsIHkgYXMgcG9pbnRZfSBmcm9tIFwiLi4vcG9pbnQuanNcIjtcbmltcG9ydCBwb2ludFJhZGlhbCBmcm9tIFwiLi4vcG9pbnRSYWRpYWwuanNcIjtcblxuZnVuY3Rpb24gbGlua1NvdXJjZShkKSB7XG4gIHJldHVybiBkLnNvdXJjZTtcbn1cblxuZnVuY3Rpb24gbGlua1RhcmdldChkKSB7XG4gIHJldHVybiBkLnRhcmdldDtcbn1cblxuZnVuY3Rpb24gbGluayhjdXJ2ZSkge1xuICB2YXIgc291cmNlID0gbGlua1NvdXJjZSxcbiAgICAgIHRhcmdldCA9IGxpbmtUYXJnZXQsXG4gICAgICB4ID0gcG9pbnRYLFxuICAgICAgeSA9IHBvaW50WSxcbiAgICAgIGNvbnRleHQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGxpbmsoKSB7XG4gICAgdmFyIGJ1ZmZlciwgYXJndiA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKSwgcyA9IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd2KSwgdCA9IHRhcmdldC5hcHBseSh0aGlzLCBhcmd2KTtcbiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7XG4gICAgY3VydmUoY29udGV4dCwgK3guYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSBzLCBhcmd2KSksICt5LmFwcGx5KHRoaXMsIGFyZ3YpLCAreC5hcHBseSh0aGlzLCAoYXJndlswXSA9IHQsIGFyZ3YpKSwgK3kuYXBwbHkodGhpcywgYXJndikpO1xuICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgXCJcIiB8fCBudWxsO1xuICB9XG5cbiAgbGluay5zb3VyY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc291cmNlID0gXywgbGluaykgOiBzb3VyY2U7XG4gIH07XG5cbiAgbGluay50YXJnZXQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFyZ2V0ID0gXywgbGluaykgOiB0YXJnZXQ7XG4gIH07XG5cbiAgbGluay54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluaykgOiB4O1xuICB9O1xuXG4gIGxpbmsueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmspIDogeTtcbiAgfTtcblxuICBsaW5rLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGxpbmspIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gbGluaztcbn1cblxuZnVuY3Rpb24gY3VydmVIb3Jpem9udGFsKGNvbnRleHQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIGNvbnRleHQubW92ZVRvKHgwLCB5MCk7XG4gIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCA9ICh4MCArIHgxKSAvIDIsIHkwLCB4MCwgeTEsIHgxLCB5MSk7XG59XG5cbmZ1bmN0aW9uIGN1cnZlVmVydGljYWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgY29udGV4dC5tb3ZlVG8oeDAsIHkwKTtcbiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgwLCB5MCA9ICh5MCArIHkxKSAvIDIsIHgxLCB5MCwgeDEsIHkxKTtcbn1cblxuZnVuY3Rpb24gY3VydmVSYWRpYWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIHAwID0gcG9pbnRSYWRpYWwoeDAsIHkwKSxcbiAgICAgIHAxID0gcG9pbnRSYWRpYWwoeDAsIHkwID0gKHkwICsgeTEpIC8gMiksXG4gICAgICBwMiA9IHBvaW50UmFkaWFsKHgxLCB5MCksXG4gICAgICBwMyA9IHBvaW50UmFkaWFsKHgxLCB5MSk7XG4gIGNvbnRleHQubW92ZVRvKHAwWzBdLCBwMFsxXSk7XG4gIGNvbnRleHQuYmV6aWVyQ3VydmVUbyhwMVswXSwgcDFbMV0sIHAyWzBdLCBwMlsxXSwgcDNbMF0sIHAzWzFdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtIb3Jpem9udGFsKCkge1xuICByZXR1cm4gbGluayhjdXJ2ZUhvcml6b250YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua1ZlcnRpY2FsKCkge1xuICByZXR1cm4gbGluayhjdXJ2ZVZlcnRpY2FsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtSYWRpYWwoKSB7XG4gIHZhciBsID0gbGluayhjdXJ2ZVJhZGlhbCk7XG4gIGwuYW5nbGUgPSBsLngsIGRlbGV0ZSBsLng7XG4gIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55O1xuICByZXR1cm4gbDtcbn1cbiIsImltcG9ydCB7cGksIHRhdX0gZnJvbSBcIi4uL21hdGguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7XG4gICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIHBpKTtcbiAgICBjb250ZXh0Lm1vdmVUbyhyLCAwKTtcbiAgICBjb250ZXh0LmFyYygwLCAwLCByLCAwLCB0YXUpO1xuICB9XG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7XG4gICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIDUpIC8gMjtcbiAgICBjb250ZXh0Lm1vdmVUbygtMyAqIHIsIC1yKTtcbiAgICBjb250ZXh0LmxpbmVUbygtciwgLXIpO1xuICAgIGNvbnRleHQubGluZVRvKC1yLCAtMyAqIHIpO1xuICAgIGNvbnRleHQubGluZVRvKHIsIC0zICogcik7XG4gICAgY29udGV4dC5saW5lVG8ociwgLXIpO1xuICAgIGNvbnRleHQubGluZVRvKDMgKiByLCAtcik7XG4gICAgY29udGV4dC5saW5lVG8oMyAqIHIsIHIpO1xuICAgIGNvbnRleHQubGluZVRvKHIsIHIpO1xuICAgIGNvbnRleHQubGluZVRvKHIsIDMgKiByKTtcbiAgICBjb250ZXh0LmxpbmVUbygtciwgMyAqIHIpO1xuICAgIGNvbnRleHQubGluZVRvKC1yLCByKTtcbiAgICBjb250ZXh0LmxpbmVUbygtMyAqIHIsIHIpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn07XG4iLCJ2YXIgdGFuMzAgPSBNYXRoLnNxcnQoMSAvIDMpLFxuICAgIHRhbjMwXzIgPSB0YW4zMCAqIDI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkge1xuICAgIHZhciB5ID0gTWF0aC5zcXJ0KHNpemUgLyB0YW4zMF8yKSxcbiAgICAgICAgeCA9IHkgKiB0YW4zMDtcbiAgICBjb250ZXh0Lm1vdmVUbygwLCAteSk7XG4gICAgY29udGV4dC5saW5lVG8oeCwgMCk7XG4gICAgY29udGV4dC5saW5lVG8oMCwgeSk7XG4gICAgY29udGV4dC5saW5lVG8oLXgsIDApO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn07XG4iLCJpbXBvcnQge3BpLCB0YXV9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5cbnZhciBrYSA9IDAuODkwODEzMDkxNTI5Mjg1MjI4MTAsXG4gICAga3IgPSBNYXRoLnNpbihwaSAvIDEwKSAvIE1hdGguc2luKDcgKiBwaSAvIDEwKSxcbiAgICBreCA9IE1hdGguc2luKHRhdSAvIDEwKSAqIGtyLFxuICAgIGt5ID0gLU1hdGguY29zKHRhdSAvIDEwKSAqIGtyO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHtcbiAgICB2YXIgciA9IE1hdGguc3FydChzaXplICoga2EpLFxuICAgICAgICB4ID0ga3ggKiByLFxuICAgICAgICB5ID0ga3kgKiByO1xuICAgIGNvbnRleHQubW92ZVRvKDAsIC1yKTtcbiAgICBjb250ZXh0LmxpbmVUbyh4LCB5KTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7ICsraSkge1xuICAgICAgdmFyIGEgPSB0YXUgKiBpIC8gNSxcbiAgICAgICAgICBjID0gTWF0aC5jb3MoYSksXG4gICAgICAgICAgcyA9IE1hdGguc2luKGEpO1xuICAgICAgY29udGV4dC5saW5lVG8ocyAqIHIsIC1jICogcik7XG4gICAgICBjb250ZXh0LmxpbmVUbyhjICogeCAtIHMgKiB5LCBzICogeCArIGMgKiB5KTtcbiAgICB9XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkge1xuICAgIHZhciB3ID0gTWF0aC5zcXJ0KHNpemUpLFxuICAgICAgICB4ID0gLXcgLyAyO1xuICAgIGNvbnRleHQucmVjdCh4LCB4LCB3LCB3KTtcbiAgfVxufTtcbiIsInZhciBzcXJ0MyA9IE1hdGguc3FydCgzKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7XG4gICAgdmFyIHkgPSAtTWF0aC5zcXJ0KHNpemUgLyAoc3FydDMgKiAzKSk7XG4gICAgY29udGV4dC5tb3ZlVG8oMCwgeSAqIDIpO1xuICAgIGNvbnRleHQubGluZVRvKC1zcXJ0MyAqIHksIC15KTtcbiAgICBjb250ZXh0LmxpbmVUbyhzcXJ0MyAqIHksIC15KTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59O1xuIiwidmFyIGMgPSAtMC41LFxuICAgIHMgPSBNYXRoLnNxcnQoMykgLyAyLFxuICAgIGsgPSAxIC8gTWF0aC5zcXJ0KDEyKSxcbiAgICBhID0gKGsgLyAyICsgMSkgKiAzO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHtcbiAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gYSksXG4gICAgICAgIHgwID0gciAvIDIsXG4gICAgICAgIHkwID0gciAqIGssXG4gICAgICAgIHgxID0geDAsXG4gICAgICAgIHkxID0gciAqIGsgKyByLFxuICAgICAgICB4MiA9IC14MSxcbiAgICAgICAgeTIgPSB5MTtcbiAgICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApO1xuICAgIGNvbnRleHQubGluZVRvKHgxLCB5MSk7XG4gICAgY29udGV4dC5saW5lVG8oeDIsIHkyKTtcbiAgICBjb250ZXh0LmxpbmVUbyhjICogeDAgLSBzICogeTAsIHMgKiB4MCArIGMgKiB5MCk7XG4gICAgY29udGV4dC5saW5lVG8oYyAqIHgxIC0gcyAqIHkxLCBzICogeDEgKyBjICogeTEpO1xuICAgIGNvbnRleHQubGluZVRvKGMgKiB4MiAtIHMgKiB5MiwgcyAqIHgyICsgYyAqIHkyKTtcbiAgICBjb250ZXh0LmxpbmVUbyhjICogeDAgKyBzICogeTAsIGMgKiB5MCAtIHMgKiB4MCk7XG4gICAgY29udGV4dC5saW5lVG8oYyAqIHgxICsgcyAqIHkxLCBjICogeTEgLSBzICogeDEpO1xuICAgIGNvbnRleHQubGluZVRvKGMgKiB4MiArIHMgKiB5MiwgYyAqIHkyIC0gcyAqIHgyKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59O1xuIiwiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGNpcmNsZSBmcm9tIFwiLi9zeW1ib2wvY2lyY2xlLmpzXCI7XG5pbXBvcnQgY3Jvc3MgZnJvbSBcIi4vc3ltYm9sL2Nyb3NzLmpzXCI7XG5pbXBvcnQgZGlhbW9uZCBmcm9tIFwiLi9zeW1ib2wvZGlhbW9uZC5qc1wiO1xuaW1wb3J0IHN0YXIgZnJvbSBcIi4vc3ltYm9sL3N0YXIuanNcIjtcbmltcG9ydCBzcXVhcmUgZnJvbSBcIi4vc3ltYm9sL3NxdWFyZS5qc1wiO1xuaW1wb3J0IHRyaWFuZ2xlIGZyb20gXCIuL3N5bWJvbC90cmlhbmdsZS5qc1wiO1xuaW1wb3J0IHd5ZSBmcm9tIFwiLi9zeW1ib2wvd3llLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZXhwb3J0IHZhciBzeW1ib2xzID0gW1xuICBjaXJjbGUsXG4gIGNyb3NzLFxuICBkaWFtb25kLFxuICBzcXVhcmUsXG4gIHN0YXIsXG4gIHRyaWFuZ2xlLFxuICB3eWVcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgdHlwZSA9IGNvbnN0YW50KGNpcmNsZSksXG4gICAgICBzaXplID0gY29uc3RhbnQoNjQpLFxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gc3ltYm9sKCkge1xuICAgIHZhciBidWZmZXI7XG4gICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCgpO1xuICAgIHR5cGUuYXBwbHkodGhpcywgYXJndW1lbnRzKS5kcmF3KGNvbnRleHQsICtzaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgXCJcIiB8fCBudWxsO1xuICB9XG5cbiAgc3ltYm9sLnR5cGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHlwZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHN5bWJvbCkgOiB0eXBlO1xuICB9O1xuXG4gIHN5bWJvbC5zaXplID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNpemUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgc3ltYm9sKSA6IHNpemU7XG4gIH07XG5cbiAgc3ltYm9sLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfLCBzeW1ib2wpIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gc3ltYm9sO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHBvaW50KHRoYXQsIHgsIHkpIHtcbiAgdGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKFxuICAgICgyICogdGhhdC5feDAgKyB0aGF0Ll94MSkgLyAzLFxuICAgICgyICogdGhhdC5feTAgKyB0aGF0Ll95MSkgLyAzLFxuICAgICh0aGF0Ll94MCArIDIgKiB0aGF0Ll94MSkgLyAzLFxuICAgICh0aGF0Ll95MCArIDIgKiB0aGF0Ll95MSkgLyAzLFxuICAgICh0aGF0Ll94MCArIDQgKiB0aGF0Ll94MSArIHgpIC8gNixcbiAgICAodGhhdC5feTAgKyA0ICogdGhhdC5feTEgKyB5KSAvIDZcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEJhc2lzKGNvbnRleHQpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbkJhc2lzLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gMDtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IE5hTjtcbiAgfSxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAzOiBwb2ludCh0aGlzLCB0aGlzLl94MSwgdGhpcy5feTEpOyAvLyBwcm9jZWVkXG4gICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fY29udGV4dC5saW5lVG8oKDUgKiB0aGlzLl94MCArIHRoaXMuX3gxKSAvIDYsICg1ICogdGhpcy5feTAgKyB0aGlzLl95MSkgLyA2KTsgLy8gcHJvY2VlZFxuICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgQmFzaXMoY29udGV4dCk7XG59XG4iLCJpbXBvcnQgbm9vcCBmcm9tIFwiLi4vbm9vcC5qc1wiO1xuaW1wb3J0IHtwb2ludH0gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZnVuY3Rpb24gQmFzaXNDbG9zZWQoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbn1cblxuQmFzaXNDbG9zZWQucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IG5vb3AsXG4gIGFyZWFFbmQ6IG5vb3AsXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gdGhpcy5feTMgPSB0aGlzLl95NCA9IE5hTjtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMToge1xuICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MiwgdGhpcy5feTIpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMjoge1xuICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDIgKyAyICogdGhpcy5feDMpIC8gMywgKHRoaXMuX3kyICsgMiAqIHRoaXMuX3kzKSAvIDMpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMgKyAyICogdGhpcy5feDIpIC8gMywgKHRoaXMuX3kzICsgMiAqIHRoaXMuX3kyKSAvIDMpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMzoge1xuICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3gyLCB0aGlzLl95Mik7XG4gICAgICAgIHRoaXMucG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTtcbiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NCwgdGhpcy5feTQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX3gyID0geCwgdGhpcy5feTIgPSB5OyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5feDQgPSB4LCB0aGlzLl95NCA9IHk7IHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCArIDQgKiB0aGlzLl94MSArIHgpIC8gNiwgKHRoaXMuX3kwICsgNCAqIHRoaXMuX3kxICsgeSkgLyA2KTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBCYXNpc0Nsb3NlZChjb250ZXh0KTtcbn1cbiIsImltcG9ydCB7cG9pbnR9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmZ1bmN0aW9uIEJhc2lzT3Blbihjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5CYXNpc09wZW4ucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMykpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB2YXIgeDAgPSAodGhpcy5feDAgKyA0ICogdGhpcy5feDEgKyB4KSAvIDYsIHkwID0gKHRoaXMuX3kwICsgNCAqIHRoaXMuX3kxICsgeSkgLyA2OyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeDAsIHkwKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgwLCB5MCk7IGJyZWFrO1xuICAgICAgY2FzZSAzOiB0aGlzLl9wb2ludCA9IDQ7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhaztcbiAgICB9XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4O1xuICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IEJhc2lzT3Blbihjb250ZXh0KTtcbn1cbiIsImltcG9ydCB7QmFzaXN9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmZ1bmN0aW9uIEJ1bmRsZShjb250ZXh0LCBiZXRhKSB7XG4gIHRoaXMuX2Jhc2lzID0gbmV3IEJhc2lzKGNvbnRleHQpO1xuICB0aGlzLl9iZXRhID0gYmV0YTtcbn1cblxuQnVuZGxlLnByb3RvdHlwZSA9IHtcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94ID0gW107XG4gICAgdGhpcy5feSA9IFtdO1xuICAgIHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgeCA9IHRoaXMuX3gsXG4gICAgICAgIHkgPSB0aGlzLl95LFxuICAgICAgICBqID0geC5sZW5ndGggLSAxO1xuXG4gICAgaWYgKGogPiAwKSB7XG4gICAgICB2YXIgeDAgPSB4WzBdLFxuICAgICAgICAgIHkwID0geVswXSxcbiAgICAgICAgICBkeCA9IHhbal0gLSB4MCxcbiAgICAgICAgICBkeSA9IHlbal0gLSB5MCxcbiAgICAgICAgICBpID0gLTEsXG4gICAgICAgICAgdDtcblxuICAgICAgd2hpbGUgKCsraSA8PSBqKSB7XG4gICAgICAgIHQgPSBpIC8gajtcbiAgICAgICAgdGhpcy5fYmFzaXMucG9pbnQoXG4gICAgICAgICAgdGhpcy5fYmV0YSAqIHhbaV0gKyAoMSAtIHRoaXMuX2JldGEpICogKHgwICsgdCAqIGR4KSxcbiAgICAgICAgICB0aGlzLl9iZXRhICogeVtpXSArICgxIC0gdGhpcy5fYmV0YSkgKiAoeTAgKyB0ICogZHkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5feCA9IHRoaXMuX3kgPSBudWxsO1xuICAgIHRoaXMuX2Jhc2lzLmxpbmVFbmQoKTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLl94LnB1c2goK3gpO1xuICAgIHRoaXMuX3kucHVzaCgreSk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20oYmV0YSkge1xuXG4gIGZ1bmN0aW9uIGJ1bmRsZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGJldGEgPT09IDEgPyBuZXcgQmFzaXMoY29udGV4dCkgOiBuZXcgQnVuZGxlKGNvbnRleHQsIGJldGEpO1xuICB9XG5cbiAgYnVuZGxlLmJldGEgPSBmdW5jdGlvbihiZXRhKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrYmV0YSk7XG4gIH07XG5cbiAgcmV0dXJuIGJ1bmRsZTtcbn0pKDAuODUpO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIHBvaW50KHRoYXQsIHgsIHkpIHtcbiAgdGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKFxuICAgIHRoYXQuX3gxICsgdGhhdC5fayAqICh0aGF0Ll94MiAtIHRoYXQuX3gwKSxcbiAgICB0aGF0Ll95MSArIHRoYXQuX2sgKiAodGhhdC5feTIgLSB0aGF0Ll95MCksXG4gICAgdGhhdC5feDIgKyB0aGF0Ll9rICogKHRoYXQuX3gxIC0geCksXG4gICAgdGhhdC5feTIgKyB0aGF0Ll9rICogKHRoYXQuX3kxIC0geSksXG4gICAgdGhhdC5feDIsXG4gICAgdGhhdC5feTJcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENhcmRpbmFsKGNvbnRleHQsIHRlbnNpb24pIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjtcbn1cblxuQ2FyZGluYWwucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhaztcbiAgICAgIGNhc2UgMzogcG9pbnQodGhpcywgdGhpcy5feDEsIHRoaXMuX3kxKTsgYnJlYWs7XG4gICAgfVxuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl94MSA9IHgsIHRoaXMuX3kxID0geTsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgLy8gcHJvY2VlZFxuICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKHRlbnNpb24pIHtcblxuICBmdW5jdGlvbiBjYXJkaW5hbChjb250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBDYXJkaW5hbChjb250ZXh0LCB0ZW5zaW9uKTtcbiAgfVxuXG4gIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrdGVuc2lvbik7XG4gIH07XG5cbiAgcmV0dXJuIGNhcmRpbmFsO1xufSkoMCk7XG4iLCJpbXBvcnQgbm9vcCBmcm9tIFwiLi4vbm9vcC5qc1wiO1xuaW1wb3J0IHtwb2ludH0gZnJvbSBcIi4vY2FyZGluYWwuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsIHRlbnNpb24pIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjtcbn1cblxuQ2FyZGluYWxDbG9zZWQucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IG5vb3AsXG4gIGFyZWFFbmQ6IG5vb3AsXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9IHRoaXMuX3g1ID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gdGhpcy5feTUgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDE6IHtcbiAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsIHRoaXMuX3kzKTtcbiAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDI6IHtcbiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTtcbiAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDM6IHtcbiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpO1xuICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7XG4gICAgICAgIHRoaXMucG9pbnQodGhpcy5feDUsIHRoaXMuX3k1KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQgPSB4LCB0aGlzLl95NCA9IHkpOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NSA9IHgsIHRoaXMuX3k1ID0geTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20odGVuc2lvbikge1xuXG4gIGZ1bmN0aW9uIGNhcmRpbmFsKGNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsIHRlbnNpb24pO1xuICB9XG5cbiAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHtcbiAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTtcbiAgfTtcblxuICByZXR1cm4gY2FyZGluYWw7XG59KSgwKTtcbiIsImltcG9ydCB7cG9pbnR9IGZyb20gXCIuL2NhcmRpbmFsLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDYXJkaW5hbE9wZW4oY29udGV4dCwgdGVuc2lvbikge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5fayA9ICgxIC0gdGVuc2lvbikgLyA2O1xufVxuXG5DYXJkaW5hbE9wZW4ucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDMpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95MikgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhaztcbiAgICAgIGNhc2UgMzogdGhpcy5fcG9pbnQgPSA0OyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20odGVuc2lvbikge1xuXG4gIGZ1bmN0aW9uIGNhcmRpbmFsKGNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IENhcmRpbmFsT3Blbihjb250ZXh0LCB0ZW5zaW9uKTtcbiAgfVxuXG4gIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrdGVuc2lvbik7XG4gIH07XG5cbiAgcmV0dXJuIGNhcmRpbmFsO1xufSkoMCk7XG4iLCJpbXBvcnQge2Vwc2lsb259IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQge0NhcmRpbmFsfSBmcm9tIFwiLi9jYXJkaW5hbC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnQodGhhdCwgeCwgeSkge1xuICB2YXIgeDEgPSB0aGF0Ll94MSxcbiAgICAgIHkxID0gdGhhdC5feTEsXG4gICAgICB4MiA9IHRoYXQuX3gyLFxuICAgICAgeTIgPSB0aGF0Ll95MjtcblxuICBpZiAodGhhdC5fbDAxX2EgPiBlcHNpbG9uKSB7XG4gICAgdmFyIGEgPSAyICogdGhhdC5fbDAxXzJhICsgMyAqIHRoYXQuX2wwMV9hICogdGhhdC5fbDEyX2EgKyB0aGF0Ll9sMTJfMmEsXG4gICAgICAgIG4gPSAzICogdGhhdC5fbDAxX2EgKiAodGhhdC5fbDAxX2EgKyB0aGF0Ll9sMTJfYSk7XG4gICAgeDEgPSAoeDEgKiBhIC0gdGhhdC5feDAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll94MiAqIHRoYXQuX2wwMV8yYSkgLyBuO1xuICAgIHkxID0gKHkxICogYSAtIHRoYXQuX3kwICogdGhhdC5fbDEyXzJhICsgdGhhdC5feTIgKiB0aGF0Ll9sMDFfMmEpIC8gbjtcbiAgfVxuXG4gIGlmICh0aGF0Ll9sMjNfYSA+IGVwc2lsb24pIHtcbiAgICB2YXIgYiA9IDIgKiB0aGF0Ll9sMjNfMmEgKyAzICogdGhhdC5fbDIzX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSxcbiAgICAgICAgbSA9IDMgKiB0aGF0Ll9sMjNfYSAqICh0aGF0Ll9sMjNfYSArIHRoYXQuX2wxMl9hKTtcbiAgICB4MiA9ICh4MiAqIGIgKyB0aGF0Ll94MSAqIHRoYXQuX2wyM18yYSAtIHggKiB0aGF0Ll9sMTJfMmEpIC8gbTtcbiAgICB5MiA9ICh5MiAqIGIgKyB0aGF0Ll95MSAqIHRoYXQuX2wyM18yYSAtIHkgKiB0aGF0Ll9sMTJfMmEpIC8gbTtcbiAgfVxuXG4gIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MSwgeTEsIHgyLCB5MiwgdGhhdC5feDIsIHRoYXQuX3kyKTtcbn1cblxuZnVuY3Rpb24gQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5fYWxwaGEgPSBhbHBoYTtcbn1cblxuQ2F0bXVsbFJvbS5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47XG4gICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID1cbiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPVxuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhaztcbiAgICAgIGNhc2UgMzogdGhpcy5wb2ludCh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcblxuICAgIGlmICh0aGlzLl9wb2ludCkge1xuICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCxcbiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7XG4gICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTtcbiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7XG5cbiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb20oY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsKGNvbnRleHQsIDApO1xuICB9XG5cbiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpO1xuICB9O1xuXG4gIHJldHVybiBjYXRtdWxsUm9tO1xufSkoMC41KTtcbiIsImltcG9ydCB7Q2FyZGluYWxDbG9zZWR9IGZyb20gXCIuL2NhcmRpbmFsQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9vcCBmcm9tIFwiLi4vbm9vcC5qc1wiO1xuaW1wb3J0IHtwb2ludH0gZnJvbSBcIi4vY2F0bXVsbFJvbS5qc1wiO1xuXG5mdW5jdGlvbiBDYXRtdWxsUm9tQ2xvc2VkKGNvbnRleHQsIGFscGhhKSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLl9hbHBoYSA9IGFscGhhO1xufVxuXG5DYXRtdWxsUm9tQ2xvc2VkLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBub29wLFxuICBhcmVhRW5kOiBub29wLFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9IHRoaXMuX3gzID0gdGhpcy5feDQgPSB0aGlzLl94NSA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gdGhpcy5feTMgPSB0aGlzLl95NCA9IHRoaXMuX3k1ID0gTmFOO1xuICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYSA9XG4gICAgdGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhID1cbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMToge1xuICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MywgdGhpcy5feTMpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMjoge1xuICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MywgdGhpcy5feTMpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMzoge1xuICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3gzLCB0aGlzLl95Myk7XG4gICAgICAgIHRoaXMucG9pbnQodGhpcy5feDQsIHRoaXMuX3k0KTtcbiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NSwgdGhpcy5feTUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG5cbiAgICBpZiAodGhpcy5fcG9pbnQpIHtcbiAgICAgIHZhciB4MjMgPSB0aGlzLl94MiAtIHgsXG4gICAgICAgICAgeTIzID0gdGhpcy5feTIgLSB5O1xuICAgICAgdGhpcy5fbDIzX2EgPSBNYXRoLnNxcnQodGhpcy5fbDIzXzJhID0gTWF0aC5wb3coeDIzICogeDIzICsgeTIzICogeTIzLCB0aGlzLl9hbHBoYSkpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQgPSB4LCB0aGlzLl95NCA9IHkpOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NSA9IHgsIHRoaXMuX3k1ID0geTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTtcbiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7XG5cbiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsIDApO1xuICB9XG5cbiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpO1xuICB9O1xuXG4gIHJldHVybiBjYXRtdWxsUm9tO1xufSkoMC41KTtcbiIsImltcG9ydCB7Q2FyZGluYWxPcGVufSBmcm9tIFwiLi9jYXJkaW5hbE9wZW4uanNcIjtcbmltcG9ydCB7cG9pbnR9IGZyb20gXCIuL2NhdG11bGxSb20uanNcIjtcblxuZnVuY3Rpb24gQ2F0bXVsbFJvbU9wZW4oY29udGV4dCwgYWxwaGEpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuX2FscGhhID0gYWxwaGE7XG59XG5cbkNhdG11bGxSb21PcGVuLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gMDtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IE5hTjtcbiAgfSxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IE5hTjtcbiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2EgPVxuICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMykpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuXG4gICAgaWYgKHRoaXMuX3BvaW50KSB7XG4gICAgICB2YXIgeDIzID0gdGhpcy5feDIgLSB4LFxuICAgICAgICAgIHkyMyA9IHRoaXMuX3kyIC0geTtcbiAgICAgIHRoaXMuX2wyM19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyArIHkyMyAqIHkyMywgdGhpcy5fYWxwaGEpKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95MikgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhaztcbiAgICAgIGNhc2UgMzogdGhpcy5fcG9pbnQgPSA0OyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTtcbiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7XG5cbiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb21PcGVuKGNvbnRleHQsIGFscGhhKSA6IG5ldyBDYXJkaW5hbE9wZW4oY29udGV4dCwgMCk7XG4gIH1cblxuICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHtcbiAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7XG4gIH07XG5cbiAgcmV0dXJuIGNhdG11bGxSb207XG59KSgwLjUpO1xuIiwiaW1wb3J0IG5vb3AgZnJvbSBcIi4uL25vb3AuanNcIjtcblxuZnVuY3Rpb24gTGluZWFyQ2xvc2VkKGNvbnRleHQpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbkxpbmVhckNsb3NlZC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogbm9vcCxcbiAgYXJlYUVuZDogbm9vcCxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9wb2ludCkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBpZiAodGhpcy5fcG9pbnQpIHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpO1xuICAgIGVsc2UgdGhpcy5fcG9pbnQgPSAxLCB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IExpbmVhckNsb3NlZChjb250ZXh0KTtcbn1cbiIsImZ1bmN0aW9uIHNpZ24oeCkge1xuICByZXR1cm4geCA8IDAgPyAtMSA6IDE7XG59XG5cbi8vIENhbGN1bGF0ZSB0aGUgc2xvcGVzIG9mIHRoZSB0YW5nZW50cyAoSGVybWl0ZS10eXBlIGludGVycG9sYXRpb24pIGJhc2VkIG9uXG4vLyB0aGUgZm9sbG93aW5nIHBhcGVyOiBTdGVmZmVuLCBNLiAxOTkwLiBBIFNpbXBsZSBNZXRob2QgZm9yIE1vbm90b25pY1xuLy8gSW50ZXJwb2xhdGlvbiBpbiBPbmUgRGltZW5zaW9uLiBBc3Ryb25vbXkgYW5kIEFzdHJvcGh5c2ljcywgVm9sLiAyMzksIE5PLlxuLy8gTk9WKElJKSwgUC4gNDQzLCAxOTkwLlxuZnVuY3Rpb24gc2xvcGUzKHRoYXQsIHgyLCB5Mikge1xuICB2YXIgaDAgPSB0aGF0Ll94MSAtIHRoYXQuX3gwLFxuICAgICAgaDEgPSB4MiAtIHRoYXQuX3gxLFxuICAgICAgczAgPSAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyAoaDAgfHwgaDEgPCAwICYmIC0wKSxcbiAgICAgIHMxID0gKHkyIC0gdGhhdC5feTEpIC8gKGgxIHx8IGgwIDwgMCAmJiAtMCksXG4gICAgICBwID0gKHMwICogaDEgKyBzMSAqIGgwKSAvIChoMCArIGgxKTtcbiAgcmV0dXJuIChzaWduKHMwKSArIHNpZ24oczEpKSAqIE1hdGgubWluKE1hdGguYWJzKHMwKSwgTWF0aC5hYnMoczEpLCAwLjUgKiBNYXRoLmFicyhwKSkgfHwgMDtcbn1cblxuLy8gQ2FsY3VsYXRlIGEgb25lLXNpZGVkIHNsb3BlLlxuZnVuY3Rpb24gc2xvcGUyKHRoYXQsIHQpIHtcbiAgdmFyIGggPSB0aGF0Ll94MSAtIHRoYXQuX3gwO1xuICByZXR1cm4gaCA/ICgzICogKHRoYXQuX3kxIC0gdGhhdC5feTApIC8gaCAtIHQpIC8gMiA6IHQ7XG59XG5cbi8vIEFjY29yZGluZyB0byBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19IZXJtaXRlX3NwbGluZSNSZXByZXNlbnRhdGlvbnNcbi8vIFwieW91IGNhbiBleHByZXNzIGN1YmljIEhlcm1pdGUgaW50ZXJwb2xhdGlvbiBpbiB0ZXJtcyBvZiBjdWJpYyBCw6l6aWVyIGN1cnZlc1xuLy8gd2l0aCByZXNwZWN0IHRvIHRoZSBmb3VyIHZhbHVlcyBwMCwgcDAgKyBtMCAvIDMsIHAxIC0gbTEgLyAzLCBwMVwiLlxuZnVuY3Rpb24gcG9pbnQodGhhdCwgdDAsIHQxKSB7XG4gIHZhciB4MCA9IHRoYXQuX3gwLFxuICAgICAgeTAgPSB0aGF0Ll95MCxcbiAgICAgIHgxID0gdGhhdC5feDEsXG4gICAgICB5MSA9IHRoYXQuX3kxLFxuICAgICAgZHggPSAoeDEgLSB4MCkgLyAzO1xuICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oeDAgKyBkeCwgeTAgKyBkeCAqIHQwLCB4MSAtIGR4LCB5MSAtIGR4ICogdDEsIHgxLCB5MSk7XG59XG5cbmZ1bmN0aW9uIE1vbm90b25lWChjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5Nb25vdG9uZVgucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPVxuICAgIHRoaXMuX3QwID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhaztcbiAgICAgIGNhc2UgMzogcG9pbnQodGhpcywgdGhpcy5fdDAsIHNsb3BlMih0aGlzLCB0aGlzLl90MCkpOyBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB2YXIgdDEgPSBOYU47XG5cbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBpZiAoeCA9PT0gdGhpcy5feDEgJiYgeSA9PT0gdGhpcy5feTEpIHJldHVybjsgLy8gSWdub3JlIGNvaW5jaWRlbnQgcG9pbnRzLlxuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgcG9pbnQodGhpcywgc2xvcGUyKHRoaXMsIHQxID0gc2xvcGUzKHRoaXMsIHgsIHkpKSwgdDEpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHRoaXMuX3QwLCB0MSA9IHNsb3BlMyh0aGlzLCB4LCB5KSk7IGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7XG4gICAgdGhpcy5fdDAgPSB0MTtcbiAgfVxufVxuXG5mdW5jdGlvbiBNb25vdG9uZVkoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gbmV3IFJlZmxlY3RDb250ZXh0KGNvbnRleHQpO1xufVxuXG4oTW9ub3RvbmVZLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9ub3RvbmVYLnByb3RvdHlwZSkpLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkge1xuICBNb25vdG9uZVgucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcywgeSwgeCk7XG59O1xuXG5mdW5jdGlvbiBSZWZsZWN0Q29udGV4dChjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5SZWZsZWN0Q29udGV4dC5wcm90b3R5cGUgPSB7XG4gIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgeyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh5LCB4KTsgfSxcbiAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHsgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsgfSxcbiAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuX2NvbnRleHQubGluZVRvKHksIHgpOyB9LFxuICBiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeCwgeSkgeyB0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oeTEsIHgxLCB5MiwgeDIsIHksIHgpOyB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbW9ub3RvbmVYKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBNb25vdG9uZVgoY29udGV4dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb25vdG9uZVkoY29udGV4dCkge1xuICByZXR1cm4gbmV3IE1vbm90b25lWShjb250ZXh0KTtcbn1cbiIsImZ1bmN0aW9uIE5hdHVyYWwoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbn1cblxuTmF0dXJhbC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feCA9IFtdO1xuICAgIHRoaXMuX3kgPSBbXTtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHggPSB0aGlzLl94LFxuICAgICAgICB5ID0gdGhpcy5feSxcbiAgICAgICAgbiA9IHgubGVuZ3RoO1xuXG4gICAgaWYgKG4pIHtcbiAgICAgIHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4WzBdLCB5WzBdKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHhbMF0sIHlbMF0pO1xuICAgICAgaWYgKG4gPT09IDIpIHtcbiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeFsxXSwgeVsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcHggPSBjb250cm9sUG9pbnRzKHgpLFxuICAgICAgICAgICAgcHkgPSBjb250cm9sUG9pbnRzKHkpO1xuICAgICAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMTsgaTEgPCBuOyArK2kwLCArK2kxKSB7XG4gICAgICAgICAgdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHB4WzBdW2kwXSwgcHlbMF1baTBdLCBweFsxXVtpMF0sIHB5WzFdW2kwXSwgeFtpMV0sIHlbaTFdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIG4gPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgICB0aGlzLl94ID0gdGhpcy5feSA9IG51bGw7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdGhpcy5feC5wdXNoKCt4KTtcbiAgICB0aGlzLl95LnB1c2goK3kpO1xuICB9XG59O1xuXG4vLyBTZWUgaHR0cHM6Ly93d3cucGFydGljbGVpbmNlbGwuY29tLzIwMTIvYmV6aWVyLXNwbGluZXMvIGZvciBkZXJpdmF0aW9uLlxuZnVuY3Rpb24gY29udHJvbFBvaW50cyh4KSB7XG4gIHZhciBpLFxuICAgICAgbiA9IHgubGVuZ3RoIC0gMSxcbiAgICAgIG0sXG4gICAgICBhID0gbmV3IEFycmF5KG4pLFxuICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgIHIgPSBuZXcgQXJyYXkobik7XG4gIGFbMF0gPSAwLCBiWzBdID0gMiwgclswXSA9IHhbMF0gKyAyICogeFsxXTtcbiAgZm9yIChpID0gMTsgaSA8IG4gLSAxOyArK2kpIGFbaV0gPSAxLCBiW2ldID0gNCwgcltpXSA9IDQgKiB4W2ldICsgMiAqIHhbaSArIDFdO1xuICBhW24gLSAxXSA9IDIsIGJbbiAtIDFdID0gNywgcltuIC0gMV0gPSA4ICogeFtuIC0gMV0gKyB4W25dO1xuICBmb3IgKGkgPSAxOyBpIDwgbjsgKytpKSBtID0gYVtpXSAvIGJbaSAtIDFdLCBiW2ldIC09IG0sIHJbaV0gLT0gbSAqIHJbaSAtIDFdO1xuICBhW24gLSAxXSA9IHJbbiAtIDFdIC8gYltuIC0gMV07XG4gIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IC0taSkgYVtpXSA9IChyW2ldIC0gYVtpICsgMV0pIC8gYltpXTtcbiAgYltuIC0gMV0gPSAoeFtuXSArIGFbbiAtIDFdKSAvIDI7XG4gIGZvciAoaSA9IDA7IGkgPCBuIC0gMTsgKytpKSBiW2ldID0gMiAqIHhbaSArIDFdIC0gYVtpICsgMV07XG4gIHJldHVybiBbYSwgYl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBOYXR1cmFsKGNvbnRleHQpO1xufVxuIiwiZnVuY3Rpb24gU3RlcChjb250ZXh0LCB0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLl90ID0gdDtcbn1cblxuU3RlcC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feCA9IHRoaXMuX3kgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoMCA8IHRoaXMuX3QgJiYgdGhpcy5fdCA8IDEgJiYgdGhpcy5fcG9pbnQgPT09IDIpIHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsIHRoaXMuX3kpO1xuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBpZiAodGhpcy5fbGluZSA+PSAwKSB0aGlzLl90ID0gMSAtIHRoaXMuX3QsIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKHRoaXMuX3QgPD0gMCkge1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsIHkpO1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB4MSA9IHRoaXMuX3ggKiAoMSAtIHRoaXMuX3QpICsgeCAqIHRoaXMuX3Q7XG4gICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeDEsIHRoaXMuX3kpO1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgxLCB5KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5feCA9IHgsIHRoaXMuX3kgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAwLjUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RlcEJlZm9yZShjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0ZXBBZnRlcihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAxKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHtcbiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDEpKSByZXR1cm47XG4gIGZvciAodmFyIGkgPSAxLCBqLCBzMCwgczEgPSBzZXJpZXNbb3JkZXJbMF1dLCBuLCBtID0gczEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgczAgPSBzMSwgczEgPSBzZXJpZXNbb3JkZXJbaV1dO1xuICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICAgIHMxW2pdWzFdICs9IHMxW2pdWzBdID0gaXNOYU4oczBbal1bMV0pID8gczBbal1bMF0gOiBzMFtqXVsxXTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcykge1xuICB2YXIgbiA9IHNlcmllcy5sZW5ndGgsIG8gPSBuZXcgQXJyYXkobik7XG4gIHdoaWxlICgtLW4gPj0gMCkgb1tuXSA9IG47XG4gIHJldHVybiBvO1xufVxuIiwiaW1wb3J0IHtzbGljZX0gZnJvbSBcIi4vYXJyYXkuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IG9mZnNldE5vbmUgZnJvbSBcIi4vb2Zmc2V0L25vbmUuanNcIjtcbmltcG9ydCBvcmRlck5vbmUgZnJvbSBcIi4vb3JkZXIvbm9uZS5qc1wiO1xuXG5mdW5jdGlvbiBzdGFja1ZhbHVlKGQsIGtleSkge1xuICByZXR1cm4gZFtrZXldO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGtleXMgPSBjb25zdGFudChbXSksXG4gICAgICBvcmRlciA9IG9yZGVyTm9uZSxcbiAgICAgIG9mZnNldCA9IG9mZnNldE5vbmUsXG4gICAgICB2YWx1ZSA9IHN0YWNrVmFsdWU7XG5cbiAgZnVuY3Rpb24gc3RhY2soZGF0YSkge1xuICAgIHZhciBreiA9IGtleXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgaSxcbiAgICAgICAgbSA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBuID0ga3oubGVuZ3RoLFxuICAgICAgICBzeiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgb3o7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBmb3IgKHZhciBraSA9IGt6W2ldLCBzaSA9IHN6W2ldID0gbmV3IEFycmF5KG0pLCBqID0gMCwgc2lqOyBqIDwgbTsgKytqKSB7XG4gICAgICAgIHNpW2pdID0gc2lqID0gWzAsICt2YWx1ZShkYXRhW2pdLCBraSwgaiwgZGF0YSldO1xuICAgICAgICBzaWouZGF0YSA9IGRhdGFbal07XG4gICAgICB9XG4gICAgICBzaS5rZXkgPSBraTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBveiA9IG9yZGVyKHN6KTsgaSA8IG47ICsraSkge1xuICAgICAgc3pbb3pbaV1dLmluZGV4ID0gaTtcbiAgICB9XG5cbiAgICBvZmZzZXQoc3osIG96KTtcbiAgICByZXR1cm4gc3o7XG4gIH1cblxuICBzdGFjay5rZXlzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KHNsaWNlLmNhbGwoXykpLCBzdGFjaykgOiBrZXlzO1xuICB9O1xuXG4gIHN0YWNrLnZhbHVlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHN0YWNrKSA6IHZhbHVlO1xuICB9O1xuXG4gIHN0YWNrLm9yZGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9yZGVyID0gXyA9PSBudWxsID8gb3JkZXJOb25lIDogdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChzbGljZS5jYWxsKF8pKSwgc3RhY2spIDogb3JkZXI7XG4gIH07XG5cbiAgc3RhY2sub2Zmc2V0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9mZnNldCA9IF8gPT0gbnVsbCA/IG9mZnNldE5vbmUgOiBfLCBzdGFjaykgOiBvZmZzZXQ7XG4gIH07XG5cbiAgcmV0dXJuIHN0YWNrO1xufVxuIiwiaW1wb3J0IG5vbmUgZnJvbSBcIi4vbm9uZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZXJpZXMsIG9yZGVyKSB7XG4gIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAwKSkgcmV0dXJuO1xuICBmb3IgKHZhciBpLCBuLCBqID0gMCwgbSA9IHNlcmllc1swXS5sZW5ndGgsIHk7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHkgPSBpID0gMDsgaSA8IG47ICsraSkgeSArPSBzZXJpZXNbaV1bal1bMV0gfHwgMDtcbiAgICBpZiAoeSkgZm9yIChpID0gMDsgaSA8IG47ICsraSkgc2VyaWVzW2ldW2pdWzFdIC89IHk7XG4gIH1cbiAgbm9uZShzZXJpZXMsIG9yZGVyKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHtcbiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApKSByZXR1cm47XG4gIGZvciAodmFyIGksIGogPSAwLCBkLCBkeSwgeXAsIHluLCBuLCBtID0gc2VyaWVzW29yZGVyWzBdXS5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHlwID0geW4gPSAwLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChkeSA9IChkID0gc2VyaWVzW29yZGVyW2ldXVtqXSlbMV0gLSBkWzBdKSA+IDApIHtcbiAgICAgICAgZFswXSA9IHlwLCBkWzFdID0geXAgKz0gZHk7XG4gICAgICB9IGVsc2UgaWYgKGR5IDwgMCkge1xuICAgICAgICBkWzFdID0geW4sIGRbMF0gPSB5biArPSBkeTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRbMF0gPSAwLCBkWzFdID0gZHk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgbm9uZSBmcm9tIFwiLi9ub25lLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHtcbiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApKSByZXR1cm47XG4gIGZvciAodmFyIGogPSAwLCBzMCA9IHNlcmllc1tvcmRlclswXV0sIG4sIG0gPSBzMC5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBpID0gMCwgeSA9IDA7IGkgPCBuOyArK2kpIHkgKz0gc2VyaWVzW2ldW2pdWzFdIHx8IDA7XG4gICAgczBbal1bMV0gKz0gczBbal1bMF0gPSAteSAvIDI7XG4gIH1cbiAgbm9uZShzZXJpZXMsIG9yZGVyKTtcbn1cbiIsImltcG9ydCBub25lIGZyb20gXCIuL25vbmUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzLCBvcmRlcikge1xuICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMCkgfHwgISgobSA9IChzMCA9IHNlcmllc1tvcmRlclswXV0pLmxlbmd0aCkgPiAwKSkgcmV0dXJuO1xuICBmb3IgKHZhciB5ID0gMCwgaiA9IDEsIHMwLCBtLCBuOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHMxID0gMCwgczIgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgc2kgPSBzZXJpZXNbb3JkZXJbaV1dLFxuICAgICAgICAgIHNpajAgPSBzaVtqXVsxXSB8fCAwLFxuICAgICAgICAgIHNpajEgPSBzaVtqIC0gMV1bMV0gfHwgMCxcbiAgICAgICAgICBzMyA9IChzaWowIC0gc2lqMSkgLyAyO1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBpOyArK2spIHtcbiAgICAgICAgdmFyIHNrID0gc2VyaWVzW29yZGVyW2tdXSxcbiAgICAgICAgICAgIHNrajAgPSBza1tqXVsxXSB8fCAwLFxuICAgICAgICAgICAgc2tqMSA9IHNrW2ogLSAxXVsxXSB8fCAwO1xuICAgICAgICBzMyArPSBza2owIC0gc2tqMTtcbiAgICAgIH1cbiAgICAgIHMxICs9IHNpajAsIHMyICs9IHMzICogc2lqMDtcbiAgICB9XG4gICAgczBbaiAtIDFdWzFdICs9IHMwW2ogLSAxXVswXSA9IHk7XG4gICAgaWYgKHMxKSB5IC09IHMyIC8gczE7XG4gIH1cbiAgczBbaiAtIDFdWzFdICs9IHMwW2ogLSAxXVswXSA9IHk7XG4gIG5vbmUoc2VyaWVzLCBvcmRlcik7XG59XG4iLCJpbXBvcnQgbm9uZSBmcm9tIFwiLi9ub25lLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcykge1xuICB2YXIgcGVha3MgPSBzZXJpZXMubWFwKHBlYWspO1xuICByZXR1cm4gbm9uZShzZXJpZXMpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gcGVha3NbYV0gLSBwZWFrc1tiXTsgfSk7XG59XG5cbmZ1bmN0aW9uIHBlYWsoc2VyaWVzKSB7XG4gIHZhciBpID0gLTEsIGogPSAwLCBuID0gc2VyaWVzLmxlbmd0aCwgdmksIHZqID0gLUluZmluaXR5O1xuICB3aGlsZSAoKytpIDwgbikgaWYgKCh2aSA9ICtzZXJpZXNbaV1bMV0pID4gdmopIHZqID0gdmksIGogPSBpO1xuICByZXR1cm4gajtcbn1cbiIsImltcG9ydCBub25lIGZyb20gXCIuL25vbmUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzKSB7XG4gIHZhciBzdW1zID0gc2VyaWVzLm1hcChzdW0pO1xuICByZXR1cm4gbm9uZShzZXJpZXMpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gc3Vtc1thXSAtIHN1bXNbYl07IH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VtKHNlcmllcykge1xuICB2YXIgcyA9IDAsIGkgPSAtMSwgbiA9IHNlcmllcy5sZW5ndGgsIHY7XG4gIHdoaWxlICgrK2kgPCBuKSBpZiAodiA9ICtzZXJpZXNbaV1bMV0pIHMgKz0gdjtcbiAgcmV0dXJuIHM7XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZXJpZXMpIHtcbiAgcmV0dXJuIGFzY2VuZGluZyhzZXJpZXMpLnJldmVyc2UoKTtcbn1cbiIsImltcG9ydCBhcHBlYXJhbmNlIGZyb20gXCIuL2FwcGVhcmFuY2UuanNcIjtcbmltcG9ydCB7c3VtfSBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzKSB7XG4gIHZhciBuID0gc2VyaWVzLmxlbmd0aCxcbiAgICAgIGksXG4gICAgICBqLFxuICAgICAgc3VtcyA9IHNlcmllcy5tYXAoc3VtKSxcbiAgICAgIG9yZGVyID0gYXBwZWFyYW5jZShzZXJpZXMpLFxuICAgICAgdG9wID0gMCxcbiAgICAgIGJvdHRvbSA9IDAsXG4gICAgICB0b3BzID0gW10sXG4gICAgICBib3R0b21zID0gW107XG5cbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgIGogPSBvcmRlcltpXTtcbiAgICBpZiAodG9wIDwgYm90dG9tKSB7XG4gICAgICB0b3AgKz0gc3Vtc1tqXTtcbiAgICAgIHRvcHMucHVzaChqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm90dG9tICs9IHN1bXNbal07XG4gICAgICBib3R0b21zLnB1c2goaik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdHRvbXMucmV2ZXJzZSgpLmNvbmNhdCh0b3BzKTtcbn1cbiIsImltcG9ydCBub25lIGZyb20gXCIuL25vbmUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzKSB7XG4gIHJldHVybiBub25lKHNlcmllcykucmV2ZXJzZSgpO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGFyY30gZnJvbSBcIi4vYXJjLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgYXJlYX0gZnJvbSBcIi4vYXJlYS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGxpbmV9IGZyb20gXCIuL2xpbmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwaWV9IGZyb20gXCIuL3BpZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFyZWFSYWRpYWwsIGRlZmF1bHQgYXMgcmFkaWFsQXJlYX0gZnJvbSBcIi4vYXJlYVJhZGlhbC5qc1wiOyAvLyBOb3RlOiByYWRpYWxBcmVhIGlzIGRlcHJlY2F0ZWQhXG5leHBvcnQge2RlZmF1bHQgYXMgbGluZVJhZGlhbCwgZGVmYXVsdCBhcyByYWRpYWxMaW5lfSBmcm9tIFwiLi9saW5lUmFkaWFsLmpzXCI7IC8vIE5vdGU6IHJhZGlhbExpbmUgaXMgZGVwcmVjYXRlZCFcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwb2ludFJhZGlhbH0gZnJvbSBcIi4vcG9pbnRSYWRpYWwuanNcIjtcbmV4cG9ydCB7bGlua0hvcml6b250YWwsIGxpbmtWZXJ0aWNhbCwgbGlua1JhZGlhbH0gZnJvbSBcIi4vbGluay9pbmRleC5qc1wiO1xuXG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sLCBzeW1ib2xzfSBmcm9tIFwiLi9zeW1ib2wuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xDaXJjbGV9IGZyb20gXCIuL3N5bWJvbC9jaXJjbGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xDcm9zc30gZnJvbSBcIi4vc3ltYm9sL2Nyb3NzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sRGlhbW9uZH0gZnJvbSBcIi4vc3ltYm9sL2RpYW1vbmQuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xTcXVhcmV9IGZyb20gXCIuL3N5bWJvbC9zcXVhcmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xTdGFyfSBmcm9tIFwiLi9zeW1ib2wvc3Rhci5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN5bWJvbFRyaWFuZ2xlfSBmcm9tIFwiLi9zeW1ib2wvdHJpYW5nbGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xXeWV9IGZyb20gXCIuL3N5bWJvbC93eWUuanNcIjtcblxuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQmFzaXNDbG9zZWR9IGZyb20gXCIuL2N1cnZlL2Jhc2lzQ2xvc2VkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVCYXNpc09wZW59IGZyb20gXCIuL2N1cnZlL2Jhc2lzT3Blbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQmFzaXN9IGZyb20gXCIuL2N1cnZlL2Jhc2lzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVCdW5kbGV9IGZyb20gXCIuL2N1cnZlL2J1bmRsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQ2FyZGluYWxDbG9zZWR9IGZyb20gXCIuL2N1cnZlL2NhcmRpbmFsQ2xvc2VkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVDYXJkaW5hbE9wZW59IGZyb20gXCIuL2N1cnZlL2NhcmRpbmFsT3Blbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQ2FyZGluYWx9IGZyb20gXCIuL2N1cnZlL2NhcmRpbmFsLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVDYXRtdWxsUm9tQ2xvc2VkfSBmcm9tIFwiLi9jdXJ2ZS9jYXRtdWxsUm9tQ2xvc2VkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVDYXRtdWxsUm9tT3Blbn0gZnJvbSBcIi4vY3VydmUvY2F0bXVsbFJvbU9wZW4uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUNhdG11bGxSb219IGZyb20gXCIuL2N1cnZlL2NhdG11bGxSb20uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUxpbmVhckNsb3NlZH0gZnJvbSBcIi4vY3VydmUvbGluZWFyQ2xvc2VkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVMaW5lYXJ9IGZyb20gXCIuL2N1cnZlL2xpbmVhci5qc1wiO1xuZXhwb3J0IHttb25vdG9uZVggYXMgY3VydmVNb25vdG9uZVgsIG1vbm90b25lWSBhcyBjdXJ2ZU1vbm90b25lWX0gZnJvbSBcIi4vY3VydmUvbW9ub3RvbmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZU5hdHVyYWx9IGZyb20gXCIuL2N1cnZlL25hdHVyYWwuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZVN0ZXAsIHN0ZXBBZnRlciBhcyBjdXJ2ZVN0ZXBBZnRlciwgc3RlcEJlZm9yZSBhcyBjdXJ2ZVN0ZXBCZWZvcmV9IGZyb20gXCIuL2N1cnZlL3N0ZXAuanNcIjtcblxuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrfSBmcm9tIFwiLi9zdGFjay5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT2Zmc2V0RXhwYW5kfSBmcm9tIFwiLi9vZmZzZXQvZXhwYW5kLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPZmZzZXREaXZlcmdpbmd9IGZyb20gXCIuL29mZnNldC9kaXZlcmdpbmcuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09mZnNldE5vbmV9IGZyb20gXCIuL29mZnNldC9ub25lLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPZmZzZXRTaWxob3VldHRlfSBmcm9tIFwiLi9vZmZzZXQvc2lsaG91ZXR0ZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT2Zmc2V0V2lnZ2xlfSBmcm9tIFwiLi9vZmZzZXQvd2lnZ2xlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPcmRlckFwcGVhcmFuY2V9IGZyb20gXCIuL29yZGVyL2FwcGVhcmFuY2UuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09yZGVyQXNjZW5kaW5nfSBmcm9tIFwiLi9vcmRlci9hc2NlbmRpbmcuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09yZGVyRGVzY2VuZGluZ30gZnJvbSBcIi4vb3JkZXIvZGVzY2VuZGluZy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT3JkZXJJbnNpZGVPdXR9IGZyb20gXCIuL29yZGVyL2luc2lkZU91dC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT3JkZXJOb25lfSBmcm9tIFwiLi9vcmRlci9ub25lLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPcmRlclJldmVyc2V9IGZyb20gXCIuL29yZGVyL3JldmVyc2UuanNcIjtcbiIsImV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgdGltZUludGVydmFsXG59IGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgdGltZU1pbGxpc2Vjb25kLFxuICBtaWxsaXNlY29uZHMgYXMgdGltZU1pbGxpc2Vjb25kcyxcbiAgZGVmYXVsdCBhcyB1dGNNaWxsaXNlY29uZCxcbiAgbWlsbGlzZWNvbmRzIGFzIHV0Y01pbGxpc2Vjb25kc1xufSBmcm9tIFwiLi9taWxsaXNlY29uZC5qc1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHRpbWVTZWNvbmQsXG4gIHNlY29uZHMgYXMgdGltZVNlY29uZHMsXG4gIGRlZmF1bHQgYXMgdXRjU2Vjb25kLFxuICBzZWNvbmRzIGFzIHV0Y1NlY29uZHNcbn0gZnJvbSBcIi4vc2Vjb25kLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgdGltZU1pbnV0ZSxcbiAgbWludXRlcyBhcyB0aW1lTWludXRlc1xufSBmcm9tIFwiLi9taW51dGUuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyB0aW1lSG91cixcbiAgaG91cnMgYXMgdGltZUhvdXJzXG59IGZyb20gXCIuL2hvdXIuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyB0aW1lRGF5LFxuICBkYXlzIGFzIHRpbWVEYXlzXG59IGZyb20gXCIuL2RheS5qc1wiO1xuXG5leHBvcnQge1xuICBzdW5kYXkgYXMgdGltZVdlZWssXG4gIHN1bmRheXMgYXMgdGltZVdlZWtzLFxuICBzdW5kYXkgYXMgdGltZVN1bmRheSxcbiAgc3VuZGF5cyBhcyB0aW1lU3VuZGF5cyxcbiAgbW9uZGF5IGFzIHRpbWVNb25kYXksXG4gIG1vbmRheXMgYXMgdGltZU1vbmRheXMsXG4gIHR1ZXNkYXkgYXMgdGltZVR1ZXNkYXksXG4gIHR1ZXNkYXlzIGFzIHRpbWVUdWVzZGF5cyxcbiAgd2VkbmVzZGF5IGFzIHRpbWVXZWRuZXNkYXksXG4gIHdlZG5lc2RheXMgYXMgdGltZVdlZG5lc2RheXMsXG4gIHRodXJzZGF5IGFzIHRpbWVUaHVyc2RheSxcbiAgdGh1cnNkYXlzIGFzIHRpbWVUaHVyc2RheXMsXG4gIGZyaWRheSBhcyB0aW1lRnJpZGF5LFxuICBmcmlkYXlzIGFzIHRpbWVGcmlkYXlzLFxuICBzYXR1cmRheSBhcyB0aW1lU2F0dXJkYXksXG4gIHNhdHVyZGF5cyBhcyB0aW1lU2F0dXJkYXlzXG59IGZyb20gXCIuL3dlZWsuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyB0aW1lTW9udGgsXG4gIG1vbnRocyBhcyB0aW1lTW9udGhzXG59IGZyb20gXCIuL21vbnRoLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgdGltZVllYXIsXG4gIHllYXJzIGFzIHRpbWVZZWFyc1xufSBmcm9tIFwiLi95ZWFyLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgdXRjTWludXRlLFxuICB1dGNNaW51dGVzIGFzIHV0Y01pbnV0ZXNcbn0gZnJvbSBcIi4vdXRjTWludXRlLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgdXRjSG91cixcbiAgdXRjSG91cnMgYXMgdXRjSG91cnNcbn0gZnJvbSBcIi4vdXRjSG91ci5qc1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHV0Y0RheSxcbiAgdXRjRGF5cyBhcyB1dGNEYXlzXG59IGZyb20gXCIuL3V0Y0RheS5qc1wiO1xuXG5leHBvcnQge1xuICB1dGNTdW5kYXkgYXMgdXRjV2VlayxcbiAgdXRjU3VuZGF5cyBhcyB1dGNXZWVrcyxcbiAgdXRjU3VuZGF5IGFzIHV0Y1N1bmRheSxcbiAgdXRjU3VuZGF5cyBhcyB1dGNTdW5kYXlzLFxuICB1dGNNb25kYXkgYXMgdXRjTW9uZGF5LFxuICB1dGNNb25kYXlzIGFzIHV0Y01vbmRheXMsXG4gIHV0Y1R1ZXNkYXkgYXMgdXRjVHVlc2RheSxcbiAgdXRjVHVlc2RheXMgYXMgdXRjVHVlc2RheXMsXG4gIHV0Y1dlZG5lc2RheSBhcyB1dGNXZWRuZXNkYXksXG4gIHV0Y1dlZG5lc2RheXMgYXMgdXRjV2VkbmVzZGF5cyxcbiAgdXRjVGh1cnNkYXkgYXMgdXRjVGh1cnNkYXksXG4gIHV0Y1RodXJzZGF5cyBhcyB1dGNUaHVyc2RheXMsXG4gIHV0Y0ZyaWRheSBhcyB1dGNGcmlkYXksXG4gIHV0Y0ZyaWRheXMgYXMgdXRjRnJpZGF5cyxcbiAgdXRjU2F0dXJkYXkgYXMgdXRjU2F0dXJkYXksXG4gIHV0Y1NhdHVyZGF5cyBhcyB1dGNTYXR1cmRheXNcbn0gZnJvbSBcIi4vdXRjV2Vlay5qc1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHV0Y01vbnRoLFxuICB1dGNNb250aHMgYXMgdXRjTW9udGhzXG59IGZyb20gXCIuL3V0Y01vbnRoLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgdXRjWWVhcixcbiAgdXRjWWVhcnMgYXMgdXRjWWVhcnNcbn0gZnJvbSBcIi4vdXRjWWVhci5qc1wiO1xuIiwiaW1wb3J0IHt1dGNGb3JtYXR9IGZyb20gXCIuL2RlZmF1bHRMb2NhbGUuanNcIjtcblxuZXhwb3J0IHZhciBpc29TcGVjaWZpZXIgPSBcIiVZLSVtLSVkVCVIOiVNOiVTLiVMWlwiO1xuXG5mdW5jdGlvbiBmb3JtYXRJc29OYXRpdmUoZGF0ZSkge1xuICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpO1xufVxuXG52YXIgZm9ybWF0SXNvID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmdcbiAgICA/IGZvcm1hdElzb05hdGl2ZVxuICAgIDogdXRjRm9ybWF0KGlzb1NwZWNpZmllcik7XG5cbmV4cG9ydCBkZWZhdWx0IGZvcm1hdElzbztcbiIsImltcG9ydCB7aXNvU3BlY2lmaWVyfSBmcm9tIFwiLi9pc29Gb3JtYXQuanNcIjtcbmltcG9ydCB7dXRjUGFyc2V9IGZyb20gXCIuL2RlZmF1bHRMb2NhbGUuanNcIjtcblxuZnVuY3Rpb24gcGFyc2VJc29OYXRpdmUoc3RyaW5nKSB7XG4gIHZhciBkYXRlID0gbmV3IERhdGUoc3RyaW5nKTtcbiAgcmV0dXJuIGlzTmFOKGRhdGUpID8gbnVsbCA6IGRhdGU7XG59XG5cbnZhciBwYXJzZUlzbyA9ICtuZXcgRGF0ZShcIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWlwiKVxuICAgID8gcGFyc2VJc29OYXRpdmVcbiAgICA6IHV0Y1BhcnNlKGlzb1NwZWNpZmllcik7XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnNlSXNvO1xuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHRpbWVGb3JtYXREZWZhdWx0TG9jYWxlLCB0aW1lRm9ybWF0LCB0aW1lUGFyc2UsIHV0Y0Zvcm1hdCwgdXRjUGFyc2V9IGZyb20gXCIuL2RlZmF1bHRMb2NhbGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0aW1lRm9ybWF0TG9jYWxlfSBmcm9tIFwiLi9sb2NhbGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpc29Gb3JtYXR9IGZyb20gXCIuL2lzb0Zvcm1hdC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGlzb1BhcnNlfSBmcm9tIFwiLi9pc29QYXJzZS5qc1wiO1xuIiwiaW1wb3J0IHtUaW1lciwgbm93fSBmcm9tIFwiLi90aW1lci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgdmFyIHQgPSBuZXcgVGltZXIsIHRvdGFsID0gZGVsYXk7XG4gIGlmIChkZWxheSA9PSBudWxsKSByZXR1cm4gdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSksIHQ7XG4gIGRlbGF5ID0gK2RlbGF5LCB0aW1lID0gdGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZTtcbiAgdC5yZXN0YXJ0KGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIGVsYXBzZWQgKz0gdG90YWw7XG4gICAgdC5yZXN0YXJ0KHRpY2ssIHRvdGFsICs9IGRlbGF5LCB0aW1lKTtcbiAgICBjYWxsYmFjayhlbGFwc2VkKTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsImV4cG9ydCB7XG4gIG5vdyxcbiAgdGltZXIsXG4gIHRpbWVyRmx1c2hcbn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyB0aW1lb3V0XG59IGZyb20gXCIuL3RpbWVvdXQuanNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBpbnRlcnZhbFxufSBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24geChkKSB7XG4gIHJldHVybiBkWzBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24geShkKSB7XG4gIHJldHVybiBkWzFdO1xufVxuIiwiZnVuY3Rpb24gUmVkQmxhY2tUcmVlKCkge1xuICB0aGlzLl8gPSBudWxsOyAvLyByb290IG5vZGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlZEJsYWNrTm9kZShub2RlKSB7XG4gIG5vZGUuVSA9IC8vIHBhcmVudCBub2RlXG4gIG5vZGUuQyA9IC8vIGNvbG9yIC0gdHJ1ZSBmb3IgcmVkLCBmYWxzZSBmb3IgYmxhY2tcbiAgbm9kZS5MID0gLy8gbGVmdCBub2RlXG4gIG5vZGUuUiA9IC8vIHJpZ2h0IG5vZGVcbiAgbm9kZS5QID0gLy8gcHJldmlvdXMgbm9kZVxuICBub2RlLk4gPSBudWxsOyAvLyBuZXh0IG5vZGVcbn1cblxuUmVkQmxhY2tUcmVlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFJlZEJsYWNrVHJlZSxcblxuICBpbnNlcnQ6IGZ1bmN0aW9uKGFmdGVyLCBub2RlKSB7XG4gICAgdmFyIHBhcmVudCwgZ3JhbmRwYSwgdW5jbGU7XG5cbiAgICBpZiAoYWZ0ZXIpIHtcbiAgICAgIG5vZGUuUCA9IGFmdGVyO1xuICAgICAgbm9kZS5OID0gYWZ0ZXIuTjtcbiAgICAgIGlmIChhZnRlci5OKSBhZnRlci5OLlAgPSBub2RlO1xuICAgICAgYWZ0ZXIuTiA9IG5vZGU7XG4gICAgICBpZiAoYWZ0ZXIuUikge1xuICAgICAgICBhZnRlciA9IGFmdGVyLlI7XG4gICAgICAgIHdoaWxlIChhZnRlci5MKSBhZnRlciA9IGFmdGVyLkw7XG4gICAgICAgIGFmdGVyLkwgPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWZ0ZXIuUiA9IG5vZGU7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBhZnRlcjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuXykge1xuICAgICAgYWZ0ZXIgPSBSZWRCbGFja0ZpcnN0KHRoaXMuXyk7XG4gICAgICBub2RlLlAgPSBudWxsO1xuICAgICAgbm9kZS5OID0gYWZ0ZXI7XG4gICAgICBhZnRlci5QID0gYWZ0ZXIuTCA9IG5vZGU7XG4gICAgICBwYXJlbnQgPSBhZnRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5QID0gbm9kZS5OID0gbnVsbDtcbiAgICAgIHRoaXMuXyA9IG5vZGU7XG4gICAgICBwYXJlbnQgPSBudWxsO1xuICAgIH1cbiAgICBub2RlLkwgPSBub2RlLlIgPSBudWxsO1xuICAgIG5vZGUuVSA9IHBhcmVudDtcbiAgICBub2RlLkMgPSB0cnVlO1xuXG4gICAgYWZ0ZXIgPSBub2RlO1xuICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50LkMpIHtcbiAgICAgIGdyYW5kcGEgPSBwYXJlbnQuVTtcbiAgICAgIGlmIChwYXJlbnQgPT09IGdyYW5kcGEuTCkge1xuICAgICAgICB1bmNsZSA9IGdyYW5kcGEuUjtcbiAgICAgICAgaWYgKHVuY2xlICYmIHVuY2xlLkMpIHtcbiAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTtcbiAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlO1xuICAgICAgICAgIGFmdGVyID0gZ3JhbmRwYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoYWZ0ZXIgPT09IHBhcmVudC5SKSB7XG4gICAgICAgICAgICBSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTtcbiAgICAgICAgICAgIGFmdGVyID0gcGFyZW50O1xuICAgICAgICAgICAgcGFyZW50ID0gYWZ0ZXIuVTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50LkMgPSBmYWxzZTtcbiAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlO1xuICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgZ3JhbmRwYSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVuY2xlID0gZ3JhbmRwYS5MO1xuICAgICAgICBpZiAodW5jbGUgJiYgdW5jbGUuQykge1xuICAgICAgICAgIHBhcmVudC5DID0gdW5jbGUuQyA9IGZhbHNlO1xuICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7XG4gICAgICAgICAgYWZ0ZXIgPSBncmFuZHBhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChhZnRlciA9PT0gcGFyZW50LkwpIHtcbiAgICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTtcbiAgICAgICAgICAgIGFmdGVyID0gcGFyZW50O1xuICAgICAgICAgICAgcGFyZW50ID0gYWZ0ZXIuVTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50LkMgPSBmYWxzZTtcbiAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlO1xuICAgICAgICAgIFJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBncmFuZHBhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFyZW50ID0gYWZ0ZXIuVTtcbiAgICB9XG4gICAgdGhpcy5fLkMgPSBmYWxzZTtcbiAgfSxcblxuICByZW1vdmU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZS5OKSBub2RlLk4uUCA9IG5vZGUuUDtcbiAgICBpZiAobm9kZS5QKSBub2RlLlAuTiA9IG5vZGUuTjtcbiAgICBub2RlLk4gPSBub2RlLlAgPSBudWxsO1xuXG4gICAgdmFyIHBhcmVudCA9IG5vZGUuVSxcbiAgICAgICAgc2libGluZyxcbiAgICAgICAgbGVmdCA9IG5vZGUuTCxcbiAgICAgICAgcmlnaHQgPSBub2RlLlIsXG4gICAgICAgIG5leHQsXG4gICAgICAgIHJlZDtcblxuICAgIGlmICghbGVmdCkgbmV4dCA9IHJpZ2h0O1xuICAgIGVsc2UgaWYgKCFyaWdodCkgbmV4dCA9IGxlZnQ7XG4gICAgZWxzZSBuZXh0ID0gUmVkQmxhY2tGaXJzdChyaWdodCk7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBpZiAocGFyZW50LkwgPT09IG5vZGUpIHBhcmVudC5MID0gbmV4dDtcbiAgICAgIGVsc2UgcGFyZW50LlIgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl8gPSBuZXh0O1xuICAgIH1cblxuICAgIGlmIChsZWZ0ICYmIHJpZ2h0KSB7XG4gICAgICByZWQgPSBuZXh0LkM7XG4gICAgICBuZXh0LkMgPSBub2RlLkM7XG4gICAgICBuZXh0LkwgPSBsZWZ0O1xuICAgICAgbGVmdC5VID0gbmV4dDtcbiAgICAgIGlmIChuZXh0ICE9PSByaWdodCkge1xuICAgICAgICBwYXJlbnQgPSBuZXh0LlU7XG4gICAgICAgIG5leHQuVSA9IG5vZGUuVTtcbiAgICAgICAgbm9kZSA9IG5leHQuUjtcbiAgICAgICAgcGFyZW50LkwgPSBub2RlO1xuICAgICAgICBuZXh0LlIgPSByaWdodDtcbiAgICAgICAgcmlnaHQuVSA9IG5leHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0LlUgPSBwYXJlbnQ7XG4gICAgICAgIHBhcmVudCA9IG5leHQ7XG4gICAgICAgIG5vZGUgPSBuZXh0LlI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZCA9IG5vZGUuQztcbiAgICAgIG5vZGUgPSBuZXh0O1xuICAgIH1cblxuICAgIGlmIChub2RlKSBub2RlLlUgPSBwYXJlbnQ7XG4gICAgaWYgKHJlZCkgcmV0dXJuO1xuICAgIGlmIChub2RlICYmIG5vZGUuQykgeyBub2RlLkMgPSBmYWxzZTsgcmV0dXJuOyB9XG5cbiAgICBkbyB7XG4gICAgICBpZiAobm9kZSA9PT0gdGhpcy5fKSBicmVhaztcbiAgICAgIGlmIChub2RlID09PSBwYXJlbnQuTCkge1xuICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7XG4gICAgICAgIGlmIChzaWJsaW5nLkMpIHtcbiAgICAgICAgICBzaWJsaW5nLkMgPSBmYWxzZTtcbiAgICAgICAgICBwYXJlbnQuQyA9IHRydWU7XG4gICAgICAgICAgUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHBhcmVudCk7XG4gICAgICAgICAgc2libGluZyA9IHBhcmVudC5SO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoc2libGluZy5MICYmIHNpYmxpbmcuTC5DKVxuICAgICAgICAgICAgfHwgKHNpYmxpbmcuUiAmJiBzaWJsaW5nLlIuQykpIHtcbiAgICAgICAgICBpZiAoIXNpYmxpbmcuUiB8fCAhc2libGluZy5SLkMpIHtcbiAgICAgICAgICAgIHNpYmxpbmcuTC5DID0gZmFsc2U7XG4gICAgICAgICAgICBzaWJsaW5nLkMgPSB0cnVlO1xuICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBzaWJsaW5nKTtcbiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuUjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2libGluZy5DID0gcGFyZW50LkM7XG4gICAgICAgICAgcGFyZW50LkMgPSBzaWJsaW5nLlIuQyA9IGZhbHNlO1xuICAgICAgICAgIFJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBwYXJlbnQpO1xuICAgICAgICAgIG5vZGUgPSB0aGlzLl87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuTDtcbiAgICAgICAgaWYgKHNpYmxpbmcuQykge1xuICAgICAgICAgIHNpYmxpbmcuQyA9IGZhbHNlO1xuICAgICAgICAgIHBhcmVudC5DID0gdHJ1ZTtcbiAgICAgICAgICBSZWRCbGFja1JvdGF0ZVJpZ2h0KHRoaXMsIHBhcmVudCk7XG4gICAgICAgICAgc2libGluZyA9IHBhcmVudC5MO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoc2libGluZy5MICYmIHNpYmxpbmcuTC5DKVxuICAgICAgICAgIHx8IChzaWJsaW5nLlIgJiYgc2libGluZy5SLkMpKSB7XG4gICAgICAgICAgaWYgKCFzaWJsaW5nLkwgfHwgIXNpYmxpbmcuTC5DKSB7XG4gICAgICAgICAgICBzaWJsaW5nLlIuQyA9IGZhbHNlO1xuICAgICAgICAgICAgc2libGluZy5DID0gdHJ1ZTtcbiAgICAgICAgICAgIFJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBzaWJsaW5nKTtcbiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuTDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2libGluZy5DID0gcGFyZW50LkM7XG4gICAgICAgICAgcGFyZW50LkMgPSBzaWJsaW5nLkwuQyA9IGZhbHNlO1xuICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTtcbiAgICAgICAgICBub2RlID0gdGhpcy5fO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzaWJsaW5nLkMgPSB0cnVlO1xuICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5VO1xuICAgIH0gd2hpbGUgKCFub2RlLkMpO1xuXG4gICAgaWYgKG5vZGUpIG5vZGUuQyA9IGZhbHNlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBSZWRCbGFja1JvdGF0ZUxlZnQodHJlZSwgbm9kZSkge1xuICB2YXIgcCA9IG5vZGUsXG4gICAgICBxID0gbm9kZS5SLFxuICAgICAgcGFyZW50ID0gcC5VO1xuXG4gIGlmIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50LkwgPT09IHApIHBhcmVudC5MID0gcTtcbiAgICBlbHNlIHBhcmVudC5SID0gcTtcbiAgfSBlbHNlIHtcbiAgICB0cmVlLl8gPSBxO1xuICB9XG5cbiAgcS5VID0gcGFyZW50O1xuICBwLlUgPSBxO1xuICBwLlIgPSBxLkw7XG4gIGlmIChwLlIpIHAuUi5VID0gcDtcbiAgcS5MID0gcDtcbn1cblxuZnVuY3Rpb24gUmVkQmxhY2tSb3RhdGVSaWdodCh0cmVlLCBub2RlKSB7XG4gIHZhciBwID0gbm9kZSxcbiAgICAgIHEgPSBub2RlLkwsXG4gICAgICBwYXJlbnQgPSBwLlU7XG5cbiAgaWYgKHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQuTCA9PT0gcCkgcGFyZW50LkwgPSBxO1xuICAgIGVsc2UgcGFyZW50LlIgPSBxO1xuICB9IGVsc2Uge1xuICAgIHRyZWUuXyA9IHE7XG4gIH1cblxuICBxLlUgPSBwYXJlbnQ7XG4gIHAuVSA9IHE7XG4gIHAuTCA9IHEuUjtcbiAgaWYgKHAuTCkgcC5MLlUgPSBwO1xuICBxLlIgPSBwO1xufVxuXG5mdW5jdGlvbiBSZWRCbGFja0ZpcnN0KG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDtcbiAgcmV0dXJuIG5vZGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlZEJsYWNrVHJlZTtcbiIsImltcG9ydCB7Y2VsbHMsIGVkZ2VzLCBlcHNpbG9ufSBmcm9tIFwiLi9EaWFncmFtXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFZGdlKGxlZnQsIHJpZ2h0LCB2MCwgdjEpIHtcbiAgdmFyIGVkZ2UgPSBbbnVsbCwgbnVsbF0sXG4gICAgICBpbmRleCA9IGVkZ2VzLnB1c2goZWRnZSkgLSAxO1xuICBlZGdlLmxlZnQgPSBsZWZ0O1xuICBlZGdlLnJpZ2h0ID0gcmlnaHQ7XG4gIGlmICh2MCkgc2V0RWRnZUVuZChlZGdlLCBsZWZ0LCByaWdodCwgdjApO1xuICBpZiAodjEpIHNldEVkZ2VFbmQoZWRnZSwgcmlnaHQsIGxlZnQsIHYxKTtcbiAgY2VsbHNbbGVmdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2goaW5kZXgpO1xuICBjZWxsc1tyaWdodC5pbmRleF0uaGFsZmVkZ2VzLnB1c2goaW5kZXgpO1xuICByZXR1cm4gZWRnZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJvcmRlckVkZ2UobGVmdCwgdjAsIHYxKSB7XG4gIHZhciBlZGdlID0gW3YwLCB2MV07XG4gIGVkZ2UubGVmdCA9IGxlZnQ7XG4gIHJldHVybiBlZGdlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RWRnZUVuZChlZGdlLCBsZWZ0LCByaWdodCwgdmVydGV4KSB7XG4gIGlmICghZWRnZVswXSAmJiAhZWRnZVsxXSkge1xuICAgIGVkZ2VbMF0gPSB2ZXJ0ZXg7XG4gICAgZWRnZS5sZWZ0ID0gbGVmdDtcbiAgICBlZGdlLnJpZ2h0ID0gcmlnaHQ7XG4gIH0gZWxzZSBpZiAoZWRnZS5sZWZ0ID09PSByaWdodCkge1xuICAgIGVkZ2VbMV0gPSB2ZXJ0ZXg7XG4gIH0gZWxzZSB7XG4gICAgZWRnZVswXSA9IHZlcnRleDtcbiAgfVxufVxuXG4vLyBMaWFuZ+KAk0JhcnNreSBsaW5lIGNsaXBwaW5nLlxuZnVuY3Rpb24gY2xpcEVkZ2UoZWRnZSwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIGEgPSBlZGdlWzBdLFxuICAgICAgYiA9IGVkZ2VbMV0sXG4gICAgICBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICB0MCA9IDAsXG4gICAgICB0MSA9IDEsXG4gICAgICBkeCA9IGJ4IC0gYXgsXG4gICAgICBkeSA9IGJ5IC0gYXksXG4gICAgICByO1xuXG4gIHIgPSB4MCAtIGF4O1xuICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47XG4gIHIgLz0gZHg7XG4gIGlmIChkeCA8IDApIHtcbiAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICB9IGVsc2UgaWYgKGR4ID4gMCkge1xuICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICBpZiAociA+IHQwKSB0MCA9IHI7XG4gIH1cblxuICByID0geDEgLSBheDtcbiAgaWYgKCFkeCAmJiByIDwgMCkgcmV0dXJuO1xuICByIC89IGR4O1xuICBpZiAoZHggPCAwKSB7XG4gICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgfSBlbHNlIGlmIChkeCA+IDApIHtcbiAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICB9XG5cbiAgciA9IHkwIC0gYXk7XG4gIGlmICghZHkgJiYgciA+IDApIHJldHVybjtcbiAgciAvPSBkeTtcbiAgaWYgKGR5IDwgMCkge1xuICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICBpZiAociA8IHQxKSB0MSA9IHI7XG4gIH0gZWxzZSBpZiAoZHkgPiAwKSB7XG4gICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgfVxuXG4gIHIgPSB5MSAtIGF5O1xuICBpZiAoIWR5ICYmIHIgPCAwKSByZXR1cm47XG4gIHIgLz0gZHk7XG4gIGlmIChkeSA8IDApIHtcbiAgICBpZiAociA+IHQxKSByZXR1cm47XG4gICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICB9IGVsc2UgaWYgKGR5ID4gMCkge1xuICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICBpZiAociA8IHQxKSB0MSA9IHI7XG4gIH1cblxuICBpZiAoISh0MCA+IDApICYmICEodDEgPCAxKSkgcmV0dXJuIHRydWU7IC8vIFRPRE8gQmV0dGVyIGNoZWNrP1xuXG4gIGlmICh0MCA+IDApIGVkZ2VbMF0gPSBbYXggKyB0MCAqIGR4LCBheSArIHQwICogZHldO1xuICBpZiAodDEgPCAxKSBlZGdlWzFdID0gW2F4ICsgdDEgKiBkeCwgYXkgKyB0MSAqIGR5XTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbm5lY3RFZGdlKGVkZ2UsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciB2MSA9IGVkZ2VbMV07XG4gIGlmICh2MSkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHYwID0gZWRnZVswXSxcbiAgICAgIGxlZnQgPSBlZGdlLmxlZnQsXG4gICAgICByaWdodCA9IGVkZ2UucmlnaHQsXG4gICAgICBseCA9IGxlZnRbMF0sXG4gICAgICBseSA9IGxlZnRbMV0sXG4gICAgICByeCA9IHJpZ2h0WzBdLFxuICAgICAgcnkgPSByaWdodFsxXSxcbiAgICAgIGZ4ID0gKGx4ICsgcngpIC8gMixcbiAgICAgIGZ5ID0gKGx5ICsgcnkpIC8gMixcbiAgICAgIGZtLFxuICAgICAgZmI7XG5cbiAgaWYgKHJ5ID09PSBseSkge1xuICAgIGlmIChmeCA8IHgwIHx8IGZ4ID49IHgxKSByZXR1cm47XG4gICAgaWYgKGx4ID4gcngpIHtcbiAgICAgIGlmICghdjApIHYwID0gW2Z4LCB5MF07XG4gICAgICBlbHNlIGlmICh2MFsxXSA+PSB5MSkgcmV0dXJuO1xuICAgICAgdjEgPSBbZngsIHkxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF2MCkgdjAgPSBbZngsIHkxXTtcbiAgICAgIGVsc2UgaWYgKHYwWzFdIDwgeTApIHJldHVybjtcbiAgICAgIHYxID0gW2Z4LCB5MF07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZtID0gKGx4IC0gcngpIC8gKHJ5IC0gbHkpO1xuICAgIGZiID0gZnkgLSBmbSAqIGZ4O1xuICAgIGlmIChmbSA8IC0xIHx8IGZtID4gMSkge1xuICAgICAgaWYgKGx4ID4gcngpIHtcbiAgICAgICAgaWYgKCF2MCkgdjAgPSBbKHkwIC0gZmIpIC8gZm0sIHkwXTtcbiAgICAgICAgZWxzZSBpZiAodjBbMV0gPj0geTEpIHJldHVybjtcbiAgICAgICAgdjEgPSBbKHkxIC0gZmIpIC8gZm0sIHkxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdjApIHYwID0gWyh5MSAtIGZiKSAvIGZtLCB5MV07XG4gICAgICAgIGVsc2UgaWYgKHYwWzFdIDwgeTApIHJldHVybjtcbiAgICAgICAgdjEgPSBbKHkwIC0gZmIpIC8gZm0sIHkwXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGx5IDwgcnkpIHtcbiAgICAgICAgaWYgKCF2MCkgdjAgPSBbeDAsIGZtICogeDAgKyBmYl07XG4gICAgICAgIGVsc2UgaWYgKHYwWzBdID49IHgxKSByZXR1cm47XG4gICAgICAgIHYxID0gW3gxLCBmbSAqIHgxICsgZmJdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF2MCkgdjAgPSBbeDEsIGZtICogeDEgKyBmYl07XG4gICAgICAgIGVsc2UgaWYgKHYwWzBdIDwgeDApIHJldHVybjtcbiAgICAgICAgdjEgPSBbeDAsIGZtICogeDAgKyBmYl07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZWRnZVswXSA9IHYwO1xuICBlZGdlWzFdID0gdjE7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xpcEVkZ2VzKHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciBpID0gZWRnZXMubGVuZ3RoLFxuICAgICAgZWRnZTtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgaWYgKCFjb25uZWN0RWRnZShlZGdlID0gZWRnZXNbaV0sIHgwLCB5MCwgeDEsIHkxKVxuICAgICAgICB8fCAhY2xpcEVkZ2UoZWRnZSwgeDAsIHkwLCB4MSwgeTEpXG4gICAgICAgIHx8ICEoTWF0aC5hYnMoZWRnZVswXVswXSAtIGVkZ2VbMV1bMF0pID4gZXBzaWxvblxuICAgICAgICAgICAgfHwgTWF0aC5hYnMoZWRnZVswXVsxXSAtIGVkZ2VbMV1bMV0pID4gZXBzaWxvbikpIHtcbiAgICAgIGRlbGV0ZSBlZGdlc1tpXTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7Y3JlYXRlQm9yZGVyRWRnZX0gZnJvbSBcIi4vRWRnZVwiO1xuaW1wb3J0IHtjZWxscywgZWRnZXMsIGVwc2lsb259IGZyb20gXCIuL0RpYWdyYW1cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNlbGwoc2l0ZSkge1xuICByZXR1cm4gY2VsbHNbc2l0ZS5pbmRleF0gPSB7XG4gICAgc2l0ZTogc2l0ZSxcbiAgICBoYWxmZWRnZXM6IFtdXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNlbGxIYWxmZWRnZUFuZ2xlKGNlbGwsIGVkZ2UpIHtcbiAgdmFyIHNpdGUgPSBjZWxsLnNpdGUsXG4gICAgICB2YSA9IGVkZ2UubGVmdCxcbiAgICAgIHZiID0gZWRnZS5yaWdodDtcbiAgaWYgKHNpdGUgPT09IHZiKSB2YiA9IHZhLCB2YSA9IHNpdGU7XG4gIGlmICh2YikgcmV0dXJuIE1hdGguYXRhbjIodmJbMV0gLSB2YVsxXSwgdmJbMF0gLSB2YVswXSk7XG4gIGlmIChzaXRlID09PSB2YSkgdmEgPSBlZGdlWzFdLCB2YiA9IGVkZ2VbMF07XG4gIGVsc2UgdmEgPSBlZGdlWzBdLCB2YiA9IGVkZ2VbMV07XG4gIHJldHVybiBNYXRoLmF0YW4yKHZhWzBdIC0gdmJbMF0sIHZiWzFdIC0gdmFbMV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2VsbEhhbGZlZGdlU3RhcnQoY2VsbCwgZWRnZSkge1xuICByZXR1cm4gZWRnZVsrKGVkZ2UubGVmdCAhPT0gY2VsbC5zaXRlKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjZWxsSGFsZmVkZ2VFbmQoY2VsbCwgZWRnZSkge1xuICByZXR1cm4gZWRnZVsrKGVkZ2UubGVmdCA9PT0gY2VsbC5zaXRlKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0Q2VsbEhhbGZlZGdlcygpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBjZWxscy5sZW5ndGgsIGNlbGwsIGhhbGZlZGdlcywgaiwgbTsgaSA8IG47ICsraSkge1xuICAgIGlmICgoY2VsbCA9IGNlbGxzW2ldKSAmJiAobSA9IChoYWxmZWRnZXMgPSBjZWxsLmhhbGZlZGdlcykubGVuZ3RoKSkge1xuICAgICAgdmFyIGluZGV4ID0gbmV3IEFycmF5KG0pLFxuICAgICAgICAgIGFycmF5ID0gbmV3IEFycmF5KG0pO1xuICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgaW5kZXhbal0gPSBqLCBhcnJheVtqXSA9IGNlbGxIYWxmZWRnZUFuZ2xlKGNlbGwsIGVkZ2VzW2hhbGZlZGdlc1tqXV0pO1xuICAgICAgaW5kZXguc29ydChmdW5jdGlvbihpLCBqKSB7IHJldHVybiBhcnJheVtqXSAtIGFycmF5W2ldOyB9KTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIGFycmF5W2pdID0gaGFsZmVkZ2VzW2luZGV4W2pdXTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIGhhbGZlZGdlc1tqXSA9IGFycmF5W2pdO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xpcENlbGxzKHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciBuQ2VsbHMgPSBjZWxscy5sZW5ndGgsXG4gICAgICBpQ2VsbCxcbiAgICAgIGNlbGwsXG4gICAgICBzaXRlLFxuICAgICAgaUhhbGZlZGdlLFxuICAgICAgaGFsZmVkZ2VzLFxuICAgICAgbkhhbGZlZGdlcyxcbiAgICAgIHN0YXJ0LFxuICAgICAgc3RhcnRYLFxuICAgICAgc3RhcnRZLFxuICAgICAgZW5kLFxuICAgICAgZW5kWCxcbiAgICAgIGVuZFksXG4gICAgICBjb3ZlciA9IHRydWU7XG5cbiAgZm9yIChpQ2VsbCA9IDA7IGlDZWxsIDwgbkNlbGxzOyArK2lDZWxsKSB7XG4gICAgaWYgKGNlbGwgPSBjZWxsc1tpQ2VsbF0pIHtcbiAgICAgIHNpdGUgPSBjZWxsLnNpdGU7XG4gICAgICBoYWxmZWRnZXMgPSBjZWxsLmhhbGZlZGdlcztcbiAgICAgIGlIYWxmZWRnZSA9IGhhbGZlZGdlcy5sZW5ndGg7XG5cbiAgICAgIC8vIFJlbW92ZSBhbnkgZGFuZ2xpbmcgY2xpcHBlZCBlZGdlcy5cbiAgICAgIHdoaWxlIChpSGFsZmVkZ2UtLSkge1xuICAgICAgICBpZiAoIWVkZ2VzW2hhbGZlZGdlc1tpSGFsZmVkZ2VdXSkge1xuICAgICAgICAgIGhhbGZlZGdlcy5zcGxpY2UoaUhhbGZlZGdlLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJbnNlcnQgYW55IGJvcmRlciBlZGdlcyBhcyBuZWNlc3NhcnkuXG4gICAgICBpSGFsZmVkZ2UgPSAwLCBuSGFsZmVkZ2VzID0gaGFsZmVkZ2VzLmxlbmd0aDtcbiAgICAgIHdoaWxlIChpSGFsZmVkZ2UgPCBuSGFsZmVkZ2VzKSB7XG4gICAgICAgIGVuZCA9IGNlbGxIYWxmZWRnZUVuZChjZWxsLCBlZGdlc1toYWxmZWRnZXNbaUhhbGZlZGdlXV0pLCBlbmRYID0gZW5kWzBdLCBlbmRZID0gZW5kWzFdO1xuICAgICAgICBzdGFydCA9IGNlbGxIYWxmZWRnZVN0YXJ0KGNlbGwsIGVkZ2VzW2hhbGZlZGdlc1srK2lIYWxmZWRnZSAlIG5IYWxmZWRnZXNdXSksIHN0YXJ0WCA9IHN0YXJ0WzBdLCBzdGFydFkgPSBzdGFydFsxXTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGVuZFggLSBzdGFydFgpID4gZXBzaWxvbiB8fCBNYXRoLmFicyhlbmRZIC0gc3RhcnRZKSA+IGVwc2lsb24pIHtcbiAgICAgICAgICBoYWxmZWRnZXMuc3BsaWNlKGlIYWxmZWRnZSwgMCwgZWRnZXMucHVzaChjcmVhdGVCb3JkZXJFZGdlKHNpdGUsIGVuZCxcbiAgICAgICAgICAgICAgTWF0aC5hYnMoZW5kWCAtIHgwKSA8IGVwc2lsb24gJiYgeTEgLSBlbmRZID4gZXBzaWxvbiA/IFt4MCwgTWF0aC5hYnMoc3RhcnRYIC0geDApIDwgZXBzaWxvbiA/IHN0YXJ0WSA6IHkxXVxuICAgICAgICAgICAgICA6IE1hdGguYWJzKGVuZFkgLSB5MSkgPCBlcHNpbG9uICYmIHgxIC0gZW5kWCA+IGVwc2lsb24gPyBbTWF0aC5hYnMoc3RhcnRZIC0geTEpIDwgZXBzaWxvbiA/IHN0YXJ0WCA6IHgxLCB5MV1cbiAgICAgICAgICAgICAgOiBNYXRoLmFicyhlbmRYIC0geDEpIDwgZXBzaWxvbiAmJiBlbmRZIC0geTAgPiBlcHNpbG9uID8gW3gxLCBNYXRoLmFicyhzdGFydFggLSB4MSkgPCBlcHNpbG9uID8gc3RhcnRZIDogeTBdXG4gICAgICAgICAgICAgIDogTWF0aC5hYnMoZW5kWSAtIHkwKSA8IGVwc2lsb24gJiYgZW5kWCAtIHgwID4gZXBzaWxvbiA/IFtNYXRoLmFicyhzdGFydFkgLSB5MCkgPCBlcHNpbG9uID8gc3RhcnRYIDogeDAsIHkwXVxuICAgICAgICAgICAgICA6IG51bGwpKSAtIDEpO1xuICAgICAgICAgICsrbkhhbGZlZGdlcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobkhhbGZlZGdlcykgY292ZXIgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBJZiB0aGVyZSB3ZXJlbuKAmXQgYW55IGVkZ2VzLCBoYXZlIHRoZSBjbG9zZXN0IHNpdGUgY292ZXIgdGhlIGV4dGVudC5cbiAgLy8gSXQgZG9lc27igJl0IG1hdHRlciB3aGljaCBjb3JuZXIgb2YgdGhlIGV4dGVudCB3ZSBtZWFzdXJlIVxuICBpZiAoY292ZXIpIHtcbiAgICB2YXIgZHgsIGR5LCBkMiwgZGMgPSBJbmZpbml0eTtcblxuICAgIGZvciAoaUNlbGwgPSAwLCBjb3ZlciA9IG51bGw7IGlDZWxsIDwgbkNlbGxzOyArK2lDZWxsKSB7XG4gICAgICBpZiAoY2VsbCA9IGNlbGxzW2lDZWxsXSkge1xuICAgICAgICBzaXRlID0gY2VsbC5zaXRlO1xuICAgICAgICBkeCA9IHNpdGVbMF0gLSB4MDtcbiAgICAgICAgZHkgPSBzaXRlWzFdIC0geTA7XG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICAgIGlmIChkMiA8IGRjKSBkYyA9IGQyLCBjb3ZlciA9IGNlbGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvdmVyKSB7XG4gICAgICB2YXIgdjAwID0gW3gwLCB5MF0sIHYwMSA9IFt4MCwgeTFdLCB2MTEgPSBbeDEsIHkxXSwgdjEwID0gW3gxLCB5MF07XG4gICAgICBjb3Zlci5oYWxmZWRnZXMucHVzaChcbiAgICAgICAgZWRnZXMucHVzaChjcmVhdGVCb3JkZXJFZGdlKHNpdGUgPSBjb3Zlci5zaXRlLCB2MDAsIHYwMSkpIC0gMSxcbiAgICAgICAgZWRnZXMucHVzaChjcmVhdGVCb3JkZXJFZGdlKHNpdGUsIHYwMSwgdjExKSkgLSAxLFxuICAgICAgICBlZGdlcy5wdXNoKGNyZWF0ZUJvcmRlckVkZ2Uoc2l0ZSwgdjExLCB2MTApKSAtIDEsXG4gICAgICAgIGVkZ2VzLnB1c2goY3JlYXRlQm9yZGVyRWRnZShzaXRlLCB2MTAsIHYwMCkpIC0gMVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBMYXN0bHkgZGVsZXRlIGFueSBjZWxscyB3aXRoIG5vIGVkZ2VzOyB0aGVzZSB3ZXJlIGVudGlyZWx5IGNsaXBwZWQuXG4gIGZvciAoaUNlbGwgPSAwOyBpQ2VsbCA8IG5DZWxsczsgKytpQ2VsbCkge1xuICAgIGlmIChjZWxsID0gY2VsbHNbaUNlbGxdKSB7XG4gICAgICBpZiAoIWNlbGwuaGFsZmVkZ2VzLmxlbmd0aCkge1xuICAgICAgICBkZWxldGUgY2VsbHNbaUNlbGxdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtSZWRCbGFja05vZGV9IGZyb20gXCIuL1JlZEJsYWNrVHJlZVwiO1xuaW1wb3J0IHtjaXJjbGVzLCBlcHNpbG9uMn0gZnJvbSBcIi4vRGlhZ3JhbVwiO1xuXG52YXIgY2lyY2xlUG9vbCA9IFtdO1xuXG5leHBvcnQgdmFyIGZpcnN0Q2lyY2xlO1xuXG5mdW5jdGlvbiBDaXJjbGUoKSB7XG4gIFJlZEJsYWNrTm9kZSh0aGlzKTtcbiAgdGhpcy54ID1cbiAgdGhpcy55ID1cbiAgdGhpcy5hcmMgPVxuICB0aGlzLnNpdGUgPVxuICB0aGlzLmN5ID0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaENpcmNsZShhcmMpIHtcbiAgdmFyIGxBcmMgPSBhcmMuUCxcbiAgICAgIHJBcmMgPSBhcmMuTjtcblxuICBpZiAoIWxBcmMgfHwgIXJBcmMpIHJldHVybjtcblxuICB2YXIgbFNpdGUgPSBsQXJjLnNpdGUsXG4gICAgICBjU2l0ZSA9IGFyYy5zaXRlLFxuICAgICAgclNpdGUgPSByQXJjLnNpdGU7XG5cbiAgaWYgKGxTaXRlID09PSByU2l0ZSkgcmV0dXJuO1xuXG4gIHZhciBieCA9IGNTaXRlWzBdLFxuICAgICAgYnkgPSBjU2l0ZVsxXSxcbiAgICAgIGF4ID0gbFNpdGVbMF0gLSBieCxcbiAgICAgIGF5ID0gbFNpdGVbMV0gLSBieSxcbiAgICAgIGN4ID0gclNpdGVbMF0gLSBieCxcbiAgICAgIGN5ID0gclNpdGVbMV0gLSBieTtcblxuICB2YXIgZCA9IDIgKiAoYXggKiBjeSAtIGF5ICogY3gpO1xuICBpZiAoZCA+PSAtZXBzaWxvbjIpIHJldHVybjtcblxuICB2YXIgaGEgPSBheCAqIGF4ICsgYXkgKiBheSxcbiAgICAgIGhjID0gY3ggKiBjeCArIGN5ICogY3ksXG4gICAgICB4ID0gKGN5ICogaGEgLSBheSAqIGhjKSAvIGQsXG4gICAgICB5ID0gKGF4ICogaGMgLSBjeCAqIGhhKSAvIGQ7XG5cbiAgdmFyIGNpcmNsZSA9IGNpcmNsZVBvb2wucG9wKCkgfHwgbmV3IENpcmNsZTtcbiAgY2lyY2xlLmFyYyA9IGFyYztcbiAgY2lyY2xlLnNpdGUgPSBjU2l0ZTtcbiAgY2lyY2xlLnggPSB4ICsgYng7XG4gIGNpcmNsZS55ID0gKGNpcmNsZS5jeSA9IHkgKyBieSkgKyBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7IC8vIHkgYm90dG9tXG5cbiAgYXJjLmNpcmNsZSA9IGNpcmNsZTtcblxuICB2YXIgYmVmb3JlID0gbnVsbCxcbiAgICAgIG5vZGUgPSBjaXJjbGVzLl87XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAoY2lyY2xlLnkgPCBub2RlLnkgfHwgKGNpcmNsZS55ID09PSBub2RlLnkgJiYgY2lyY2xlLnggPD0gbm9kZS54KSkge1xuICAgICAgaWYgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDtcbiAgICAgIGVsc2UgeyBiZWZvcmUgPSBub2RlLlA7IGJyZWFrOyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChub2RlLlIpIG5vZGUgPSBub2RlLlI7XG4gICAgICBlbHNlIHsgYmVmb3JlID0gbm9kZTsgYnJlYWs7IH1cbiAgICB9XG4gIH1cblxuICBjaXJjbGVzLmluc2VydChiZWZvcmUsIGNpcmNsZSk7XG4gIGlmICghYmVmb3JlKSBmaXJzdENpcmNsZSA9IGNpcmNsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGFjaENpcmNsZShhcmMpIHtcbiAgdmFyIGNpcmNsZSA9IGFyYy5jaXJjbGU7XG4gIGlmIChjaXJjbGUpIHtcbiAgICBpZiAoIWNpcmNsZS5QKSBmaXJzdENpcmNsZSA9IGNpcmNsZS5OO1xuICAgIGNpcmNsZXMucmVtb3ZlKGNpcmNsZSk7XG4gICAgY2lyY2xlUG9vbC5wdXNoKGNpcmNsZSk7XG4gICAgUmVkQmxhY2tOb2RlKGNpcmNsZSk7XG4gICAgYXJjLmNpcmNsZSA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCB7UmVkQmxhY2tOb2RlfSBmcm9tIFwiLi9SZWRCbGFja1RyZWVcIjtcbmltcG9ydCB7Y3JlYXRlQ2VsbH0gZnJvbSBcIi4vQ2VsbFwiO1xuaW1wb3J0IHthdHRhY2hDaXJjbGUsIGRldGFjaENpcmNsZX0gZnJvbSBcIi4vQ2lyY2xlXCI7XG5pbXBvcnQge2NyZWF0ZUVkZ2UsIHNldEVkZ2VFbmR9IGZyb20gXCIuL0VkZ2VcIjtcbmltcG9ydCB7YmVhY2hlcywgZXBzaWxvbn0gZnJvbSBcIi4vRGlhZ3JhbVwiO1xuXG52YXIgYmVhY2hQb29sID0gW107XG5cbmZ1bmN0aW9uIEJlYWNoKCkge1xuICBSZWRCbGFja05vZGUodGhpcyk7XG4gIHRoaXMuZWRnZSA9XG4gIHRoaXMuc2l0ZSA9XG4gIHRoaXMuY2lyY2xlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQmVhY2goc2l0ZSkge1xuICB2YXIgYmVhY2ggPSBiZWFjaFBvb2wucG9wKCkgfHwgbmV3IEJlYWNoO1xuICBiZWFjaC5zaXRlID0gc2l0ZTtcbiAgcmV0dXJuIGJlYWNoO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hCZWFjaChiZWFjaCkge1xuICBkZXRhY2hDaXJjbGUoYmVhY2gpO1xuICBiZWFjaGVzLnJlbW92ZShiZWFjaCk7XG4gIGJlYWNoUG9vbC5wdXNoKGJlYWNoKTtcbiAgUmVkQmxhY2tOb2RlKGJlYWNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUJlYWNoKGJlYWNoKSB7XG4gIHZhciBjaXJjbGUgPSBiZWFjaC5jaXJjbGUsXG4gICAgICB4ID0gY2lyY2xlLngsXG4gICAgICB5ID0gY2lyY2xlLmN5LFxuICAgICAgdmVydGV4ID0gW3gsIHldLFxuICAgICAgcHJldmlvdXMgPSBiZWFjaC5QLFxuICAgICAgbmV4dCA9IGJlYWNoLk4sXG4gICAgICBkaXNhcHBlYXJpbmcgPSBbYmVhY2hdO1xuXG4gIGRldGFjaEJlYWNoKGJlYWNoKTtcblxuICB2YXIgbEFyYyA9IHByZXZpb3VzO1xuICB3aGlsZSAobEFyYy5jaXJjbGVcbiAgICAgICYmIE1hdGguYWJzKHggLSBsQXJjLmNpcmNsZS54KSA8IGVwc2lsb25cbiAgICAgICYmIE1hdGguYWJzKHkgLSBsQXJjLmNpcmNsZS5jeSkgPCBlcHNpbG9uKSB7XG4gICAgcHJldmlvdXMgPSBsQXJjLlA7XG4gICAgZGlzYXBwZWFyaW5nLnVuc2hpZnQobEFyYyk7XG4gICAgZGV0YWNoQmVhY2gobEFyYyk7XG4gICAgbEFyYyA9IHByZXZpb3VzO1xuICB9XG5cbiAgZGlzYXBwZWFyaW5nLnVuc2hpZnQobEFyYyk7XG4gIGRldGFjaENpcmNsZShsQXJjKTtcblxuICB2YXIgckFyYyA9IG5leHQ7XG4gIHdoaWxlIChyQXJjLmNpcmNsZVxuICAgICAgJiYgTWF0aC5hYnMoeCAtIHJBcmMuY2lyY2xlLngpIDwgZXBzaWxvblxuICAgICAgJiYgTWF0aC5hYnMoeSAtIHJBcmMuY2lyY2xlLmN5KSA8IGVwc2lsb24pIHtcbiAgICBuZXh0ID0gckFyYy5OO1xuICAgIGRpc2FwcGVhcmluZy5wdXNoKHJBcmMpO1xuICAgIGRldGFjaEJlYWNoKHJBcmMpO1xuICAgIHJBcmMgPSBuZXh0O1xuICB9XG5cbiAgZGlzYXBwZWFyaW5nLnB1c2gockFyYyk7XG4gIGRldGFjaENpcmNsZShyQXJjKTtcblxuICB2YXIgbkFyY3MgPSBkaXNhcHBlYXJpbmcubGVuZ3RoLFxuICAgICAgaUFyYztcbiAgZm9yIChpQXJjID0gMTsgaUFyYyA8IG5BcmNzOyArK2lBcmMpIHtcbiAgICByQXJjID0gZGlzYXBwZWFyaW5nW2lBcmNdO1xuICAgIGxBcmMgPSBkaXNhcHBlYXJpbmdbaUFyYyAtIDFdO1xuICAgIHNldEVkZ2VFbmQockFyYy5lZGdlLCBsQXJjLnNpdGUsIHJBcmMuc2l0ZSwgdmVydGV4KTtcbiAgfVxuXG4gIGxBcmMgPSBkaXNhcHBlYXJpbmdbMF07XG4gIHJBcmMgPSBkaXNhcHBlYXJpbmdbbkFyY3MgLSAxXTtcbiAgckFyYy5lZGdlID0gY3JlYXRlRWRnZShsQXJjLnNpdGUsIHJBcmMuc2l0ZSwgbnVsbCwgdmVydGV4KTtcblxuICBhdHRhY2hDaXJjbGUobEFyYyk7XG4gIGF0dGFjaENpcmNsZShyQXJjKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEJlYWNoKHNpdGUpIHtcbiAgdmFyIHggPSBzaXRlWzBdLFxuICAgICAgZGlyZWN0cml4ID0gc2l0ZVsxXSxcbiAgICAgIGxBcmMsXG4gICAgICByQXJjLFxuICAgICAgZHhsLFxuICAgICAgZHhyLFxuICAgICAgbm9kZSA9IGJlYWNoZXMuXztcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGR4bCA9IGxlZnRCcmVha1BvaW50KG5vZGUsIGRpcmVjdHJpeCkgLSB4O1xuICAgIGlmIChkeGwgPiBlcHNpbG9uKSBub2RlID0gbm9kZS5MOyBlbHNlIHtcbiAgICAgIGR4ciA9IHggLSByaWdodEJyZWFrUG9pbnQobm9kZSwgZGlyZWN0cml4KTtcbiAgICAgIGlmIChkeHIgPiBlcHNpbG9uKSB7XG4gICAgICAgIGlmICghbm9kZS5SKSB7XG4gICAgICAgICAgbEFyYyA9IG5vZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUuUjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkeGwgPiAtZXBzaWxvbikge1xuICAgICAgICAgIGxBcmMgPSBub2RlLlA7XG4gICAgICAgICAgckFyYyA9IG5vZGU7XG4gICAgICAgIH0gZWxzZSBpZiAoZHhyID4gLWVwc2lsb24pIHtcbiAgICAgICAgICBsQXJjID0gbm9kZTtcbiAgICAgICAgICByQXJjID0gbm9kZS5OO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxBcmMgPSByQXJjID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjcmVhdGVDZWxsKHNpdGUpO1xuICB2YXIgbmV3QXJjID0gY3JlYXRlQmVhY2goc2l0ZSk7XG4gIGJlYWNoZXMuaW5zZXJ0KGxBcmMsIG5ld0FyYyk7XG5cbiAgaWYgKCFsQXJjICYmICFyQXJjKSByZXR1cm47XG5cbiAgaWYgKGxBcmMgPT09IHJBcmMpIHtcbiAgICBkZXRhY2hDaXJjbGUobEFyYyk7XG4gICAgckFyYyA9IGNyZWF0ZUJlYWNoKGxBcmMuc2l0ZSk7XG4gICAgYmVhY2hlcy5pbnNlcnQobmV3QXJjLCByQXJjKTtcbiAgICBuZXdBcmMuZWRnZSA9IHJBcmMuZWRnZSA9IGNyZWF0ZUVkZ2UobEFyYy5zaXRlLCBuZXdBcmMuc2l0ZSk7XG4gICAgYXR0YWNoQ2lyY2xlKGxBcmMpO1xuICAgIGF0dGFjaENpcmNsZShyQXJjKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXJBcmMpIHsgLy8gJiYgbEFyY1xuICAgIG5ld0FyYy5lZGdlID0gY3JlYXRlRWRnZShsQXJjLnNpdGUsIG5ld0FyYy5zaXRlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBlbHNlIGxBcmMgIT09IHJBcmNcbiAgZGV0YWNoQ2lyY2xlKGxBcmMpO1xuICBkZXRhY2hDaXJjbGUockFyYyk7XG5cbiAgdmFyIGxTaXRlID0gbEFyYy5zaXRlLFxuICAgICAgYXggPSBsU2l0ZVswXSxcbiAgICAgIGF5ID0gbFNpdGVbMV0sXG4gICAgICBieCA9IHNpdGVbMF0gLSBheCxcbiAgICAgIGJ5ID0gc2l0ZVsxXSAtIGF5LFxuICAgICAgclNpdGUgPSByQXJjLnNpdGUsXG4gICAgICBjeCA9IHJTaXRlWzBdIC0gYXgsXG4gICAgICBjeSA9IHJTaXRlWzFdIC0gYXksXG4gICAgICBkID0gMiAqIChieCAqIGN5IC0gYnkgKiBjeCksXG4gICAgICBoYiA9IGJ4ICogYnggKyBieSAqIGJ5LFxuICAgICAgaGMgPSBjeCAqIGN4ICsgY3kgKiBjeSxcbiAgICAgIHZlcnRleCA9IFsoY3kgKiBoYiAtIGJ5ICogaGMpIC8gZCArIGF4LCAoYnggKiBoYyAtIGN4ICogaGIpIC8gZCArIGF5XTtcblxuICBzZXRFZGdlRW5kKHJBcmMuZWRnZSwgbFNpdGUsIHJTaXRlLCB2ZXJ0ZXgpO1xuICBuZXdBcmMuZWRnZSA9IGNyZWF0ZUVkZ2UobFNpdGUsIHNpdGUsIG51bGwsIHZlcnRleCk7XG4gIHJBcmMuZWRnZSA9IGNyZWF0ZUVkZ2Uoc2l0ZSwgclNpdGUsIG51bGwsIHZlcnRleCk7XG4gIGF0dGFjaENpcmNsZShsQXJjKTtcbiAgYXR0YWNoQ2lyY2xlKHJBcmMpO1xufVxuXG5mdW5jdGlvbiBsZWZ0QnJlYWtQb2ludChhcmMsIGRpcmVjdHJpeCkge1xuICB2YXIgc2l0ZSA9IGFyYy5zaXRlLFxuICAgICAgcmZvY3ggPSBzaXRlWzBdLFxuICAgICAgcmZvY3kgPSBzaXRlWzFdLFxuICAgICAgcGJ5MiA9IHJmb2N5IC0gZGlyZWN0cml4O1xuXG4gIGlmICghcGJ5MikgcmV0dXJuIHJmb2N4O1xuXG4gIHZhciBsQXJjID0gYXJjLlA7XG4gIGlmICghbEFyYykgcmV0dXJuIC1JbmZpbml0eTtcblxuICBzaXRlID0gbEFyYy5zaXRlO1xuICB2YXIgbGZvY3ggPSBzaXRlWzBdLFxuICAgICAgbGZvY3kgPSBzaXRlWzFdLFxuICAgICAgcGxieTIgPSBsZm9jeSAtIGRpcmVjdHJpeDtcblxuICBpZiAoIXBsYnkyKSByZXR1cm4gbGZvY3g7XG5cbiAgdmFyIGhsID0gbGZvY3ggLSByZm9jeCxcbiAgICAgIGFieTIgPSAxIC8gcGJ5MiAtIDEgLyBwbGJ5MixcbiAgICAgIGIgPSBobCAvIHBsYnkyO1xuXG4gIGlmIChhYnkyKSByZXR1cm4gKC1iICsgTWF0aC5zcXJ0KGIgKiBiIC0gMiAqIGFieTIgKiAoaGwgKiBobCAvICgtMiAqIHBsYnkyKSAtIGxmb2N5ICsgcGxieTIgLyAyICsgcmZvY3kgLSBwYnkyIC8gMikpKSAvIGFieTIgKyByZm9jeDtcblxuICByZXR1cm4gKHJmb2N4ICsgbGZvY3gpIC8gMjtcbn1cblxuZnVuY3Rpb24gcmlnaHRCcmVha1BvaW50KGFyYywgZGlyZWN0cml4KSB7XG4gIHZhciByQXJjID0gYXJjLk47XG4gIGlmIChyQXJjKSByZXR1cm4gbGVmdEJyZWFrUG9pbnQockFyYywgZGlyZWN0cml4KTtcbiAgdmFyIHNpdGUgPSBhcmMuc2l0ZTtcbiAgcmV0dXJuIHNpdGVbMV0gPT09IGRpcmVjdHJpeCA/IHNpdGVbMF0gOiBJbmZpbml0eTtcbn1cbiIsImltcG9ydCB7YWRkQmVhY2gsIHJlbW92ZUJlYWNofSBmcm9tIFwiLi9CZWFjaFwiO1xuaW1wb3J0IHtzb3J0Q2VsbEhhbGZlZGdlcywgY2VsbEhhbGZlZGdlU3RhcnQsIGNsaXBDZWxsc30gZnJvbSBcIi4vQ2VsbFwiO1xuaW1wb3J0IHtmaXJzdENpcmNsZX0gZnJvbSBcIi4vQ2lyY2xlXCI7XG5pbXBvcnQge2NsaXBFZGdlc30gZnJvbSBcIi4vRWRnZVwiO1xuaW1wb3J0IFJlZEJsYWNrVHJlZSBmcm9tIFwiLi9SZWRCbGFja1RyZWVcIjtcblxuZXhwb3J0IHZhciBlcHNpbG9uID0gMWUtNjtcbmV4cG9ydCB2YXIgZXBzaWxvbjIgPSAxZS0xMjtcbmV4cG9ydCB2YXIgYmVhY2hlcztcbmV4cG9ydCB2YXIgY2VsbHM7XG5leHBvcnQgdmFyIGNpcmNsZXM7XG5leHBvcnQgdmFyIGVkZ2VzO1xuXG5mdW5jdGlvbiB0cmlhbmdsZUFyZWEoYSwgYiwgYykge1xuICByZXR1cm4gKGFbMF0gLSBjWzBdKSAqIChiWzFdIC0gYVsxXSkgLSAoYVswXSAtIGJbMF0pICogKGNbMV0gLSBhWzFdKTtcbn1cblxuZnVuY3Rpb24gbGV4aWNvZ3JhcGhpYyhhLCBiKSB7XG4gIHJldHVybiBiWzFdIC0gYVsxXVxuICAgICAgfHwgYlswXSAtIGFbMF07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERpYWdyYW0oc2l0ZXMsIGV4dGVudCkge1xuICB2YXIgc2l0ZSA9IHNpdGVzLnNvcnQobGV4aWNvZ3JhcGhpYykucG9wKCksXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIGNpcmNsZTtcblxuICBlZGdlcyA9IFtdO1xuICBjZWxscyA9IG5ldyBBcnJheShzaXRlcy5sZW5ndGgpO1xuICBiZWFjaGVzID0gbmV3IFJlZEJsYWNrVHJlZTtcbiAgY2lyY2xlcyA9IG5ldyBSZWRCbGFja1RyZWU7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjaXJjbGUgPSBmaXJzdENpcmNsZTtcbiAgICBpZiAoc2l0ZSAmJiAoIWNpcmNsZSB8fCBzaXRlWzFdIDwgY2lyY2xlLnkgfHwgKHNpdGVbMV0gPT09IGNpcmNsZS55ICYmIHNpdGVbMF0gPCBjaXJjbGUueCkpKSB7XG4gICAgICBpZiAoc2l0ZVswXSAhPT0geCB8fCBzaXRlWzFdICE9PSB5KSB7XG4gICAgICAgIGFkZEJlYWNoKHNpdGUpO1xuICAgICAgICB4ID0gc2l0ZVswXSwgeSA9IHNpdGVbMV07XG4gICAgICB9XG4gICAgICBzaXRlID0gc2l0ZXMucG9wKCk7XG4gICAgfSBlbHNlIGlmIChjaXJjbGUpIHtcbiAgICAgIHJlbW92ZUJlYWNoKGNpcmNsZS5hcmMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzb3J0Q2VsbEhhbGZlZGdlcygpO1xuXG4gIGlmIChleHRlbnQpIHtcbiAgICB2YXIgeDAgPSArZXh0ZW50WzBdWzBdLFxuICAgICAgICB5MCA9ICtleHRlbnRbMF1bMV0sXG4gICAgICAgIHgxID0gK2V4dGVudFsxXVswXSxcbiAgICAgICAgeTEgPSArZXh0ZW50WzFdWzFdO1xuICAgIGNsaXBFZGdlcyh4MCwgeTAsIHgxLCB5MSk7XG4gICAgY2xpcENlbGxzKHgwLCB5MCwgeDEsIHkxKTtcbiAgfVxuXG4gIHRoaXMuZWRnZXMgPSBlZGdlcztcbiAgdGhpcy5jZWxscyA9IGNlbGxzO1xuXG4gIGJlYWNoZXMgPVxuICBjaXJjbGVzID1cbiAgZWRnZXMgPVxuICBjZWxscyA9IG51bGw7XG59XG5cbkRpYWdyYW0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlhZ3JhbSxcblxuICBwb2x5Z29uczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVkZ2VzID0gdGhpcy5lZGdlcztcblxuICAgIHJldHVybiB0aGlzLmNlbGxzLm1hcChmdW5jdGlvbihjZWxsKSB7XG4gICAgICB2YXIgcG9seWdvbiA9IGNlbGwuaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiBjZWxsSGFsZmVkZ2VTdGFydChjZWxsLCBlZGdlc1tpXSk7IH0pO1xuICAgICAgcG9seWdvbi5kYXRhID0gY2VsbC5zaXRlLmRhdGE7XG4gICAgICByZXR1cm4gcG9seWdvbjtcbiAgICB9KTtcbiAgfSxcblxuICB0cmlhbmdsZXM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0cmlhbmdsZXMgPSBbXSxcbiAgICAgICAgZWRnZXMgPSB0aGlzLmVkZ2VzO1xuXG4gICAgdGhpcy5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGNlbGwsIGkpIHtcbiAgICAgIGlmICghKG0gPSAoaGFsZmVkZ2VzID0gY2VsbC5oYWxmZWRnZXMpLmxlbmd0aCkpIHJldHVybjtcbiAgICAgIHZhciBzaXRlID0gY2VsbC5zaXRlLFxuICAgICAgICAgIGhhbGZlZGdlcyxcbiAgICAgICAgICBqID0gLTEsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBzMCxcbiAgICAgICAgICBlMSA9IGVkZ2VzW2hhbGZlZGdlc1ttIC0gMV1dLFxuICAgICAgICAgIHMxID0gZTEubGVmdCA9PT0gc2l0ZSA/IGUxLnJpZ2h0IDogZTEubGVmdDtcblxuICAgICAgd2hpbGUgKCsraiA8IG0pIHtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgICAgZTEgPSBlZGdlc1toYWxmZWRnZXNbal1dO1xuICAgICAgICBzMSA9IGUxLmxlZnQgPT09IHNpdGUgPyBlMS5yaWdodCA6IGUxLmxlZnQ7XG4gICAgICAgIGlmIChzMCAmJiBzMSAmJiBpIDwgczAuaW5kZXggJiYgaSA8IHMxLmluZGV4ICYmIHRyaWFuZ2xlQXJlYShzaXRlLCBzMCwgczEpIDwgMCkge1xuICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKFtzaXRlLmRhdGEsIHMwLmRhdGEsIHMxLmRhdGFdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcbiAgfSxcblxuICBsaW5rczogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICAgIHJldHVybiBlZGdlLnJpZ2h0O1xuICAgIH0pLm1hcChmdW5jdGlvbihlZGdlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2U6IGVkZ2UubGVmdC5kYXRhLFxuICAgICAgICB0YXJnZXQ6IGVkZ2UucmlnaHQuZGF0YVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSxcblxuICBmaW5kOiBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXMsIGkwLCBpMSA9IHRoYXQuX2ZvdW5kIHx8IDAsIG4gPSB0aGF0LmNlbGxzLmxlbmd0aCwgY2VsbDtcblxuICAgIC8vIFVzZSB0aGUgcHJldmlvdXNseS1mb3VuZCBjZWxsLCBvciBzdGFydCB3aXRoIGFuIGFyYml0cmFyeSBvbmUuXG4gICAgd2hpbGUgKCEoY2VsbCA9IHRoYXQuY2VsbHNbaTFdKSkgaWYgKCsraTEgPj0gbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGR4ID0geCAtIGNlbGwuc2l0ZVswXSwgZHkgPSB5IC0gY2VsbC5zaXRlWzFdLCBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuXG4gICAgLy8gVHJhdmVyc2UgdGhlIGhhbGYtZWRnZXMgdG8gZmluZCBhIGNsb3NlciBjZWxsLCBpZiBhbnkuXG4gICAgZG8ge1xuICAgICAgY2VsbCA9IHRoYXQuY2VsbHNbaTAgPSBpMV0sIGkxID0gbnVsbDtcbiAgICAgIGNlbGwuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgZWRnZSA9IHRoYXQuZWRnZXNbZV0sIHYgPSBlZGdlLmxlZnQ7XG4gICAgICAgIGlmICgodiA9PT0gY2VsbC5zaXRlIHx8ICF2KSAmJiAhKHYgPSBlZGdlLnJpZ2h0KSkgcmV0dXJuO1xuICAgICAgICB2YXIgdnggPSB4IC0gdlswXSwgdnkgPSB5IC0gdlsxXSwgdjIgPSB2eCAqIHZ4ICsgdnkgKiB2eTtcbiAgICAgICAgaWYgKHYyIDwgZDIpIGQyID0gdjIsIGkxID0gdi5pbmRleDtcbiAgICAgIH0pO1xuICAgIH0gd2hpbGUgKGkxICE9PSBudWxsKTtcblxuICAgIHRoYXQuX2ZvdW5kID0gaTA7XG5cbiAgICByZXR1cm4gcmFkaXVzID09IG51bGwgfHwgZDIgPD0gcmFkaXVzICogcmFkaXVzID8gY2VsbC5zaXRlIDogbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQge3ggYXMgcG9pbnRYLCB5IGFzIHBvaW50WX0gZnJvbSBcIi4vcG9pbnRcIjtcbmltcG9ydCBEaWFncmFtLCB7ZXBzaWxvbn0gZnJvbSBcIi4vRGlhZ3JhbVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHggPSBwb2ludFgsXG4gICAgICB5ID0gcG9pbnRZLFxuICAgICAgZXh0ZW50ID0gbnVsbDtcblxuICBmdW5jdGlvbiB2b3Jvbm9pKGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IERpYWdyYW0oZGF0YS5tYXAoZnVuY3Rpb24oZCwgaSkge1xuICAgICAgdmFyIHMgPSBbTWF0aC5yb3VuZCh4KGQsIGksIGRhdGEpIC8gZXBzaWxvbikgKiBlcHNpbG9uLCBNYXRoLnJvdW5kKHkoZCwgaSwgZGF0YSkgLyBlcHNpbG9uKSAqIGVwc2lsb25dO1xuICAgICAgcy5pbmRleCA9IGk7XG4gICAgICBzLmRhdGEgPSBkO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSksIGV4dGVudCk7XG4gIH1cblxuICB2b3Jvbm9pLnBvbHlnb25zID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIHJldHVybiB2b3Jvbm9pKGRhdGEpLnBvbHlnb25zKCk7XG4gIH07XG5cbiAgdm9yb25vaS5saW5rcyA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICByZXR1cm4gdm9yb25vaShkYXRhKS5saW5rcygpO1xuICB9O1xuXG4gIHZvcm9ub2kudHJpYW5nbGVzID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIHJldHVybiB2b3Jvbm9pKGRhdGEpLnRyaWFuZ2xlcygpO1xuICB9O1xuXG4gIHZvcm9ub2kueCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHZvcm9ub2kpIDogeDtcbiAgfTtcblxuICB2b3Jvbm9pLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB2b3Jvbm9pKSA6IHk7XG4gIH07XG5cbiAgdm9yb25vaS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gXyA9PSBudWxsID8gbnVsbCA6IFtbK19bMF1bMF0sICtfWzBdWzFdXSwgWytfWzFdWzBdLCArX1sxXVsxXV1dLCB2b3Jvbm9pKSA6IGV4dGVudCAmJiBbW2V4dGVudFswXVswXSwgZXh0ZW50WzBdWzFdXSwgW2V4dGVudFsxXVswXSwgZXh0ZW50WzFdWzFdXV07XG4gIH07XG5cbiAgdm9yb25vaS5zaXplID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IF8gPT0gbnVsbCA/IG51bGwgOiBbWzAsIDBdLCBbK19bMF0sICtfWzFdXV0sIHZvcm9ub2kpIDogZXh0ZW50ICYmIFtleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0sIGV4dGVudFsxXVsxXSAtIGV4dGVudFswXVsxXV07XG4gIH07XG5cbiAgcmV0dXJuIHZvcm9ub2k7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgdm9yb25vaX0gZnJvbSBcIi4vdm9yb25vaVwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBab29tRXZlbnQodGFyZ2V0LCB0eXBlLCB0cmFuc2Zvcm0pIHtcbiAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIFRyYW5zZm9ybShrLCB4LCB5KSB7XG4gIHRoaXMuayA9IGs7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMueSA9IHk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sXG4gIHNjYWxlOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7XG4gIH0sXG4gIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB4ID09PSAwICYgeSA9PT0gMCA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuaywgdGhpcy54ICsgdGhpcy5rICogeCwgdGhpcy55ICsgdGhpcy5rICogeSk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbihwb2ludCkge1xuICAgIHJldHVybiBbcG9pbnRbMF0gKiB0aGlzLmsgKyB0aGlzLngsIHBvaW50WzFdICogdGhpcy5rICsgdGhpcy55XTtcbiAgfSxcbiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7XG4gIH0sXG4gIGFwcGx5WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5ICogdGhpcy5rICsgdGhpcy55O1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIFsobG9jYXRpb25bMF0gLSB0aGlzLngpIC8gdGhpcy5rLCAobG9jYXRpb25bMV0gLSB0aGlzLnkpIC8gdGhpcy5rXTtcbiAgfSxcbiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7XG4gIH0sXG4gIGludmVydFk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gKHkgLSB0aGlzLnkpIC8gdGhpcy5rO1xuICB9LFxuICByZXNjYWxlWDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4LmNvcHkoKS5kb21haW4oeC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsIHRoaXMpLm1hcCh4LmludmVydCwgeCkpO1xuICB9LFxuICByZXNjYWxlWTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpO1xuICB9LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgdGhpcy54ICsgXCIsXCIgKyB0aGlzLnkgKyBcIikgc2NhbGUoXCIgKyB0aGlzLmsgKyBcIilcIjtcbiAgfVxufTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IG5ldyBUcmFuc2Zvcm0oMSwgMCwgMCk7XG5cbnRyYW5zZm9ybS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJvdG90eXBlO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX196b29tKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gbm9kZS5fX3pvb207XG59XG4iLCJpbXBvcnQge2V2ZW50fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZVpvb219IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtldmVudCwgY3VzdG9tRXZlbnQsIHNlbGVjdCwgbW91c2UsIHRvdWNofSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge2ludGVycnVwdH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IFpvb21FdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuaW1wb3J0IHtUcmFuc2Zvcm0sIGlkZW50aXR5fSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoKSB7XG4gIHJldHVybiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgZSA9IHRoaXM7XG4gIGlmIChlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgIGUgPSBlLm93bmVyU1ZHRWxlbWVudCB8fCBlO1xuICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcInZpZXdCb3hcIikpIHtcbiAgICAgIGUgPSBlLnZpZXdCb3guYmFzZVZhbDtcbiAgICAgIHJldHVybiBbW2UueCwgZS55XSwgW2UueCArIGUud2lkdGgsIGUueSArIGUuaGVpZ2h0XV07XG4gICAgfVxuICAgIHJldHVybiBbWzAsIDBdLCBbZS53aWR0aC5iYXNlVmFsLnZhbHVlLCBlLmhlaWdodC5iYXNlVmFsLnZhbHVlXV07XG4gIH1cbiAgcmV0dXJuIFtbMCwgMF0sIFtlLmNsaWVudFdpZHRoLCBlLmNsaWVudEhlaWdodF1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtKCkge1xuICByZXR1cm4gdGhpcy5fX3pvb20gfHwgaWRlbnRpdHk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRXaGVlbERlbHRhKCkge1xuICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXZlbnQuZGVsdGFNb2RlID8gMSA6IDAuMDAyKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnN0cmFpbih0cmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSB7XG4gIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLFxuICAgICAgZHgxID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzFdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVswXSxcbiAgICAgIGR5MCA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFswXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMV0sXG4gICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzFdO1xuICByZXR1cm4gdHJhbnNmb3JtLnRyYW5zbGF0ZShcbiAgICBkeDEgPiBkeDAgPyAoZHgwICsgZHgxKSAvIDIgOiBNYXRoLm1pbigwLCBkeDApIHx8IE1hdGgubWF4KDAsIGR4MSksXG4gICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRoLm1heCgwLCBkeTEpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBjb25zdHJhaW4gPSBkZWZhdWx0Q29uc3RyYWluLFxuICAgICAgd2hlZWxEZWx0YSA9IGRlZmF1bHRXaGVlbERlbHRhLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIHNjYWxlRXh0ZW50ID0gWzAsIEluZmluaXR5XSxcbiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sXG4gICAgICBkdXJhdGlvbiA9IDI1MCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVab29tLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcInpvb21cIiwgXCJlbmRcIiksXG4gICAgICB0b3VjaHN0YXJ0aW5nLFxuICAgICAgdG91Y2hlbmRpbmcsXG4gICAgICB0b3VjaERlbGF5ID0gNTAwLFxuICAgICAgd2hlZWxEZWxheSA9IDE1MCxcbiAgICAgIGNsaWNrRGlzdGFuY2UyID0gMDtcblxuICBmdW5jdGlvbiB6b29tKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvblxuICAgICAgICAucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSlcbiAgICAgICAgLm9uKFwid2hlZWwuem9vbVwiLCB3aGVlbGVkKVxuICAgICAgICAub24oXCJtb3VzZWRvd24uem9vbVwiLCBtb3VzZWRvd25lZClcbiAgICAgICAgLm9uKFwiZGJsY2xpY2suem9vbVwiLCBkYmxjbGlja2VkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuem9vbVwiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS56b29tXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbVwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCJ0b3VjaC1hY3Rpb25cIiwgXCJub25lXCIpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICB6b29tLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gY29sbGVjdGlvbi5zZWxlY3Rpb24gPyBjb2xsZWN0aW9uLnNlbGVjdGlvbigpIDogY29sbGVjdGlvbjtcbiAgICBzZWxlY3Rpb24ucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSk7XG4gICAgaWYgKGNvbGxlY3Rpb24gIT09IHNlbGVjdGlvbikge1xuICAgICAgc2NoZWR1bGUoY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIC5zdGFydCgpXG4gICAgICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRyYW5zZm9ybSlcbiAgICAgICAgICAgIC5lbmQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB6b29tLnNjYWxlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHApIHtcbiAgICB6b29tLnNjYWxlVG8oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBrMCA9IHRoaXMuX196b29tLmssXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBrMCAqIGsxO1xuICAgIH0sIHApO1xuICB9O1xuXG4gIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwLFxuICAgICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwKTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zdHJhaW4odGhpcy5fX3pvb20udHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHlcbiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0pO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIHApIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbihpZGVudGl0eS50cmFuc2xhdGUocDBbMF0sIHAwWzFdKS5zY2FsZSh0LmspLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IC14LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IC15LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteVxuICAgICAgKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwKTtcbiAgfTtcblxuICBmdW5jdGlvbiBzY2FsZSh0cmFuc2Zvcm0sIGspIHtcbiAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBrKSk7XG4gICAgcmV0dXJuIGsgPT09IHRyYW5zZm9ybS5rID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybShrLCB0cmFuc2Zvcm0ueCwgdHJhbnNmb3JtLnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHRyYW5zZm9ybSwgcDAsIHAxKSB7XG4gICAgdmFyIHggPSBwMFswXSAtIHAxWzBdICogdHJhbnNmb3JtLmssIHkgPSBwMFsxXSAtIHAxWzFdICogdHJhbnNmb3JtLms7XG4gICAgcmV0dXJuIHggPT09IHRyYW5zZm9ybS54ICYmIHkgPT09IHRyYW5zZm9ybS55ID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybSh0cmFuc2Zvcm0uaywgeCwgeSk7XG4gIH1cblxuICBmdW5jdGlvbiBjZW50cm9pZChleHRlbnQpIHtcbiAgICByZXR1cm4gWygrZXh0ZW50WzBdWzBdICsgK2V4dGVudFsxXVswXSkgLyAyLCAoK2V4dGVudFswXVsxXSArICtleHRlbnRbMV1bMV0pIC8gMl07XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZSh0cmFuc2l0aW9uLCB0cmFuc2Zvcm0sIHBvaW50KSB7XG4gICAgdHJhbnNpdGlvblxuICAgICAgICAub24oXCJzdGFydC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuc3RhcnQoKTsgfSlcbiAgICAgICAgLm9uKFwiaW50ZXJydXB0Lnpvb20gZW5kLnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5lbmQoKTsgfSlcbiAgICAgICAgLnR3ZWVuKFwiem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLFxuICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLFxuICAgICAgICAgICAgICBwID0gcG9pbnQgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHBvaW50ID09PSBcImZ1bmN0aW9uXCIgPyBwb2ludC5hcHBseSh0aGF0LCBhcmdzKSA6IHBvaW50LFxuICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoZVsxXVswXSAtIGVbMF1bMF0sIGVbMV1bMV0gLSBlWzBdWzFdKSxcbiAgICAgICAgICAgICAgYSA9IHRoYXQuX196b29tLFxuICAgICAgICAgICAgICBiID0gdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoYXQsIGFyZ3MpIDogdHJhbnNmb3JtLFxuICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoYS5pbnZlcnQocCkuY29uY2F0KHcgLyBhLmspLCBiLmludmVydChwKS5jb25jYXQodyAvIGIuaykpO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAodCA9PT0gMSkgdCA9IGI7IC8vIEF2b2lkIHJvdW5kaW5nIGVycm9yIG9uIGVuZC5cbiAgICAgICAgICAgIGVsc2UgeyB2YXIgbCA9IGkodCksIGsgPSB3IC8gbFsyXTsgdCA9IG5ldyBUcmFuc2Zvcm0oaywgcFswXSAtIGxbMF0gKiBrLCBwWzFdIC0gbFsxXSAqIGspOyB9XG4gICAgICAgICAgICBnLnpvb20obnVsbCwgdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXN0dXJlKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgcmV0dXJuICghY2xlYW4gJiYgdGhhdC5fX3pvb21pbmcpIHx8IG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB0aGlzLnRhcHMgPSAwO1xuICB9XG5cbiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7XG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCsrdGhpcy5hY3RpdmUgPT09IDEpIHtcbiAgICAgICAgdGhpcy50aGF0Ll9fem9vbWluZyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkge1xuICAgICAgaWYgKHRoaXMubW91c2UgJiYga2V5ICE9PSBcIm1vdXNlXCIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gwICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMFsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDBbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gxICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pO1xuICAgICAgdGhpcy50aGF0Ll9fem9vbSA9IHRyYW5zZm9ybTtcbiAgICAgIHRoaXMuZW1pdChcInpvb21cIik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy50aGF0Ll9fem9vbWluZztcbiAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICBjdXN0b21FdmVudChuZXcgWm9vbUV2ZW50KHpvb20sIHR5cGUsIHRoaXMudGhhdC5fX3pvb20pLCBsaXN0ZW5lcnMuYXBwbHksIGxpc3RlbmVycywgW3R5cGUsIHRoaXMudGhhdCwgdGhpcy5hcmdzXSk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHdoZWVsZWQoKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHQuayAqIE1hdGgucG93KDIsIHdoZWVsRGVsdGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpKSxcbiAgICAgICAgcCA9IG1vdXNlKHRoaXMpO1xuXG4gICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuXG4gICAgLy8gSWYgdGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1lb3V0LlxuICAgIGlmIChnLndoZWVsKSB7XG4gICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7XG4gICAgICAgIGcubW91c2VbMV0gPSB0LmludmVydChnLm1vdXNlWzBdID0gcCk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB3aGVlbCBldmVudCB3b27igJl0IHRyaWdnZXIgYSB0cmFuc2Zvcm0gY2hhbmdlLCBpZ25vcmUgaXQuXG4gICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47XG5cbiAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuXG4gICAgZWxzZSB7XG4gICAgICBnLm1vdXNlID0gW3AsIHQuaW52ZXJ0KHApXTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBub2V2ZW50KCk7XG4gICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7XG4gICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcblxuICAgIGZ1bmN0aW9uIHdoZWVsaWRsZWQoKSB7XG4gICAgICBnLndoZWVsID0gbnVsbDtcbiAgICAgIGcuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMsIHRydWUpLFxuICAgICAgICB2ID0gc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLnpvb21cIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oXCJtb3VzZXVwLnpvb21cIiwgbW91c2V1cHBlZCwgdHJ1ZSksXG4gICAgICAgIHAgPSBtb3VzZSh0aGlzKSxcbiAgICAgICAgeDAgPSBldmVudC5jbGllbnRYLFxuICAgICAgICB5MCA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICBub3Byb3BhZ2F0aW9uKCk7XG4gICAgZy5tb3VzZSA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCldO1xuICAgIGludGVycnVwdCh0aGlzKTtcbiAgICBnLnN0YXJ0KCk7XG5cbiAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKCkge1xuICAgICAgbm9ldmVudCgpO1xuICAgICAgaWYgKCFnLm1vdmVkKSB7XG4gICAgICAgIHZhciBkeCA9IGV2ZW50LmNsaWVudFggLSB4MCwgZHkgPSBldmVudC5jbGllbnRZIC0geTA7XG4gICAgICAgIGcubW92ZWQgPSBkeCAqIGR4ICsgZHkgKiBkeSA+IGNsaWNrRGlzdGFuY2UyO1xuICAgICAgfVxuICAgICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gbW91c2UoZy50aGF0KSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKCkge1xuICAgICAgdi5vbihcIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbVwiLCBudWxsKTtcbiAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgZy5tb3ZlZCk7XG4gICAgICBub2V2ZW50KCk7XG4gICAgICBnLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRibGNsaWNrZWQoKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICBwMCA9IG1vdXNlKHRoaXMpLFxuICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgIGsxID0gdDAuayAqIChldmVudC5zaGlmdEtleSA/IDAuNSA6IDIpLFxuICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5zbGF0ZUV4dGVudCk7XG5cbiAgICBub2V2ZW50KCk7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkgc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikuY2FsbChzY2hlZHVsZSwgdDEsIHAwKTtcbiAgICBlbHNlIHNlbGVjdCh0aGlzKS5jYWxsKHpvb20udHJhbnNmb3JtLCB0MSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQudG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMsIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA9PT0gbiksXG4gICAgICAgIHN0YXJ0ZWQsIGksIHQsIHA7XG5cbiAgICBub3Byb3BhZ2F0aW9uKCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSB0b3VjaCh0aGlzLCB0b3VjaGVzLCB0LmlkZW50aWZpZXIpO1xuICAgICAgcCA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCksIHQuaWRlbnRpZmllcl07XG4gICAgICBpZiAoIWcudG91Y2gwKSBnLnRvdWNoMCA9IHAsIHN0YXJ0ZWQgPSB0cnVlLCBnLnRhcHMgPSAxICsgISF0b3VjaHN0YXJ0aW5nO1xuICAgICAgZWxzZSBpZiAoIWcudG91Y2gxICYmIGcudG91Y2gwWzJdICE9PSBwWzJdKSBnLnRvdWNoMSA9IHAsIGcudGFwcyA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRvdWNoc3RhcnRpbmcpIHRvdWNoc3RhcnRpbmcgPSBjbGVhclRpbWVvdXQodG91Y2hzdGFydGluZyk7XG5cbiAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgaWYgKGcudGFwcyA8IDIpIHRvdWNoc3RhcnRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaHN0YXJ0aW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZCgpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0LCBwLCBsO1xuXG4gICAgbm9ldmVudCgpO1xuICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0gY2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpO1xuICAgIGcudGFwcyA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSB0b3VjaCh0aGlzLCB0b3VjaGVzLCB0LmlkZW50aWZpZXIpO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gwWzBdID0gcDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gxWzBdID0gcDtcbiAgICB9XG4gICAgdCA9IGcudGhhdC5fX3pvb207XG4gICAgaWYgKGcudG91Y2gxKSB7XG4gICAgICB2YXIgcDAgPSBnLnRvdWNoMFswXSwgbDAgPSBnLnRvdWNoMFsxXSxcbiAgICAgICAgICBwMSA9IGcudG91Y2gxWzBdLCBsMSA9IGcudG91Y2gxWzFdLFxuICAgICAgICAgIGRwID0gKGRwID0gcDFbMF0gLSBwMFswXSkgKiBkcCArIChkcCA9IHAxWzFdIC0gcDBbMV0pICogZHAsXG4gICAgICAgICAgZGwgPSAoZGwgPSBsMVswXSAtIGwwWzBdKSAqIGRsICsgKGRsID0gbDFbMV0gLSBsMFsxXSkgKiBkbDtcbiAgICAgIHQgPSBzY2FsZSh0LCBNYXRoLnNxcnQoZHAgLyBkbCkpO1xuICAgICAgcCA9IFsocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyXTtcbiAgICAgIGwgPSBbKGwwWzBdICsgbDFbMF0pIC8gMiwgKGwwWzFdICsgbDFbMV0pIC8gMl07XG4gICAgfVxuICAgIGVsc2UgaWYgKGcudG91Y2gwKSBwID0gZy50b3VjaDBbMF0sIGwgPSBnLnRvdWNoMFsxXTtcbiAgICBlbHNlIHJldHVybjtcbiAgICBnLnpvb20oXCJ0b3VjaFwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHQsIHAsIGwpLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKCkge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQ7XG5cbiAgICBub3Byb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDE7XG4gICAgfVxuICAgIGlmIChnLnRvdWNoMSAmJiAhZy50b3VjaDApIGcudG91Y2gwID0gZy50b3VjaDEsIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICBpZiAoZy50b3VjaDApIGcudG91Y2gwWzFdID0gdGhpcy5fX3pvb20uaW52ZXJ0KGcudG91Y2gwWzBdKTtcbiAgICBlbHNlIHtcbiAgICAgIGcuZW5kKCk7XG4gICAgICAvLyBJZiB0aGlzIHdhcyBhIGRibHRhcCwgcmVyb3V0ZSB0byB0aGUgKG9wdGlvbmFsKSBkYmxjbGljay56b29tIGhhbmRsZXIuXG4gICAgICBpZiAoZy50YXBzID09PSAyKSB7XG4gICAgICAgIHZhciBwID0gc2VsZWN0KHRoaXMpLm9uKFwiZGJsY2xpY2suem9vbVwiKTtcbiAgICAgICAgaWYgKHApIHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB6b29tLndoZWVsRGVsdGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7XG4gIH07XG5cbiAgem9vbS5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IGZpbHRlcjtcbiAgfTtcblxuICB6b29tLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIHpvb20uZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoW1srX1swXVswXSwgK19bMF1bMV1dLCBbK19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDtcbiAgfTtcblxuICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlRXh0ZW50WzBdID0gK19bMF0sIHNjYWxlRXh0ZW50WzFdID0gK19bMV0sIHpvb20pIDogW3NjYWxlRXh0ZW50WzBdLCBzY2FsZUV4dGVudFsxXV07XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNsYXRlRXh0ZW50WzBdWzBdID0gK19bMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVswXSA9ICtfWzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV0gPSArX1swXVsxXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdID0gK19bMV1bMV0sIHpvb20pIDogW1t0cmFuc2xhdGVFeHRlbnRbMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXV0sIFt0cmFuc2xhdGVFeHRlbnRbMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXV1dO1xuICB9O1xuXG4gIHpvb20uY29uc3RyYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluO1xuICB9O1xuXG4gIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHVyYXRpb24gPSArXywgem9vbSkgOiBkdXJhdGlvbjtcbiAgfTtcblxuICB6b29tLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgem9vbSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICB6b29tLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IHpvb20gOiB2YWx1ZTtcbiAgfTtcblxuICB6b29tLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIHpvb20pIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyB6b29tfSBmcm9tIFwiLi96b29tLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgem9vbVRyYW5zZm9ybSwgaWRlbnRpdHkgYXMgem9vbUlkZW50aXR5fSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbiIsImV4cG9ydCB7dmVyc2lvbn0gZnJvbSBcIi4vZGlzdC9wYWNrYWdlLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtYXJyYXlcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1heGlzXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtYnJ1c2hcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1jaG9yZFwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWNvbGxlY3Rpb25cIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1jb2xvclwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWNvbnRvdXJcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWRyYWdcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1kc3ZcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1lYXNlXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtZmV0Y2hcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1mb3JjZVwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWZvcm1hdFwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWdlb1wiO1xuZXhwb3J0ICogZnJvbSBcImQzLWhpZXJhcmNoeVwiO1xuZXhwb3J0ICogZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtcGF0aFwiO1xuZXhwb3J0ICogZnJvbSBcImQzLXBvbHlnb25cIjtcbmV4cG9ydCAqIGZyb20gXCJkMy1xdWFkdHJlZVwiO1xuZXhwb3J0ICogZnJvbSBcImQzLXJhbmRvbVwiO1xuZXhwb3J0ICogZnJvbSBcImQzLXNjYWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtc2NhbGUtY2hyb21hdGljXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtc2hhcGVcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy10aW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtdGltZS1mb3JtYXRcIjtcbmV4cG9ydCAqIGZyb20gXCJkMy10aW1lclwiO1xuZXhwb3J0ICogZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCJkMy12b3Jvbm9pXCI7XG5leHBvcnQgKiBmcm9tIFwiZDMtem9vbVwiO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///4\\n')},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nif (true) {\\n module.exports = __webpack_require__(29);\\n} else {}\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanM/M2JhOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDLG1CQUFtQixtQkFBTyxDQUFDLEVBQWtDO0FBQzdELENBQUMsTUFBTSxFQUVOIiwiZmlsZSI6IjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///5\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar reactIs = __webpack_require__(5);\\n\\n/**\\n * Copyright 2015, Yahoo! Inc.\\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\\n */\\nvar REACT_STATICS = {\\n childContextTypes: true,\\n contextType: true,\\n contextTypes: true,\\n defaultProps: true,\\n displayName: true,\\n getDefaultProps: true,\\n getDerivedStateFromError: true,\\n getDerivedStateFromProps: true,\\n mixins: true,\\n propTypes: true,\\n type: true\\n};\\nvar KNOWN_STATICS = {\\n name: true,\\n length: true,\\n prototype: true,\\n caller: true,\\n callee: true,\\n arguments: true,\\n arity: true\\n};\\nvar FORWARD_REF_STATICS = {\\n '$$typeof': true,\\n render: true,\\n defaultProps: true,\\n displayName: true,\\n propTypes: true\\n};\\nvar MEMO_STATICS = {\\n '$$typeof': true,\\n compare: true,\\n defaultProps: true,\\n displayName: true,\\n propTypes: true,\\n type: true\\n};\\nvar TYPE_STATICS = {};\\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\\n\\nfunction getStatics(component) {\\n // React v16.11 and below\\n if (reactIs.isMemo(component)) {\\n return MEMO_STATICS;\\n } // React v16.12 and above\\n\\n\\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\\n}\\n\\nvar defineProperty = Object.defineProperty;\\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\\nvar getPrototypeOf = Object.getPrototypeOf;\\nvar objectPrototype = Object.prototype;\\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\\n if (typeof sourceComponent !== 'string') {\\n // don't hoist over string (html) components\\n if (objectPrototype) {\\n var inheritedComponent = getPrototypeOf(sourceComponent);\\n\\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\\n }\\n }\\n\\n var keys = getOwnPropertyNames(sourceComponent);\\n\\n if (getOwnPropertySymbols) {\\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\\n }\\n\\n var targetStatics = getStatics(targetComponent);\\n var sourceStatics = getStatics(sourceComponent);\\n\\n for (var i = 0; i < keys.length; ++i) {\\n var key = keys[i];\\n\\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\\n\\n try {\\n // Avoid failures from read-only properties\\n defineProperty(targetComponent, key, descriptor);\\n } catch (e) {}\\n }\\n }\\n }\\n\\n return targetComponent;\\n}\\n\\nmodule.exports = hoistNonReactStatics;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MvZGlzdC9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy5janMuanM/OTVmZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixjQUFjLG1CQUFPLENBQUMsQ0FBVTs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUIsaUJBQWlCO0FBQ3BDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBIiwiZmlsZSI6IjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciByZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28hIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xudmFyIFJFQUNUX1NUQVRJQ1MgPSB7XG4gIGNoaWxkQ29udGV4dFR5cGVzOiB0cnVlLFxuICBjb250ZXh0VHlwZTogdHJ1ZSxcbiAgY29udGV4dFR5cGVzOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBnZXREZWZhdWx0UHJvcHM6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiB0cnVlLFxuICBtaXhpbnM6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBLTk9XTl9TVEFUSUNTID0ge1xuICBuYW1lOiB0cnVlLFxuICBsZW5ndGg6IHRydWUsXG4gIHByb3RvdHlwZTogdHJ1ZSxcbiAgY2FsbGVyOiB0cnVlLFxuICBjYWxsZWU6IHRydWUsXG4gIGFyZ3VtZW50czogdHJ1ZSxcbiAgYXJpdHk6IHRydWVcbn07XG52YXIgRk9SV0FSRF9SRUZfU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgcmVuZGVyOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWVcbn07XG52YXIgTUVNT19TVEFUSUNTID0ge1xuICAnJCR0eXBlb2YnOiB0cnVlLFxuICBjb21wYXJlOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgVFlQRV9TVEFUSUNTID0ge307XG5UWVBFX1NUQVRJQ1NbcmVhY3RJcy5Gb3J3YXJkUmVmXSA9IEZPUldBUkRfUkVGX1NUQVRJQ1M7XG5UWVBFX1NUQVRJQ1NbcmVhY3RJcy5NZW1vXSA9IE1FTU9fU1RBVElDUztcblxuZnVuY3Rpb24gZ2V0U3RhdGljcyhjb21wb25lbnQpIHtcbiAgLy8gUmVhY3QgdjE2LjExIGFuZCBiZWxvd1xuICBpZiAocmVhY3RJcy5pc01lbW8oY29tcG9uZW50KSkge1xuICAgIHJldHVybiBNRU1PX1NUQVRJQ1M7XG4gIH0gLy8gUmVhY3QgdjE2LjEyIGFuZCBhYm92ZVxuXG5cbiAgcmV0dXJuIFRZUEVfU1RBVElDU1tjb21wb25lbnRbJyQkdHlwZW9mJ11dIHx8IFJFQUNUX1NUQVRJQ1M7XG59XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyIG9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5mdW5jdGlvbiBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIHNvdXJjZUNvbXBvbmVudCwgYmxhY2tsaXN0KSB7XG4gIGlmICh0eXBlb2Ygc291cmNlQ29tcG9uZW50ICE9PSAnc3RyaW5nJykge1xuICAgIC8vIGRvbid0IGhvaXN0IG92ZXIgc3RyaW5nIChodG1sKSBjb21wb25lbnRzXG4gICAgaWYgKG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgdmFyIGluaGVyaXRlZENvbXBvbmVudCA9IGdldFByb3RvdHlwZU9mKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICAgIGlmIChpbmhlcml0ZWRDb21wb25lbnQgJiYgaW5oZXJpdGVkQ29tcG9uZW50ICE9PSBvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgICAgaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBpbmhlcml0ZWRDb21wb25lbnQsIGJsYWNrbGlzdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICBpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICBrZXlzID0ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZUNvbXBvbmVudCkpO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXRTdGF0aWNzID0gZ2V0U3RhdGljcyh0YXJnZXRDb21wb25lbnQpO1xuICAgIHZhciBzb3VyY2VTdGF0aWNzID0gZ2V0U3RhdGljcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKCFLTk9XTl9TVEFUSUNTW2tleV0gJiYgIShibGFja2xpc3QgJiYgYmxhY2tsaXN0W2tleV0pICYmICEoc291cmNlU3RhdGljcyAmJiBzb3VyY2VTdGF0aWNzW2tleV0pICYmICEodGFyZ2V0U3RhdGljcyAmJiB0YXJnZXRTdGF0aWNzW2tleV0pKSB7XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZUNvbXBvbmVudCwga2V5KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEF2b2lkIGZhaWx1cmVzIGZyb20gcmVhZC1vbmx5IHByb3BlcnRpZXNcbiAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXRDb21wb25lbnQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldENvbXBvbmVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBob2lzdE5vblJlYWN0U3RhdGljcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///6\\n\")},function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval(\"/* WEBPACK VAR INJECTION */(function(global, module) {/* harmony import */ var _ponyfill_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(19);\\n/* global window */\\n\\n\\nvar root;\\n\\nif (typeof self !== 'undefined') {\\n root = self;\\n} else if (typeof window !== 'undefined') {\\n root = window;\\n} else if (typeof global !== 'undefined') {\\n root = global;\\n} else if (true) {\\n root = module;\\n} else {}\\n\\nvar result = Object(_ponyfill_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ \\\"a\\\"])(root);\\n/* harmony default export */ __webpack_exports__[\\\"a\\\"] = (result);\\n\\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(9), __webpack_require__(30)(module)))//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3ltYm9sLW9ic2VydmFibGUvZXMvaW5kZXguanM/NWY3NyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ3FDOztBQUVyQzs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQyxVQUFVLElBQTZCO0FBQ3hDO0FBQ0EsQ0FBQyxNQUFNLEVBRU47O0FBRUQsYUFBYSxvRUFBUTtBQUNOLCtEQUFNLEVBQUMiLCJmaWxlIjoiNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCB3aW5kb3cgKi9cbmltcG9ydCBwb255ZmlsbCBmcm9tICcuL3BvbnlmaWxsLmpzJztcblxudmFyIHJvb3Q7XG5cbmlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IHNlbGY7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBtb2R1bGU7XG59IGVsc2Uge1xuICByb290ID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbn1cblxudmFyIHJlc3VsdCA9IHBvbnlmaWxsKHJvb3QpO1xuZXhwb3J0IGRlZmF1bHQgcmVzdWx0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///7\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"/*\\nobject-assign\\n(c) Sindre Sorhus\\n@license MIT\\n*/\\n\\n\\n/* eslint-disable no-unused-vars */\\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\\n\\nfunction toObject(val) {\\n\\tif (val === null || val === undefined) {\\n\\t\\tthrow new TypeError('Object.assign cannot be called with null or undefined');\\n\\t}\\n\\n\\treturn Object(val);\\n}\\n\\nfunction shouldUseNative() {\\n\\ttry {\\n\\t\\tif (!Object.assign) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\n\\t\\t// Detect buggy property enumeration order in older V8 versions.\\n\\n\\t\\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\\n\\t\\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\\n\\t\\ttest1[5] = 'de';\\n\\t\\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\n\\t\\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\\n\\t\\tvar test2 = {};\\n\\t\\tfor (var i = 0; i < 10; i++) {\\n\\t\\t\\ttest2['_' + String.fromCharCode(i)] = i;\\n\\t\\t}\\n\\t\\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\\n\\t\\t\\treturn test2[n];\\n\\t\\t});\\n\\t\\tif (order2.join('') !== '0123456789') {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\n\\t\\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\\n\\t\\tvar test3 = {};\\n\\t\\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\\n\\t\\t\\ttest3[letter] = letter;\\n\\t\\t});\\n\\t\\tif (Object.keys(Object.assign({}, test3)).join('') !==\\n\\t\\t\\t\\t'abcdefghijklmnopqrst') {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\n\\t\\treturn true;\\n\\t} catch (err) {\\n\\t\\t// We don't expect any of the above to throw, but better to be safe.\\n\\t\\treturn false;\\n\\t}\\n}\\n\\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\\n\\tvar from;\\n\\tvar to = toObject(target);\\n\\tvar symbols;\\n\\n\\tfor (var s = 1; s < arguments.length; s++) {\\n\\t\\tfrom = Object(arguments[s]);\\n\\n\\t\\tfor (var key in from) {\\n\\t\\t\\tif (hasOwnProperty.call(from, key)) {\\n\\t\\t\\t\\tto[key] = from[key];\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif (getOwnPropertySymbols) {\\n\\t\\t\\tsymbols = getOwnPropertySymbols(from);\\n\\t\\t\\tfor (var i = 0; i < symbols.length; i++) {\\n\\t\\t\\t\\tif (propIsEnumerable.call(from, symbols[i])) {\\n\\t\\t\\t\\t\\tto[symbols[i]] = from[symbols[i]];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn to;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcz8xNGM3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdCQUFnQixzQkFBc0I7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLG9CQUFvQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///8\\n\")},function(module,exports){eval('var g;\\n\\n// This works in non-strict mode\\ng = (function() {\\n\\treturn this;\\n})();\\n\\ntry {\\n\\t// This works if eval is allowed (see CSP)\\n\\tg = g || new Function(\"return this\")();\\n} catch (e) {\\n\\t// This works if the window reference is available\\n\\tif (typeof window === \"object\") g = window;\\n}\\n\\n// g can still be undefined, but nothing to do about it...\\n// We return undefined, instead of nothing here, so it\\'s\\n// easier to handle this case. if(!global) { ...}\\n\\nmodule.exports = g;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2EyOTgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7O0FBRTVDIiwiZmlsZSI6IjkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///9\\n')},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nmodule.exports = function bind(fn, thisArg) {\\n return function wrap() {\\n var args = new Array(arguments.length);\\n for (var i = 0; i < args.length; i++) {\\n args[i] = arguments[i];\\n }\\n return fn.apply(thisArg, args);\\n };\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcz80NjFmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpQkFBaUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///10\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\n\\nfunction encode(val) {\\n return encodeURIComponent(val).\\n replace(/%40/gi, '@').\\n replace(/%3A/gi, ':').\\n replace(/%24/g, '$').\\n replace(/%2C/gi, ',').\\n replace(/%20/g, '+').\\n replace(/%5B/gi, '[').\\n replace(/%5D/gi, ']');\\n}\\n\\n/**\\n * Build a URL by appending params to the end\\n *\\n * @param {string} url The base of the url (e.g., http://www.google.com)\\n * @param {object} [params] The params to be appended\\n * @returns {string} The formatted url\\n */\\nmodule.exports = function buildURL(url, params, paramsSerializer) {\\n /*eslint no-param-reassign:0*/\\n if (!params) {\\n return url;\\n }\\n\\n var serializedParams;\\n if (paramsSerializer) {\\n serializedParams = paramsSerializer(params);\\n } else if (utils.isURLSearchParams(params)) {\\n serializedParams = params.toString();\\n } else {\\n var parts = [];\\n\\n utils.forEach(params, function serialize(val, key) {\\n if (val === null || typeof val === 'undefined') {\\n return;\\n }\\n\\n if (utils.isArray(val)) {\\n key = key + '[]';\\n } else {\\n val = [val];\\n }\\n\\n utils.forEach(val, function parseValue(v) {\\n if (utils.isDate(v)) {\\n v = v.toISOString();\\n } else if (utils.isObject(v)) {\\n v = JSON.stringify(v);\\n }\\n parts.push(encode(key) + '=' + encode(v));\\n });\\n });\\n\\n serializedParams = parts.join('&');\\n }\\n\\n if (serializedParams) {\\n var hashmarkIndex = url.indexOf('#');\\n if (hashmarkIndex !== -1) {\\n url = url.slice(0, hashmarkIndex);\\n }\\n\\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\\n }\\n\\n return url;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanM/MmEyYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMsQ0FBWTs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkuXG4gICAgcmVwbGFjZSgvJTQwL2dpLCAnQCcpLlxuICAgIHJlcGxhY2UoLyUzQS9naSwgJzonKS5cbiAgICByZXBsYWNlKC8lMjQvZywgJyQnKS5cbiAgICByZXBsYWNlKC8lMkMvZ2ksICcsJykuXG4gICAgcmVwbGFjZSgvJTIwL2csICcrJykuXG4gICAgcmVwbGFjZSgvJTVCL2dpLCAnWycpLlxuICAgIHJlcGxhY2UoLyU1RC9naSwgJ10nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHVybFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJ1aWxkVVJMKHVybCwgcGFyYW1zLCBwYXJhbXNTZXJpYWxpemVyKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICBpZiAoIXBhcmFtcykge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICB2YXIgc2VyaWFsaXplZFBhcmFtcztcbiAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIpIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gcGFyYW1zU2VyaWFsaXplcihwYXJhbXMpO1xuICB9IGVsc2UgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKHBhcmFtcykpIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHBhcnRzID0gW107XG5cbiAgICB1dGlscy5mb3JFYWNoKHBhcmFtcywgZnVuY3Rpb24gc2VyaWFsaXplKHZhbCwga2V5KSB7XG4gICAgICBpZiAodmFsID09PSBudWxsIHx8IHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHV0aWxzLmlzQXJyYXkodmFsKSkge1xuICAgICAgICBrZXkgPSBrZXkgKyAnW10nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gW3ZhbF07XG4gICAgICB9XG5cbiAgICAgIHV0aWxzLmZvckVhY2godmFsLCBmdW5jdGlvbiBwYXJzZVZhbHVlKHYpIHtcbiAgICAgICAgaWYgKHV0aWxzLmlzRGF0ZSh2KSkge1xuICAgICAgICAgIHYgPSB2LnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodXRpbHMuaXNPYmplY3QodikpIHtcbiAgICAgICAgICB2ID0gSlNPTi5zdHJpbmdpZnkodik7XG4gICAgICAgIH1cbiAgICAgICAgcGFydHMucHVzaChlbmNvZGUoa2V5KSArICc9JyArIGVuY29kZSh2KSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJ0cy5qb2luKCcmJyk7XG4gIH1cblxuICBpZiAoc2VyaWFsaXplZFBhcmFtcykge1xuICAgIHZhciBoYXNobWFya0luZGV4ID0gdXJsLmluZGV4T2YoJyMnKTtcbiAgICBpZiAoaGFzaG1hcmtJbmRleCAhPT0gLTEpIHtcbiAgICAgIHVybCA9IHVybC5zbGljZSgwLCBoYXNobWFya0luZGV4KTtcbiAgICB9XG5cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///11\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nmodule.exports = function isCancel(value) {\\n return !!(value && value.__CANCEL__);\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcz82N2VjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQSIsImZpbGUiOiIxMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///12\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"/* WEBPACK VAR INJECTION */(function(process) {\\n\\nvar utils = __webpack_require__(1);\\nvar normalizeHeaderName = __webpack_require__(49);\\n\\nvar DEFAULT_CONTENT_TYPE = {\\n 'Content-Type': 'application/x-www-form-urlencoded'\\n};\\n\\nfunction setContentTypeIfUnset(headers, value) {\\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\\n headers['Content-Type'] = value;\\n }\\n}\\n\\nfunction getDefaultAdapter() {\\n var adapter;\\n if (typeof XMLHttpRequest !== 'undefined') {\\n // For browsers use XHR adapter\\n adapter = __webpack_require__(14);\\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\\n // For node use HTTP adapter\\n adapter = __webpack_require__(14);\\n }\\n return adapter;\\n}\\n\\nvar defaults = {\\n adapter: getDefaultAdapter(),\\n\\n transformRequest: [function transformRequest(data, headers) {\\n normalizeHeaderName(headers, 'Accept');\\n normalizeHeaderName(headers, 'Content-Type');\\n if (utils.isFormData(data) ||\\n utils.isArrayBuffer(data) ||\\n utils.isBuffer(data) ||\\n utils.isStream(data) ||\\n utils.isFile(data) ||\\n utils.isBlob(data)\\n ) {\\n return data;\\n }\\n if (utils.isArrayBufferView(data)) {\\n return data.buffer;\\n }\\n if (utils.isURLSearchParams(data)) {\\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\\n return data.toString();\\n }\\n if (utils.isObject(data)) {\\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\\n return JSON.stringify(data);\\n }\\n return data;\\n }],\\n\\n transformResponse: [function transformResponse(data) {\\n /*eslint no-param-reassign:0*/\\n if (typeof data === 'string') {\\n try {\\n data = JSON.parse(data);\\n } catch (e) { /* Ignore */ }\\n }\\n return data;\\n }],\\n\\n /**\\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\\n * timeout is not created.\\n */\\n timeout: 0,\\n\\n xsrfCookieName: 'XSRF-TOKEN',\\n xsrfHeaderName: 'X-XSRF-TOKEN',\\n\\n maxContentLength: -1,\\n\\n validateStatus: function validateStatus(status) {\\n return status >= 200 && status < 300;\\n }\\n};\\n\\ndefaults.headers = {\\n common: {\\n 'Accept': 'application/json, text/plain, */*'\\n }\\n};\\n\\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\\n defaults.headers[method] = {};\\n});\\n\\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\\n});\\n\\nmodule.exports = defaults;\\n\\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(48)))//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzP2Q2OWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLENBQVM7QUFDN0IsMEJBQTBCLG1CQUFPLENBQUMsRUFBK0I7O0FBRWpFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxtQkFBTyxDQUFDLEVBQWdCO0FBQ3RDLEdBQUc7QUFDSDtBQUNBLGNBQWMsbUJBQU8sQ0FBQyxFQUFpQjtBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RTtBQUN4RTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxZQUFZO0FBQ25CO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDOztBQUVEIiwiZmlsZSI6IjEzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgbm9ybWFsaXplSGVhZGVyTmFtZSA9IHJlcXVpcmUoJy4vaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lJyk7XG5cbnZhciBERUZBVUxUX0NPTlRFTlRfVFlQRSA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG59O1xuXG5mdW5jdGlvbiBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgdmFsdWUpIHtcbiAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzKSAmJiB1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzWydDb250ZW50LVR5cGUnXSkpIHtcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRBZGFwdGVyKCkge1xuICB2YXIgYWRhcHRlcjtcbiAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMveGhyJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nKSB7XG4gICAgLy8gRm9yIG5vZGUgdXNlIEhUVFAgYWRhcHRlclxuICAgIGFkYXB0ZXIgPSByZXF1aXJlKCcuL2FkYXB0ZXJzL2h0dHAnKTtcbiAgfVxuICByZXR1cm4gYWRhcHRlcjtcbn1cblxudmFyIGRlZmF1bHRzID0ge1xuICBhZGFwdGVyOiBnZXREZWZhdWx0QWRhcHRlcigpLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdBY2NlcHQnKTtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKTtcbiAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQmxvYihkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc09iamVjdChkYXRhKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIHRyYW5zZm9ybVJlc3BvbnNlOiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSkge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkgeyAvKiBJZ25vcmUgKi8gfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgLyoqXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxuICAgKiB0aW1lb3V0IGlzIG5vdCBjcmVhdGVkLlxuICAgKi9cbiAgdGltZW91dDogMCxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXG5cbiAgbWF4Q29udGVudExlbmd0aDogLTEsXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfVxufTtcblxuZGVmYXVsdHMuaGVhZGVycyA9IHtcbiAgY29tbW9uOiB7XG4gICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonXG4gIH1cbn07XG5cbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0gdXRpbHMubWVyZ2UoREVGQVVMVF9DT05URU5UX1RZUEUpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///13\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\nvar settle = __webpack_require__(50);\\nvar buildURL = __webpack_require__(11);\\nvar buildFullPath = __webpack_require__(52);\\nvar parseHeaders = __webpack_require__(55);\\nvar isURLSameOrigin = __webpack_require__(56);\\nvar createError = __webpack_require__(15);\\n\\nmodule.exports = function xhrAdapter(config) {\\n return new Promise(function dispatchXhrRequest(resolve, reject) {\\n var requestData = config.data;\\n var requestHeaders = config.headers;\\n\\n if (utils.isFormData(requestData)) {\\n delete requestHeaders['Content-Type']; // Let the browser set it\\n }\\n\\n var request = new XMLHttpRequest();\\n\\n // HTTP basic authentication\\n if (config.auth) {\\n var username = config.auth.username || '';\\n var password = config.auth.password || '';\\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\\n }\\n\\n var fullPath = buildFullPath(config.baseURL, config.url);\\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\\n\\n // Set the request timeout in MS\\n request.timeout = config.timeout;\\n\\n // Listen for ready state\\n request.onreadystatechange = function handleLoad() {\\n if (!request || request.readyState !== 4) {\\n return;\\n }\\n\\n // The request errored out and we didn't get a response, this will be\\n // handled by onerror instead\\n // With one exception: request that using file: protocol, most browsers\\n // will return status as 0 even though it's a successful request\\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\\n return;\\n }\\n\\n // Prepare the response\\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\\n var response = {\\n data: responseData,\\n status: request.status,\\n statusText: request.statusText,\\n headers: responseHeaders,\\n config: config,\\n request: request\\n };\\n\\n settle(resolve, reject, response);\\n\\n // Clean up request\\n request = null;\\n };\\n\\n // Handle browser request cancellation (as opposed to a manual cancellation)\\n request.onabort = function handleAbort() {\\n if (!request) {\\n return;\\n }\\n\\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\\n\\n // Clean up request\\n request = null;\\n };\\n\\n // Handle low level network errors\\n request.onerror = function handleError() {\\n // Real errors are hidden from us by the browser\\n // onerror should only fire if it's a network error\\n reject(createError('Network Error', config, null, request));\\n\\n // Clean up request\\n request = null;\\n };\\n\\n // Handle timeout\\n request.ontimeout = function handleTimeout() {\\n var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';\\n if (config.timeoutErrorMessage) {\\n timeoutErrorMessage = config.timeoutErrorMessage;\\n }\\n reject(createError(timeoutErrorMessage, config, 'ECONNABORTED',\\n request));\\n\\n // Clean up request\\n request = null;\\n };\\n\\n // Add xsrf header\\n // This is only done if running in a standard browser environment.\\n // Specifically not if we're in a web worker, or react-native.\\n if (utils.isStandardBrowserEnv()) {\\n var cookies = __webpack_require__(57);\\n\\n // Add xsrf header\\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\\n cookies.read(config.xsrfCookieName) :\\n undefined;\\n\\n if (xsrfValue) {\\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\\n }\\n }\\n\\n // Add headers to the request\\n if ('setRequestHeader' in request) {\\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\\n // Remove Content-Type if data is undefined\\n delete requestHeaders[key];\\n } else {\\n // Otherwise add header to the request\\n request.setRequestHeader(key, val);\\n }\\n });\\n }\\n\\n // Add withCredentials to request if needed\\n if (!utils.isUndefined(config.withCredentials)) {\\n request.withCredentials = !!config.withCredentials;\\n }\\n\\n // Add responseType to request if needed\\n if (config.responseType) {\\n try {\\n request.responseType = config.responseType;\\n } catch (e) {\\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\\n if (config.responseType !== 'json') {\\n throw e;\\n }\\n }\\n }\\n\\n // Handle progress if needed\\n if (typeof config.onDownloadProgress === 'function') {\\n request.addEventListener('progress', config.onDownloadProgress);\\n }\\n\\n // Not all browsers support upload events\\n if (typeof config.onUploadProgress === 'function' && request.upload) {\\n request.upload.addEventListener('progress', config.onUploadProgress);\\n }\\n\\n if (config.cancelToken) {\\n // Handle cancellation\\n config.cancelToken.promise.then(function onCanceled(cancel) {\\n if (!request) {\\n return;\\n }\\n\\n request.abort();\\n reject(cancel);\\n // Clean up request\\n request = null;\\n });\\n }\\n\\n if (requestData === undefined) {\\n requestData = null;\\n }\\n\\n // Send the request\\n request.send(requestData);\\n });\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcz82YmM3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxDQUFZO0FBQ2hDLGFBQWEsbUJBQU8sQ0FBQyxFQUFrQjtBQUN2QyxlQUFlLG1CQUFPLENBQUMsRUFBdUI7QUFDOUMsb0JBQW9CLG1CQUFPLENBQUMsRUFBdUI7QUFDbkQsbUJBQW1CLG1CQUFPLENBQUMsRUFBMkI7QUFDdEQsc0JBQXNCLG1CQUFPLENBQUMsRUFBOEI7QUFDNUQsa0JBQWtCLG1CQUFPLENBQUMsRUFBcUI7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixtQkFBTyxDQUFDLEVBQXNCOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCIsImZpbGUiOiIxNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIHNldHRsZSA9IHJlcXVpcmUoJy4vLi4vY29yZS9zZXR0bGUnKTtcbnZhciBidWlsZFVSTCA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9idWlsZFVSTCcpO1xudmFyIGJ1aWxkRnVsbFBhdGggPSByZXF1aXJlKCcuLi9jb3JlL2J1aWxkRnVsbFBhdGgnKTtcbnZhciBwYXJzZUhlYWRlcnMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvcGFyc2VIZWFkZXJzJyk7XG52YXIgaXNVUkxTYW1lT3JpZ2luID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbicpO1xudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnLi4vY29yZS9jcmVhdGVFcnJvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHhockFkYXB0ZXIoY29uZmlnKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBkaXNwYXRjaFhoclJlcXVlc3QocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3REYXRhID0gY29uZmlnLmRhdGE7XG4gICAgdmFyIHJlcXVlc3RIZWFkZXJzID0gY29uZmlnLmhlYWRlcnM7XG5cbiAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShyZXF1ZXN0RGF0YSkpIHtcbiAgICAgIGRlbGV0ZSByZXF1ZXN0SGVhZGVyc1snQ29udGVudC1UeXBlJ107IC8vIExldCB0aGUgYnJvd3NlciBzZXQgaXRcbiAgICB9XG5cbiAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICAgIGlmIChjb25maWcuYXV0aCkge1xuICAgICAgdmFyIHVzZXJuYW1lID0gY29uZmlnLmF1dGgudXNlcm5hbWUgfHwgJyc7XG4gICAgICB2YXIgcGFzc3dvcmQgPSBjb25maWcuYXV0aC5wYXNzd29yZCB8fCAnJztcbiAgICAgIHJlcXVlc3RIZWFkZXJzLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2EodXNlcm5hbWUgKyAnOicgKyBwYXNzd29yZCk7XG4gICAgfVxuXG4gICAgdmFyIGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gICAgcmVxdWVzdC5vcGVuKGNvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKSwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuICAgIHJlcXVlc3QudGltZW91dCA9IGNvbmZpZy50aW1lb3V0O1xuXG4gICAgLy8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZVxuICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgIC8vIGhhbmRsZWQgYnkgb25lcnJvciBpbnN0ZWFkXG4gICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xuICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAwICYmICEocmVxdWVzdC5yZXNwb25zZVVSTCAmJiByZXF1ZXN0LnJlc3BvbnNlVVJMLmluZGV4T2YoJ2ZpbGU6JykgPT09IDApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICAgIHZhciByZXNwb25zZUhlYWRlcnMgPSAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ID8gcGFyc2VIZWFkZXJzKHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpIDogbnVsbDtcbiAgICAgIHZhciByZXNwb25zZURhdGEgPSAhY29uZmlnLnJlc3BvbnNlVHlwZSB8fCBjb25maWcucmVzcG9uc2VUeXBlID09PSAndGV4dCcgPyByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG4gICAgICB2YXIgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0XG4gICAgICB9O1xuXG4gICAgICBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcsIGNvbmZpZywgJ0VDT05OQUJPUlRFRCcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBjb25maWcsIG51bGwsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgdmFyIHRpbWVvdXRFcnJvck1lc3NhZ2UgPSAndGltZW91dCBvZiAnICsgY29uZmlnLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnO1xuICAgICAgaWYgKGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBjb25maWcudGltZW91dEVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCBjb25maWcsICdFQ09OTkFCT1JURUQnLFxuICAgICAgICByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgICAvLyBTcGVjaWZpY2FsbHkgbm90IGlmIHdlJ3JlIGluIGEgd2ViIHdvcmtlciwgb3IgcmVhY3QtbmF0aXZlLlxuICAgIGlmICh1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpKSB7XG4gICAgICB2YXIgY29va2llcyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9jb29raWVzJyk7XG5cbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgdmFyIHhzcmZWYWx1ZSA9IChjb25maWcud2l0aENyZWRlbnRpYWxzIHx8IGlzVVJMU2FtZU9yaWdpbihmdWxsUGF0aCkpICYmIGNvbmZpZy54c3JmQ29va2llTmFtZSA/XG4gICAgICAgIGNvb2tpZXMucmVhZChjb25maWcueHNyZkNvb2tpZU5hbWUpIDpcbiAgICAgICAgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoeHNyZlZhbHVlKSB7XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzW2NvbmZpZy54c3JmSGVhZGVyTmFtZV0gPSB4c3JmVmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzLmZvckVhY2gocmVxdWVzdEhlYWRlcnMsIGZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXIodmFsLCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0RGF0YSA9PT0gJ3VuZGVmaW5lZCcgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIENvbnRlbnQtVHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgICAgICAgIGRlbGV0ZSByZXF1ZXN0SGVhZGVyc1trZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSBhZGQgaGVhZGVyIHRvIHRoZSByZXF1ZXN0XG4gICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnLndpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFjb25maWcud2l0aENyZWRlbnRpYWxzO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVHlwZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBFeHBlY3RlZCBET01FeGNlcHRpb24gdGhyb3duIGJ5IGJyb3dzZXJzIG5vdCBjb21wYXRpYmxlIFhNTEh0dHBSZXF1ZXN0IExldmVsIDIuXG4gICAgICAgIC8vIEJ1dCwgdGhpcyBjYW4gYmUgc3VwcHJlc3NlZCBmb3IgJ2pzb24nIHR5cGUgYXMgaXQgY2FuIGJlIHBhcnNlZCBieSBkZWZhdWx0ICd0cmFuc2Zvcm1SZXNwb25zZScgZnVuY3Rpb24uXG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHByb2dyZXNzIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25VcGxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25VcGxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgY29uZmlnLmNhbmNlbFRva2VuLnByb21pc2UudGhlbihmdW5jdGlvbiBvbkNhbmNlbGVkKGNhbmNlbCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlamVjdChjYW5jZWwpO1xuICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3REYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3REYXRhID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgcmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhKTtcbiAgfSk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///14\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar enhanceError = __webpack_require__(51);\\n\\n/**\\n * Create an Error with the specified message, config, error code, request and response.\\n *\\n * @param {string} message The error message.\\n * @param {Object} config The config.\\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\\n * @param {Object} [request] The request.\\n * @param {Object} [response] The response.\\n * @returns {Error} The created error.\\n */\\nmodule.exports = function createError(message, config, code, request, response) {\\n var error = new Error(message);\\n return enhanceError(error, config, code, request, response);\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvY3JlYXRlRXJyb3IuanM/MmRhNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixtQkFBbUIsbUJBQU8sQ0FBQyxFQUFnQjs7QUFFM0M7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGVuaGFuY2VFcnJvciA9IHJlcXVpcmUoJy4vZW5oYW5jZUVycm9yJyk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUVycm9yKG1lc3NhZ2UsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZW5oYW5jZUVycm9yKGVycm9yLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///15\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\n\\n/**\\n * Config-specific merge-function which creates a new config-object\\n * by merging two configuration objects together.\\n *\\n * @param {Object} config1\\n * @param {Object} config2\\n * @returns {Object} New object resulting from merging config2 to config1\\n */\\nmodule.exports = function mergeConfig(config1, config2) {\\n // eslint-disable-next-line no-param-reassign\\n config2 = config2 || {};\\n var config = {};\\n\\n var valueFromConfig2Keys = ['url', 'method', 'params', 'data'];\\n var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy'];\\n var defaultToConfig2Keys = [\\n 'baseURL', 'url', 'transformRequest', 'transformResponse', 'paramsSerializer',\\n 'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',\\n 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress',\\n 'maxContentLength', 'validateStatus', 'maxRedirects', 'httpAgent',\\n 'httpsAgent', 'cancelToken', 'socketPath'\\n ];\\n\\n utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {\\n if (typeof config2[prop] !== 'undefined') {\\n config[prop] = config2[prop];\\n }\\n });\\n\\n utils.forEach(mergeDeepPropertiesKeys, function mergeDeepProperties(prop) {\\n if (utils.isObject(config2[prop])) {\\n config[prop] = utils.deepMerge(config1[prop], config2[prop]);\\n } else if (typeof config2[prop] !== 'undefined') {\\n config[prop] = config2[prop];\\n } else if (utils.isObject(config1[prop])) {\\n config[prop] = utils.deepMerge(config1[prop]);\\n } else if (typeof config1[prop] !== 'undefined') {\\n config[prop] = config1[prop];\\n }\\n });\\n\\n utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {\\n if (typeof config2[prop] !== 'undefined') {\\n config[prop] = config2[prop];\\n } else if (typeof config1[prop] !== 'undefined') {\\n config[prop] = config1[prop];\\n }\\n });\\n\\n var axiosKeys = valueFromConfig2Keys\\n .concat(mergeDeepPropertiesKeys)\\n .concat(defaultToConfig2Keys);\\n\\n var otherKeys = Object\\n .keys(config2)\\n .filter(function filterAxiosKeys(key) {\\n return axiosKeys.indexOf(key) === -1;\\n });\\n\\n utils.forEach(otherKeys, function otherKeysDefaultToConfig2(prop) {\\n if (typeof config2[prop] !== 'undefined') {\\n config[prop] = config2[prop];\\n } else if (typeof config1[prop] !== 'undefined') {\\n config[prop] = config1[prop];\\n }\\n });\\n\\n return config;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanM/NDc2ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMsQ0FBVTs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBIiwiZmlsZSI6IjE2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgdmFyIGNvbmZpZyA9IHt9O1xuXG4gIHZhciB2YWx1ZUZyb21Db25maWcyS2V5cyA9IFsndXJsJywgJ21ldGhvZCcsICdwYXJhbXMnLCAnZGF0YSddO1xuICB2YXIgbWVyZ2VEZWVwUHJvcGVydGllc0tleXMgPSBbJ2hlYWRlcnMnLCAnYXV0aCcsICdwcm94eSddO1xuICB2YXIgZGVmYXVsdFRvQ29uZmlnMktleXMgPSBbXG4gICAgJ2Jhc2VVUkwnLCAndXJsJywgJ3RyYW5zZm9ybVJlcXVlc3QnLCAndHJhbnNmb3JtUmVzcG9uc2UnLCAncGFyYW1zU2VyaWFsaXplcicsXG4gICAgJ3RpbWVvdXQnLCAnd2l0aENyZWRlbnRpYWxzJywgJ2FkYXB0ZXInLCAncmVzcG9uc2VUeXBlJywgJ3hzcmZDb29raWVOYW1lJyxcbiAgICAneHNyZkhlYWRlck5hbWUnLCAnb25VcGxvYWRQcm9ncmVzcycsICdvbkRvd25sb2FkUHJvZ3Jlc3MnLFxuICAgICdtYXhDb250ZW50TGVuZ3RoJywgJ3ZhbGlkYXRlU3RhdHVzJywgJ21heFJlZGlyZWN0cycsICdodHRwQWdlbnQnLFxuICAgICdodHRwc0FnZW50JywgJ2NhbmNlbFRva2VuJywgJ3NvY2tldFBhdGgnXG4gIF07XG5cbiAgdXRpbHMuZm9yRWFjaCh2YWx1ZUZyb21Db25maWcyS2V5cywgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihwcm9wKSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcyW3Byb3BdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uZmlnW3Byb3BdID0gY29uZmlnMltwcm9wXTtcbiAgICB9XG4gIH0pO1xuXG4gIHV0aWxzLmZvckVhY2gobWVyZ2VEZWVwUHJvcGVydGllc0tleXMsIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMocHJvcCkge1xuICAgIGlmICh1dGlscy5pc09iamVjdChjb25maWcyW3Byb3BdKSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gdXRpbHMuZGVlcE1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZzJbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBjb25maWcyW3Byb3BdO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNPYmplY3QoY29uZmlnMVtwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IHV0aWxzLmRlZXBNZXJnZShjb25maWcxW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25maWcxW3Byb3BdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uZmlnW3Byb3BdID0gY29uZmlnMVtwcm9wXTtcbiAgICB9XG4gIH0pO1xuXG4gIHV0aWxzLmZvckVhY2goZGVmYXVsdFRvQ29uZmlnMktleXMsIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIocHJvcCkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnMltwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzJbcHJvcF07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnMVtwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzFbcHJvcF07XG4gICAgfVxuICB9KTtcblxuICB2YXIgYXhpb3NLZXlzID0gdmFsdWVGcm9tQ29uZmlnMktleXNcbiAgICAuY29uY2F0KG1lcmdlRGVlcFByb3BlcnRpZXNLZXlzKVxuICAgIC5jb25jYXQoZGVmYXVsdFRvQ29uZmlnMktleXMpO1xuXG4gIHZhciBvdGhlcktleXMgPSBPYmplY3RcbiAgICAua2V5cyhjb25maWcyKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gZmlsdGVyQXhpb3NLZXlzKGtleSkge1xuICAgICAgcmV0dXJuIGF4aW9zS2V5cy5pbmRleE9mKGtleSkgPT09IC0xO1xuICAgIH0pO1xuXG4gIHV0aWxzLmZvckVhY2gob3RoZXJLZXlzLCBmdW5jdGlvbiBvdGhlcktleXNEZWZhdWx0VG9Db25maWcyKHByb3ApIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZzJbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBjb25maWcyW3Byb3BdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZzFbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBjb25maWcxW3Byb3BdO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///16\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\n/**\\n * A `Cancel` is an object that is thrown when an operation is canceled.\\n *\\n * @class\\n * @param {string=} message The message.\\n */\\nfunction Cancel(message) {\\n this.message = message;\\n}\\n\\nCancel.prototype.toString = function toString() {\\n return 'Cancel' + (this.message ? ': ' + this.message : '');\\n};\\n\\nCancel.prototype.__CANCEL__ = true;\\n\\nmodule.exports = Cancel;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanM/OTA2MSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEiLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSBgQ2FuY2VsYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbChtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG59XG5cbkNhbmNlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdDYW5jZWwnICsgKHRoaXMubWVzc2FnZSA/ICc6ICcgKyB0aGlzLm1lc3NhZ2UgOiAnJyk7XG59O1xuXG5DYW5jZWwucHJvdG90eXBlLl9fQ0FOQ0VMX18gPSB0cnVlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///17\\n\")},function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval('// ESM COMPAT FLAG\\n__webpack_require__.r(__webpack_exports__);\\n\\n// EXPORTS\\n__webpack_require__.d(__webpack_exports__, \"Provider\", function() { return /* reexport */ components_Provider; });\\n__webpack_require__.d(__webpack_exports__, \"connectAdvanced\", function() { return /* reexport */ connectAdvanced; });\\n__webpack_require__.d(__webpack_exports__, \"ReactReduxContext\", function() { return /* reexport */ ReactReduxContext; });\\n__webpack_require__.d(__webpack_exports__, \"connect\", function() { return /* reexport */ connect_connect; });\\n__webpack_require__.d(__webpack_exports__, \"batch\", function() { return /* reexport */ react_dom[\"unstable_batchedUpdates\"]; });\\n__webpack_require__.d(__webpack_exports__, \"useDispatch\", function() { return /* reexport */ useDispatch; });\\n__webpack_require__.d(__webpack_exports__, \"createDispatchHook\", function() { return /* reexport */ createDispatchHook; });\\n__webpack_require__.d(__webpack_exports__, \"useSelector\", function() { return /* reexport */ useSelector; });\\n__webpack_require__.d(__webpack_exports__, \"createSelectorHook\", function() { return /* reexport */ createSelectorHook; });\\n__webpack_require__.d(__webpack_exports__, \"useStore\", function() { return /* reexport */ useStore_useStore; });\\n__webpack_require__.d(__webpack_exports__, \"createStoreHook\", function() { return /* reexport */ createStoreHook; });\\n__webpack_require__.d(__webpack_exports__, \"shallowEqual\", function() { return /* reexport */ shallowEqual; });\\n\\n// EXTERNAL MODULE: ./node_modules/react/index.js\\nvar react = __webpack_require__(0);\\nvar react_default = /*#__PURE__*/__webpack_require__.n(react);\\n\\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\\nvar prop_types = __webpack_require__(26);\\n\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/components/Context.js\\n\\nvar ReactReduxContext =\\n/*#__PURE__*/\\nreact_default.a.createContext(null);\\n\\nif (false) {}\\n\\n/* harmony default export */ var components_Context = (ReactReduxContext);\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/utils/batch.js\\n// Default to a dummy \"batch\" implementation that just runs the callback\\nfunction defaultNoopBatch(callback) {\\n callback();\\n}\\n\\nvar batch_batch = defaultNoopBatch; // Allow injecting another batching function later\\n\\nvar setBatch = function setBatch(newBatch) {\\n return batch_batch = newBatch;\\n}; // Supply a getter just to skip dealing with ESM bindings\\n\\nvar getBatch = function getBatch() {\\n return batch_batch;\\n};\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/utils/Subscription.js\\n // encapsulates the subscription logic for connecting a component to the redux store, as\\n// well as nesting subscriptions of descendant components, so that we can ensure the\\n// ancestor components re-render before descendants\\n\\nvar nullListeners = {\\n notify: function notify() {}\\n};\\n\\nfunction createListenerCollection() {\\n var batch = getBatch();\\n var first = null;\\n var last = null;\\n return {\\n clear: function clear() {\\n first = null;\\n last = null;\\n },\\n notify: function notify() {\\n batch(function () {\\n var listener = first;\\n\\n while (listener) {\\n listener.callback();\\n listener = listener.next;\\n }\\n });\\n },\\n get: function get() {\\n var listeners = [];\\n var listener = first;\\n\\n while (listener) {\\n listeners.push(listener);\\n listener = listener.next;\\n }\\n\\n return listeners;\\n },\\n subscribe: function subscribe(callback) {\\n var isSubscribed = true;\\n var listener = last = {\\n callback: callback,\\n next: null,\\n prev: last\\n };\\n\\n if (listener.prev) {\\n listener.prev.next = listener;\\n } else {\\n first = listener;\\n }\\n\\n return function unsubscribe() {\\n if (!isSubscribed || first === null) return;\\n isSubscribed = false;\\n\\n if (listener.next) {\\n listener.next.prev = listener.prev;\\n } else {\\n last = listener.prev;\\n }\\n\\n if (listener.prev) {\\n listener.prev.next = listener.next;\\n } else {\\n first = listener.next;\\n }\\n };\\n }\\n };\\n}\\n\\nvar Subscription =\\n/*#__PURE__*/\\nfunction () {\\n function Subscription(store, parentSub) {\\n this.store = store;\\n this.parentSub = parentSub;\\n this.unsubscribe = null;\\n this.listeners = nullListeners;\\n this.handleChangeWrapper = this.handleChangeWrapper.bind(this);\\n }\\n\\n var _proto = Subscription.prototype;\\n\\n _proto.addNestedSub = function addNestedSub(listener) {\\n this.trySubscribe();\\n return this.listeners.subscribe(listener);\\n };\\n\\n _proto.notifyNestedSubs = function notifyNestedSubs() {\\n this.listeners.notify();\\n };\\n\\n _proto.handleChangeWrapper = function handleChangeWrapper() {\\n if (this.onStateChange) {\\n this.onStateChange();\\n }\\n };\\n\\n _proto.isSubscribed = function isSubscribed() {\\n return Boolean(this.unsubscribe);\\n };\\n\\n _proto.trySubscribe = function trySubscribe() {\\n if (!this.unsubscribe) {\\n this.unsubscribe = this.parentSub ? this.parentSub.addNestedSub(this.handleChangeWrapper) : this.store.subscribe(this.handleChangeWrapper);\\n this.listeners = createListenerCollection();\\n }\\n };\\n\\n _proto.tryUnsubscribe = function tryUnsubscribe() {\\n if (this.unsubscribe) {\\n this.unsubscribe();\\n this.unsubscribe = null;\\n this.listeners.clear();\\n this.listeners = nullListeners;\\n }\\n };\\n\\n return Subscription;\\n}();\\n\\n\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/components/Provider.js\\n\\n\\n\\n\\n\\nfunction Provider(_ref) {\\n var store = _ref.store,\\n context = _ref.context,\\n children = _ref.children;\\n var contextValue = Object(react[\"useMemo\"])(function () {\\n var subscription = new Subscription(store);\\n subscription.onStateChange = subscription.notifyNestedSubs;\\n return {\\n store: store,\\n subscription: subscription\\n };\\n }, [store]);\\n var previousState = Object(react[\"useMemo\"])(function () {\\n return store.getState();\\n }, [store]);\\n Object(react[\"useEffect\"])(function () {\\n var subscription = contextValue.subscription;\\n subscription.trySubscribe();\\n\\n if (previousState !== store.getState()) {\\n subscription.notifyNestedSubs();\\n }\\n\\n return function () {\\n subscription.tryUnsubscribe();\\n subscription.onStateChange = null;\\n };\\n }, [contextValue, previousState]);\\n var Context = context || ReactReduxContext;\\n return react_default.a.createElement(Context.Provider, {\\n value: contextValue\\n }, children);\\n}\\n\\nif (false) {}\\n\\n/* harmony default export */ var components_Provider = (Provider);\\n// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js\\nfunction _extends() {\\n _extends = Object.assign || function (target) {\\n for (var i = 1; i < arguments.length; i++) {\\n var source = arguments[i];\\n\\n for (var key in source) {\\n if (Object.prototype.hasOwnProperty.call(source, key)) {\\n target[key] = source[key];\\n }\\n }\\n }\\n\\n return target;\\n };\\n\\n return _extends.apply(this, arguments);\\n}\\n// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\\nfunction _objectWithoutPropertiesLoose(source, excluded) {\\n if (source == null) return {};\\n var target = {};\\n var sourceKeys = Object.keys(source);\\n var key, i;\\n\\n for (i = 0; i < sourceKeys.length; i++) {\\n key = sourceKeys[i];\\n if (excluded.indexOf(key) >= 0) continue;\\n target[key] = source[key];\\n }\\n\\n return target;\\n}\\n// EXTERNAL MODULE: ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\\nvar hoist_non_react_statics_cjs = __webpack_require__(6);\\nvar hoist_non_react_statics_cjs_default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics_cjs);\\n\\n// EXTERNAL MODULE: ./node_modules/react-is/index.js\\nvar react_is = __webpack_require__(5);\\n\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js\\n // React currently throws a warning when using useLayoutEffect on the server.\\n// To get around it, we can conditionally useEffect on the server (no-op) and\\n// useLayoutEffect in the browser. We need useLayoutEffect to ensure the store\\n// subscription callback always has the selector from the latest render commit\\n// available, otherwise a store update may happen between render and the effect,\\n// which may cause missed updates; we also must ensure the store subscription\\n// is created synchronously, otherwise a store update may occur before the\\n// subscription is created and an inconsistent state may be observed\\n\\nvar useIsomorphicLayoutEffect = typeof window !== \\'undefined\\' && typeof window.document !== \\'undefined\\' && typeof window.document.createElement !== \\'undefined\\' ? react[\"useLayoutEffect\"] : react[\"useEffect\"];\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/components/connectAdvanced.js\\n\\n\\n\\n\\n\\n\\n\\n // Define some constant arrays just to avoid re-creating these\\n\\nvar EMPTY_ARRAY = [];\\nvar NO_SUBSCRIPTION_ARRAY = [null, null];\\n\\nvar stringifyComponent = function stringifyComponent(Comp) {\\n try {\\n return JSON.stringify(Comp);\\n } catch (err) {\\n return String(Comp);\\n }\\n};\\n\\nfunction storeStateUpdatesReducer(state, action) {\\n var updateCount = state[1];\\n return [action.payload, updateCount + 1];\\n}\\n\\nfunction useIsomorphicLayoutEffectWithArgs(effectFunc, effectArgs, dependencies) {\\n useIsomorphicLayoutEffect(function () {\\n return effectFunc.apply(void 0, effectArgs);\\n }, dependencies);\\n}\\n\\nfunction captureWrapperProps(lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs) {\\n // We want to capture the wrapper props and child props we used for later comparisons\\n lastWrapperProps.current = wrapperProps;\\n lastChildProps.current = actualChildProps;\\n renderIsScheduled.current = false; // If the render was from a store update, clear out that reference and cascade the subscriber update\\n\\n if (childPropsFromStoreUpdate.current) {\\n childPropsFromStoreUpdate.current = null;\\n notifyNestedSubs();\\n }\\n}\\n\\nfunction subscribeUpdates(shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch) {\\n // If we\\'re not subscribed to the store, nothing to do here\\n if (!shouldHandleStateChanges) return; // Capture values for checking if and when this component unmounts\\n\\n var didUnsubscribe = false;\\n var lastThrownError = null; // We\\'ll run this callback every time a store subscription update propagates to this component\\n\\n var checkForUpdates = function checkForUpdates() {\\n if (didUnsubscribe) {\\n // Don\\'t run stale listeners.\\n // Redux doesn\\'t guarantee unsubscriptions happen until next dispatch.\\n return;\\n }\\n\\n var latestStoreState = store.getState();\\n var newChildProps, error;\\n\\n try {\\n // Actually run the selector with the most recent store state and wrapper props\\n // to determine what the child props should be\\n newChildProps = childPropsSelector(latestStoreState, lastWrapperProps.current);\\n } catch (e) {\\n error = e;\\n lastThrownError = e;\\n }\\n\\n if (!error) {\\n lastThrownError = null;\\n } // If the child props haven\\'t changed, nothing to do here - cascade the subscription update\\n\\n\\n if (newChildProps === lastChildProps.current) {\\n if (!renderIsScheduled.current) {\\n notifyNestedSubs();\\n }\\n } else {\\n // Save references to the new child props. Note that we track the \"child props from store update\"\\n // as a ref instead of a useState/useReducer because we need a way to determine if that value has\\n // been processed. If this went into useState/useReducer, we couldn\\'t clear out the value without\\n // forcing another re-render, which we don\\'t want.\\n lastChildProps.current = newChildProps;\\n childPropsFromStoreUpdate.current = newChildProps;\\n renderIsScheduled.current = true; // If the child props _did_ change (or we caught an error), this wrapper component needs to re-render\\n\\n forceComponentUpdateDispatch({\\n type: \\'STORE_UPDATED\\',\\n payload: {\\n error: error\\n }\\n });\\n }\\n }; // Actually subscribe to the nearest connected ancestor (or store)\\n\\n\\n subscription.onStateChange = checkForUpdates;\\n subscription.trySubscribe(); // Pull data from the store after first render in case the store has\\n // changed since we began.\\n\\n checkForUpdates();\\n\\n var unsubscribeWrapper = function unsubscribeWrapper() {\\n didUnsubscribe = true;\\n subscription.tryUnsubscribe();\\n subscription.onStateChange = null;\\n\\n if (lastThrownError) {\\n // It\\'s possible that we caught an error due to a bad mapState function, but the\\n // parent re-rendered without this component and we\\'re about to unmount.\\n // This shouldn\\'t happen as long as we do top-down subscriptions correctly, but\\n // if we ever do those wrong, this throw will surface the error in our tests.\\n // In that case, throw the error from here so it doesn\\'t get lost.\\n throw lastThrownError;\\n }\\n };\\n\\n return unsubscribeWrapper;\\n}\\n\\nvar initStateUpdates = function initStateUpdates() {\\n return [null, 0];\\n};\\n\\nfunction connectAdvanced(\\n/*\\r\\n selectorFactory is a func that is responsible for returning the selector function used to\\r\\n compute new props from state, props, and dispatch. For example:\\r\\n export default connectAdvanced((dispatch, options) => (state, props) => ({\\r\\n thing: state.things[props.thingId],\\r\\n saveThing: fields => dispatch(actionCreators.saveThing(props.thingId, fields)),\\r\\n }))(YourComponent)\\r\\n Access to dispatch is provided to the factory so selectorFactories can bind actionCreators\\r\\n outside of their selector as an optimization. Options passed to connectAdvanced are passed to\\r\\n the selectorFactory, along with displayName and WrappedComponent, as the second argument.\\r\\n Note that selectorFactory is responsible for all caching/memoization of inbound and outbound\\r\\n props. Do not use connectAdvanced directly without memoizing results between calls to your\\r\\n selector, otherwise the Connect component will re-render on every state or props change.\\r\\n*/\\nselectorFactory, // options object:\\n_ref) {\\n if (_ref === void 0) {\\n _ref = {};\\n }\\n\\n var _ref2 = _ref,\\n _ref2$getDisplayName = _ref2.getDisplayName,\\n getDisplayName = _ref2$getDisplayName === void 0 ? function (name) {\\n return \"ConnectAdvanced(\" + name + \")\";\\n } : _ref2$getDisplayName,\\n _ref2$methodName = _ref2.methodName,\\n methodName = _ref2$methodName === void 0 ? \\'connectAdvanced\\' : _ref2$methodName,\\n _ref2$renderCountProp = _ref2.renderCountProp,\\n renderCountProp = _ref2$renderCountProp === void 0 ? undefined : _ref2$renderCountProp,\\n _ref2$shouldHandleSta = _ref2.shouldHandleStateChanges,\\n shouldHandleStateChanges = _ref2$shouldHandleSta === void 0 ? true : _ref2$shouldHandleSta,\\n _ref2$storeKey = _ref2.storeKey,\\n storeKey = _ref2$storeKey === void 0 ? \\'store\\' : _ref2$storeKey,\\n _ref2$withRef = _ref2.withRef,\\n withRef = _ref2$withRef === void 0 ? false : _ref2$withRef,\\n _ref2$forwardRef = _ref2.forwardRef,\\n forwardRef = _ref2$forwardRef === void 0 ? false : _ref2$forwardRef,\\n _ref2$context = _ref2.context,\\n context = _ref2$context === void 0 ? ReactReduxContext : _ref2$context,\\n connectOptions = _objectWithoutPropertiesLoose(_ref2, [\"getDisplayName\", \"methodName\", \"renderCountProp\", \"shouldHandleStateChanges\", \"storeKey\", \"withRef\", \"forwardRef\", \"context\"]);\\n\\n if (false) { var customStoreWarningMessage; }\\n\\n var Context = context;\\n return function wrapWithConnect(WrappedComponent) {\\n if (false) {}\\n\\n var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || \\'Component\\';\\n var displayName = getDisplayName(wrappedComponentName);\\n\\n var selectorFactoryOptions = _extends({}, connectOptions, {\\n getDisplayName: getDisplayName,\\n methodName: methodName,\\n renderCountProp: renderCountProp,\\n shouldHandleStateChanges: shouldHandleStateChanges,\\n storeKey: storeKey,\\n displayName: displayName,\\n wrappedComponentName: wrappedComponentName,\\n WrappedComponent: WrappedComponent\\n });\\n\\n var pure = connectOptions.pure;\\n\\n function createChildSelector(store) {\\n return selectorFactory(store.dispatch, selectorFactoryOptions);\\n } // If we aren\\'t running in \"pure\" mode, we don\\'t want to memoize values.\\n // To avoid conditionally calling hooks, we fall back to a tiny wrapper\\n // that just executes the given callback immediately.\\n\\n\\n var usePureOnlyMemo = pure ? react[\"useMemo\"] : function (callback) {\\n return callback();\\n };\\n\\n function ConnectFunction(props) {\\n var _useMemo = Object(react[\"useMemo\"])(function () {\\n // Distinguish between actual \"data\" props that were passed to the wrapper component,\\n // and values needed to control behavior (forwarded refs, alternate context instances).\\n // To maintain the wrapperProps object reference, memoize this destructuring.\\n var forwardedRef = props.forwardedRef,\\n wrapperProps = _objectWithoutPropertiesLoose(props, [\"forwardedRef\"]);\\n\\n return [props.context, forwardedRef, wrapperProps];\\n }, [props]),\\n propsContext = _useMemo[0],\\n forwardedRef = _useMemo[1],\\n wrapperProps = _useMemo[2];\\n\\n var ContextToUse = Object(react[\"useMemo\"])(function () {\\n // Users may optionally pass in a custom context instance to use instead of our ReactReduxContext.\\n // Memoize the check that determines which context instance we should use.\\n return propsContext && propsContext.Consumer && Object(react_is[\"isContextConsumer\"])(react_default.a.createElement(propsContext.Consumer, null)) ? propsContext : Context;\\n }, [propsContext, Context]); // Retrieve the store and ancestor subscription via context, if available\\n\\n var contextValue = Object(react[\"useContext\"])(ContextToUse); // The store _must_ exist as either a prop or in context.\\n // We\\'ll check to see if it _looks_ like a Redux store first.\\n // This allows us to pass through a `store` prop that is just a plain value.\\n\\n var didStoreComeFromProps = Boolean(props.store) && Boolean(props.store.getState) && Boolean(props.store.dispatch);\\n var didStoreComeFromContext = Boolean(contextValue) && Boolean(contextValue.store);\\n\\n if (false) {} // Based on the previous check, one of these must be true\\n\\n\\n var store = didStoreComeFromProps ? props.store : contextValue.store;\\n var childPropsSelector = Object(react[\"useMemo\"])(function () {\\n // The child props selector needs the store reference as an input.\\n // Re-create this selector whenever the store changes.\\n return createChildSelector(store);\\n }, [store]);\\n\\n var _useMemo2 = Object(react[\"useMemo\"])(function () {\\n if (!shouldHandleStateChanges) return NO_SUBSCRIPTION_ARRAY; // This Subscription\\'s source should match where store came from: props vs. context. A component\\n // connected to the store via props shouldn\\'t use subscription from context, or vice versa.\\n\\n var subscription = new Subscription(store, didStoreComeFromProps ? null : contextValue.subscription); // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in\\n // the middle of the notification loop, where `subscription` will then be null. This can\\n // probably be avoided if Subscription\\'s listeners logic is changed to not call listeners\\n // that have been unsubscribed in the middle of the notification loop.\\n\\n var notifyNestedSubs = subscription.notifyNestedSubs.bind(subscription);\\n return [subscription, notifyNestedSubs];\\n }, [store, didStoreComeFromProps, contextValue]),\\n subscription = _useMemo2[0],\\n notifyNestedSubs = _useMemo2[1]; // Determine what {store, subscription} value should be put into nested context, if necessary,\\n // and memoize that value to avoid unnecessary context updates.\\n\\n\\n var overriddenContextValue = Object(react[\"useMemo\"])(function () {\\n if (didStoreComeFromProps) {\\n // This component is directly subscribed to a store from props.\\n // We don\\'t want descendants reading from this store - pass down whatever\\n // the existing context value is from the nearest connected ancestor.\\n return contextValue;\\n } // Otherwise, put this component\\'s subscription instance into context, so that\\n // connected descendants won\\'t update until after this component is done\\n\\n\\n return _extends({}, contextValue, {\\n subscription: subscription\\n });\\n }, [didStoreComeFromProps, contextValue, subscription]); // We need to force this wrapper component to re-render whenever a Redux store update\\n // causes a change to the calculated child component props (or we caught an error in mapState)\\n\\n var _useReducer = Object(react[\"useReducer\"])(storeStateUpdatesReducer, EMPTY_ARRAY, initStateUpdates),\\n _useReducer$ = _useReducer[0],\\n previousStateUpdateResult = _useReducer$[0],\\n forceComponentUpdateDispatch = _useReducer[1]; // Propagate any mapState/mapDispatch errors upwards\\n\\n\\n if (previousStateUpdateResult && previousStateUpdateResult.error) {\\n throw previousStateUpdateResult.error;\\n } // Set up refs to coordinate values between the subscription effect and the render logic\\n\\n\\n var lastChildProps = Object(react[\"useRef\"])();\\n var lastWrapperProps = Object(react[\"useRef\"])(wrapperProps);\\n var childPropsFromStoreUpdate = Object(react[\"useRef\"])();\\n var renderIsScheduled = Object(react[\"useRef\"])(false);\\n var actualChildProps = usePureOnlyMemo(function () {\\n // Tricky logic here:\\n // - This render may have been triggered by a Redux store update that produced new child props\\n // - However, we may have gotten new wrapper props after that\\n // If we have new child props, and the same wrapper props, we know we should use the new child props as-is.\\n // But, if we have new wrapper props, those might change the child props, so we have to recalculate things.\\n // So, we\\'ll use the child props from store update only if the wrapper props are the same as last time.\\n if (childPropsFromStoreUpdate.current && wrapperProps === lastWrapperProps.current) {\\n return childPropsFromStoreUpdate.current;\\n } // TODO We\\'re reading the store directly in render() here. Bad idea?\\n // This will likely cause Bad Things (TM) to happen in Concurrent Mode.\\n // Note that we do this because on renders _not_ caused by store updates, we need the latest store state\\n // to determine what the child props should be.\\n\\n\\n return childPropsSelector(store.getState(), wrapperProps);\\n }, [store, previousStateUpdateResult, wrapperProps]); // We need this to execute synchronously every time we re-render. However, React warns\\n // about useLayoutEffect in SSR, so we try to detect environment and fall back to\\n // just useEffect instead to avoid the warning, since neither will run anyway.\\n\\n useIsomorphicLayoutEffectWithArgs(captureWrapperProps, [lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs]); // Our re-subscribe logic only runs when the store/subscription setup changes\\n\\n useIsomorphicLayoutEffectWithArgs(subscribeUpdates, [shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch], [store, subscription, childPropsSelector]); // Now that all that\\'s done, we can finally try to actually render the child component.\\n // We memoize the elements for the rendered child component as an optimization.\\n\\n var renderedWrappedComponent = Object(react[\"useMemo\"])(function () {\\n return react_default.a.createElement(WrappedComponent, _extends({}, actualChildProps, {\\n ref: forwardedRef\\n }));\\n }, [forwardedRef, WrappedComponent, actualChildProps]); // If React sees the exact same element reference as last time, it bails out of re-rendering\\n // that child, same as if it was wrapped in React.memo() or returned false from shouldComponentUpdate.\\n\\n var renderedChild = Object(react[\"useMemo\"])(function () {\\n if (shouldHandleStateChanges) {\\n // If this component is subscribed to store updates, we need to pass its own\\n // subscription instance down to our descendants. That means rendering the same\\n // Context instance, and putting a different value into the context.\\n return react_default.a.createElement(ContextToUse.Provider, {\\n value: overriddenContextValue\\n }, renderedWrappedComponent);\\n }\\n\\n return renderedWrappedComponent;\\n }, [ContextToUse, renderedWrappedComponent, overriddenContextValue]);\\n return renderedChild;\\n } // If we\\'re in \"pure\" mode, ensure our wrapper component only re-renders when incoming props have changed.\\n\\n\\n var Connect = pure ? react_default.a.memo(ConnectFunction) : ConnectFunction;\\n Connect.WrappedComponent = WrappedComponent;\\n Connect.displayName = displayName;\\n\\n if (forwardRef) {\\n var forwarded = react_default.a.forwardRef(function forwardConnectRef(props, ref) {\\n return react_default.a.createElement(Connect, _extends({}, props, {\\n forwardedRef: ref\\n }));\\n });\\n forwarded.displayName = displayName;\\n forwarded.WrappedComponent = WrappedComponent;\\n return hoist_non_react_statics_cjs_default()(forwarded, WrappedComponent);\\n }\\n\\n return hoist_non_react_statics_cjs_default()(Connect, WrappedComponent);\\n };\\n}\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/utils/shallowEqual.js\\nfunction is(x, y) {\\n if (x === y) {\\n return x !== 0 || y !== 0 || 1 / x === 1 / y;\\n } else {\\n return x !== x && y !== y;\\n }\\n}\\n\\nfunction shallowEqual(objA, objB) {\\n if (is(objA, objB)) return true;\\n\\n if (typeof objA !== \\'object\\' || objA === null || typeof objB !== \\'object\\' || objB === null) {\\n return false;\\n }\\n\\n var keysA = Object.keys(objA);\\n var keysB = Object.keys(objB);\\n if (keysA.length !== keysB.length) return false;\\n\\n for (var i = 0; i < keysA.length; i++) {\\n if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\\n return false;\\n }\\n }\\n\\n return true;\\n}\\n// EXTERNAL MODULE: ./node_modules/redux/es/redux.js\\nvar redux = __webpack_require__(2);\\n\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/utils/isPlainObject.js\\n/**\\r\\n * @param {any} obj The object to inspect.\\r\\n * @returns {boolean} True if the argument appears to be a plain object.\\r\\n */\\nfunction isPlainObject(obj) {\\n if (typeof obj !== \\'object\\' || obj === null) return false;\\n var proto = Object.getPrototypeOf(obj);\\n if (proto === null) return true;\\n var baseProto = proto;\\n\\n while (Object.getPrototypeOf(baseProto) !== null) {\\n baseProto = Object.getPrototypeOf(baseProto);\\n }\\n\\n return proto === baseProto;\\n}\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/utils/warning.js\\n/**\\r\\n * Prints a warning in the console if it exists.\\r\\n *\\r\\n * @param {String} message The warning message.\\r\\n * @returns {void}\\r\\n */\\nfunction warning(message) {\\n /* eslint-disable no-console */\\n if (typeof console !== \\'undefined\\' && typeof console.error === \\'function\\') {\\n console.error(message);\\n }\\n /* eslint-enable no-console */\\n\\n\\n try {\\n // This error was thrown as a convenience so that if you enable\\n // \"break on all exceptions\" in your console,\\n // it would pause the execution at this line.\\n throw new Error(message);\\n /* eslint-disable no-empty */\\n } catch (e) {}\\n /* eslint-enable no-empty */\\n\\n}\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/utils/verifyPlainObject.js\\n\\n\\nfunction verifyPlainObject(value, displayName, methodName) {\\n if (!isPlainObject(value)) {\\n warning(methodName + \"() in \" + displayName + \" must return a plain object. Instead received \" + value + \".\");\\n }\\n}\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/connect/wrapMapToProps.js\\n\\nfunction wrapMapToPropsConstant(getConstant) {\\n return function initConstantSelector(dispatch, options) {\\n var constant = getConstant(dispatch, options);\\n\\n function constantSelector() {\\n return constant;\\n }\\n\\n constantSelector.dependsOnOwnProps = false;\\n return constantSelector;\\n };\\n} // dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args\\n// to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine\\n// whether mapToProps needs to be invoked when props have changed.\\n//\\n// A length of one signals that mapToProps does not depend on props from the parent component.\\n// A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and\\n// therefore not reporting its length accurately..\\n\\nfunction getDependsOnOwnProps(mapToProps) {\\n return mapToProps.dependsOnOwnProps !== null && mapToProps.dependsOnOwnProps !== undefined ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1;\\n} // Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,\\n// this function wraps mapToProps in a proxy function which does several things:\\n//\\n// * Detects whether the mapToProps function being called depends on props, which\\n// is used by selectorFactory to decide if it should reinvoke on props changes.\\n//\\n// * On first call, handles mapToProps if returns another function, and treats that\\n// new function as the true mapToProps for subsequent calls.\\n//\\n// * On first call, verifies the first result is a plain object, in order to warn\\n// the developer that their mapToProps function is not returning a valid result.\\n//\\n\\nfunction wrapMapToPropsFunc(mapToProps, methodName) {\\n return function initProxySelector(dispatch, _ref) {\\n var displayName = _ref.displayName;\\n\\n var proxy = function mapToPropsProxy(stateOrDispatch, ownProps) {\\n return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch);\\n }; // allow detectFactoryAndVerify to get ownProps\\n\\n\\n proxy.dependsOnOwnProps = true;\\n\\n proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) {\\n proxy.mapToProps = mapToProps;\\n proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps);\\n var props = proxy(stateOrDispatch, ownProps);\\n\\n if (typeof props === \\'function\\') {\\n proxy.mapToProps = props;\\n proxy.dependsOnOwnProps = getDependsOnOwnProps(props);\\n props = proxy(stateOrDispatch, ownProps);\\n }\\n\\n if (false) {}\\n return props;\\n };\\n\\n return proxy;\\n };\\n}\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/connect/mapDispatchToProps.js\\n\\n\\nfunction whenMapDispatchToPropsIsFunction(mapDispatchToProps) {\\n return typeof mapDispatchToProps === \\'function\\' ? wrapMapToPropsFunc(mapDispatchToProps, \\'mapDispatchToProps\\') : undefined;\\n}\\nfunction whenMapDispatchToPropsIsMissing(mapDispatchToProps) {\\n return !mapDispatchToProps ? wrapMapToPropsConstant(function (dispatch) {\\n return {\\n dispatch: dispatch\\n };\\n }) : undefined;\\n}\\nfunction whenMapDispatchToPropsIsObject(mapDispatchToProps) {\\n return mapDispatchToProps && typeof mapDispatchToProps === \\'object\\' ? wrapMapToPropsConstant(function (dispatch) {\\n return Object(redux[\"bindActionCreators\"])(mapDispatchToProps, dispatch);\\n }) : undefined;\\n}\\n/* harmony default export */ var connect_mapDispatchToProps = ([whenMapDispatchToPropsIsFunction, whenMapDispatchToPropsIsMissing, whenMapDispatchToPropsIsObject]);\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/connect/mapStateToProps.js\\n\\nfunction whenMapStateToPropsIsFunction(mapStateToProps) {\\n return typeof mapStateToProps === \\'function\\' ? wrapMapToPropsFunc(mapStateToProps, \\'mapStateToProps\\') : undefined;\\n}\\nfunction whenMapStateToPropsIsMissing(mapStateToProps) {\\n return !mapStateToProps ? wrapMapToPropsConstant(function () {\\n return {};\\n }) : undefined;\\n}\\n/* harmony default export */ var connect_mapStateToProps = ([whenMapStateToPropsIsFunction, whenMapStateToPropsIsMissing]);\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/connect/mergeProps.js\\n\\n\\nfunction defaultMergeProps(stateProps, dispatchProps, ownProps) {\\n return _extends({}, ownProps, {}, stateProps, {}, dispatchProps);\\n}\\nfunction wrapMergePropsFunc(mergeProps) {\\n return function initMergePropsProxy(dispatch, _ref) {\\n var displayName = _ref.displayName,\\n pure = _ref.pure,\\n areMergedPropsEqual = _ref.areMergedPropsEqual;\\n var hasRunOnce = false;\\n var mergedProps;\\n return function mergePropsProxy(stateProps, dispatchProps, ownProps) {\\n var nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps);\\n\\n if (hasRunOnce) {\\n if (!pure || !areMergedPropsEqual(nextMergedProps, mergedProps)) mergedProps = nextMergedProps;\\n } else {\\n hasRunOnce = true;\\n mergedProps = nextMergedProps;\\n if (false) {}\\n }\\n\\n return mergedProps;\\n };\\n };\\n}\\nfunction whenMergePropsIsFunction(mergeProps) {\\n return typeof mergeProps === \\'function\\' ? wrapMergePropsFunc(mergeProps) : undefined;\\n}\\nfunction whenMergePropsIsOmitted(mergeProps) {\\n return !mergeProps ? function () {\\n return defaultMergeProps;\\n } : undefined;\\n}\\n/* harmony default export */ var connect_mergeProps = ([whenMergePropsIsFunction, whenMergePropsIsOmitted]);\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/connect/verifySubselectors.js\\n\\n\\nfunction verify(selector, methodName, displayName) {\\n if (!selector) {\\n throw new Error(\"Unexpected value for \" + methodName + \" in \" + displayName + \".\");\\n } else if (methodName === \\'mapStateToProps\\' || methodName === \\'mapDispatchToProps\\') {\\n if (!Object.prototype.hasOwnProperty.call(selector, \\'dependsOnOwnProps\\')) {\\n warning(\"The selector for \" + methodName + \" of \" + displayName + \" did not specify a value for dependsOnOwnProps.\");\\n }\\n }\\n}\\n\\nfunction verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps, displayName) {\\n verify(mapStateToProps, \\'mapStateToProps\\', displayName);\\n verify(mapDispatchToProps, \\'mapDispatchToProps\\', displayName);\\n verify(mergeProps, \\'mergeProps\\', displayName);\\n}\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/connect/selectorFactory.js\\n\\n\\nfunction impureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch) {\\n return function impureFinalPropsSelector(state, ownProps) {\\n return mergeProps(mapStateToProps(state, ownProps), mapDispatchToProps(dispatch, ownProps), ownProps);\\n };\\n}\\nfunction pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, _ref) {\\n var areStatesEqual = _ref.areStatesEqual,\\n areOwnPropsEqual = _ref.areOwnPropsEqual,\\n areStatePropsEqual = _ref.areStatePropsEqual;\\n var hasRunAtLeastOnce = false;\\n var state;\\n var ownProps;\\n var stateProps;\\n var dispatchProps;\\n var mergedProps;\\n\\n function handleFirstCall(firstState, firstOwnProps) {\\n state = firstState;\\n ownProps = firstOwnProps;\\n stateProps = mapStateToProps(state, ownProps);\\n dispatchProps = mapDispatchToProps(dispatch, ownProps);\\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\\n hasRunAtLeastOnce = true;\\n return mergedProps;\\n }\\n\\n function handleNewPropsAndNewState() {\\n stateProps = mapStateToProps(state, ownProps);\\n if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);\\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\\n return mergedProps;\\n }\\n\\n function handleNewProps() {\\n if (mapStateToProps.dependsOnOwnProps) stateProps = mapStateToProps(state, ownProps);\\n if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);\\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\\n return mergedProps;\\n }\\n\\n function handleNewState() {\\n var nextStateProps = mapStateToProps(state, ownProps);\\n var statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps);\\n stateProps = nextStateProps;\\n if (statePropsChanged) mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\\n return mergedProps;\\n }\\n\\n function handleSubsequentCalls(nextState, nextOwnProps) {\\n var propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps);\\n var stateChanged = !areStatesEqual(nextState, state);\\n state = nextState;\\n ownProps = nextOwnProps;\\n if (propsChanged && stateChanged) return handleNewPropsAndNewState();\\n if (propsChanged) return handleNewProps();\\n if (stateChanged) return handleNewState();\\n return mergedProps;\\n }\\n\\n return function pureFinalPropsSelector(nextState, nextOwnProps) {\\n return hasRunAtLeastOnce ? handleSubsequentCalls(nextState, nextOwnProps) : handleFirstCall(nextState, nextOwnProps);\\n };\\n} // TODO: Add more comments\\n// If pure is true, the selector returned by selectorFactory will memoize its results,\\n// allowing connectAdvanced\\'s shouldComponentUpdate to return false if final\\n// props have not changed. If false, the selector will always return a new\\n// object and shouldComponentUpdate will always return true.\\n\\nfunction finalPropsSelectorFactory(dispatch, _ref2) {\\n var initMapStateToProps = _ref2.initMapStateToProps,\\n initMapDispatchToProps = _ref2.initMapDispatchToProps,\\n initMergeProps = _ref2.initMergeProps,\\n options = _objectWithoutPropertiesLoose(_ref2, [\"initMapStateToProps\", \"initMapDispatchToProps\", \"initMergeProps\"]);\\n\\n var mapStateToProps = initMapStateToProps(dispatch, options);\\n var mapDispatchToProps = initMapDispatchToProps(dispatch, options);\\n var mergeProps = initMergeProps(dispatch, options);\\n\\n if (false) {}\\n\\n var selectorFactory = options.pure ? pureFinalPropsSelectorFactory : impureFinalPropsSelectorFactory;\\n return selectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options);\\n}\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/connect/connect.js\\n\\n\\n\\n\\n\\n\\n\\n\\n/*\\r\\n connect is a facade over connectAdvanced. It turns its args into a compatible\\r\\n selectorFactory, which has the signature:\\r\\n\\r\\n (dispatch, options) => (nextState, nextOwnProps) => nextFinalProps\\r\\n \\r\\n connect passes its args to connectAdvanced as options, which will in turn pass them to\\r\\n selectorFactory each time a Connect component instance is instantiated or hot reloaded.\\r\\n\\r\\n selectorFactory returns a final props selector from its mapStateToProps,\\r\\n mapStateToPropsFactories, mapDispatchToProps, mapDispatchToPropsFactories, mergeProps,\\r\\n mergePropsFactories, and pure args.\\r\\n\\r\\n The resulting final props selector is called by the Connect component instance whenever\\r\\n it receives new props or store state.\\r\\n */\\n\\nfunction match(arg, factories, name) {\\n for (var i = factories.length - 1; i >= 0; i--) {\\n var result = factories[i](arg);\\n if (result) return result;\\n }\\n\\n return function (dispatch, options) {\\n throw new Error(\"Invalid value of type \" + typeof arg + \" for \" + name + \" argument when connecting component \" + options.wrappedComponentName + \".\");\\n };\\n}\\n\\nfunction strictEqual(a, b) {\\n return a === b;\\n} // createConnect with default args builds the \\'official\\' connect behavior. Calling it with\\n// different options opens up some testing and extensibility scenarios\\n\\n\\nfunction createConnect(_temp) {\\n var _ref = _temp === void 0 ? {} : _temp,\\n _ref$connectHOC = _ref.connectHOC,\\n connectHOC = _ref$connectHOC === void 0 ? connectAdvanced : _ref$connectHOC,\\n _ref$mapStateToPropsF = _ref.mapStateToPropsFactories,\\n mapStateToPropsFactories = _ref$mapStateToPropsF === void 0 ? connect_mapStateToProps : _ref$mapStateToPropsF,\\n _ref$mapDispatchToPro = _ref.mapDispatchToPropsFactories,\\n mapDispatchToPropsFactories = _ref$mapDispatchToPro === void 0 ? connect_mapDispatchToProps : _ref$mapDispatchToPro,\\n _ref$mergePropsFactor = _ref.mergePropsFactories,\\n mergePropsFactories = _ref$mergePropsFactor === void 0 ? connect_mergeProps : _ref$mergePropsFactor,\\n _ref$selectorFactory = _ref.selectorFactory,\\n selectorFactory = _ref$selectorFactory === void 0 ? finalPropsSelectorFactory : _ref$selectorFactory;\\n\\n return function connect(mapStateToProps, mapDispatchToProps, mergeProps, _ref2) {\\n if (_ref2 === void 0) {\\n _ref2 = {};\\n }\\n\\n var _ref3 = _ref2,\\n _ref3$pure = _ref3.pure,\\n pure = _ref3$pure === void 0 ? true : _ref3$pure,\\n _ref3$areStatesEqual = _ref3.areStatesEqual,\\n areStatesEqual = _ref3$areStatesEqual === void 0 ? strictEqual : _ref3$areStatesEqual,\\n _ref3$areOwnPropsEqua = _ref3.areOwnPropsEqual,\\n areOwnPropsEqual = _ref3$areOwnPropsEqua === void 0 ? shallowEqual : _ref3$areOwnPropsEqua,\\n _ref3$areStatePropsEq = _ref3.areStatePropsEqual,\\n areStatePropsEqual = _ref3$areStatePropsEq === void 0 ? shallowEqual : _ref3$areStatePropsEq,\\n _ref3$areMergedPropsE = _ref3.areMergedPropsEqual,\\n areMergedPropsEqual = _ref3$areMergedPropsE === void 0 ? shallowEqual : _ref3$areMergedPropsE,\\n extraOptions = _objectWithoutPropertiesLoose(_ref3, [\"pure\", \"areStatesEqual\", \"areOwnPropsEqual\", \"areStatePropsEqual\", \"areMergedPropsEqual\"]);\\n\\n var initMapStateToProps = match(mapStateToProps, mapStateToPropsFactories, \\'mapStateToProps\\');\\n var initMapDispatchToProps = match(mapDispatchToProps, mapDispatchToPropsFactories, \\'mapDispatchToProps\\');\\n var initMergeProps = match(mergeProps, mergePropsFactories, \\'mergeProps\\');\\n return connectHOC(selectorFactory, _extends({\\n // used in error messages\\n methodName: \\'connect\\',\\n // used to compute Connect\\'s displayName from the wrapped component\\'s displayName.\\n getDisplayName: function getDisplayName(name) {\\n return \"Connect(\" + name + \")\";\\n },\\n // if mapStateToProps is falsy, the Connect component doesn\\'t subscribe to store state changes\\n shouldHandleStateChanges: Boolean(mapStateToProps),\\n // passed through to selectorFactory\\n initMapStateToProps: initMapStateToProps,\\n initMapDispatchToProps: initMapDispatchToProps,\\n initMergeProps: initMergeProps,\\n pure: pure,\\n areStatesEqual: areStatesEqual,\\n areOwnPropsEqual: areOwnPropsEqual,\\n areStatePropsEqual: areStatePropsEqual,\\n areMergedPropsEqual: areMergedPropsEqual\\n }, extraOptions));\\n };\\n}\\n/* harmony default export */ var connect_connect = (/*#__PURE__*/createConnect());\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/hooks/useReduxContext.js\\n\\n\\n/**\\r\\n * A hook to access the value of the `ReactReduxContext`. This is a low-level\\r\\n * hook that you should usually not need to call directly.\\r\\n *\\r\\n * @returns {any} the value of the `ReactReduxContext`\\r\\n *\\r\\n * @example\\r\\n *\\r\\n * import React from \\'react\\'\\r\\n * import { useReduxContext } from \\'react-redux\\'\\r\\n *\\r\\n * export const CounterComponent = ({ value }) => {\\r\\n * const { store } = useReduxContext()\\r\\n * return <div>{store.getState()}</div>\\r\\n * }\\r\\n */\\n\\nfunction useReduxContext_useReduxContext() {\\n var contextValue = Object(react[\"useContext\"])(ReactReduxContext);\\n\\n if (false) {}\\n\\n return contextValue;\\n}\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/hooks/useStore.js\\n\\n\\n\\n/**\\r\\n * Hook factory, which creates a `useStore` hook bound to a given context.\\r\\n *\\r\\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\\r\\n * @returns {Function} A `useStore` hook bound to the specified context.\\r\\n */\\n\\nfunction createStoreHook(context) {\\n if (context === void 0) {\\n context = ReactReduxContext;\\n }\\n\\n var useReduxContext = context === ReactReduxContext ? useReduxContext_useReduxContext : function () {\\n return Object(react[\"useContext\"])(context);\\n };\\n return function useStore() {\\n var _useReduxContext = useReduxContext(),\\n store = _useReduxContext.store;\\n\\n return store;\\n };\\n}\\n/**\\r\\n * A hook to access the redux store.\\r\\n *\\r\\n * @returns {any} the redux store\\r\\n *\\r\\n * @example\\r\\n *\\r\\n * import React from \\'react\\'\\r\\n * import { useStore } from \\'react-redux\\'\\r\\n *\\r\\n * export const ExampleComponent = () => {\\r\\n * const store = useStore()\\r\\n * return <div>{store.getState()}</div>\\r\\n * }\\r\\n */\\n\\nvar useStore_useStore =\\n/*#__PURE__*/\\ncreateStoreHook();\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/hooks/useDispatch.js\\n\\n\\n/**\\r\\n * Hook factory, which creates a `useDispatch` hook bound to a given context.\\r\\n *\\r\\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\\r\\n * @returns {Function} A `useDispatch` hook bound to the specified context.\\r\\n */\\n\\nfunction createDispatchHook(context) {\\n if (context === void 0) {\\n context = ReactReduxContext;\\n }\\n\\n var useStore = context === ReactReduxContext ? useStore_useStore : createStoreHook(context);\\n return function useDispatch() {\\n var store = useStore();\\n return store.dispatch;\\n };\\n}\\n/**\\r\\n * A hook to access the redux `dispatch` function.\\r\\n *\\r\\n * @returns {any|function} redux store\\'s `dispatch` function\\r\\n *\\r\\n * @example\\r\\n *\\r\\n * import React, { useCallback } from \\'react\\'\\r\\n * import { useDispatch } from \\'react-redux\\'\\r\\n *\\r\\n * export const CounterComponent = ({ value }) => {\\r\\n * const dispatch = useDispatch()\\r\\n * const increaseCounter = useCallback(() => dispatch({ type: \\'increase-counter\\' }), [])\\r\\n * return (\\r\\n * <div>\\r\\n * <span>{value}</span>\\r\\n * <button onClick={increaseCounter}>Increase counter</button>\\r\\n * </div>\\r\\n * )\\r\\n * }\\r\\n */\\n\\nvar useDispatch =\\n/*#__PURE__*/\\ncreateDispatchHook();\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/hooks/useSelector.js\\n\\n\\n\\n\\n\\n\\nvar refEquality = function refEquality(a, b) {\\n return a === b;\\n};\\n\\nfunction useSelectorWithStoreAndSubscription(selector, equalityFn, store, contextSub) {\\n var _useReducer = Object(react[\"useReducer\"])(function (s) {\\n return s + 1;\\n }, 0),\\n forceRender = _useReducer[1];\\n\\n var subscription = Object(react[\"useMemo\"])(function () {\\n return new Subscription(store, contextSub);\\n }, [store, contextSub]);\\n var latestSubscriptionCallbackError = Object(react[\"useRef\"])();\\n var latestSelector = Object(react[\"useRef\"])();\\n var latestSelectedState = Object(react[\"useRef\"])();\\n var selectedState;\\n\\n try {\\n if (selector !== latestSelector.current || latestSubscriptionCallbackError.current) {\\n selectedState = selector(store.getState());\\n } else {\\n selectedState = latestSelectedState.current;\\n }\\n } catch (err) {\\n if (latestSubscriptionCallbackError.current) {\\n err.message += \"\\\\nThe error may be correlated with this previous error:\\\\n\" + latestSubscriptionCallbackError.current.stack + \"\\\\n\\\\n\";\\n }\\n\\n throw err;\\n }\\n\\n useIsomorphicLayoutEffect(function () {\\n latestSelector.current = selector;\\n latestSelectedState.current = selectedState;\\n latestSubscriptionCallbackError.current = undefined;\\n });\\n useIsomorphicLayoutEffect(function () {\\n function checkForUpdates() {\\n try {\\n var newSelectedState = latestSelector.current(store.getState());\\n\\n if (equalityFn(newSelectedState, latestSelectedState.current)) {\\n return;\\n }\\n\\n latestSelectedState.current = newSelectedState;\\n } catch (err) {\\n // we ignore all errors here, since when the component\\n // is re-rendered, the selectors are called again, and\\n // will throw again, if neither props nor store state\\n // changed\\n latestSubscriptionCallbackError.current = err;\\n }\\n\\n forceRender({});\\n }\\n\\n subscription.onStateChange = checkForUpdates;\\n subscription.trySubscribe();\\n checkForUpdates();\\n return function () {\\n return subscription.tryUnsubscribe();\\n };\\n }, [store, subscription]);\\n return selectedState;\\n}\\n/**\\r\\n * Hook factory, which creates a `useSelector` hook bound to a given context.\\r\\n *\\r\\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\\r\\n * @returns {Function} A `useSelector` hook bound to the specified context.\\r\\n */\\n\\n\\nfunction createSelectorHook(context) {\\n if (context === void 0) {\\n context = ReactReduxContext;\\n }\\n\\n var useReduxContext = context === ReactReduxContext ? useReduxContext_useReduxContext : function () {\\n return Object(react[\"useContext\"])(context);\\n };\\n return function useSelector(selector, equalityFn) {\\n if (equalityFn === void 0) {\\n equalityFn = refEquality;\\n }\\n\\n if (false) {}\\n\\n var _useReduxContext = useReduxContext(),\\n store = _useReduxContext.store,\\n contextSub = _useReduxContext.subscription;\\n\\n return useSelectorWithStoreAndSubscription(selector, equalityFn, store, contextSub);\\n };\\n}\\n/**\\r\\n * A hook to access the redux store\\'s state. This hook takes a selector function\\r\\n * as an argument. The selector is called with the store state.\\r\\n *\\r\\n * This hook takes an optional equality comparison function as the second parameter\\r\\n * that allows you to customize the way the selected state is compared to determine\\r\\n * whether the component needs to be re-rendered.\\r\\n *\\r\\n * @param {Function} selector the selector function\\r\\n * @param {Function=} equalityFn the function that will be used to determine equality\\r\\n *\\r\\n * @returns {any} the selected state\\r\\n *\\r\\n * @example\\r\\n *\\r\\n * import React from \\'react\\'\\r\\n * import { useSelector } from \\'react-redux\\'\\r\\n *\\r\\n * export const CounterComponent = () => {\\r\\n * const counter = useSelector(state => state.counter)\\r\\n * return <div>{counter}</div>\\r\\n * }\\r\\n */\\n\\nvar useSelector =\\n/*#__PURE__*/\\ncreateSelectorHook();\\n// EXTERNAL MODULE: ./node_modules/react-dom/index.js\\nvar react_dom = __webpack_require__(3);\\n\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/utils/reactBatchedUpdates.js\\n/* eslint-disable import/no-unresolved */\\n\\n// CONCATENATED MODULE: ./node_modules/react-redux/es/index.js\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nsetBatch(react_dom[\"unstable_batchedUpdates\"]);\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29tcG9uZW50cy9Db250ZXh0LmpzP2Y5MzMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2JhdGNoLmpzPzNiMDQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL1N1YnNjcmlwdGlvbi5qcz9iZmQ5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL1Byb3ZpZGVyLmpzPzFjZjMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanM/Y2JlYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcz9lNDg3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzPzhhZTciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvY29ubmVjdEFkdmFuY2VkLmpzP2Q3ZTkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3NoYWxsb3dFcXVhbC5qcz9mMTFmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9pc1BsYWluT2JqZWN0LmpzP2UxMjUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3dhcm5pbmcuanM/OGRkYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QuanM/ZmViOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC93cmFwTWFwVG9Qcm9wcy5qcz8xM2I3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcy5qcz9lMDBhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcFN0YXRlVG9Qcm9wcy5qcz9iYTRmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21lcmdlUHJvcHMuanM/ZmNlZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC92ZXJpZnlTdWJzZWxlY3RvcnMuanM/ZWNkOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9zZWxlY3RvckZhY3RvcnkuanM/YjI3NSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9jb25uZWN0LmpzPzllZmYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZVJlZHV4Q29udGV4dC5qcz9iZmNkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VTdG9yZS5qcz81OGMxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VEaXNwYXRjaC5qcz83NmIyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VTZWxlY3Rvci5qcz84MjA5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9yZWFjdEJhdGNoZWRVcGRhdGVzLmpzP2FhMDAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVz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aEQsUUFBUSxDQUFDLG9DQUFLIiwiZmlsZSI6IjE4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgUmVhY3RSZWR1eENvbnRleHQgPVxuLyojX19QVVJFX18qL1xuUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVhY3RSZWR1eENvbnRleHQuZGlzcGxheU5hbWUgPSAnUmVhY3RSZWR1eCc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0UmVkdXhDb250ZXh0OyIsIi8vIERlZmF1bHQgdG8gYSBkdW1teSBcImJhdGNoXCIgaW1wbGVtZW50YXRpb24gdGhhdCBqdXN0IHJ1bnMgdGhlIGNhbGxiYWNrXG5mdW5jdGlvbiBkZWZhdWx0Tm9vcEJhdGNoKGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKCk7XG59XG5cbnZhciBiYXRjaCA9IGRlZmF1bHROb29wQmF0Y2g7IC8vIEFsbG93IGluamVjdGluZyBhbm90aGVyIGJhdGNoaW5nIGZ1bmN0aW9uIGxhdGVyXG5cbmV4cG9ydCB2YXIgc2V0QmF0Y2ggPSBmdW5jdGlvbiBzZXRCYXRjaChuZXdCYXRjaCkge1xuICByZXR1cm4gYmF0Y2ggPSBuZXdCYXRjaDtcbn07IC8vIFN1cHBseSBhIGdldHRlciBqdXN0IHRvIHNraXAgZGVhbGluZyB3aXRoIEVTTSBiaW5kaW5nc1xuXG5leHBvcnQgdmFyIGdldEJhdGNoID0gZnVuY3Rpb24gZ2V0QmF0Y2goKSB7XG4gIHJldHVybiBiYXRjaDtcbn07IiwiaW1wb3J0IHsgZ2V0QmF0Y2ggfSBmcm9tICcuL2JhdGNoJzsgLy8gZW5jYXBzdWxhdGVzIHRoZSBzdWJzY3JpcHRpb24gbG9naWMgZm9yIGNvbm5lY3RpbmcgYSBjb21wb25lbnQgdG8gdGhlIHJlZHV4IHN0b3JlLCBhc1xuLy8gd2VsbCBhcyBuZXN0aW5nIHN1YnNjcmlwdGlvbnMgb2YgZGVzY2VuZGFudCBjb21wb25lbnRzLCBzbyB0aGF0IHdlIGNhbiBlbnN1cmUgdGhlXG4vLyBhbmNlc3RvciBjb21wb25lbnRzIHJlLXJlbmRlciBiZWZvcmUgZGVzY2VuZGFudHNcblxudmFyIG51bGxMaXN0ZW5lcnMgPSB7XG4gIG5vdGlmeTogZnVuY3Rpb24gbm90aWZ5KCkge31cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpIHtcbiAgdmFyIGJhdGNoID0gZ2V0QmF0Y2goKTtcbiAgdmFyIGZpcnN0ID0gbnVsbDtcbiAgdmFyIGxhc3QgPSBudWxsO1xuICByZXR1cm4ge1xuICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIGxhc3QgPSBudWxsO1xuICAgIH0sXG4gICAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoKSB7XG4gICAgICBiYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGZpcnN0O1xuXG4gICAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrKCk7XG4gICAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgICAgdmFyIGxpc3RlbmVyID0gZmlyc3Q7XG5cbiAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpc3RlbmVycztcbiAgICB9LFxuICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGxhc3QgPSB7XG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgcHJldjogbGFzdFxuICAgICAgfTtcblxuICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdCA9IGxpc3RlbmVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICghaXNTdWJzY3JpYmVkIHx8IGZpcnN0ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lci5uZXh0KSB7XG4gICAgICAgICAgbGlzdGVuZXIubmV4dC5wcmV2ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0ZW5lci5wcmV2KSB7XG4gICAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXJzdCA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG52YXIgU3Vic2NyaXB0aW9uID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3Vic2NyaXB0aW9uKHN0b3JlLCBwYXJlbnRTdWIpIHtcbiAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gICAgdGhpcy5wYXJlbnRTdWIgPSBwYXJlbnRTdWI7XG4gICAgdGhpcy51bnN1YnNjcmliZSA9IG51bGw7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuICAgIHRoaXMuaGFuZGxlQ2hhbmdlV3JhcHBlciA9IHRoaXMuaGFuZGxlQ2hhbmdlV3JhcHBlci5iaW5kKHRoaXMpO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFN1YnNjcmlwdGlvbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmFkZE5lc3RlZFN1YiA9IGZ1bmN0aW9uIGFkZE5lc3RlZFN1YihsaXN0ZW5lcikge1xuICAgIHRoaXMudHJ5U3Vic2NyaWJlKCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzLnN1YnNjcmliZShsaXN0ZW5lcik7XG4gIH07XG5cbiAgX3Byb3RvLm5vdGlmeU5lc3RlZFN1YnMgPSBmdW5jdGlvbiBub3RpZnlOZXN0ZWRTdWJzKCkge1xuICAgIHRoaXMubGlzdGVuZXJzLm5vdGlmeSgpO1xuICB9O1xuXG4gIF9wcm90by5oYW5kbGVDaGFuZ2VXcmFwcGVyID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlV3JhcHBlcigpIHtcbiAgICBpZiAodGhpcy5vblN0YXRlQ2hhbmdlKSB7XG4gICAgICB0aGlzLm9uU3RhdGVDaGFuZ2UoKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmlzU3Vic2NyaWJlZCA9IGZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnVuc3Vic2NyaWJlKTtcbiAgfTtcblxuICBfcHJvdG8udHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24gdHJ5U3Vic2NyaWJlKCkge1xuICAgIGlmICghdGhpcy51bnN1YnNjcmliZSkge1xuICAgICAgdGhpcy51bnN1YnNjcmliZSA9IHRoaXMucGFyZW50U3ViID8gdGhpcy5wYXJlbnRTdWIuYWRkTmVzdGVkU3ViKHRoaXMuaGFuZGxlQ2hhbmdlV3JhcHBlcikgOiB0aGlzLnN0b3JlLnN1YnNjcmliZSh0aGlzLmhhbmRsZUNoYW5nZVdyYXBwZXIpO1xuICAgICAgdGhpcy5saXN0ZW5lcnMgPSBjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24oKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnRyeVVuc3Vic2NyaWJlID0gZnVuY3Rpb24gdHJ5VW5zdWJzY3JpYmUoKSB7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUgPSBudWxsO1xuICAgICAgdGhpcy5saXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIHRoaXMubGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFN1YnNjcmlwdGlvbjtcbn0oKTtcblxuZXhwb3J0IHsgU3Vic2NyaXB0aW9uIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgUmVhY3QsIHsgdXNlTWVtbywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi9Db250ZXh0JztcbmltcG9ydCBTdWJzY3JpcHRpb24gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcblxuZnVuY3Rpb24gUHJvdmlkZXIoX3JlZikge1xuICB2YXIgc3RvcmUgPSBfcmVmLnN0b3JlLFxuICAgICAgY29udGV4dCA9IF9yZWYuY29udGV4dCxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKHN0b3JlKTtcbiAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IHN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzO1xuICAgIHJldHVybiB7XG4gICAgICBzdG9yZTogc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvblxuICAgIH07XG4gIH0sIFtzdG9yZV0pO1xuICB2YXIgcHJldmlvdXNTdGF0ZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpO1xuICB9LCBbc3RvcmVdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gY29udGV4dFZhbHVlLnN1YnNjcmlwdGlvbjtcbiAgICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG5cbiAgICBpZiAocHJldmlvdXNTdGF0ZSAhPT0gc3RvcmUuZ2V0U3RhdGUoKSkge1xuICAgICAgc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IG51bGw7XG4gICAgfTtcbiAgfSwgW2NvbnRleHRWYWx1ZSwgcHJldmlvdXNTdGF0ZV0pO1xuICB2YXIgQ29udGV4dCA9IGNvbnRleHQgfHwgUmVhY3RSZWR1eENvbnRleHQ7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlXG4gIH0sIGNoaWxkcmVuKTtcbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUHJvdmlkZXIucHJvcFR5cGVzID0ge1xuICAgIHN0b3JlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgc3Vic2NyaWJlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBnZXRTdGF0ZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICAgIH0pLFxuICAgIGNvbnRleHQ6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnlcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvdmlkZXI7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn0iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCB9IGZyb20gJ3JlYWN0JzsgLy8gUmVhY3QgY3VycmVudGx5IHRocm93cyBhIHdhcm5pbmcgd2hlbiB1c2luZyB1c2VMYXlvdXRFZmZlY3Qgb24gdGhlIHNlcnZlci5cbi8vIFRvIGdldCBhcm91bmQgaXQsIHdlIGNhbiBjb25kaXRpb25hbGx5IHVzZUVmZmVjdCBvbiB0aGUgc2VydmVyIChuby1vcCkgYW5kXG4vLyB1c2VMYXlvdXRFZmZlY3QgaW4gdGhlIGJyb3dzZXIuIFdlIG5lZWQgdXNlTGF5b3V0RWZmZWN0IHRvIGVuc3VyZSB0aGUgc3RvcmVcbi8vIHN1YnNjcmlwdGlvbiBjYWxsYmFjayBhbHdheXMgaGFzIHRoZSBzZWxlY3RvciBmcm9tIHRoZSBsYXRlc3QgcmVuZGVyIGNvbW1pdFxuLy8gYXZhaWxhYmxlLCBvdGhlcndpc2UgYSBzdG9yZSB1cGRhdGUgbWF5IGhhcHBlbiBiZXR3ZWVuIHJlbmRlciBhbmQgdGhlIGVmZmVjdCxcbi8vIHdoaWNoIG1heSBjYXVzZSBtaXNzZWQgdXBkYXRlczsgd2UgYWxzbyBtdXN0IGVuc3VyZSB0aGUgc3RvcmUgc3Vic2NyaXB0aW9uXG4vLyBpcyBjcmVhdGVkIHN5bmNocm9ub3VzbHksIG90aGVyd2lzZSBhIHN0b3JlIHVwZGF0ZSBtYXkgb2NjdXIgYmVmb3JlIHRoZVxuLy8gc3Vic2NyaXB0aW9uIGlzIGNyZWF0ZWQgYW5kIGFuIGluY29uc2lzdGVudCBzdGF0ZSBtYXkgYmUgb2JzZXJ2ZWRcblxuZXhwb3J0IHZhciB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZVwiO1xuaW1wb3J0IGhvaXN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCwgdXNlTWVtbywgdXNlUmVmLCB1c2VSZWR1Y2VyIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNWYWxpZEVsZW1lbnRUeXBlLCBpc0NvbnRleHRDb25zdW1lciB9IGZyb20gJ3JlYWN0LWlzJztcbmltcG9ydCBTdWJzY3JpcHRpb24gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi9Db250ZXh0JzsgLy8gRGVmaW5lIHNvbWUgY29uc3RhbnQgYXJyYXlzIGp1c3QgdG8gYXZvaWQgcmUtY3JlYXRpbmcgdGhlc2VcblxudmFyIEVNUFRZX0FSUkFZID0gW107XG52YXIgTk9fU1VCU0NSSVBUSU9OX0FSUkFZID0gW251bGwsIG51bGxdO1xuXG52YXIgc3RyaW5naWZ5Q29tcG9uZW50ID0gZnVuY3Rpb24gc3RyaW5naWZ5Q29tcG9uZW50KENvbXApIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoQ29tcCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBTdHJpbmcoQ29tcCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHN0b3JlU3RhdGVVcGRhdGVzUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIHZhciB1cGRhdGVDb3VudCA9IHN0YXRlWzFdO1xuICByZXR1cm4gW2FjdGlvbi5wYXlsb2FkLCB1cGRhdGVDb3VudCArIDFdO1xufVxuXG5mdW5jdGlvbiB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoZWZmZWN0RnVuYywgZWZmZWN0QXJncywgZGVwZW5kZW5jaWVzKSB7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBlZmZlY3RGdW5jLmFwcGx5KHZvaWQgMCwgZWZmZWN0QXJncyk7XG4gIH0sIGRlcGVuZGVuY2llcyk7XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVXcmFwcGVyUHJvcHMobGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCB3cmFwcGVyUHJvcHMsIGFjdHVhbENoaWxkUHJvcHMsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMpIHtcbiAgLy8gV2Ugd2FudCB0byBjYXB0dXJlIHRoZSB3cmFwcGVyIHByb3BzIGFuZCBjaGlsZCBwcm9wcyB3ZSB1c2VkIGZvciBsYXRlciBjb21wYXJpc29uc1xuICBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQgPSB3cmFwcGVyUHJvcHM7XG4gIGxhc3RDaGlsZFByb3BzLmN1cnJlbnQgPSBhY3R1YWxDaGlsZFByb3BzO1xuICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gZmFsc2U7IC8vIElmIHRoZSByZW5kZXIgd2FzIGZyb20gYSBzdG9yZSB1cGRhdGUsIGNsZWFyIG91dCB0aGF0IHJlZmVyZW5jZSBhbmQgY2FzY2FkZSB0aGUgc3Vic2NyaWJlciB1cGRhdGVcblxuICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50KSB7XG4gICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbnVsbDtcbiAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCBmb3JjZUNvbXBvbmVudFVwZGF0ZURpc3BhdGNoKSB7XG4gIC8vIElmIHdlJ3JlIG5vdCBzdWJzY3JpYmVkIHRvIHRoZSBzdG9yZSwgbm90aGluZyB0byBkbyBoZXJlXG4gIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSByZXR1cm47IC8vIENhcHR1cmUgdmFsdWVzIGZvciBjaGVja2luZyBpZiBhbmQgd2hlbiB0aGlzIGNvbXBvbmVudCB1bm1vdW50c1xuXG4gIHZhciBkaWRVbnN1YnNjcmliZSA9IGZhbHNlO1xuICB2YXIgbGFzdFRocm93bkVycm9yID0gbnVsbDsgLy8gV2UnbGwgcnVuIHRoaXMgY2FsbGJhY2sgZXZlcnkgdGltZSBhIHN0b3JlIHN1YnNjcmlwdGlvbiB1cGRhdGUgcHJvcGFnYXRlcyB0byB0aGlzIGNvbXBvbmVudFxuXG4gIHZhciBjaGVja0ZvclVwZGF0ZXMgPSBmdW5jdGlvbiBjaGVja0ZvclVwZGF0ZXMoKSB7XG4gICAgaWYgKGRpZFVuc3Vic2NyaWJlKSB7XG4gICAgICAvLyBEb24ndCBydW4gc3RhbGUgbGlzdGVuZXJzLlxuICAgICAgLy8gUmVkdXggZG9lc24ndCBndWFyYW50ZWUgdW5zdWJzY3JpcHRpb25zIGhhcHBlbiB1bnRpbCBuZXh0IGRpc3BhdGNoLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBsYXRlc3RTdG9yZVN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICB2YXIgbmV3Q2hpbGRQcm9wcywgZXJyb3I7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0dWFsbHkgcnVuIHRoZSBzZWxlY3RvciB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdG9yZSBzdGF0ZSBhbmQgd3JhcHBlciBwcm9wc1xuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGNoaWxkIHByb3BzIHNob3VsZCBiZVxuICAgICAgbmV3Q2hpbGRQcm9wcyA9IGNoaWxkUHJvcHNTZWxlY3RvcihsYXRlc3RTdG9yZVN0YXRlLCBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IGU7XG4gICAgfVxuXG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgbGFzdFRocm93bkVycm9yID0gbnVsbDtcbiAgICB9IC8vIElmIHRoZSBjaGlsZCBwcm9wcyBoYXZlbid0IGNoYW5nZWQsIG5vdGhpbmcgdG8gZG8gaGVyZSAtIGNhc2NhZGUgdGhlIHN1YnNjcmlwdGlvbiB1cGRhdGVcblxuXG4gICAgaWYgKG5ld0NoaWxkUHJvcHMgPT09IGxhc3RDaGlsZFByb3BzLmN1cnJlbnQpIHtcbiAgICAgIGlmICghcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCkge1xuICAgICAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNhdmUgcmVmZXJlbmNlcyB0byB0aGUgbmV3IGNoaWxkIHByb3BzLiAgTm90ZSB0aGF0IHdlIHRyYWNrIHRoZSBcImNoaWxkIHByb3BzIGZyb20gc3RvcmUgdXBkYXRlXCJcbiAgICAgIC8vIGFzIGEgcmVmIGluc3RlYWQgb2YgYSB1c2VTdGF0ZS91c2VSZWR1Y2VyIGJlY2F1c2Ugd2UgbmVlZCBhIHdheSB0byBkZXRlcm1pbmUgaWYgdGhhdCB2YWx1ZSBoYXNcbiAgICAgIC8vIGJlZW4gcHJvY2Vzc2VkLiAgSWYgdGhpcyB3ZW50IGludG8gdXNlU3RhdGUvdXNlUmVkdWNlciwgd2UgY291bGRuJ3QgY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aXRob3V0XG4gICAgICAvLyBmb3JjaW5nIGFub3RoZXIgcmUtcmVuZGVyLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBuZXdDaGlsZFByb3BzO1xuICAgICAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IHRydWU7IC8vIElmIHRoZSBjaGlsZCBwcm9wcyBfZGlkXyBjaGFuZ2UgKG9yIHdlIGNhdWdodCBhbiBlcnJvciksIHRoaXMgd3JhcHBlciBjb21wb25lbnQgbmVlZHMgdG8gcmUtcmVuZGVyXG5cbiAgICAgIGZvcmNlQ29tcG9uZW50VXBkYXRlRGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnU1RPUkVfVVBEQVRFRCcsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9OyAvLyBBY3R1YWxseSBzdWJzY3JpYmUgdG8gdGhlIG5lYXJlc3QgY29ubmVjdGVkIGFuY2VzdG9yIChvciBzdG9yZSlcblxuXG4gIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gY2hlY2tGb3JVcGRhdGVzO1xuICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7IC8vIFB1bGwgZGF0YSBmcm9tIHRoZSBzdG9yZSBhZnRlciBmaXJzdCByZW5kZXIgaW4gY2FzZSB0aGUgc3RvcmUgaGFzXG4gIC8vIGNoYW5nZWQgc2luY2Ugd2UgYmVnYW4uXG5cbiAgY2hlY2tGb3JVcGRhdGVzKCk7XG5cbiAgdmFyIHVuc3Vic2NyaWJlV3JhcHBlciA9IGZ1bmN0aW9uIHVuc3Vic2NyaWJlV3JhcHBlcigpIHtcbiAgICBkaWRVbnN1YnNjcmliZSA9IHRydWU7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBudWxsO1xuXG4gICAgaWYgKGxhc3RUaHJvd25FcnJvcikge1xuICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdlIGNhdWdodCBhbiBlcnJvciBkdWUgdG8gYSBiYWQgbWFwU3RhdGUgZnVuY3Rpb24sIGJ1dCB0aGVcbiAgICAgIC8vIHBhcmVudCByZS1yZW5kZXJlZCB3aXRob3V0IHRoaXMgY29tcG9uZW50IGFuZCB3ZSdyZSBhYm91dCB0byB1bm1vdW50LlxuICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIGxvbmcgYXMgd2UgZG8gdG9wLWRvd24gc3Vic2NyaXB0aW9ucyBjb3JyZWN0bHksIGJ1dFxuICAgICAgLy8gaWYgd2UgZXZlciBkbyB0aG9zZSB3cm9uZywgdGhpcyB0aHJvdyB3aWxsIHN1cmZhY2UgdGhlIGVycm9yIGluIG91ciB0ZXN0cy5cbiAgICAgIC8vIEluIHRoYXQgY2FzZSwgdGhyb3cgdGhlIGVycm9yIGZyb20gaGVyZSBzbyBpdCBkb2Vzbid0IGdldCBsb3N0LlxuICAgICAgdGhyb3cgbGFzdFRocm93bkVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdW5zdWJzY3JpYmVXcmFwcGVyO1xufVxuXG52YXIgaW5pdFN0YXRlVXBkYXRlcyA9IGZ1bmN0aW9uIGluaXRTdGF0ZVVwZGF0ZXMoKSB7XG4gIHJldHVybiBbbnVsbCwgMF07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25uZWN0QWR2YW5jZWQoXG4vKlxyXG4gIHNlbGVjdG9yRmFjdG9yeSBpcyBhIGZ1bmMgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIHRoZSBzZWxlY3RvciBmdW5jdGlvbiB1c2VkIHRvXHJcbiAgY29tcHV0ZSBuZXcgcHJvcHMgZnJvbSBzdGF0ZSwgcHJvcHMsIGFuZCBkaXNwYXRjaC4gRm9yIGV4YW1wbGU6XHJcbiAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbm5lY3RBZHZhbmNlZCgoZGlzcGF0Y2gsIG9wdGlvbnMpID0+IChzdGF0ZSwgcHJvcHMpID0+ICh7XHJcbiAgICAgIHRoaW5nOiBzdGF0ZS50aGluZ3NbcHJvcHMudGhpbmdJZF0sXHJcbiAgICAgIHNhdmVUaGluZzogZmllbGRzID0+IGRpc3BhdGNoKGFjdGlvbkNyZWF0b3JzLnNhdmVUaGluZyhwcm9wcy50aGluZ0lkLCBmaWVsZHMpKSxcclxuICAgIH0pKShZb3VyQ29tcG9uZW50KVxyXG4gICAgQWNjZXNzIHRvIGRpc3BhdGNoIGlzIHByb3ZpZGVkIHRvIHRoZSBmYWN0b3J5IHNvIHNlbGVjdG9yRmFjdG9yaWVzIGNhbiBiaW5kIGFjdGlvbkNyZWF0b3JzXHJcbiAgb3V0c2lkZSBvZiB0aGVpciBzZWxlY3RvciBhcyBhbiBvcHRpbWl6YXRpb24uIE9wdGlvbnMgcGFzc2VkIHRvIGNvbm5lY3RBZHZhbmNlZCBhcmUgcGFzc2VkIHRvXHJcbiAgdGhlIHNlbGVjdG9yRmFjdG9yeSwgYWxvbmcgd2l0aCBkaXNwbGF5TmFtZSBhbmQgV3JhcHBlZENvbXBvbmVudCwgYXMgdGhlIHNlY29uZCBhcmd1bWVudC5cclxuICAgIE5vdGUgdGhhdCBzZWxlY3RvckZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIGFsbCBjYWNoaW5nL21lbW9pemF0aW9uIG9mIGluYm91bmQgYW5kIG91dGJvdW5kXHJcbiAgcHJvcHMuIERvIG5vdCB1c2UgY29ubmVjdEFkdmFuY2VkIGRpcmVjdGx5IHdpdGhvdXQgbWVtb2l6aW5nIHJlc3VsdHMgYmV0d2VlbiBjYWxscyB0byB5b3VyXHJcbiAgc2VsZWN0b3IsIG90aGVyd2lzZSB0aGUgQ29ubmVjdCBjb21wb25lbnQgd2lsbCByZS1yZW5kZXIgb24gZXZlcnkgc3RhdGUgb3IgcHJvcHMgY2hhbmdlLlxyXG4qL1xuc2VsZWN0b3JGYWN0b3J5LCAvLyBvcHRpb25zIG9iamVjdDpcbl9yZWYpIHtcbiAgaWYgKF9yZWYgPT09IHZvaWQgMCkge1xuICAgIF9yZWYgPSB7fTtcbiAgfVxuXG4gIHZhciBfcmVmMiA9IF9yZWYsXG4gICAgICBfcmVmMiRnZXREaXNwbGF5TmFtZSA9IF9yZWYyLmdldERpc3BsYXlOYW1lLFxuICAgICAgZ2V0RGlzcGxheU5hbWUgPSBfcmVmMiRnZXREaXNwbGF5TmFtZSA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gXCJDb25uZWN0QWR2YW5jZWQoXCIgKyBuYW1lICsgXCIpXCI7XG4gIH0gOiBfcmVmMiRnZXREaXNwbGF5TmFtZSxcbiAgICAgIF9yZWYyJG1ldGhvZE5hbWUgPSBfcmVmMi5tZXRob2ROYW1lLFxuICAgICAgbWV0aG9kTmFtZSA9IF9yZWYyJG1ldGhvZE5hbWUgPT09IHZvaWQgMCA/ICdjb25uZWN0QWR2YW5jZWQnIDogX3JlZjIkbWV0aG9kTmFtZSxcbiAgICAgIF9yZWYyJHJlbmRlckNvdW50UHJvcCA9IF9yZWYyLnJlbmRlckNvdW50UHJvcCxcbiAgICAgIHJlbmRlckNvdW50UHJvcCA9IF9yZWYyJHJlbmRlckNvdW50UHJvcCA9PT0gdm9pZCAwID8gdW5kZWZpbmVkIDogX3JlZjIkcmVuZGVyQ291bnRQcm9wLFxuICAgICAgX3JlZjIkc2hvdWxkSGFuZGxlU3RhID0gX3JlZjIuc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLFxuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzID0gX3JlZjIkc2hvdWxkSGFuZGxlU3RhID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZjIkc2hvdWxkSGFuZGxlU3RhLFxuICAgICAgX3JlZjIkc3RvcmVLZXkgPSBfcmVmMi5zdG9yZUtleSxcbiAgICAgIHN0b3JlS2V5ID0gX3JlZjIkc3RvcmVLZXkgPT09IHZvaWQgMCA/ICdzdG9yZScgOiBfcmVmMiRzdG9yZUtleSxcbiAgICAgIF9yZWYyJHdpdGhSZWYgPSBfcmVmMi53aXRoUmVmLFxuICAgICAgd2l0aFJlZiA9IF9yZWYyJHdpdGhSZWYgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjIkd2l0aFJlZixcbiAgICAgIF9yZWYyJGZvcndhcmRSZWYgPSBfcmVmMi5mb3J3YXJkUmVmLFxuICAgICAgZm9yd2FyZFJlZiA9IF9yZWYyJGZvcndhcmRSZWYgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjIkZm9yd2FyZFJlZixcbiAgICAgIF9yZWYyJGNvbnRleHQgPSBfcmVmMi5jb250ZXh0LFxuICAgICAgY29udGV4dCA9IF9yZWYyJGNvbnRleHQgPT09IHZvaWQgMCA/IFJlYWN0UmVkdXhDb250ZXh0IDogX3JlZjIkY29udGV4dCxcbiAgICAgIGNvbm5lY3RPcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZjIsIFtcImdldERpc3BsYXlOYW1lXCIsIFwibWV0aG9kTmFtZVwiLCBcInJlbmRlckNvdW50UHJvcFwiLCBcInNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlc1wiLCBcInN0b3JlS2V5XCIsIFwid2l0aFJlZlwiLCBcImZvcndhcmRSZWZcIiwgXCJjb250ZXh0XCJdKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChyZW5kZXJDb3VudFByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVuZGVyQ291bnRQcm9wIGlzIHJlbW92ZWQuIHJlbmRlciBjb3VudGluZyBpcyBidWlsdCBpbnRvIHRoZSBsYXRlc3QgUmVhY3QgRGV2IFRvb2xzIHByb2ZpbGluZyBleHRlbnNpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHdpdGhSZWYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2l0aFJlZiBpcyByZW1vdmVkLiBUbyBhY2Nlc3MgdGhlIHdyYXBwZWQgaW5zdGFuY2UsIHVzZSBhIHJlZiBvbiB0aGUgY29ubmVjdGVkIGNvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIHZhciBjdXN0b21TdG9yZVdhcm5pbmdNZXNzYWdlID0gJ1RvIHVzZSBhIGN1c3RvbSBSZWR1eCBzdG9yZSBmb3Igc3BlY2lmaWMgY29tcG9uZW50cywgY3JlYXRlIGEgY3VzdG9tIFJlYWN0IGNvbnRleHQgd2l0aCAnICsgXCJSZWFjdC5jcmVhdGVDb250ZXh0KCksIGFuZCBwYXNzIHRoZSBjb250ZXh0IG9iamVjdCB0byBSZWFjdCBSZWR1eCdzIFByb3ZpZGVyIGFuZCBzcGVjaWZpYyBjb21wb25lbnRzXCIgKyAnIGxpa2U6IDxQcm92aWRlciBjb250ZXh0PXtNeUNvbnRleHR9PjxDb25uZWN0ZWRDb21wb25lbnQgY29udGV4dD17TXlDb250ZXh0fSAvPjwvUHJvdmlkZXI+LiAnICsgJ1lvdSBtYXkgYWxzbyBwYXNzIGEge2NvbnRleHQgOiBNeUNvbnRleHR9IG9wdGlvbiB0byBjb25uZWN0JztcblxuICAgIGlmIChzdG9yZUtleSAhPT0gJ3N0b3JlJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdG9yZUtleSBoYXMgYmVlbiByZW1vdmVkIGFuZCBkb2VzIG5vdCBkbyBhbnl0aGluZy4gJyArIGN1c3RvbVN0b3JlV2FybmluZ01lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBDb250ZXh0ID0gY29udGV4dDtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXBXaXRoQ29ubmVjdChXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWlzVmFsaWRFbGVtZW50VHlwZShXcmFwcGVkQ29tcG9uZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgcGFzcyBhIGNvbXBvbmVudCB0byB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgXCIgKyAobWV0aG9kTmFtZSArIFwiLiBJbnN0ZWFkIHJlY2VpdmVkIFwiICsgc3RyaW5naWZ5Q29tcG9uZW50KFdyYXBwZWRDb21wb25lbnQpKSk7XG4gICAgfVxuXG4gICAgdmFyIHdyYXBwZWRDb21wb25lbnROYW1lID0gV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG4gICAgdmFyIGRpc3BsYXlOYW1lID0gZ2V0RGlzcGxheU5hbWUod3JhcHBlZENvbXBvbmVudE5hbWUpO1xuXG4gICAgdmFyIHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgY29ubmVjdE9wdGlvbnMsIHtcbiAgICAgIGdldERpc3BsYXlOYW1lOiBnZXREaXNwbGF5TmFtZSxcbiAgICAgIG1ldGhvZE5hbWU6IG1ldGhvZE5hbWUsXG4gICAgICByZW5kZXJDb3VudFByb3A6IHJlbmRlckNvdW50UHJvcCxcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlczogc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLFxuICAgICAgc3RvcmVLZXk6IHN0b3JlS2V5LFxuICAgICAgZGlzcGxheU5hbWU6IGRpc3BsYXlOYW1lLFxuICAgICAgd3JhcHBlZENvbXBvbmVudE5hbWU6IHdyYXBwZWRDb21wb25lbnROYW1lLFxuICAgICAgV3JhcHBlZENvbXBvbmVudDogV3JhcHBlZENvbXBvbmVudFxuICAgIH0pO1xuXG4gICAgdmFyIHB1cmUgPSBjb25uZWN0T3B0aW9ucy5wdXJlO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlQ2hpbGRTZWxlY3RvcihzdG9yZSkge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yRmFjdG9yeShzdG9yZS5kaXNwYXRjaCwgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyk7XG4gICAgfSAvLyBJZiB3ZSBhcmVuJ3QgcnVubmluZyBpbiBcInB1cmVcIiBtb2RlLCB3ZSBkb24ndCB3YW50IHRvIG1lbW9pemUgdmFsdWVzLlxuICAgIC8vIFRvIGF2b2lkIGNvbmRpdGlvbmFsbHkgY2FsbGluZyBob29rcywgd2UgZmFsbCBiYWNrIHRvIGEgdGlueSB3cmFwcGVyXG4gICAgLy8gdGhhdCBqdXN0IGV4ZWN1dGVzIHRoZSBnaXZlbiBjYWxsYmFjayBpbW1lZGlhdGVseS5cblxuXG4gICAgdmFyIHVzZVB1cmVPbmx5TWVtbyA9IHB1cmUgPyB1c2VNZW1vIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gQ29ubmVjdEZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICB2YXIgX3VzZU1lbW8gPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gRGlzdGluZ3Vpc2ggYmV0d2VlbiBhY3R1YWwgXCJkYXRhXCIgcHJvcHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGUgd3JhcHBlciBjb21wb25lbnQsXG4gICAgICAgIC8vIGFuZCB2YWx1ZXMgbmVlZGVkIHRvIGNvbnRyb2wgYmVoYXZpb3IgKGZvcndhcmRlZCByZWZzLCBhbHRlcm5hdGUgY29udGV4dCBpbnN0YW5jZXMpLlxuICAgICAgICAvLyBUbyBtYWludGFpbiB0aGUgd3JhcHBlclByb3BzIG9iamVjdCByZWZlcmVuY2UsIG1lbW9pemUgdGhpcyBkZXN0cnVjdHVyaW5nLlxuICAgICAgICB2YXIgZm9yd2FyZGVkUmVmID0gcHJvcHMuZm9yd2FyZGVkUmVmLFxuICAgICAgICAgICAgd3JhcHBlclByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UocHJvcHMsIFtcImZvcndhcmRlZFJlZlwiXSk7XG5cbiAgICAgICAgcmV0dXJuIFtwcm9wcy5jb250ZXh0LCBmb3J3YXJkZWRSZWYsIHdyYXBwZXJQcm9wc107XG4gICAgICB9LCBbcHJvcHNdKSxcbiAgICAgICAgICBwcm9wc0NvbnRleHQgPSBfdXNlTWVtb1swXSxcbiAgICAgICAgICBmb3J3YXJkZWRSZWYgPSBfdXNlTWVtb1sxXSxcbiAgICAgICAgICB3cmFwcGVyUHJvcHMgPSBfdXNlTWVtb1syXTtcblxuICAgICAgdmFyIENvbnRleHRUb1VzZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBVc2VycyBtYXkgb3B0aW9uYWxseSBwYXNzIGluIGEgY3VzdG9tIGNvbnRleHQgaW5zdGFuY2UgdG8gdXNlIGluc3RlYWQgb2Ygb3VyIFJlYWN0UmVkdXhDb250ZXh0LlxuICAgICAgICAvLyBNZW1vaXplIHRoZSBjaGVjayB0aGF0IGRldGVybWluZXMgd2hpY2ggY29udGV4dCBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlLlxuICAgICAgICByZXR1cm4gcHJvcHNDb250ZXh0ICYmIHByb3BzQ29udGV4dC5Db25zdW1lciAmJiBpc0NvbnRleHRDb25zdW1lcihSZWFjdC5jcmVhdGVFbGVtZW50KHByb3BzQ29udGV4dC5Db25zdW1lciwgbnVsbCkpID8gcHJvcHNDb250ZXh0IDogQ29udGV4dDtcbiAgICAgIH0sIFtwcm9wc0NvbnRleHQsIENvbnRleHRdKTsgLy8gUmV0cmlldmUgdGhlIHN0b3JlIGFuZCBhbmNlc3RvciBzdWJzY3JpcHRpb24gdmlhIGNvbnRleHQsIGlmIGF2YWlsYWJsZVxuXG4gICAgICB2YXIgY29udGV4dFZhbHVlID0gdXNlQ29udGV4dChDb250ZXh0VG9Vc2UpOyAvLyBUaGUgc3RvcmUgX211c3RfIGV4aXN0IGFzIGVpdGhlciBhIHByb3Agb3IgaW4gY29udGV4dC5cbiAgICAgIC8vIFdlJ2xsIGNoZWNrIHRvIHNlZSBpZiBpdCBfbG9va3NfIGxpa2UgYSBSZWR1eCBzdG9yZSBmaXJzdC5cbiAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHBhc3MgdGhyb3VnaCBhIGBzdG9yZWAgcHJvcCB0aGF0IGlzIGp1c3QgYSBwbGFpbiB2YWx1ZS5cblxuICAgICAgdmFyIGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA9IEJvb2xlYW4ocHJvcHMuc3RvcmUpICYmIEJvb2xlYW4ocHJvcHMuc3RvcmUuZ2V0U3RhdGUpICYmIEJvb2xlYW4ocHJvcHMuc3RvcmUuZGlzcGF0Y2gpO1xuICAgICAgdmFyIGRpZFN0b3JlQ29tZUZyb21Db250ZXh0ID0gQm9vbGVhbihjb250ZXh0VmFsdWUpICYmIEJvb2xlYW4oY29udGV4dFZhbHVlLnN0b3JlKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWRpZFN0b3JlQ29tZUZyb21Qcm9wcyAmJiAhZGlkU3RvcmVDb21lRnJvbUNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgXFxcInN0b3JlXFxcIiBpbiB0aGUgY29udGV4dCBvZiBcIiArIChcIlxcXCJcIiArIGRpc3BsYXlOYW1lICsgXCJcXFwiLiBFaXRoZXIgd3JhcCB0aGUgcm9vdCBjb21wb25lbnQgaW4gYSA8UHJvdmlkZXI+LCBcIikgKyBcIm9yIHBhc3MgYSBjdXN0b20gUmVhY3QgY29udGV4dCBwcm92aWRlciB0byA8UHJvdmlkZXI+IGFuZCB0aGUgY29ycmVzcG9uZGluZyBcIiArIChcIlJlYWN0IGNvbnRleHQgY29uc3VtZXIgdG8gXCIgKyBkaXNwbGF5TmFtZSArIFwiIGluIGNvbm5lY3Qgb3B0aW9ucy5cIikpO1xuICAgICAgfSAvLyBCYXNlZCBvbiB0aGUgcHJldmlvdXMgY2hlY2ssIG9uZSBvZiB0aGVzZSBtdXN0IGJlIHRydWVcblxuXG4gICAgICB2YXIgc3RvcmUgPSBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPyBwcm9wcy5zdG9yZSA6IGNvbnRleHRWYWx1ZS5zdG9yZTtcbiAgICAgIHZhciBjaGlsZFByb3BzU2VsZWN0b3IgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVGhlIGNoaWxkIHByb3BzIHNlbGVjdG9yIG5lZWRzIHRoZSBzdG9yZSByZWZlcmVuY2UgYXMgYW4gaW5wdXQuXG4gICAgICAgIC8vIFJlLWNyZWF0ZSB0aGlzIHNlbGVjdG9yIHdoZW5ldmVyIHRoZSBzdG9yZSBjaGFuZ2VzLlxuICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGRTZWxlY3RvcihzdG9yZSk7XG4gICAgICB9LCBbc3RvcmVdKTtcblxuICAgICAgdmFyIF91c2VNZW1vMiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuIE5PX1NVQlNDUklQVElPTl9BUlJBWTsgLy8gVGhpcyBTdWJzY3JpcHRpb24ncyBzb3VyY2Ugc2hvdWxkIG1hdGNoIHdoZXJlIHN0b3JlIGNhbWUgZnJvbTogcHJvcHMgdnMuIGNvbnRleHQuIEEgY29tcG9uZW50XG4gICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgc3RvcmUgdmlhIHByb3BzIHNob3VsZG4ndCB1c2Ugc3Vic2NyaXB0aW9uIGZyb20gY29udGV4dCwgb3IgdmljZSB2ZXJzYS5cblxuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbihzdG9yZSwgZGlkU3RvcmVDb21lRnJvbVByb3BzID8gbnVsbCA6IGNvbnRleHRWYWx1ZS5zdWJzY3JpcHRpb24pOyAvLyBgbm90aWZ5TmVzdGVkU3Vic2AgaXMgZHVwbGljYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQgaW5cbiAgICAgICAgLy8gdGhlIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIGxvb3AsIHdoZXJlIGBzdWJzY3JpcHRpb25gIHdpbGwgdGhlbiBiZSBudWxsLiBUaGlzIGNhblxuICAgICAgICAvLyBwcm9iYWJseSBiZSBhdm9pZGVkIGlmIFN1YnNjcmlwdGlvbidzIGxpc3RlbmVycyBsb2dpYyBpcyBjaGFuZ2VkIHRvIG5vdCBjYWxsIGxpc3RlbmVyc1xuICAgICAgICAvLyB0aGF0IGhhdmUgYmVlbiB1bnN1YnNjcmliZWQgaW4gdGhlICBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLlxuXG4gICAgICAgIHZhciBub3RpZnlOZXN0ZWRTdWJzID0gc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnMuYmluZChzdWJzY3JpcHRpb24pO1xuICAgICAgICByZXR1cm4gW3N1YnNjcmlwdGlvbiwgbm90aWZ5TmVzdGVkU3Vic107XG4gICAgICB9LCBbc3RvcmUsIGRpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlXSksXG4gICAgICAgICAgc3Vic2NyaXB0aW9uID0gX3VzZU1lbW8yWzBdLFxuICAgICAgICAgIG5vdGlmeU5lc3RlZFN1YnMgPSBfdXNlTWVtbzJbMV07IC8vIERldGVybWluZSB3aGF0IHtzdG9yZSwgc3Vic2NyaXB0aW9ufSB2YWx1ZSBzaG91bGQgYmUgcHV0IGludG8gbmVzdGVkIGNvbnRleHQsIGlmIG5lY2Vzc2FyeSxcbiAgICAgIC8vIGFuZCBtZW1vaXplIHRoYXQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3NhcnkgY29udGV4dCB1cGRhdGVzLlxuXG5cbiAgICAgIHZhciBvdmVycmlkZGVuQ29udGV4dFZhbHVlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChkaWRTdG9yZUNvbWVGcm9tUHJvcHMpIHtcbiAgICAgICAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBkaXJlY3RseSBzdWJzY3JpYmVkIHRvIGEgc3RvcmUgZnJvbSBwcm9wcy5cbiAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IGRlc2NlbmRhbnRzIHJlYWRpbmcgZnJvbSB0aGlzIHN0b3JlIC0gcGFzcyBkb3duIHdoYXRldmVyXG4gICAgICAgICAgLy8gdGhlIGV4aXN0aW5nIGNvbnRleHQgdmFsdWUgaXMgZnJvbSB0aGUgbmVhcmVzdCBjb25uZWN0ZWQgYW5jZXN0b3IuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHRWYWx1ZTtcbiAgICAgICAgfSAvLyBPdGhlcndpc2UsIHB1dCB0aGlzIGNvbXBvbmVudCdzIHN1YnNjcmlwdGlvbiBpbnN0YW5jZSBpbnRvIGNvbnRleHQsIHNvIHRoYXRcbiAgICAgICAgLy8gY29ubmVjdGVkIGRlc2NlbmRhbnRzIHdvbid0IHVwZGF0ZSB1bnRpbCBhZnRlciB0aGlzIGNvbXBvbmVudCBpcyBkb25lXG5cblxuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGNvbnRleHRWYWx1ZSwge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbjogc3Vic2NyaXB0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfSwgW2RpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlLCBzdWJzY3JpcHRpb25dKTsgLy8gV2UgbmVlZCB0byBmb3JjZSB0aGlzIHdyYXBwZXIgY29tcG9uZW50IHRvIHJlLXJlbmRlciB3aGVuZXZlciBhIFJlZHV4IHN0b3JlIHVwZGF0ZVxuICAgICAgLy8gY2F1c2VzIGEgY2hhbmdlIHRvIHRoZSBjYWxjdWxhdGVkIGNoaWxkIGNvbXBvbmVudCBwcm9wcyAob3Igd2UgY2F1Z2h0IGFuIGVycm9yIGluIG1hcFN0YXRlKVxuXG4gICAgICB2YXIgX3VzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyKHN0b3JlU3RhdGVVcGRhdGVzUmVkdWNlciwgRU1QVFlfQVJSQVksIGluaXRTdGF0ZVVwZGF0ZXMpLFxuICAgICAgICAgIF91c2VSZWR1Y2VyJCA9IF91c2VSZWR1Y2VyWzBdLFxuICAgICAgICAgIHByZXZpb3VzU3RhdGVVcGRhdGVSZXN1bHQgPSBfdXNlUmVkdWNlciRbMF0sXG4gICAgICAgICAgZm9yY2VDb21wb25lbnRVcGRhdGVEaXNwYXRjaCA9IF91c2VSZWR1Y2VyWzFdOyAvLyBQcm9wYWdhdGUgYW55IG1hcFN0YXRlL21hcERpc3BhdGNoIGVycm9ycyB1cHdhcmRzXG5cblxuICAgICAgaWYgKHByZXZpb3VzU3RhdGVVcGRhdGVSZXN1bHQgJiYgcHJldmlvdXNTdGF0ZVVwZGF0ZVJlc3VsdC5lcnJvcikge1xuICAgICAgICB0aHJvdyBwcmV2aW91c1N0YXRlVXBkYXRlUmVzdWx0LmVycm9yO1xuICAgICAgfSAvLyBTZXQgdXAgcmVmcyB0byBjb29yZGluYXRlIHZhbHVlcyBiZXR3ZWVuIHRoZSBzdWJzY3JpcHRpb24gZWZmZWN0IGFuZCB0aGUgcmVuZGVyIGxvZ2ljXG5cblxuICAgICAgdmFyIGxhc3RDaGlsZFByb3BzID0gdXNlUmVmKCk7XG4gICAgICB2YXIgbGFzdFdyYXBwZXJQcm9wcyA9IHVzZVJlZih3cmFwcGVyUHJvcHMpO1xuICAgICAgdmFyIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUgPSB1c2VSZWYoKTtcbiAgICAgIHZhciByZW5kZXJJc1NjaGVkdWxlZCA9IHVzZVJlZihmYWxzZSk7XG4gICAgICB2YXIgYWN0dWFsQ2hpbGRQcm9wcyA9IHVzZVB1cmVPbmx5TWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFRyaWNreSBsb2dpYyBoZXJlOlxuICAgICAgICAvLyAtIFRoaXMgcmVuZGVyIG1heSBoYXZlIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgUmVkdXggc3RvcmUgdXBkYXRlIHRoYXQgcHJvZHVjZWQgbmV3IGNoaWxkIHByb3BzXG4gICAgICAgIC8vIC0gSG93ZXZlciwgd2UgbWF5IGhhdmUgZ290dGVuIG5ldyB3cmFwcGVyIHByb3BzIGFmdGVyIHRoYXRcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBuZXcgY2hpbGQgcHJvcHMsIGFuZCB0aGUgc2FtZSB3cmFwcGVyIHByb3BzLCB3ZSBrbm93IHdlIHNob3VsZCB1c2UgdGhlIG5ldyBjaGlsZCBwcm9wcyBhcy1pcy5cbiAgICAgICAgLy8gQnV0LCBpZiB3ZSBoYXZlIG5ldyB3cmFwcGVyIHByb3BzLCB0aG9zZSBtaWdodCBjaGFuZ2UgdGhlIGNoaWxkIHByb3BzLCBzbyB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIHRoaW5ncy5cbiAgICAgICAgLy8gU28sIHdlJ2xsIHVzZSB0aGUgY2hpbGQgcHJvcHMgZnJvbSBzdG9yZSB1cGRhdGUgb25seSBpZiB0aGUgd3JhcHBlciBwcm9wcyBhcmUgdGhlIHNhbWUgYXMgbGFzdCB0aW1lLlxuICAgICAgICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ICYmIHdyYXBwZXJQcm9wcyA9PT0gbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudDtcbiAgICAgICAgfSAvLyBUT0RPIFdlJ3JlIHJlYWRpbmcgdGhlIHN0b3JlIGRpcmVjdGx5IGluIHJlbmRlcigpIGhlcmUuIEJhZCBpZGVhP1xuICAgICAgICAvLyBUaGlzIHdpbGwgbGlrZWx5IGNhdXNlIEJhZCBUaGluZ3MgKFRNKSB0byBoYXBwZW4gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gdGhpcyBiZWNhdXNlIG9uIHJlbmRlcnMgX25vdF8gY2F1c2VkIGJ5IHN0b3JlIHVwZGF0ZXMsIHdlIG5lZWQgdGhlIGxhdGVzdCBzdG9yZSBzdGF0ZVxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgd2hhdCB0aGUgY2hpbGQgcHJvcHMgc2hvdWxkIGJlLlxuXG5cbiAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHNTZWxlY3RvcihzdG9yZS5nZXRTdGF0ZSgpLCB3cmFwcGVyUHJvcHMpO1xuICAgICAgfSwgW3N0b3JlLCBwcmV2aW91c1N0YXRlVXBkYXRlUmVzdWx0LCB3cmFwcGVyUHJvcHNdKTsgLy8gV2UgbmVlZCB0aGlzIHRvIGV4ZWN1dGUgc3luY2hyb25vdXNseSBldmVyeSB0aW1lIHdlIHJlLXJlbmRlci4gSG93ZXZlciwgUmVhY3Qgd2FybnNcbiAgICAgIC8vIGFib3V0IHVzZUxheW91dEVmZmVjdCBpbiBTU1IsIHNvIHdlIHRyeSB0byBkZXRlY3QgZW52aXJvbm1lbnQgYW5kIGZhbGwgYmFjayB0b1xuICAgICAgLy8ganVzdCB1c2VFZmZlY3QgaW5zdGVhZCB0byBhdm9pZCB0aGUgd2FybmluZywgc2luY2UgbmVpdGhlciB3aWxsIHJ1biBhbnl3YXkuXG5cbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3RXaXRoQXJncyhjYXB0dXJlV3JhcHBlclByb3BzLCBbbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCB3cmFwcGVyUHJvcHMsIGFjdHVhbENoaWxkUHJvcHMsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnNdKTsgLy8gT3VyIHJlLXN1YnNjcmliZSBsb2dpYyBvbmx5IHJ1bnMgd2hlbiB0aGUgc3RvcmUvc3Vic2NyaXB0aW9uIHNldHVwIGNoYW5nZXNcblxuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKHN1YnNjcmliZVVwZGF0ZXMsIFtzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCBmb3JjZUNvbXBvbmVudFVwZGF0ZURpc3BhdGNoXSwgW3N0b3JlLCBzdWJzY3JpcHRpb24sIGNoaWxkUHJvcHNTZWxlY3Rvcl0pOyAvLyBOb3cgdGhhdCBhbGwgdGhhdCdzIGRvbmUsIHdlIGNhbiBmaW5hbGx5IHRyeSB0byBhY3R1YWxseSByZW5kZXIgdGhlIGNoaWxkIGNvbXBvbmVudC5cbiAgICAgIC8vIFdlIG1lbW9pemUgdGhlIGVsZW1lbnRzIGZvciB0aGUgcmVuZGVyZWQgY2hpbGQgY29tcG9uZW50IGFzIGFuIG9wdGltaXphdGlvbi5cblxuICAgICAgdmFyIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgYWN0dWFsQ2hpbGRQcm9wcywge1xuICAgICAgICAgIHJlZjogZm9yd2FyZGVkUmVmXG4gICAgICAgIH0pKTtcbiAgICAgIH0sIFtmb3J3YXJkZWRSZWYsIFdyYXBwZWRDb21wb25lbnQsIGFjdHVhbENoaWxkUHJvcHNdKTsgLy8gSWYgUmVhY3Qgc2VlcyB0aGUgZXhhY3Qgc2FtZSBlbGVtZW50IHJlZmVyZW5jZSBhcyBsYXN0IHRpbWUsIGl0IGJhaWxzIG91dCBvZiByZS1yZW5kZXJpbmdcbiAgICAgIC8vIHRoYXQgY2hpbGQsIHNhbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gUmVhY3QubWVtbygpIG9yIHJldHVybmVkIGZhbHNlIGZyb20gc2hvdWxkQ29tcG9uZW50VXBkYXRlLlxuXG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBjb21wb25lbnQgaXMgc3Vic2NyaWJlZCB0byBzdG9yZSB1cGRhdGVzLCB3ZSBuZWVkIHRvIHBhc3MgaXRzIG93blxuICAgICAgICAgIC8vIHN1YnNjcmlwdGlvbiBpbnN0YW5jZSBkb3duIHRvIG91ciBkZXNjZW5kYW50cy4gVGhhdCBtZWFucyByZW5kZXJpbmcgdGhlIHNhbWVcbiAgICAgICAgICAvLyBDb250ZXh0IGluc3RhbmNlLCBhbmQgcHV0dGluZyBhIGRpZmZlcmVudCB2YWx1ZSBpbnRvIHRoZSBjb250ZXh0LlxuICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHRUb1VzZS5Qcm92aWRlciwge1xuICAgICAgICAgICAgdmFsdWU6IG92ZXJyaWRkZW5Db250ZXh0VmFsdWVcbiAgICAgICAgICB9LCByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudDtcbiAgICAgIH0sIFtDb250ZXh0VG9Vc2UsIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCwgb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZV0pO1xuICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGQ7XG4gICAgfSAvLyBJZiB3ZSdyZSBpbiBcInB1cmVcIiBtb2RlLCBlbnN1cmUgb3VyIHdyYXBwZXIgY29tcG9uZW50IG9ubHkgcmUtcmVuZGVycyB3aGVuIGluY29taW5nIHByb3BzIGhhdmUgY2hhbmdlZC5cblxuXG4gICAgdmFyIENvbm5lY3QgPSBwdXJlID8gUmVhY3QubWVtbyhDb25uZWN0RnVuY3Rpb24pIDogQ29ubmVjdEZ1bmN0aW9uO1xuICAgIENvbm5lY3QuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gICAgQ29ubmVjdC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuXG4gICAgaWYgKGZvcndhcmRSZWYpIHtcbiAgICAgIHZhciBmb3J3YXJkZWQgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIGZvcndhcmRDb25uZWN0UmVmKHByb3BzLCByZWYpIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29ubmVjdCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgICAgZm9yd2FyZGVkUmVmOiByZWZcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgICBmb3J3YXJkZWQuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICAgIGZvcndhcmRlZC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcbiAgICAgIHJldHVybiBob2lzdFN0YXRpY3MoZm9yd2FyZGVkLCBXcmFwcGVkQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaG9pc3RTdGF0aWNzKENvbm5lY3QsIFdyYXBwZWRDb21wb25lbnQpO1xuICB9O1xufSIsImZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCB8fCB5ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59IiwiLyoqXHJcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHJldHVybiB0cnVlO1xuICB2YXIgYmFzZVByb3RvID0gcHJvdG87XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pICE9PSBudWxsKSB7XG4gICAgYmFzZVByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGJhc2VQcm90byk7XG4gIH1cblxuICByZXR1cm4gcHJvdG8gPT09IGJhc2VQcm90bztcbn0iLCIvKipcclxuICogUHJpbnRzIGEgd2FybmluZyBpbiB0aGUgY29uc29sZSBpZiBpdCBleGlzdHMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UuXHJcbiAqIEByZXR1cm5zIHt2b2lkfVxyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1lbXB0eSAqL1xuICB9IGNhdGNoIChlKSB7fVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWVtcHR5ICovXG5cbn0iLCJpbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICcuL2lzUGxhaW5PYmplY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi93YXJuaW5nJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcmlmeVBsYWluT2JqZWN0KHZhbHVlLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgd2FybmluZyhtZXRob2ROYW1lICsgXCIoKSBpbiBcIiArIGRpc3BsYXlOYW1lICsgXCIgbXVzdCByZXR1cm4gYSBwbGFpbiBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQgXCIgKyB2YWx1ZSArIFwiLlwiKTtcbiAgfVxufSIsImltcG9ydCB2ZXJpZnlQbGFpbk9iamVjdCBmcm9tICcuLi91dGlscy92ZXJpZnlQbGFpbk9iamVjdCc7XG5leHBvcnQgZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNDb25zdGFudChnZXRDb25zdGFudCkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdENvbnN0YW50U2VsZWN0b3IoZGlzcGF0Y2gsIG9wdGlvbnMpIHtcbiAgICB2YXIgY29uc3RhbnQgPSBnZXRDb25zdGFudChkaXNwYXRjaCwgb3B0aW9ucyk7XG5cbiAgICBmdW5jdGlvbiBjb25zdGFudFNlbGVjdG9yKCkge1xuICAgICAgcmV0dXJuIGNvbnN0YW50O1xuICAgIH1cblxuICAgIGNvbnN0YW50U2VsZWN0b3IuZGVwZW5kc09uT3duUHJvcHMgPSBmYWxzZTtcbiAgICByZXR1cm4gY29uc3RhbnRTZWxlY3RvcjtcbiAgfTtcbn0gLy8gZGVwZW5kc09uT3duUHJvcHMgaXMgdXNlZCBieSBjcmVhdGVNYXBUb1Byb3BzUHJveHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcGFzcyBwcm9wcyBhcyBhcmdzXG4vLyB0byB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyB3cmFwcGVkLiBJdCBpcyBhbHNvIHVzZWQgYnkgbWFrZVB1cmVQcm9wc1NlbGVjdG9yIHRvIGRldGVybWluZVxuLy8gd2hldGhlciBtYXBUb1Byb3BzIG5lZWRzIHRvIGJlIGludm9rZWQgd2hlbiBwcm9wcyBoYXZlIGNoYW5nZWQuXG4vL1xuLy8gQSBsZW5ndGggb2Ygb25lIHNpZ25hbHMgdGhhdCBtYXBUb1Byb3BzIGRvZXMgbm90IGRlcGVuZCBvbiBwcm9wcyBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50LlxuLy8gQSBsZW5ndGggb2YgemVybyBpcyBhc3N1bWVkIHRvIG1lYW4gbWFwVG9Qcm9wcyBpcyBnZXR0aW5nIGFyZ3MgdmlhIGFyZ3VtZW50cyBvciAuLi5hcmdzIGFuZFxuLy8gdGhlcmVmb3JlIG5vdCByZXBvcnRpbmcgaXRzIGxlbmd0aCBhY2N1cmF0ZWx5Li5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlcGVuZHNPbk93blByb3BzKG1hcFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMgIT09IG51bGwgJiYgbWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcyAhPT0gdW5kZWZpbmVkID8gQm9vbGVhbihtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSA6IG1hcFRvUHJvcHMubGVuZ3RoICE9PSAxO1xufSAvLyBVc2VkIGJ5IHdoZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uIGFuZCB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbixcbi8vIHRoaXMgZnVuY3Rpb24gd3JhcHMgbWFwVG9Qcm9wcyBpbiBhIHByb3h5IGZ1bmN0aW9uIHdoaWNoIGRvZXMgc2V2ZXJhbCB0aGluZ3M6XG4vL1xuLy8gICogRGV0ZWN0cyB3aGV0aGVyIHRoZSBtYXBUb1Byb3BzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCBkZXBlbmRzIG9uIHByb3BzLCB3aGljaFxuLy8gICAgaXMgdXNlZCBieSBzZWxlY3RvckZhY3RvcnkgdG8gZGVjaWRlIGlmIGl0IHNob3VsZCByZWludm9rZSBvbiBwcm9wcyBjaGFuZ2VzLlxuLy9cbi8vICAqIE9uIGZpcnN0IGNhbGwsIGhhbmRsZXMgbWFwVG9Qcm9wcyBpZiByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24sIGFuZCB0cmVhdHMgdGhhdFxuLy8gICAgbmV3IGZ1bmN0aW9uIGFzIHRoZSB0cnVlIG1hcFRvUHJvcHMgZm9yIHN1YnNlcXVlbnQgY2FsbHMuXG4vL1xuLy8gICogT24gZmlyc3QgY2FsbCwgdmVyaWZpZXMgdGhlIGZpcnN0IHJlc3VsdCBpcyBhIHBsYWluIG9iamVjdCwgaW4gb3JkZXIgdG8gd2FyblxuLy8gICAgdGhlIGRldmVsb3BlciB0aGF0IHRoZWlyIG1hcFRvUHJvcHMgZnVuY3Rpb24gaXMgbm90IHJldHVybmluZyBhIHZhbGlkIHJlc3VsdC5cbi8vXG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwVG9Qcm9wcywgbWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdFByb3h5U2VsZWN0b3IoZGlzcGF0Y2gsIF9yZWYpIHtcbiAgICB2YXIgZGlzcGxheU5hbWUgPSBfcmVmLmRpc3BsYXlOYW1lO1xuXG4gICAgdmFyIHByb3h5ID0gZnVuY3Rpb24gbWFwVG9Qcm9wc1Byb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHJldHVybiBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA/IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykgOiBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCk7XG4gICAgfTsgLy8gYWxsb3cgZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeSB0byBnZXQgb3duUHJvcHNcblxuXG4gICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSB0cnVlO1xuXG4gICAgcHJveHkubWFwVG9Qcm9wcyA9IGZ1bmN0aW9uIGRldGVjdEZhY3RvcnlBbmRWZXJpZnkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykge1xuICAgICAgcHJveHkubWFwVG9Qcm9wcyA9IG1hcFRvUHJvcHM7XG4gICAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IGdldERlcGVuZHNPbk93blByb3BzKG1hcFRvUHJvcHMpO1xuICAgICAgdmFyIHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgcHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJveHkubWFwVG9Qcm9wcyA9IHByb3BzO1xuICAgICAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IGdldERlcGVuZHNPbk93blByb3BzKHByb3BzKTtcbiAgICAgICAgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHZlcmlmeVBsYWluT2JqZWN0KHByb3BzLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSk7XG4gICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcblxuICAgIHJldHVybiBwcm94eTtcbiAgfTtcbn0iLCJpbXBvcnQgeyBiaW5kQWN0aW9uQ3JlYXRvcnMgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbihtYXBEaXNwYXRjaFRvUHJvcHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09ICdmdW5jdGlvbicgPyB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJykgOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzTWlzc2luZyhtYXBEaXNwYXRjaFRvUHJvcHMpIHtcbiAgcmV0dXJuICFtYXBEaXNwYXRjaFRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGZ1bmN0aW9uIChkaXNwYXRjaCkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwYXRjaDogZGlzcGF0Y2hcbiAgICB9O1xuICB9KSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNPYmplY3QobWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBEaXNwYXRjaFRvUHJvcHMgJiYgdHlwZW9mIG1hcERpc3BhdGNoVG9Qcm9wcyA9PT0gJ29iamVjdCcgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGZ1bmN0aW9uIChkaXNwYXRjaCkge1xuICAgIHJldHVybiBiaW5kQWN0aW9uQ3JlYXRvcnMobWFwRGlzcGF0Y2hUb1Byb3BzLCBkaXNwYXRjaCk7XG4gIH0pIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGRlZmF1bHQgW3doZW5NYXBEaXNwYXRjaFRvUHJvcHNJc0Z1bmN0aW9uLCB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNNaXNzaW5nLCB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNPYmplY3RdOyIsImltcG9ydCB7IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQsIHdyYXBNYXBUb1Byb3BzRnVuYyB9IGZyb20gJy4vd3JhcE1hcFRvUHJvcHMnO1xuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uKG1hcFN0YXRlVG9Qcm9wcykge1xuICByZXR1cm4gdHlwZW9mIG1hcFN0YXRlVG9Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnKSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nKG1hcFN0YXRlVG9Qcm9wcykge1xuICByZXR1cm4gIW1hcFN0YXRlVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7fTtcbiAgfSkgOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZGVmYXVsdCBbd2hlbk1hcFN0YXRlVG9Qcm9wc0lzRnVuY3Rpb24sIHdoZW5NYXBTdGF0ZVRvUHJvcHNJc01pc3NpbmddOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IHZlcmlmeVBsYWluT2JqZWN0IGZyb20gJy4uL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0JztcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0TWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICByZXR1cm4gX2V4dGVuZHMoe30sIG93blByb3BzLCB7fSwgc3RhdGVQcm9wcywge30sIGRpc3BhdGNoUHJvcHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0TWVyZ2VQcm9wc1Byb3h5KGRpc3BhdGNoLCBfcmVmKSB7XG4gICAgdmFyIGRpc3BsYXlOYW1lID0gX3JlZi5kaXNwbGF5TmFtZSxcbiAgICAgICAgcHVyZSA9IF9yZWYucHVyZSxcbiAgICAgICAgYXJlTWVyZ2VkUHJvcHNFcXVhbCA9IF9yZWYuYXJlTWVyZ2VkUHJvcHNFcXVhbDtcbiAgICB2YXIgaGFzUnVuT25jZSA9IGZhbHNlO1xuICAgIHZhciBtZXJnZWRQcm9wcztcbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VQcm9wc1Byb3h5KHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gICAgICB2YXIgbmV4dE1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG5cbiAgICAgIGlmIChoYXNSdW5PbmNlKSB7XG4gICAgICAgIGlmICghcHVyZSB8fCAhYXJlTWVyZ2VkUHJvcHNFcXVhbChuZXh0TWVyZ2VkUHJvcHMsIG1lcmdlZFByb3BzKSkgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNSdW5PbmNlID0gdHJ1ZTtcbiAgICAgICAgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB2ZXJpZnlQbGFpbk9iamVjdChtZXJnZWRQcm9wcywgZGlzcGxheU5hbWUsICdtZXJnZVByb3BzJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgICB9O1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NZXJnZVByb3BzSXNGdW5jdGlvbihtZXJnZVByb3BzKSB7XG4gIHJldHVybiB0eXBlb2YgbWVyZ2VQcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWVyZ2VQcm9wc0lzT21pdHRlZChtZXJnZVByb3BzKSB7XG4gIHJldHVybiAhbWVyZ2VQcm9wcyA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1lcmdlUHJvcHM7XG4gIH0gOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZGVmYXVsdCBbd2hlbk1lcmdlUHJvcHNJc0Z1bmN0aW9uLCB3aGVuTWVyZ2VQcm9wc0lzT21pdHRlZF07IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5cbmZ1bmN0aW9uIHZlcmlmeShzZWxlY3RvciwgbWV0aG9kTmFtZSwgZGlzcGxheU5hbWUpIHtcbiAgaWYgKCFzZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgdmFsdWUgZm9yIFwiICsgbWV0aG9kTmFtZSArIFwiIGluIFwiICsgZGlzcGxheU5hbWUgKyBcIi5cIik7XG4gIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ21hcFN0YXRlVG9Qcm9wcycgfHwgbWV0aG9kTmFtZSA9PT0gJ21hcERpc3BhdGNoVG9Qcm9wcycpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWxlY3RvciwgJ2RlcGVuZHNPbk93blByb3BzJykpIHtcbiAgICAgIHdhcm5pbmcoXCJUaGUgc2VsZWN0b3IgZm9yIFwiICsgbWV0aG9kTmFtZSArIFwiIG9mIFwiICsgZGlzcGxheU5hbWUgKyBcIiBkaWQgbm90IHNwZWNpZnkgYSB2YWx1ZSBmb3IgZGVwZW5kc09uT3duUHJvcHMuXCIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZlcmlmeShtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnLCBkaXNwbGF5TmFtZSk7XG4gIHZlcmlmeShtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnLCBkaXNwbGF5TmFtZSk7XG4gIHZlcmlmeShtZXJnZVByb3BzLCAnbWVyZ2VQcm9wcycsIGRpc3BsYXlOYW1lKTtcbn0iLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmltcG9ydCB2ZXJpZnlTdWJzZWxlY3RvcnMgZnJvbSAnLi92ZXJpZnlTdWJzZWxlY3RvcnMnO1xuZXhwb3J0IGZ1bmN0aW9uIGltcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3Ioc3RhdGUsIG93blByb3BzKSB7XG4gICAgcmV0dXJuIG1lcmdlUHJvcHMobWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyksIG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpLCBvd25Qcm9wcyk7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCBfcmVmKSB7XG4gIHZhciBhcmVTdGF0ZXNFcXVhbCA9IF9yZWYuYXJlU3RhdGVzRXF1YWwsXG4gICAgICBhcmVPd25Qcm9wc0VxdWFsID0gX3JlZi5hcmVPd25Qcm9wc0VxdWFsLFxuICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsID0gX3JlZi5hcmVTdGF0ZVByb3BzRXF1YWw7XG4gIHZhciBoYXNSdW5BdExlYXN0T25jZSA9IGZhbHNlO1xuICB2YXIgc3RhdGU7XG4gIHZhciBvd25Qcm9wcztcbiAgdmFyIHN0YXRlUHJvcHM7XG4gIHZhciBkaXNwYXRjaFByb3BzO1xuICB2YXIgbWVyZ2VkUHJvcHM7XG5cbiAgZnVuY3Rpb24gaGFuZGxlRmlyc3RDYWxsKGZpcnN0U3RhdGUsIGZpcnN0T3duUHJvcHMpIHtcbiAgICBzdGF0ZSA9IGZpcnN0U3RhdGU7XG4gICAgb3duUHJvcHMgPSBmaXJzdE93blByb3BzO1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICBoYXNSdW5BdExlYXN0T25jZSA9IHRydWU7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSgpIHtcbiAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3UHJvcHMoKSB7XG4gICAgaWYgKG1hcFN0YXRlVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGlmIChtYXBEaXNwYXRjaFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1N0YXRlKCkge1xuICAgIHZhciBuZXh0U3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIHZhciBzdGF0ZVByb3BzQ2hhbmdlZCA9ICFhcmVTdGF0ZVByb3BzRXF1YWwobmV4dFN0YXRlUHJvcHMsIHN0YXRlUHJvcHMpO1xuICAgIHN0YXRlUHJvcHMgPSBuZXh0U3RhdGVQcm9wcztcbiAgICBpZiAoc3RhdGVQcm9wc0NoYW5nZWQpIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgdmFyIHByb3BzQ2hhbmdlZCA9ICFhcmVPd25Qcm9wc0VxdWFsKG5leHRPd25Qcm9wcywgb3duUHJvcHMpO1xuICAgIHZhciBzdGF0ZUNoYW5nZWQgPSAhYXJlU3RhdGVzRXF1YWwobmV4dFN0YXRlLCBzdGF0ZSk7XG4gICAgc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgb3duUHJvcHMgPSBuZXh0T3duUHJvcHM7XG4gICAgaWYgKHByb3BzQ2hhbmdlZCAmJiBzdGF0ZUNoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCk7XG4gICAgaWYgKHByb3BzQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1Byb3BzKCk7XG4gICAgaWYgKHN0YXRlQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1N0YXRlKCk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1cmVGaW5hbFByb3BzU2VsZWN0b3IobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICByZXR1cm4gaGFzUnVuQXRMZWFzdE9uY2UgPyBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIDogaGFuZGxlRmlyc3RDYWxsKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKTtcbiAgfTtcbn0gLy8gVE9ETzogQWRkIG1vcmUgY29tbWVudHNcbi8vIElmIHB1cmUgaXMgdHJ1ZSwgdGhlIHNlbGVjdG9yIHJldHVybmVkIGJ5IHNlbGVjdG9yRmFjdG9yeSB3aWxsIG1lbW9pemUgaXRzIHJlc3VsdHMsXG4vLyBhbGxvd2luZyBjb25uZWN0QWR2YW5jZWQncyBzaG91bGRDb21wb25lbnRVcGRhdGUgdG8gcmV0dXJuIGZhbHNlIGlmIGZpbmFsXG4vLyBwcm9wcyBoYXZlIG5vdCBjaGFuZ2VkLiBJZiBmYWxzZSwgdGhlIHNlbGVjdG9yIHdpbGwgYWx3YXlzIHJldHVybiBhIG5ld1xuLy8gb2JqZWN0IGFuZCBzaG91bGRDb21wb25lbnRVcGRhdGUgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkoZGlzcGF0Y2gsIF9yZWYyKSB7XG4gIHZhciBpbml0TWFwU3RhdGVUb1Byb3BzID0gX3JlZjIuaW5pdE1hcFN0YXRlVG9Qcm9wcyxcbiAgICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMgPSBfcmVmMi5pbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICAgICAgaW5pdE1lcmdlUHJvcHMgPSBfcmVmMi5pbml0TWVyZ2VQcm9wcyxcbiAgICAgIG9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmMiwgW1wiaW5pdE1hcFN0YXRlVG9Qcm9wc1wiLCBcImluaXRNYXBEaXNwYXRjaFRvUHJvcHNcIiwgXCJpbml0TWVyZ2VQcm9wc1wiXSk7XG5cbiAgdmFyIG1hcFN0YXRlVG9Qcm9wcyA9IGluaXRNYXBTdGF0ZVRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICB2YXIgbWFwRGlzcGF0Y2hUb1Byb3BzID0gaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIHZhciBtZXJnZVByb3BzID0gaW5pdE1lcmdlUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBvcHRpb25zLmRpc3BsYXlOYW1lKTtcbiAgfVxuXG4gIHZhciBzZWxlY3RvckZhY3RvcnkgPSBvcHRpb25zLnB1cmUgPyBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeSA6IGltcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3Rvcnk7XG4gIHJldHVybiBzZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCBvcHRpb25zKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZVwiO1xuaW1wb3J0IGNvbm5lY3RBZHZhbmNlZCBmcm9tICcuLi9jb21wb25lbnRzL2Nvbm5lY3RBZHZhbmNlZCc7XG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJy4uL3V0aWxzL3NoYWxsb3dFcXVhbCc7XG5pbXBvcnQgZGVmYXVsdE1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcyBmcm9tICcuL21hcERpc3BhdGNoVG9Qcm9wcyc7XG5pbXBvcnQgZGVmYXVsdE1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcyBmcm9tICcuL21hcFN0YXRlVG9Qcm9wcyc7XG5pbXBvcnQgZGVmYXVsdE1lcmdlUHJvcHNGYWN0b3JpZXMgZnJvbSAnLi9tZXJnZVByb3BzJztcbmltcG9ydCBkZWZhdWx0U2VsZWN0b3JGYWN0b3J5IGZyb20gJy4vc2VsZWN0b3JGYWN0b3J5Jztcbi8qXHJcbiAgY29ubmVjdCBpcyBhIGZhY2FkZSBvdmVyIGNvbm5lY3RBZHZhbmNlZC4gSXQgdHVybnMgaXRzIGFyZ3MgaW50byBhIGNvbXBhdGlibGVcclxuICBzZWxlY3RvckZhY3RvcnksIHdoaWNoIGhhcyB0aGUgc2lnbmF0dXJlOlxyXG5cclxuICAgIChkaXNwYXRjaCwgb3B0aW9ucykgPT4gKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSA9PiBuZXh0RmluYWxQcm9wc1xyXG4gIFxyXG4gIGNvbm5lY3QgcGFzc2VzIGl0cyBhcmdzIHRvIGNvbm5lY3RBZHZhbmNlZCBhcyBvcHRpb25zLCB3aGljaCB3aWxsIGluIHR1cm4gcGFzcyB0aGVtIHRvXHJcbiAgc2VsZWN0b3JGYWN0b3J5IGVhY2ggdGltZSBhIENvbm5lY3QgY29tcG9uZW50IGluc3RhbmNlIGlzIGluc3RhbnRpYXRlZCBvciBob3QgcmVsb2FkZWQuXHJcblxyXG4gIHNlbGVjdG9yRmFjdG9yeSByZXR1cm5zIGEgZmluYWwgcHJvcHMgc2VsZWN0b3IgZnJvbSBpdHMgbWFwU3RhdGVUb1Byb3BzLFxyXG4gIG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3JpZXMsIG1lcmdlUHJvcHMsXHJcbiAgbWVyZ2VQcm9wc0ZhY3RvcmllcywgYW5kIHB1cmUgYXJncy5cclxuXHJcbiAgVGhlIHJlc3VsdGluZyBmaW5hbCBwcm9wcyBzZWxlY3RvciBpcyBjYWxsZWQgYnkgdGhlIENvbm5lY3QgY29tcG9uZW50IGluc3RhbmNlIHdoZW5ldmVyXHJcbiAgaXQgcmVjZWl2ZXMgbmV3IHByb3BzIG9yIHN0b3JlIHN0YXRlLlxyXG4gKi9cblxuZnVuY3Rpb24gbWF0Y2goYXJnLCBmYWN0b3JpZXMsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IGZhY3Rvcmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciByZXN1bHQgPSBmYWN0b3JpZXNbaV0oYXJnKTtcbiAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgb3B0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmFsdWUgb2YgdHlwZSBcIiArIHR5cGVvZiBhcmcgKyBcIiBmb3IgXCIgKyBuYW1lICsgXCIgYXJndW1lbnQgd2hlbiBjb25uZWN0aW5nIGNvbXBvbmVudCBcIiArIG9wdGlvbnMud3JhcHBlZENvbXBvbmVudE5hbWUgKyBcIi5cIik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0cmljdEVxdWFsKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT09IGI7XG59IC8vIGNyZWF0ZUNvbm5lY3Qgd2l0aCBkZWZhdWx0IGFyZ3MgYnVpbGRzIHRoZSAnb2ZmaWNpYWwnIGNvbm5lY3QgYmVoYXZpb3IuIENhbGxpbmcgaXQgd2l0aFxuLy8gZGlmZmVyZW50IG9wdGlvbnMgb3BlbnMgdXAgc29tZSB0ZXN0aW5nIGFuZCBleHRlbnNpYmlsaXR5IHNjZW5hcmlvc1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25uZWN0KF90ZW1wKSB7XG4gIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICBfcmVmJGNvbm5lY3RIT0MgPSBfcmVmLmNvbm5lY3RIT0MsXG4gICAgICBjb25uZWN0SE9DID0gX3JlZiRjb25uZWN0SE9DID09PSB2b2lkIDAgPyBjb25uZWN0QWR2YW5jZWQgOiBfcmVmJGNvbm5lY3RIT0MsXG4gICAgICBfcmVmJG1hcFN0YXRlVG9Qcm9wc0YgPSBfcmVmLm1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcyxcbiAgICAgIG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcyA9IF9yZWYkbWFwU3RhdGVUb1Byb3BzRiA9PT0gdm9pZCAwID8gZGVmYXVsdE1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcyA6IF9yZWYkbWFwU3RhdGVUb1Byb3BzRixcbiAgICAgIF9yZWYkbWFwRGlzcGF0Y2hUb1BybyA9IF9yZWYubWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzLFxuICAgICAgbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzID0gX3JlZiRtYXBEaXNwYXRjaFRvUHJvID09PSB2b2lkIDAgPyBkZWZhdWx0TWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzIDogX3JlZiRtYXBEaXNwYXRjaFRvUHJvLFxuICAgICAgX3JlZiRtZXJnZVByb3BzRmFjdG9yID0gX3JlZi5tZXJnZVByb3BzRmFjdG9yaWVzLFxuICAgICAgbWVyZ2VQcm9wc0ZhY3RvcmllcyA9IF9yZWYkbWVyZ2VQcm9wc0ZhY3RvciA9PT0gdm9pZCAwID8gZGVmYXVsdE1lcmdlUHJvcHNGYWN0b3JpZXMgOiBfcmVmJG1lcmdlUHJvcHNGYWN0b3IsXG4gICAgICBfcmVmJHNlbGVjdG9yRmFjdG9yeSA9IF9yZWYuc2VsZWN0b3JGYWN0b3J5LFxuICAgICAgc2VsZWN0b3JGYWN0b3J5ID0gX3JlZiRzZWxlY3RvckZhY3RvcnkgPT09IHZvaWQgMCA/IGRlZmF1bHRTZWxlY3RvckZhY3RvcnkgOiBfcmVmJHNlbGVjdG9yRmFjdG9yeTtcblxuICByZXR1cm4gZnVuY3Rpb24gY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgX3JlZjIpIHtcbiAgICBpZiAoX3JlZjIgPT09IHZvaWQgMCkge1xuICAgICAgX3JlZjIgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjMgPSBfcmVmMixcbiAgICAgICAgX3JlZjMkcHVyZSA9IF9yZWYzLnB1cmUsXG4gICAgICAgIHB1cmUgPSBfcmVmMyRwdXJlID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZjMkcHVyZSxcbiAgICAgICAgX3JlZjMkYXJlU3RhdGVzRXF1YWwgPSBfcmVmMy5hcmVTdGF0ZXNFcXVhbCxcbiAgICAgICAgYXJlU3RhdGVzRXF1YWwgPSBfcmVmMyRhcmVTdGF0ZXNFcXVhbCA9PT0gdm9pZCAwID8gc3RyaWN0RXF1YWwgOiBfcmVmMyRhcmVTdGF0ZXNFcXVhbCxcbiAgICAgICAgX3JlZjMkYXJlT3duUHJvcHNFcXVhID0gX3JlZjMuYXJlT3duUHJvcHNFcXVhbCxcbiAgICAgICAgYXJlT3duUHJvcHNFcXVhbCA9IF9yZWYzJGFyZU93blByb3BzRXF1YSA9PT0gdm9pZCAwID8gc2hhbGxvd0VxdWFsIDogX3JlZjMkYXJlT3duUHJvcHNFcXVhLFxuICAgICAgICBfcmVmMyRhcmVTdGF0ZVByb3BzRXEgPSBfcmVmMy5hcmVTdGF0ZVByb3BzRXF1YWwsXG4gICAgICAgIGFyZVN0YXRlUHJvcHNFcXVhbCA9IF9yZWYzJGFyZVN0YXRlUHJvcHNFcSA9PT0gdm9pZCAwID8gc2hhbGxvd0VxdWFsIDogX3JlZjMkYXJlU3RhdGVQcm9wc0VxLFxuICAgICAgICBfcmVmMyRhcmVNZXJnZWRQcm9wc0UgPSBfcmVmMy5hcmVNZXJnZWRQcm9wc0VxdWFsLFxuICAgICAgICBhcmVNZXJnZWRQcm9wc0VxdWFsID0gX3JlZjMkYXJlTWVyZ2VkUHJvcHNFID09PSB2b2lkIDAgPyBzaGFsbG93RXF1YWwgOiBfcmVmMyRhcmVNZXJnZWRQcm9wc0UsXG4gICAgICAgIGV4dHJhT3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYzLCBbXCJwdXJlXCIsIFwiYXJlU3RhdGVzRXF1YWxcIiwgXCJhcmVPd25Qcm9wc0VxdWFsXCIsIFwiYXJlU3RhdGVQcm9wc0VxdWFsXCIsIFwiYXJlTWVyZ2VkUHJvcHNFcXVhbFwiXSk7XG5cbiAgICB2YXIgaW5pdE1hcFN0YXRlVG9Qcm9wcyA9IG1hdGNoKG1hcFN0YXRlVG9Qcm9wcywgbWFwU3RhdGVUb1Byb3BzRmFjdG9yaWVzLCAnbWFwU3RhdGVUb1Byb3BzJyk7XG4gICAgdmFyIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMgPSBtYXRjaChtYXBEaXNwYXRjaFRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpO1xuICAgIHZhciBpbml0TWVyZ2VQcm9wcyA9IG1hdGNoKG1lcmdlUHJvcHMsIG1lcmdlUHJvcHNGYWN0b3JpZXMsICdtZXJnZVByb3BzJyk7XG4gICAgcmV0dXJuIGNvbm5lY3RIT0Moc2VsZWN0b3JGYWN0b3J5LCBfZXh0ZW5kcyh7XG4gICAgICAvLyB1c2VkIGluIGVycm9yIG1lc3NhZ2VzXG4gICAgICBtZXRob2ROYW1lOiAnY29ubmVjdCcsXG4gICAgICAvLyB1c2VkIHRvIGNvbXB1dGUgQ29ubmVjdCdzIGRpc3BsYXlOYW1lIGZyb20gdGhlIHdyYXBwZWQgY29tcG9uZW50J3MgZGlzcGxheU5hbWUuXG4gICAgICBnZXREaXNwbGF5TmFtZTogZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUobmFtZSkge1xuICAgICAgICByZXR1cm4gXCJDb25uZWN0KFwiICsgbmFtZSArIFwiKVwiO1xuICAgICAgfSxcbiAgICAgIC8vIGlmIG1hcFN0YXRlVG9Qcm9wcyBpcyBmYWxzeSwgdGhlIENvbm5lY3QgY29tcG9uZW50IGRvZXNuJ3Qgc3Vic2NyaWJlIHRvIHN0b3JlIHN0YXRlIGNoYW5nZXNcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlczogQm9vbGVhbihtYXBTdGF0ZVRvUHJvcHMpLFxuICAgICAgLy8gcGFzc2VkIHRocm91Z2ggdG8gc2VsZWN0b3JGYWN0b3J5XG4gICAgICBpbml0TWFwU3RhdGVUb1Byb3BzOiBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wczogaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyxcbiAgICAgIGluaXRNZXJnZVByb3BzOiBpbml0TWVyZ2VQcm9wcyxcbiAgICAgIHB1cmU6IHB1cmUsXG4gICAgICBhcmVTdGF0ZXNFcXVhbDogYXJlU3RhdGVzRXF1YWwsXG4gICAgICBhcmVPd25Qcm9wc0VxdWFsOiBhcmVPd25Qcm9wc0VxdWFsLFxuICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsOiBhcmVTdGF0ZVByb3BzRXF1YWwsXG4gICAgICBhcmVNZXJnZWRQcm9wc0VxdWFsOiBhcmVNZXJnZWRQcm9wc0VxdWFsXG4gICAgfSwgZXh0cmFPcHRpb25zKSk7XG4gIH07XG59XG5leHBvcnQgZGVmYXVsdFxuLyojX19QVVJFX18qL1xuY3JlYXRlQ29ubmVjdCgpOyIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG4vKipcclxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgdmFsdWUgb2YgdGhlIGBSZWFjdFJlZHV4Q29udGV4dGAuIFRoaXMgaXMgYSBsb3ctbGV2ZWxcclxuICogaG9vayB0aGF0IHlvdSBzaG91bGQgdXN1YWxseSBub3QgbmVlZCB0byBjYWxsIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgdmFsdWUgb2YgdGhlIGBSZWFjdFJlZHV4Q29udGV4dGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VSZWR1eENvbnRleHQgfSBmcm9tICdyZWFjdC1yZWR1eCdcclxuICpcclxuICogZXhwb3J0IGNvbnN0IENvdW50ZXJDb21wb25lbnQgPSAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAqICAgY29uc3QgeyBzdG9yZSB9ID0gdXNlUmVkdXhDb250ZXh0KClcclxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cclxuICogfVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZHV4Q29udGV4dCgpIHtcbiAgdmFyIGNvbnRleHRWYWx1ZSA9IHVzZUNvbnRleHQoUmVhY3RSZWR1eENvbnRleHQpO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFjb250ZXh0VmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHJlYWN0LXJlZHV4IGNvbnRleHQgdmFsdWU7IHBsZWFzZSBlbnN1cmUgdGhlIGNvbXBvbmVudCBpcyB3cmFwcGVkIGluIGEgPFByb3ZpZGVyPicpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHRWYWx1ZTtcbn0iLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbnRleHQnO1xuaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IGFzIHVzZURlZmF1bHRSZWR1eENvbnRleHQgfSBmcm9tICcuL3VzZVJlZHV4Q29udGV4dCc7XG4vKipcclxuICogSG9vayBmYWN0b3J5LCB3aGljaCBjcmVhdGVzIGEgYHVzZVN0b3JlYCBob29rIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlU3RvcmVgIGhvb2sgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0KSB7XG4gIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHtcbiAgICBjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQ7XG4gIH1cblxuICB2YXIgdXNlUmVkdXhDb250ZXh0ID0gY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB1c2VDb250ZXh0KGNvbnRleHQpO1xuICB9O1xuICByZXR1cm4gZnVuY3Rpb24gdXNlU3RvcmUoKSB7XG4gICAgdmFyIF91c2VSZWR1eENvbnRleHQgPSB1c2VSZWR1eENvbnRleHQoKSxcbiAgICAgICAgc3RvcmUgPSBfdXNlUmVkdXhDb250ZXh0LnN0b3JlO1xuXG4gICAgcmV0dXJuIHN0b3JlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgcmVkdXggc3RvcmVcclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VTdG9yZSB9IGZyb20gJ3JlYWN0LXJlZHV4J1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgRXhhbXBsZUNvbXBvbmVudCA9ICgpID0+IHtcclxuICogICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlKClcclxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cclxuICogfVxyXG4gKi9cblxuZXhwb3J0IHZhciB1c2VTdG9yZSA9XG4vKiNfX1BVUkVfXyovXG5jcmVhdGVTdG9yZUhvb2soKTsiLCJpbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTdG9yZSBhcyB1c2VEZWZhdWx0U3RvcmUsIGNyZWF0ZVN0b3JlSG9vayB9IGZyb20gJy4vdXNlU3RvcmUnO1xuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VEaXNwYXRjaGAgaG9vayBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgYHVzZURpc3BhdGNoYCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXNwYXRjaEhvb2soY29udGV4dCkge1xuICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7XG4gICAgY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0O1xuICB9XG5cbiAgdmFyIHVzZVN0b3JlID0gY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VEZWZhdWx0U3RvcmUgOiBjcmVhdGVTdG9yZUhvb2soY29udGV4dCk7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VEaXNwYXRjaCgpIHtcbiAgICB2YXIgc3RvcmUgPSB1c2VTdG9yZSgpO1xuICAgIHJldHVybiBzdG9yZS5kaXNwYXRjaDtcbiAgfTtcbn1cbi8qKlxyXG4gKiBBIGhvb2sgdG8gYWNjZXNzIHRoZSByZWR1eCBgZGlzcGF0Y2hgIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fGZ1bmN0aW9ufSByZWR1eCBzdG9yZSdzIGBkaXNwYXRjaGAgZnVuY3Rpb25cclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZURpc3BhdGNoIH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKHsgdmFsdWUgfSkgPT4ge1xyXG4gKiAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKVxyXG4gKiAgIGNvbnN0IGluY3JlYXNlQ291bnRlciA9IHVzZUNhbGxiYWNrKCgpID0+IGRpc3BhdGNoKHsgdHlwZTogJ2luY3JlYXNlLWNvdW50ZXInIH0pLCBbXSlcclxuICogICByZXR1cm4gKFxyXG4gKiAgICAgPGRpdj5cclxuICogICAgICAgPHNwYW4+e3ZhbHVlfTwvc3Bhbj5cclxuICogICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtpbmNyZWFzZUNvdW50ZXJ9PkluY3JlYXNlIGNvdW50ZXI8L2J1dHRvbj5cclxuICogICAgIDwvZGl2PlxyXG4gKiAgIClcclxuICogfVxyXG4gKi9cblxuZXhwb3J0IHZhciB1c2VEaXNwYXRjaCA9XG4vKiNfX1BVUkVfXyovXG5jcmVhdGVEaXNwYXRjaEhvb2soKTsiLCJpbXBvcnQgeyB1c2VSZWR1Y2VyLCB1c2VSZWYsIHVzZU1lbW8sIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWR1eENvbnRleHQgYXMgdXNlRGVmYXVsdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vdXNlUmVkdXhDb250ZXh0JztcbmltcG9ydCBTdWJzY3JpcHRpb24gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcblxudmFyIHJlZkVxdWFsaXR5ID0gZnVuY3Rpb24gcmVmRXF1YWxpdHkoYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn07XG5cbmZ1bmN0aW9uIHVzZVNlbGVjdG9yV2l0aFN0b3JlQW5kU3Vic2NyaXB0aW9uKHNlbGVjdG9yLCBlcXVhbGl0eUZuLCBzdG9yZSwgY29udGV4dFN1Yikge1xuICB2YXIgX3VzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyKGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMgKyAxO1xuICB9LCAwKSxcbiAgICAgIGZvcmNlUmVuZGVyID0gX3VzZVJlZHVjZXJbMV07XG5cbiAgdmFyIHN1YnNjcmlwdGlvbiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKHN0b3JlLCBjb250ZXh0U3ViKTtcbiAgfSwgW3N0b3JlLCBjb250ZXh0U3ViXSk7XG4gIHZhciBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yID0gdXNlUmVmKCk7XG4gIHZhciBsYXRlc3RTZWxlY3RvciA9IHVzZVJlZigpO1xuICB2YXIgbGF0ZXN0U2VsZWN0ZWRTdGF0ZSA9IHVzZVJlZigpO1xuICB2YXIgc2VsZWN0ZWRTdGF0ZTtcblxuICB0cnkge1xuICAgIGlmIChzZWxlY3RvciAhPT0gbGF0ZXN0U2VsZWN0b3IuY3VycmVudCB8fCBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQpIHtcbiAgICAgIHNlbGVjdGVkU3RhdGUgPSBzZWxlY3RvcihzdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTdGF0ZSA9IGxhdGVzdFNlbGVjdGVkU3RhdGUuY3VycmVudDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQpIHtcbiAgICAgIGVyci5tZXNzYWdlICs9IFwiXFxuVGhlIGVycm9yIG1heSBiZSBjb3JyZWxhdGVkIHdpdGggdGhpcyBwcmV2aW91cyBlcnJvcjpcXG5cIiArIGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudC5zdGFjayArIFwiXFxuXFxuXCI7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgbGF0ZXN0U2VsZWN0b3IuY3VycmVudCA9IHNlbGVjdG9yO1xuICAgIGxhdGVzdFNlbGVjdGVkU3RhdGUuY3VycmVudCA9IHNlbGVjdGVkU3RhdGU7XG4gICAgbGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICB9KTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gY2hlY2tGb3JVcGRhdGVzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG5ld1NlbGVjdGVkU3RhdGUgPSBsYXRlc3RTZWxlY3Rvci5jdXJyZW50KHN0b3JlLmdldFN0YXRlKCkpO1xuXG4gICAgICAgIGlmIChlcXVhbGl0eUZuKG5ld1NlbGVjdGVkU3RhdGUsIGxhdGVzdFNlbGVjdGVkU3RhdGUuY3VycmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsYXRlc3RTZWxlY3RlZFN0YXRlLmN1cnJlbnQgPSBuZXdTZWxlY3RlZFN0YXRlO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIHdlIGlnbm9yZSBhbGwgZXJyb3JzIGhlcmUsIHNpbmNlIHdoZW4gdGhlIGNvbXBvbmVudFxuICAgICAgICAvLyBpcyByZS1yZW5kZXJlZCwgdGhlIHNlbGVjdG9ycyBhcmUgY2FsbGVkIGFnYWluLCBhbmRcbiAgICAgICAgLy8gd2lsbCB0aHJvdyBhZ2FpbiwgaWYgbmVpdGhlciBwcm9wcyBub3Igc3RvcmUgc3RhdGVcbiAgICAgICAgLy8gY2hhbmdlZFxuICAgICAgICBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQgPSBlcnI7XG4gICAgICB9XG5cbiAgICAgIGZvcmNlUmVuZGVyKHt9KTtcbiAgICB9XG5cbiAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IGNoZWNrRm9yVXBkYXRlcztcbiAgICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG4gICAgY2hlY2tGb3JVcGRhdGVzKCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICB9LCBbc3RvcmUsIHN1YnNjcmlwdGlvbl0pO1xuICByZXR1cm4gc2VsZWN0ZWRTdGF0ZTtcbn1cbi8qKlxyXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlU2VsZWN0b3JgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWN0LkNvbnRleHR9IFtjb250ZXh0PVJlYWN0UmVkdXhDb250ZXh0XSBDb250ZXh0IHBhc3NlZCB0byB5b3VyIGA8UHJvdmlkZXI+YC5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VTZWxlY3RvcmAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXHJcbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3Rvckhvb2soY29udGV4dCkge1xuICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7XG4gICAgY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0O1xuICB9XG5cbiAgdmFyIHVzZVJlZHV4Q29udGV4dCA9IGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlRGVmYXVsdFJlZHV4Q29udGV4dCA6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdXNlQ29udGV4dChjb250ZXh0KTtcbiAgfTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVNlbGVjdG9yKHNlbGVjdG9yLCBlcXVhbGl0eUZuKSB7XG4gICAgaWYgKGVxdWFsaXR5Rm4gPT09IHZvaWQgMCkge1xuICAgICAgZXF1YWxpdHlGbiA9IHJlZkVxdWFsaXR5O1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFzZWxlY3Rvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgcGFzcyBhIHNlbGVjdG9yIHRvIHVzZVNlbGVjdG9yc1wiKTtcbiAgICB9XG5cbiAgICB2YXIgX3VzZVJlZHV4Q29udGV4dCA9IHVzZVJlZHV4Q29udGV4dCgpLFxuICAgICAgICBzdG9yZSA9IF91c2VSZWR1eENvbnRleHQuc3RvcmUsXG4gICAgICAgIGNvbnRleHRTdWIgPSBfdXNlUmVkdXhDb250ZXh0LnN1YnNjcmlwdGlvbjtcblxuICAgIHJldHVybiB1c2VTZWxlY3RvcldpdGhTdG9yZUFuZFN1YnNjcmlwdGlvbihzZWxlY3RvciwgZXF1YWxpdHlGbiwgc3RvcmUsIGNvbnRleHRTdWIpO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlJ3Mgc3RhdGUuIFRoaXMgaG9vayB0YWtlcyBhIHNlbGVjdG9yIGZ1bmN0aW9uXHJcbiAqIGFzIGFuIGFyZ3VtZW50LiBUaGUgc2VsZWN0b3IgaXMgY2FsbGVkIHdpdGggdGhlIHN0b3JlIHN0YXRlLlxyXG4gKlxyXG4gKiBUaGlzIGhvb2sgdGFrZXMgYW4gb3B0aW9uYWwgZXF1YWxpdHkgY29tcGFyaXNvbiBmdW5jdGlvbiBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlclxyXG4gKiB0aGF0IGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB3YXkgdGhlIHNlbGVjdGVkIHN0YXRlIGlzIGNvbXBhcmVkIHRvIGRldGVybWluZVxyXG4gKiB3aGV0aGVyIHRoZSBjb21wb25lbnQgbmVlZHMgdG8gYmUgcmUtcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGVjdG9yIHRoZSBzZWxlY3RvciBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gZXF1YWxpdHlGbiB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGVxdWFsaXR5XHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl9IHRoZSBzZWxlY3RlZCBzdGF0ZVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IGNvdW50ZXIgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5jb3VudGVyKVxyXG4gKiAgIHJldHVybiA8ZGl2Pntjb3VudGVyfTwvZGl2PlxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgdmFyIHVzZVNlbGVjdG9yID1cbi8qI19fUFVSRV9fKi9cbmNyZWF0ZVNlbGVjdG9ySG9vaygpOyIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby11bnJlc29sdmVkICovXG5leHBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gJ3JlYWN0LWRvbSc7IiwiaW1wb3J0IFByb3ZpZGVyIGZyb20gJy4vY29tcG9uZW50cy9Qcm92aWRlcic7XG5pbXBvcnQgY29ubmVjdEFkdmFuY2VkIGZyb20gJy4vY29tcG9uZW50cy9jb25uZWN0QWR2YW5jZWQnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgY29ubmVjdCBmcm9tICcuL2Nvbm5lY3QvY29ubmVjdCc7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rIH0gZnJvbSAnLi9ob29rcy91c2VEaXNwYXRjaCc7XG5pbXBvcnQgeyB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTZWxlY3Rvcic7XG5pbXBvcnQgeyB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTdG9yZSc7XG5pbXBvcnQgeyBzZXRCYXRjaCB9IGZyb20gJy4vdXRpbHMvYmF0Y2gnO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgYXMgYmF0Y2ggfSBmcm9tICcuL3V0aWxzL3JlYWN0QmF0Y2hlZFVwZGF0ZXMnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICcuL3V0aWxzL3NoYWxsb3dFcXVhbCc7XG5zZXRCYXRjaChiYXRjaCk7XG5leHBvcnQgeyBQcm92aWRlciwgY29ubmVjdEFkdmFuY2VkLCBSZWFjdFJlZHV4Q29udGV4dCwgY29ubmVjdCwgYmF0Y2gsIHVzZURpc3BhdGNoLCBjcmVhdGVEaXNwYXRjaEhvb2ssIHVzZVNlbGVjdG9yLCBjcmVhdGVTZWxlY3Rvckhvb2ssIHVzZVN0b3JlLCBjcmVhdGVTdG9yZUhvb2ssIHNoYWxsb3dFcXVhbCB9OyJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///18\\n')},function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval(\"/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \\\"a\\\", function() { return symbolObservablePonyfill; });\\nfunction symbolObservablePonyfill(root) {\\n\\tvar result;\\n\\tvar Symbol = root.Symbol;\\n\\n\\tif (typeof Symbol === 'function') {\\n\\t\\tif (Symbol.observable) {\\n\\t\\t\\tresult = Symbol.observable;\\n\\t\\t} else {\\n\\t\\t\\tresult = Symbol('observable');\\n\\t\\t\\tSymbol.observable = result;\\n\\t\\t}\\n\\t} else {\\n\\t\\tresult = '@@observable';\\n\\t}\\n\\n\\treturn result;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3ltYm9sLW9ic2VydmFibGUvZXMvcG9ueWZpbGwuanM/NDJkNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFlO0FBQ2Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIxOS5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN5bWJvbE9ic2VydmFibGVQb255ZmlsbChyb290KSB7XG5cdHZhciByZXN1bHQ7XG5cdHZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxuXHRpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGlmIChTeW1ib2wub2JzZXJ2YWJsZSkge1xuXHRcdFx0cmVzdWx0ID0gU3ltYm9sLm9ic2VydmFibGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdCA9IFN5bWJvbCgnb2JzZXJ2YWJsZScpO1xuXHRcdFx0U3ltYm9sLm9ic2VydmFibGUgPSByZXN1bHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9ICdAQG9ic2VydmFibGUnO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///19\\n\")},function(n,t,e){n.exports=e(21)},function(module,exports,__webpack_require__){\"use strict\";eval('\\nvar __importDefault = (this && this.__importDefault) || function (mod) {\\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\\n};\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nconst react_1 = __importDefault(__webpack_require__(0));\\nconst react_dom_1 = __importDefault(__webpack_require__(3));\\nconst react_redux_1 = __webpack_require__(18);\\nconst redux_1 = __webpack_require__(2);\\nconst reducers_ts_1 = __importDefault(__webpack_require__(31));\\nconst MainContainer_tsx_1 = __importDefault(__webpack_require__(32));\\nconst redux_logger_1 = __webpack_require__(60);\\nconst redux_thunk_1 = __importDefault(__webpack_require__(61));\\nconst loggerMiddleware = redux_logger_1.createLogger();\\nconst store = redux_1.createStore(reducers_ts_1.default, redux_1.applyMiddleware(redux_thunk_1.default, loggerMiddleware));\\nreact_dom_1.default.render(react_1.default.createElement(react_redux_1.Provider, { store: store },\\n react_1.default.createElement(MainContainer_tsx_1.default, null)), document.getElementById(\\'widget\\'));\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvaW5kZXgudHN4P2ExNDUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3REFBMEI7QUFDMUIsNERBQWlDO0FBQ2pDLDhDQUF1QztBQUN2Qyx1Q0FBcUQ7QUFDckQsK0RBQXVDO0FBQ3ZDLHFFQUFnRDtBQUNoRCwrQ0FBNEM7QUFDNUMsK0RBQTBDO0FBRTFDLE1BQU0sZ0JBQWdCLEdBQUcsMkJBQVksRUFBRTtBQUN2QyxNQUFNLEtBQUssR0FBRyxtQkFBVyxDQUFDLHFCQUFXLEVBQUUsdUJBQWUsQ0FBQyxxQkFBZSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztBQUUzRixtQkFBUSxDQUFDLE1BQU0sQ0FDYiw4QkFBQyxzQkFBUSxJQUFDLEtBQUssRUFBRSxLQUFLO0lBQ3BCLDhCQUFDLDJCQUFhLE9BQUcsQ0FDUixFQUNYLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQ2xDLENBQUMiLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IGNyZWF0ZVN0b3JlLCBhcHBseU1pZGRsZXdhcmUgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgcm9vdFJlZHVjZXIgZnJvbSAnLi9yZWR1Y2Vycy50cydcbmltcG9ydCBNYWluQ29udGFpbmVyIGZyb20gXCIuL01haW5Db250YWluZXIudHN4XCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdyZWR1eC1sb2dnZXInO1xuaW1wb3J0IHRodW5rTWlkZGxld2FyZSBmcm9tICdyZWR1eC10aHVuayc7XG5cbmNvbnN0IGxvZ2dlck1pZGRsZXdhcmUgPSBjcmVhdGVMb2dnZXIoKVxuY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShyb290UmVkdWNlciwgYXBwbHlNaWRkbGV3YXJlKHRodW5rTWlkZGxld2FyZSwgbG9nZ2VyTWlkZGxld2FyZSkpO1xuXG5SZWFjdERPTS5yZW5kZXIoXG4gIDxQcm92aWRlciBzdG9yZT17c3RvcmV9PlxuICAgIDxNYWluQ29udGFpbmVyIC8+XG4gIDwvUHJvdmlkZXI+LFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2lkZ2V0Jylcbik7XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///21\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('/** @license React v16.13.1\\n * react.production.min.js\\n *\\n * Copyright (c) Facebook, Inc. and its affiliates.\\n *\\n * This source code is licensed under the MIT license found in the\\n * LICENSE file in the root directory of this source tree.\\n */\\n\\nvar l=__webpack_require__(8),n=\"function\"===typeof Symbol&&Symbol.for,p=n?Symbol.for(\"react.element\"):60103,q=n?Symbol.for(\"react.portal\"):60106,r=n?Symbol.for(\"react.fragment\"):60107,t=n?Symbol.for(\"react.strict_mode\"):60108,u=n?Symbol.for(\"react.profiler\"):60114,v=n?Symbol.for(\"react.provider\"):60109,w=n?Symbol.for(\"react.context\"):60110,x=n?Symbol.for(\"react.forward_ref\"):60112,y=n?Symbol.for(\"react.suspense\"):60113,z=n?Symbol.for(\"react.memo\"):60115,A=n?Symbol.for(\"react.lazy\"):\\n60116,B=\"function\"===typeof Symbol&&Symbol.iterator;function C(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}\\nvar D={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},E={};function F(a,b,c){this.props=a;this.context=b;this.refs=E;this.updater=c||D}F.prototype.isReactComponent={};F.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(C(85));this.updater.enqueueSetState(this,a,b,\"setState\")};F.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};\\nfunction G(){}G.prototype=F.prototype;function H(a,b,c){this.props=a;this.context=b;this.refs=E;this.updater=c||D}var I=H.prototype=new G;I.constructor=H;l(I,F.prototype);I.isPureReactComponent=!0;var J={current:null},K=Object.prototype.hasOwnProperty,L={key:!0,ref:!0,__self:!0,__source:!0};\\nfunction M(a,b,c){var e,d={},g=null,k=null;if(null!=b)for(e in void 0!==b.ref&&(k=b.ref),void 0!==b.key&&(g=\"\"+b.key),b)K.call(b,e)&&!L.hasOwnProperty(e)&&(d[e]=b[e]);var f=arguments.length-2;if(1===f)d.children=c;else if(1<f){for(var h=Array(f),m=0;m<f;m++)h[m]=arguments[m+2];d.children=h}if(a&&a.defaultProps)for(e in f=a.defaultProps,f)void 0===d[e]&&(d[e]=f[e]);return{$$typeof:p,type:a,key:g,ref:k,props:d,_owner:J.current}}\\nfunction N(a,b){return{$$typeof:p,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===p}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+a).replace(/[=:]/g,function(a){return b[a]})}var P=/\\\\/+/g,Q=[];function R(a,b,c,e){if(Q.length){var d=Q.pop();d.result=a;d.keyPrefix=b;d.func=c;d.context=e;d.count=0;return d}return{result:a,keyPrefix:b,func:c,context:e,count:0}}\\nfunction S(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>Q.length&&Q.push(a)}\\nfunction T(a,b,c,e){var d=typeof a;if(\"undefined\"===d||\"boolean\"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case p:case q:g=!0}}if(g)return c(e,a,\"\"===b?\".\"+U(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var k=0;k<a.length;k++){d=a[k];var f=b+U(d,k);g+=T(d,f,c,e)}else if(null===a||\"object\"!==typeof a?f=null:(f=B&&a[B]||a[\"@@iterator\"],f=\"function\"===typeof f?f:null),\"function\"===typeof f)for(a=f.call(a),k=\\n0;!(d=a.next()).done;)d=d.value,f=b+U(d,k++),g+=T(d,f,c,e);else if(\"object\"===d)throw c=\"\"+a,Error(C(31,\"[object Object]\"===c?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":c,\"\"));return g}function V(a,b,c){return null==a?0:T(a,\"\",b,c)}function U(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function W(a,b){a.func.call(a.context,b,a.count++)}\\nfunction aa(a,b,c){var e=a.result,d=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?X(a,e,c,function(a){return a}):null!=a&&(O(a)&&(a=N(a,d+(!a.key||b&&b.key===a.key?\"\":(\"\"+a.key).replace(P,\"$&/\")+\"/\")+c)),e.push(a))}function X(a,b,c,e,d){var g=\"\";null!=c&&(g=(\"\"+c).replace(P,\"$&/\")+\"/\");b=R(b,g,e,d);V(a,aa,b);S(b)}var Y={current:null};function Z(){var a=Y.current;if(null===a)throw Error(C(321));return a}\\nvar ba={ReactCurrentDispatcher:Y,ReactCurrentBatchConfig:{suspense:null},ReactCurrentOwner:J,IsSomeRendererActing:{current:!1},assign:l};exports.Children={map:function(a,b,c){if(null==a)return a;var e=[];X(a,e,null,b,c);return e},forEach:function(a,b,c){if(null==a)return a;b=R(null,null,b,c);V(a,W,b);S(b)},count:function(a){return V(a,function(){return null},null)},toArray:function(a){var b=[];X(a,b,null,function(a){return a});return b},only:function(a){if(!O(a))throw Error(C(143));return a}};\\nexports.Component=F;exports.Fragment=r;exports.Profiler=u;exports.PureComponent=H;exports.StrictMode=t;exports.Suspense=y;exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ba;\\nexports.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(C(267,a));var e=l({},a.props),d=a.key,g=a.ref,k=a._owner;if(null!=b){void 0!==b.ref&&(g=b.ref,k=J.current);void 0!==b.key&&(d=\"\"+b.key);if(a.type&&a.type.defaultProps)var f=a.type.defaultProps;for(h in b)K.call(b,h)&&!L.hasOwnProperty(h)&&(e[h]=void 0===b[h]&&void 0!==f?f[h]:b[h])}var h=arguments.length-2;if(1===h)e.children=c;else if(1<h){f=Array(h);for(var m=0;m<h;m++)f[m]=arguments[m+2];e.children=f}return{$$typeof:p,type:a.type,\\nkey:d,ref:g,props:e,_owner:k}};exports.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:w,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:v,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};exports.forwardRef=function(a){return{$$typeof:x,render:a}};exports.isValidElement=O;\\nexports.lazy=function(a){return{$$typeof:A,_ctor:a,_status:-1,_result:null}};exports.memo=function(a,b){return{$$typeof:z,type:a,compare:void 0===b?null:b}};exports.useCallback=function(a,b){return Z().useCallback(a,b)};exports.useContext=function(a,b){return Z().useContext(a,b)};exports.useDebugValue=function(){};exports.useEffect=function(a,b){return Z().useEffect(a,b)};exports.useImperativeHandle=function(a,b,c){return Z().useImperativeHandle(a,b,c)};\\nexports.useLayoutEffect=function(a,b){return Z().useLayoutEffect(a,b)};exports.useMemo=function(a,b){return Z().useMemo(a,b)};exports.useReducer=function(a,b,c){return Z().useReducer(a,b,c)};exports.useRef=function(a){return Z().useRef(a)};exports.useState=function(a){return Z().useState(a)};exports.version=\"16.13.1\";\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzP2QxMzgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYSxNQUFNLG1CQUFPLENBQUMsQ0FBZTtBQUMxQyxvREFBb0QsY0FBYyx5RUFBeUUsbUJBQW1CLG1EQUFtRCxtQ0FBbUM7QUFDcFAsT0FBTyxxQkFBcUIsU0FBUyxnQ0FBZ0MsaUNBQWlDLDhCQUE4QixNQUFNLGtCQUFrQixhQUFhLGVBQWUsWUFBWSxrQkFBa0IsZ0NBQWdDLG1DQUFtQywwRUFBMEUsbURBQW1ELG9DQUFvQztBQUMxYixjQUFjLHdCQUF3QixrQkFBa0IsYUFBYSxlQUFlLFlBQVksa0JBQWtCLHdCQUF3QixnQkFBZ0IsaUJBQWlCLDBCQUEwQixPQUFPLGFBQWEsc0NBQXNDO0FBQy9QLGtCQUFrQixVQUFVLGVBQWUsNEhBQTRILHlCQUF5QixzQkFBc0IsYUFBYSx1QkFBdUIsSUFBSSx3QkFBd0IsYUFBYSw0RUFBNEUsT0FBTztBQUN0WCxnQkFBZ0IsT0FBTyxzRUFBc0UsY0FBYyxvREFBb0QsbUJBQW1CLE9BQU8sbUJBQW1CLDZDQUE2QyxZQUFZLEVBQUUsa0JBQWtCLG9CQUFvQixhQUFhLGNBQWMsV0FBVyxjQUFjLFNBQVMsWUFBWSxVQUFVLFNBQVMsT0FBTztBQUNoWixjQUFjLGNBQWMsaUJBQWlCLFlBQVksZUFBZSxVQUFVO0FBQ2xGLG9CQUFvQixlQUFlLHlDQUF5QyxTQUFTLGlCQUFpQixlQUFlLGlDQUFpQyxNQUFNLGlDQUFpQyxvQkFBb0IseUNBQXlDLElBQUksbUJBQW1CLGdDQUFnQyxXQUFXLEtBQUssT0FBTyxlQUFlLGNBQWM7QUFDclcsRUFBRSxtQkFBbUIsc0NBQXNDLHNGQUFzRiw4QkFBOEIsU0FBUyxTQUFTLGtCQUFrQiw2QkFBNkIsZ0JBQWdCLDhFQUE4RSxnQkFBZ0I7QUFDOVYsbUJBQW1CLDZCQUE2QixxQ0FBcUMscUNBQXFDLFNBQVMsd0dBQXdHLHNCQUFzQixTQUFTLHlDQUF5QyxhQUFhLFVBQVUsS0FBSyxPQUFPLGNBQWMsYUFBYSxnQkFBZ0IsZ0NBQWdDO0FBQ2phLFFBQVEsa0RBQWtELGNBQWMsMkNBQTJDLFdBQVcsV0FBVyxrQkFBa0Isb0JBQW9CLG9CQUFvQixTQUFTLGdCQUFnQixTQUFTLHlCQUF5QixvQkFBb0IsbUJBQW1CLFNBQVMsS0FBSyxtQkFBbUIsc0JBQXNCLFlBQVksT0FBTyxxQkFBcUIsU0FBUyx1QkFBdUIsU0FBUyxFQUFFLFNBQVMsa0JBQWtCLDZCQUE2QjtBQUN2ZSxvQkFBb0IsbUJBQW1CLG1CQUFtQix3QkFBd0IscUJBQXFCLG1CQUFtQjtBQUMxSCxxQ0FBcUMsOENBQThDLFVBQVUscUNBQXFDLFlBQVksc0NBQXNDLDZCQUE2Qix5REFBeUQseUZBQXlGLHlCQUF5QixzQkFBc0IsYUFBYSxXQUFXLFlBQVksSUFBSSx3QkFBd0IsYUFBYSxPQUFPO0FBQ3RlLCtCQUErQixvQ0FBb0MscUJBQXFCLEdBQUcsZ0hBQWdILFlBQVksdUJBQXVCLHFCQUFxQix3QkFBd0Isa0NBQWtDLHFCQUFxQixTQUFTLFVBQVUsNkJBQTZCLE9BQU8sZUFBZSwrQkFBK0IsT0FBTyxzQkFBc0I7QUFDcGQseUJBQXlCLE9BQU8sNkNBQTZDLDJCQUEyQixPQUFPLDhDQUE4QyxrQ0FBa0MsNkJBQTZCLGlDQUFpQyw0QkFBNEIsbUNBQW1DLGdDQUFnQywyQkFBMkIsNENBQTRDO0FBQ25hLHNDQUFzQyxpQ0FBaUMsOEJBQThCLHlCQUF5QixtQ0FBbUMsOEJBQThCLDJCQUEyQixzQkFBc0IsNkJBQTZCLHdCQUF3QiIsImZpbGUiOiIyMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7dmFyIGw9cmVxdWlyZShcIm9iamVjdC1hc3NpZ25cIiksbj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLHA9bj9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMyxxPW4/U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTo2MDEwNixyPW4/U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpOjYwMTA3LHQ9bj9TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik6NjAxMDgsdT1uP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTo2MDExNCx2PW4/U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpOjYwMTA5LHc9bj9TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTo2MDExMCx4PW4/U3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpOjYwMTEyLHk9bj9TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIik6NjAxMTMsej1uP1N5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpOjYwMTE1LEE9bj9TeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKTpcbjYwMTE2LEI9XCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIEMoYSl7Zm9yKHZhciBiPVwiaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9XCIrYSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyliKz1cIiZhcmdzW109XCIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tjXSk7cmV0dXJuXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjXCIrYStcIjsgdmlzaXQgXCIrYitcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuXCJ9XG52YXIgRD17aXNNb3VudGVkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKCl7fX0sRT17fTtmdW5jdGlvbiBGKGEsYixjKXt0aGlzLnByb3BzPWE7dGhpcy5jb250ZXh0PWI7dGhpcy5yZWZzPUU7dGhpcy51cGRhdGVyPWN8fER9Ri5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fTtGLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihhLGIpe2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJm51bGwhPWEpdGhyb3cgRXJyb3IoQyg4NSkpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxhLGIsXCJzZXRTdGF0ZVwiKX07Ri5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLGEsXCJmb3JjZVVwZGF0ZVwiKX07XG5mdW5jdGlvbiBHKCl7fUcucHJvdG90eXBlPUYucHJvdG90eXBlO2Z1bmN0aW9uIEgoYSxiLGMpe3RoaXMucHJvcHM9YTt0aGlzLmNvbnRleHQ9Yjt0aGlzLnJlZnM9RTt0aGlzLnVwZGF0ZXI9Y3x8RH12YXIgST1ILnByb3RvdHlwZT1uZXcgRztJLmNvbnN0cnVjdG9yPUg7bChJLEYucHJvdG90eXBlKTtJLmlzUHVyZVJlYWN0Q29tcG9uZW50PSEwO3ZhciBKPXtjdXJyZW50Om51bGx9LEs9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxMPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07XG5mdW5jdGlvbiBNKGEsYixjKXt2YXIgZSxkPXt9LGc9bnVsbCxrPW51bGw7aWYobnVsbCE9Yilmb3IoZSBpbiB2b2lkIDAhPT1iLnJlZiYmKGs9Yi5yZWYpLHZvaWQgMCE9PWIua2V5JiYoZz1cIlwiK2Iua2V5KSxiKUsuY2FsbChiLGUpJiYhTC5oYXNPd25Qcm9wZXJ0eShlKSYmKGRbZV09YltlXSk7dmFyIGY9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1mKWQuY2hpbGRyZW49YztlbHNlIGlmKDE8Zil7Zm9yKHZhciBoPUFycmF5KGYpLG09MDttPGY7bSsrKWhbbV09YXJndW1lbnRzW20rMl07ZC5jaGlsZHJlbj1ofWlmKGEmJmEuZGVmYXVsdFByb3BzKWZvcihlIGluIGY9YS5kZWZhdWx0UHJvcHMsZil2b2lkIDA9PT1kW2VdJiYoZFtlXT1mW2VdKTtyZXR1cm57JCR0eXBlb2Y6cCx0eXBlOmEsa2V5OmcscmVmOmsscHJvcHM6ZCxfb3duZXI6Si5jdXJyZW50fX1cbmZ1bmN0aW9uIE4oYSxiKXtyZXR1cm57JCR0eXBlb2Y6cCx0eXBlOmEudHlwZSxrZXk6YixyZWY6YS5yZWYscHJvcHM6YS5wcm9wcyxfb3duZXI6YS5fb3duZXJ9fWZ1bmN0aW9uIE8oYSl7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmYS4kJHR5cGVvZj09PXB9ZnVuY3Rpb24gZXNjYXBlKGEpe3ZhciBiPXtcIj1cIjpcIj0wXCIsXCI6XCI6XCI9MlwifTtyZXR1cm5cIiRcIisoXCJcIithKS5yZXBsYWNlKC9bPTpdL2csZnVuY3Rpb24oYSl7cmV0dXJuIGJbYV19KX12YXIgUD0vXFwvKy9nLFE9W107ZnVuY3Rpb24gUihhLGIsYyxlKXtpZihRLmxlbmd0aCl7dmFyIGQ9US5wb3AoKTtkLnJlc3VsdD1hO2Qua2V5UHJlZml4PWI7ZC5mdW5jPWM7ZC5jb250ZXh0PWU7ZC5jb3VudD0wO3JldHVybiBkfXJldHVybntyZXN1bHQ6YSxrZXlQcmVmaXg6YixmdW5jOmMsY29udGV4dDplLGNvdW50OjB9fVxuZnVuY3Rpb24gUyhhKXthLnJlc3VsdD1udWxsO2Eua2V5UHJlZml4PW51bGw7YS5mdW5jPW51bGw7YS5jb250ZXh0PW51bGw7YS5jb3VudD0wOzEwPlEubGVuZ3RoJiZRLnB1c2goYSl9XG5mdW5jdGlvbiBUKGEsYixjLGUpe3ZhciBkPXR5cGVvZiBhO2lmKFwidW5kZWZpbmVkXCI9PT1kfHxcImJvb2xlYW5cIj09PWQpYT1udWxsO3ZhciBnPSExO2lmKG51bGw9PT1hKWc9ITA7ZWxzZSBzd2l0Y2goZCl7Y2FzZSBcInN0cmluZ1wiOmNhc2UgXCJudW1iZXJcIjpnPSEwO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjpzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSBwOmNhc2UgcTpnPSEwfX1pZihnKXJldHVybiBjKGUsYSxcIlwiPT09Yj9cIi5cIitVKGEsMCk6YiksMTtnPTA7Yj1cIlwiPT09Yj9cIi5cIjpiK1wiOlwiO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBrPTA7azxhLmxlbmd0aDtrKyspe2Q9YVtrXTt2YXIgZj1iK1UoZCxrKTtnKz1UKGQsZixjLGUpfWVsc2UgaWYobnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYT9mPW51bGw6KGY9QiYmYVtCXXx8YVtcIkBAaXRlcmF0b3JcIl0sZj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgZj9mOm51bGwpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmKWZvcihhPWYuY2FsbChhKSxrPVxuMDshKGQ9YS5uZXh0KCkpLmRvbmU7KWQ9ZC52YWx1ZSxmPWIrVShkLGsrKyksZys9VChkLGYsYyxlKTtlbHNlIGlmKFwib2JqZWN0XCI9PT1kKXRocm93IGM9XCJcIithLEVycm9yKEMoMzEsXCJbb2JqZWN0IE9iamVjdF1cIj09PWM/XCJvYmplY3Qgd2l0aCBrZXlzIHtcIitPYmplY3Qua2V5cyhhKS5qb2luKFwiLCBcIikrXCJ9XCI6YyxcIlwiKSk7cmV0dXJuIGd9ZnVuY3Rpb24gVihhLGIsYyl7cmV0dXJuIG51bGw9PWE/MDpUKGEsXCJcIixiLGMpfWZ1bmN0aW9uIFUoYSxiKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZudWxsIT1hLmtleT9lc2NhcGUoYS5rZXkpOmIudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIFcoYSxiKXthLmZ1bmMuY2FsbChhLmNvbnRleHQsYixhLmNvdW50KyspfVxuZnVuY3Rpb24gYWEoYSxiLGMpe3ZhciBlPWEucmVzdWx0LGQ9YS5rZXlQcmVmaXg7YT1hLmZ1bmMuY2FsbChhLmNvbnRleHQsYixhLmNvdW50KyspO0FycmF5LmlzQXJyYXkoYSk/WChhLGUsYyxmdW5jdGlvbihhKXtyZXR1cm4gYX0pOm51bGwhPWEmJihPKGEpJiYoYT1OKGEsZCsoIWEua2V5fHxiJiZiLmtleT09PWEua2V5P1wiXCI6KFwiXCIrYS5rZXkpLnJlcGxhY2UoUCxcIiQmL1wiKStcIi9cIikrYykpLGUucHVzaChhKSl9ZnVuY3Rpb24gWChhLGIsYyxlLGQpe3ZhciBnPVwiXCI7bnVsbCE9YyYmKGc9KFwiXCIrYykucmVwbGFjZShQLFwiJCYvXCIpK1wiL1wiKTtiPVIoYixnLGUsZCk7VihhLGFhLGIpO1MoYil9dmFyIFk9e2N1cnJlbnQ6bnVsbH07ZnVuY3Rpb24gWigpe3ZhciBhPVkuY3VycmVudDtpZihudWxsPT09YSl0aHJvdyBFcnJvcihDKDMyMSkpO3JldHVybiBhfVxudmFyIGJhPXtSZWFjdEN1cnJlbnREaXNwYXRjaGVyOlksUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6e3N1c3BlbnNlOm51bGx9LFJlYWN0Q3VycmVudE93bmVyOkosSXNTb21lUmVuZGVyZXJBY3Rpbmc6e2N1cnJlbnQ6ITF9LGFzc2lnbjpsfTtleHBvcnRzLkNoaWxkcmVuPXttYXA6ZnVuY3Rpb24oYSxiLGMpe2lmKG51bGw9PWEpcmV0dXJuIGE7dmFyIGU9W107WChhLGUsbnVsbCxiLGMpO3JldHVybiBlfSxmb3JFYWNoOmZ1bmN0aW9uKGEsYixjKXtpZihudWxsPT1hKXJldHVybiBhO2I9UihudWxsLG51bGwsYixjKTtWKGEsVyxiKTtTKGIpfSxjb3VudDpmdW5jdGlvbihhKXtyZXR1cm4gVihhLGZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LG51bGwpfSx0b0FycmF5OmZ1bmN0aW9uKGEpe3ZhciBiPVtdO1goYSxiLG51bGwsZnVuY3Rpb24oYSl7cmV0dXJuIGF9KTtyZXR1cm4gYn0sb25seTpmdW5jdGlvbihhKXtpZighTyhhKSl0aHJvdyBFcnJvcihDKDE0MykpO3JldHVybiBhfX07XG5leHBvcnRzLkNvbXBvbmVudD1GO2V4cG9ydHMuRnJhZ21lbnQ9cjtleHBvcnRzLlByb2ZpbGVyPXU7ZXhwb3J0cy5QdXJlQ29tcG9uZW50PUg7ZXhwb3J0cy5TdHJpY3RNb2RlPXQ7ZXhwb3J0cy5TdXNwZW5zZT15O2V4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9YmE7XG5leHBvcnRzLmNsb25lRWxlbWVudD1mdW5jdGlvbihhLGIsYyl7aWYobnVsbD09PWF8fHZvaWQgMD09PWEpdGhyb3cgRXJyb3IoQygyNjcsYSkpO3ZhciBlPWwoe30sYS5wcm9wcyksZD1hLmtleSxnPWEucmVmLGs9YS5fb3duZXI7aWYobnVsbCE9Yil7dm9pZCAwIT09Yi5yZWYmJihnPWIucmVmLGs9Si5jdXJyZW50KTt2b2lkIDAhPT1iLmtleSYmKGQ9XCJcIitiLmtleSk7aWYoYS50eXBlJiZhLnR5cGUuZGVmYXVsdFByb3BzKXZhciBmPWEudHlwZS5kZWZhdWx0UHJvcHM7Zm9yKGggaW4gYilLLmNhbGwoYixoKSYmIUwuaGFzT3duUHJvcGVydHkoaCkmJihlW2hdPXZvaWQgMD09PWJbaF0mJnZvaWQgMCE9PWY/ZltoXTpiW2hdKX12YXIgaD1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWgpZS5jaGlsZHJlbj1jO2Vsc2UgaWYoMTxoKXtmPUFycmF5KGgpO2Zvcih2YXIgbT0wO208aDttKyspZlttXT1hcmd1bWVudHNbbSsyXTtlLmNoaWxkcmVuPWZ9cmV0dXJueyQkdHlwZW9mOnAsdHlwZTphLnR5cGUsXG5rZXk6ZCxyZWY6Zyxwcm9wczplLF9vd25lcjprfX07ZXhwb3J0cy5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9bnVsbCk7YT17JCR0eXBlb2Y6dyxfY2FsY3VsYXRlQ2hhbmdlZEJpdHM6YixfY3VycmVudFZhbHVlOmEsX2N1cnJlbnRWYWx1ZTI6YSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGx9O2EuUHJvdmlkZXI9eyQkdHlwZW9mOnYsX2NvbnRleHQ6YX07cmV0dXJuIGEuQ29uc3VtZXI9YX07ZXhwb3J0cy5jcmVhdGVFbGVtZW50PU07ZXhwb3J0cy5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGEpe3ZhciBiPU0uYmluZChudWxsLGEpO2IudHlwZT1hO3JldHVybiBifTtleHBvcnRzLmNyZWF0ZVJlZj1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGx9fTtleHBvcnRzLmZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJueyQkdHlwZW9mOngscmVuZGVyOmF9fTtleHBvcnRzLmlzVmFsaWRFbGVtZW50PU87XG5leHBvcnRzLmxhenk9ZnVuY3Rpb24oYSl7cmV0dXJueyQkdHlwZW9mOkEsX2N0b3I6YSxfc3RhdHVzOi0xLF9yZXN1bHQ6bnVsbH19O2V4cG9ydHMubWVtbz1mdW5jdGlvbihhLGIpe3JldHVybnskJHR5cGVvZjp6LHR5cGU6YSxjb21wYXJlOnZvaWQgMD09PWI/bnVsbDpifX07ZXhwb3J0cy51c2VDYWxsYmFjaz1mdW5jdGlvbihhLGIpe3JldHVybiBaKCkudXNlQ2FsbGJhY2soYSxiKX07ZXhwb3J0cy51c2VDb250ZXh0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIFooKS51c2VDb250ZXh0KGEsYil9O2V4cG9ydHMudXNlRGVidWdWYWx1ZT1mdW5jdGlvbigpe307ZXhwb3J0cy51c2VFZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gWigpLnVzZUVmZmVjdChhLGIpfTtleHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBaKCkudXNlSW1wZXJhdGl2ZUhhbmRsZShhLGIsYyl9O1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gWigpLnVzZUxheW91dEVmZmVjdChhLGIpfTtleHBvcnRzLnVzZU1lbW89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gWigpLnVzZU1lbW8oYSxiKX07ZXhwb3J0cy51c2VSZWR1Y2VyPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gWigpLnVzZVJlZHVjZXIoYSxiLGMpfTtleHBvcnRzLnVzZVJlZj1mdW5jdGlvbihhKXtyZXR1cm4gWigpLnVzZVJlZihhKX07ZXhwb3J0cy51c2VTdGF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gWigpLnVzZVN0YXRlKGEpfTtleHBvcnRzLnZlcnNpb249XCIxNi4xMy4xXCI7XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///22\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('/** @license React v16.13.1\\n * react-dom.production.min.js\\n *\\n * Copyright (c) Facebook, Inc. and its affiliates.\\n *\\n * This source code is licensed under the MIT license found in the\\n * LICENSE file in the root directory of this source tree.\\n */\\n\\n/*\\n Modernizr 3.0.0pre (Custom Build) | MIT\\n*/\\nvar aa=__webpack_require__(0),n=__webpack_require__(8),r=__webpack_require__(24);function u(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}if(!aa)throw Error(u(227));\\nfunction ba(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var da=!1,ea=null,fa=!1,ha=null,ia={onError:function(a){da=!0;ea=a}};function ja(a,b,c,d,e,f,g,h,k){da=!1;ea=null;ba.apply(ia,arguments)}function ka(a,b,c,d,e,f,g,h,k){ja.apply(this,arguments);if(da){if(da){var l=ea;da=!1;ea=null}else throw Error(u(198));fa||(fa=!0,ha=l)}}var la=null,ma=null,na=null;\\nfunction oa(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=na(c);ka(d,b,void 0,a);a.currentTarget=null}var pa=null,qa={};\\nfunction ra(){if(pa)for(var a in qa){var b=qa[a],c=pa.indexOf(a);if(!(-1<c))throw Error(u(96,a));if(!sa[c]){if(!b.extractEvents)throw Error(u(97,a));sa[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;if(ta.hasOwnProperty(h))throw Error(u(99,h));ta[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ua(k[e],g,h);e=!0}else f.registrationName?(ua(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(u(98,d,a));}}}}\\nfunction ua(a,b,c){if(va[a])throw Error(u(100,a));va[a]=b;wa[a]=b.eventTypes[c].dependencies}var sa=[],ta={},va={},wa={};function xa(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!qa.hasOwnProperty(c)||qa[c]!==d){if(qa[c])throw Error(u(102,c));qa[c]=d;b=!0}}b&&ra()}var ya=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),za=null,Aa=null,Ba=null;\\nfunction Ca(a){if(a=ma(a)){if(\"function\"!==typeof za)throw Error(u(280));var b=a.stateNode;b&&(b=la(b),za(a.stateNode,a.type,b))}}function Da(a){Aa?Ba?Ba.push(a):Ba=[a]:Aa=a}function Ea(){if(Aa){var a=Aa,b=Ba;Ba=Aa=null;Ca(a);if(b)for(a=0;a<b.length;a++)Ca(b[a])}}function Fa(a,b){return a(b)}function Ga(a,b,c,d,e){return a(b,c,d,e)}function Ha(){}var Ia=Fa,Ja=!1,Ka=!1;function La(){if(null!==Aa||null!==Ba)Ha(),Ea()}\\nfunction Ma(a,b,c){if(Ka)return a(b,c);Ka=!0;try{return Ia(a,b,c)}finally{Ka=!1,La()}}var Na=/^[:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD][:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*$/,Oa=Object.prototype.hasOwnProperty,Pa={},Qa={};\\nfunction Ra(a){if(Oa.call(Qa,a))return!0;if(Oa.call(Pa,a))return!1;if(Na.test(a))return Qa[a]=!0;Pa[a]=!0;return!1}function Sa(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\\nfunction Ta(a,b,c,d){if(null===b||\"undefined\"===typeof b||Sa(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function v(a,b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}var C={};\\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){C[a]=new v(a,0,!1,a,null,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];C[b]=new v(b,1,!1,a[1],null,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){C[a]=new v(a,2,!1,a.toLowerCase(),null,!1)});\\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){C[a]=new v(a,2,!1,a,null,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){C[a]=new v(a,3,!1,a.toLowerCase(),null,!1)});\\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){C[a]=new v(a,3,!0,a,null,!1)});[\"capture\",\"download\"].forEach(function(a){C[a]=new v(a,4,!1,a,null,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){C[a]=new v(a,6,!1,a,null,!1)});[\"rowSpan\",\"start\"].forEach(function(a){C[a]=new v(a,5,!1,a.toLowerCase(),null,!1)});var Ua=/[\\\\-:]([a-z])/g;function Va(a){return a[1].toUpperCase()}\\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(Ua,\\nVa);C[b]=new v(b,1,!1,a,null,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(Ua,Va);C[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(Ua,Va);C[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){C[a]=new v(a,1,!1,a.toLowerCase(),null,!1)});\\nC.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){C[a]=new v(a,1,!1,a.toLowerCase(),null,!0)});var Wa=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;Wa.hasOwnProperty(\"ReactCurrentDispatcher\")||(Wa.ReactCurrentDispatcher={current:null});Wa.hasOwnProperty(\"ReactCurrentBatchConfig\")||(Wa.ReactCurrentBatchConfig={suspense:null});\\nfunction Xa(a,b,c,d){var e=C.hasOwnProperty(b)?C[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(Ta(b,c,e,d)&&(c=null),d||null===e?Ra(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\\nvar Ya=/^(.*)[\\\\\\\\\\\\/]/,E=\"function\"===typeof Symbol&&Symbol.for,Za=E?Symbol.for(\"react.element\"):60103,$a=E?Symbol.for(\"react.portal\"):60106,ab=E?Symbol.for(\"react.fragment\"):60107,bb=E?Symbol.for(\"react.strict_mode\"):60108,cb=E?Symbol.for(\"react.profiler\"):60114,db=E?Symbol.for(\"react.provider\"):60109,eb=E?Symbol.for(\"react.context\"):60110,fb=E?Symbol.for(\"react.concurrent_mode\"):60111,gb=E?Symbol.for(\"react.forward_ref\"):60112,hb=E?Symbol.for(\"react.suspense\"):60113,ib=E?Symbol.for(\"react.suspense_list\"):\\n60120,jb=E?Symbol.for(\"react.memo\"):60115,kb=E?Symbol.for(\"react.lazy\"):60116,lb=E?Symbol.for(\"react.block\"):60121,mb=\"function\"===typeof Symbol&&Symbol.iterator;function nb(a){if(null===a||\"object\"!==typeof a)return null;a=mb&&a[mb]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}function ob(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}\\nfunction pb(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ab:return\"Fragment\";case $a:return\"Portal\";case cb:return\"Profiler\";case bb:return\"StrictMode\";case hb:return\"Suspense\";case ib:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case eb:return\"Context.Consumer\";case db:return\"Context.Provider\";case gb:var b=a.render;b=b.displayName||b.name||\"\";return a.displayName||(\"\"!==b?\"ForwardRef(\"+b+\")\":\\n\"ForwardRef\");case jb:return pb(a.type);case lb:return pb(a.render);case kb:if(a=1===a._status?a._result:null)return pb(a)}return null}function qb(a){var b=\"\";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c=\"\";break a;default:var d=a._debugOwner,e=a._debugSource,f=pb(a.type);c=null;d&&(c=pb(d.type));d=f;f=\"\";e?f=\" (at \"+e.fileName.replace(Ya,\"\")+\":\"+e.lineNumber+\")\":c&&(f=\" (created by \"+c+\")\");c=\"\\\\n in \"+(d||\"Unknown\")+f}b+=c;a=a.return}while(a);return b}\\nfunction rb(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}function sb(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\\nfunction tb(a){var b=sb(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\\nnull;delete a[b]}}}}function xb(a){a._valueTracker||(a._valueTracker=tb(a))}function yb(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=sb(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function zb(a,b){var c=b.checked;return n({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}\\nfunction Ab(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=rb(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Bb(a,b){b=b.checked;null!=b&&Xa(a,\"checked\",b,!1)}\\nfunction Cb(a,b){Bb(a,b);var c=rb(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?Db(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&Db(a,b.type,rb(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\\nfunction Eb(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\\nfunction Db(a,b,c){if(\"number\"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}function Fb(a){var b=\"\";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Gb(a,b){a=n({children:void 0},b);if(b=Fb(b.children))a.children=b;return a}\\nfunction Hb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+rb(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\\nfunction Ib(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(u(91));return n({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function Jb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(u(92));if(Array.isArray(c)){if(!(1>=c.length))throw Error(u(93));c=c[0]}b=c}null==b&&(b=\"\");c=b}a._wrapperState={initialValue:rb(c)}}\\nfunction Kb(a,b){var c=rb(b.value),d=rb(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function Lb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}var Mb={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\\nfunction Nb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function Ob(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?Nb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\\nvar Pb,Qb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Mb.svg||\"innerHTML\"in a)a.innerHTML=b;else{Pb=Pb||document.createElement(\"div\");Pb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=Pb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\\nfunction Rb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}function Sb(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var Tb={animationend:Sb(\"Animation\",\"AnimationEnd\"),animationiteration:Sb(\"Animation\",\"AnimationIteration\"),animationstart:Sb(\"Animation\",\"AnimationStart\"),transitionend:Sb(\"Transition\",\"TransitionEnd\")},Ub={},Vb={};\\nya&&(Vb=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Tb.animationend.animation,delete Tb.animationiteration.animation,delete Tb.animationstart.animation),\"TransitionEvent\"in window||delete Tb.transitionend.transition);function Wb(a){if(Ub[a])return Ub[a];if(!Tb[a])return a;var b=Tb[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Vb)return Ub[a]=b[c];return a}\\nvar Xb=Wb(\"animationend\"),Yb=Wb(\"animationiteration\"),Zb=Wb(\"animationstart\"),$b=Wb(\"transitionend\"),ac=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),bc=new (\"function\"===typeof WeakMap?WeakMap:Map);function cc(a){var b=bc.get(a);void 0===b&&(b=new Map,bc.set(a,b));return b}\\nfunction dc(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function ec(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function fc(a){if(dc(a)!==a)throw Error(u(188));}\\nfunction gc(a){var b=a.alternate;if(!b){b=dc(a);if(null===b)throw Error(u(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return fc(e),a;if(f===d)return fc(e),b;f=f.sibling}throw Error(u(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(u(189));}}if(c.alternate!==d)throw Error(u(190));}if(3!==c.tag)throw Error(u(188));return c.stateNode.current===c?a:b}function hc(a){a=gc(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\\nfunction ic(a,b){if(null==b)throw Error(u(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}function jc(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var kc=null;\\nfunction lc(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)oa(a,b[d],c[d]);else b&&oa(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function mc(a){null!==a&&(kc=ic(kc,a));a=kc;kc=null;if(a){jc(a,lc);if(kc)throw Error(u(95));if(fa)throw a=ha,fa=!1,ha=null,a;}}\\nfunction nc(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function oc(a){if(!ya)return!1;a=\"on\"+a;var b=a in document;b||(b=document.createElement(\"div\"),b.setAttribute(a,\"return;\"),b=\"function\"===typeof b[a]);return b}var pc=[];function qc(a){a.topLevelType=null;a.nativeEvent=null;a.targetInst=null;a.ancestors.length=0;10>pc.length&&pc.push(a)}\\nfunction rc(a,b,c,d){if(pc.length){var e=pc.pop();e.topLevelType=a;e.eventSystemFlags=d;e.nativeEvent=b;e.targetInst=c;return e}return{topLevelType:a,eventSystemFlags:d,nativeEvent:b,targetInst:c,ancestors:[]}}\\nfunction sc(a){var b=a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=tc(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=nc(a.nativeEvent);d=a.topLevelType;var f=a.nativeEvent,g=a.eventSystemFlags;0===c&&(g|=64);for(var h=null,k=0;k<sa.length;k++){var l=sa[k];l&&(l=l.extractEvents(d,b,f,e,g))&&(h=\\nic(h,l))}mc(h)}}function uc(a,b,c){if(!c.has(a)){switch(a){case \"scroll\":vc(b,\"scroll\",!0);break;case \"focus\":case \"blur\":vc(b,\"focus\",!0);vc(b,\"blur\",!0);c.set(\"blur\",null);c.set(\"focus\",null);break;case \"cancel\":case \"close\":oc(a)&&vc(b,a,!0);break;case \"invalid\":case \"submit\":case \"reset\":break;default:-1===ac.indexOf(a)&&F(a,b)}c.set(a,null)}}\\nvar wc,xc,yc,zc=!1,Ac=[],Bc=null,Cc=null,Dc=null,Ec=new Map,Fc=new Map,Gc=[],Hc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit\".split(\" \"),Ic=\"focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture\".split(\" \");\\nfunction Jc(a,b){var c=cc(b);Hc.forEach(function(a){uc(a,b,c)});Ic.forEach(function(a){uc(a,b,c)})}function Kc(a,b,c,d,e){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:e,container:d}}\\nfunction Lc(a,b){switch(a){case \"focus\":case \"blur\":Bc=null;break;case \"dragenter\":case \"dragleave\":Cc=null;break;case \"mouseover\":case \"mouseout\":Dc=null;break;case \"pointerover\":case \"pointerout\":Ec.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":Fc.delete(b.pointerId)}}function Mc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a=Kc(b,c,d,e,f),null!==b&&(b=Nc(b),null!==b&&xc(b)),a;a.eventSystemFlags|=d;return a}\\nfunction Oc(a,b,c,d,e){switch(b){case \"focus\":return Bc=Mc(Bc,a,b,c,d,e),!0;case \"dragenter\":return Cc=Mc(Cc,a,b,c,d,e),!0;case \"mouseover\":return Dc=Mc(Dc,a,b,c,d,e),!0;case \"pointerover\":var f=e.pointerId;Ec.set(f,Mc(Ec.get(f)||null,a,b,c,d,e));return!0;case \"gotpointercapture\":return f=e.pointerId,Fc.set(f,Mc(Fc.get(f)||null,a,b,c,d,e)),!0}return!1}\\nfunction Pc(a){var b=tc(a.target);if(null!==b){var c=dc(b);if(null!==c)if(b=c.tag,13===b){if(b=ec(c),null!==b){a.blockedOn=b;r.unstable_runWithPriority(a.priority,function(){yc(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function Qc(a){if(null!==a.blockedOn)return!1;var b=Rc(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);if(null!==b){var c=Nc(b);null!==c&&xc(c);a.blockedOn=b;return!1}return!0}\\nfunction Sc(a,b,c){Qc(a)&&c.delete(b)}function Tc(){for(zc=!1;0<Ac.length;){var a=Ac[0];if(null!==a.blockedOn){a=Nc(a.blockedOn);null!==a&&wc(a);break}var b=Rc(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);null!==b?a.blockedOn=b:Ac.shift()}null!==Bc&&Qc(Bc)&&(Bc=null);null!==Cc&&Qc(Cc)&&(Cc=null);null!==Dc&&Qc(Dc)&&(Dc=null);Ec.forEach(Sc);Fc.forEach(Sc)}function Uc(a,b){a.blockedOn===b&&(a.blockedOn=null,zc||(zc=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Tc)))}\\nfunction Vc(a){function b(b){return Uc(b,a)}if(0<Ac.length){Uc(Ac[0],a);for(var c=1;c<Ac.length;c++){var d=Ac[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==Bc&&Uc(Bc,a);null!==Cc&&Uc(Cc,a);null!==Dc&&Uc(Dc,a);Ec.forEach(b);Fc.forEach(b);for(c=0;c<Gc.length;c++)d=Gc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<Gc.length&&(c=Gc[0],null===c.blockedOn);)Pc(c),null===c.blockedOn&&Gc.shift()}\\nvar Wc={},Yc=new Map,Zc=new Map,$c=[\"abort\",\"abort\",Xb,\"animationEnd\",Yb,\"animationIteration\",Zb,\"animationStart\",\"canplay\",\"canPlay\",\"canplaythrough\",\"canPlayThrough\",\"durationchange\",\"durationChange\",\"emptied\",\"emptied\",\"encrypted\",\"encrypted\",\"ended\",\"ended\",\"error\",\"error\",\"gotpointercapture\",\"gotPointerCapture\",\"load\",\"load\",\"loadeddata\",\"loadedData\",\"loadedmetadata\",\"loadedMetadata\",\"loadstart\",\"loadStart\",\"lostpointercapture\",\"lostPointerCapture\",\"playing\",\"playing\",\"progress\",\"progress\",\"seeking\",\\n\"seeking\",\"stalled\",\"stalled\",\"suspend\",\"suspend\",\"timeupdate\",\"timeUpdate\",$b,\"transitionEnd\",\"waiting\",\"waiting\"];function ad(a,b){for(var c=0;c<a.length;c+=2){var d=a[c],e=a[c+1],f=\"on\"+(e[0].toUpperCase()+e.slice(1));f={phasedRegistrationNames:{bubbled:f,captured:f+\"Capture\"},dependencies:[d],eventPriority:b};Zc.set(d,b);Yc.set(d,f);Wc[e]=f}}\\nad(\"blur blur cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focus focus input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange\".split(\" \"),0);\\nad(\"drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel\".split(\" \"),1);ad($c,2);for(var bd=\"change selectionchange textInput compositionstart compositionend compositionupdate\".split(\" \"),cd=0;cd<bd.length;cd++)Zc.set(bd[cd],0);\\nvar dd=r.unstable_UserBlockingPriority,ed=r.unstable_runWithPriority,fd=!0;function F(a,b){vc(b,a,!1)}function vc(a,b,c){var d=Zc.get(b);switch(void 0===d?2:d){case 0:d=gd.bind(null,b,1,a);break;case 1:d=hd.bind(null,b,1,a);break;default:d=id.bind(null,b,1,a)}c?a.addEventListener(b,d,!0):a.addEventListener(b,d,!1)}function gd(a,b,c,d){Ja||Ha();var e=id,f=Ja;Ja=!0;try{Ga(e,a,b,c,d)}finally{(Ja=f)||La()}}function hd(a,b,c,d){ed(dd,id.bind(null,a,b,c,d))}\\nfunction id(a,b,c,d){if(fd)if(0<Ac.length&&-1<Hc.indexOf(a))a=Kc(null,a,b,c,d),Ac.push(a);else{var e=Rc(a,b,c,d);if(null===e)Lc(a,d);else if(-1<Hc.indexOf(a))a=Kc(e,a,b,c,d),Ac.push(a);else if(!Oc(e,a,b,c,d)){Lc(a,d);a=rc(a,d,null,b);try{Ma(sc,a)}finally{qc(a)}}}}\\nfunction Rc(a,b,c,d){c=nc(d);c=tc(c);if(null!==c){var e=dc(c);if(null===e)c=null;else{var f=e.tag;if(13===f){c=ec(e);if(null!==c)return c;c=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;c=null}else e!==c&&(c=null)}}a=rc(a,d,c,b);try{Ma(sc,a)}finally{qc(a)}return null}\\nvar jd={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},kd=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(jd).forEach(function(a){kd.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);jd[b]=jd[a]})});function ld(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||jd.hasOwnProperty(a)&&jd[a]?(\"\"+b).trim():b+\"px\"}\\nfunction md(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=ld(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var nd=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\\nfunction od(a,b){if(b){if(nd[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(u(137,a,\"\"));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(u(60));if(!(\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML))throw Error(u(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(u(62,\"\"));}}\\nfunction pd(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var qd=Mb.html;function rd(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=cc(a);b=wa[b];for(var d=0;d<b.length;d++)uc(b[d],a,c)}function sd(){}\\nfunction td(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function ud(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function vd(a,b){var c=ud(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=ud(c)}}\\nfunction wd(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?wd(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function xd(){for(var a=window,b=td();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=td(a.document)}return b}\\nfunction yd(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}var zd=\"$\",Ad=\"/$\",Bd=\"$?\",Cd=\"$!\",Dd=null,Ed=null;function Fd(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\\nfunction Gd(a,b){return\"textarea\"===a||\"option\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}var Hd=\"function\"===typeof setTimeout?setTimeout:void 0,Id=\"function\"===typeof clearTimeout?clearTimeout:void 0;function Jd(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}\\nfunction Kd(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===zd||c===Cd||c===Bd){if(0===b)return a;b--}else c===Ad&&b++}a=a.previousSibling}return null}var Ld=Math.random().toString(36).slice(2),Md=\"__reactInternalInstance$\"+Ld,Nd=\"__reactEventHandlers$\"+Ld,Od=\"__reactContainere$\"+Ld;\\nfunction tc(a){var b=a[Md];if(b)return b;for(var c=a.parentNode;c;){if(b=c[Od]||c[Md]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=Kd(a);null!==a;){if(c=a[Md])return c;a=Kd(a)}return b}a=c;c=a.parentNode}return null}function Nc(a){a=a[Md]||a[Od];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Pd(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(u(33));}function Qd(a){return a[Nd]||null}\\nfunction Rd(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}\\nfunction Sd(a,b){var c=a.stateNode;if(!c)return null;var d=la(c);if(!d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":case \"onMouseEnter\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==typeof c)throw Error(u(231,\\nb,typeof c));return c}function Td(a,b,c){if(b=Sd(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=ic(c._dispatchListeners,b),c._dispatchInstances=ic(c._dispatchInstances,a)}function Ud(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=Rd(b);for(b=c.length;0<b--;)Td(c[b],\"captured\",a);for(b=0;b<c.length;b++)Td(c[b],\"bubbled\",a)}}\\nfunction Vd(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Sd(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=ic(c._dispatchListeners,b),c._dispatchInstances=ic(c._dispatchInstances,a))}function Wd(a){a&&a.dispatchConfig.registrationName&&Vd(a._targetInst,null,a)}function Xd(a){jc(a,Ud)}var Yd=null,Zd=null,$d=null;\\nfunction ae(){if($d)return $d;var a,b=Zd,c=b.length,d,e=\"value\"in Yd?Yd.value:Yd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return $d=e.slice(a,1<d?1-d:void 0)}function be(){return!0}function ce(){return!1}\\nfunction G(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):\"target\"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?be:ce;this.isPropagationStopped=ce;return this}\\nn(G.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=be)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=be)},persist:function(){this.isPersistent=be},isPersistent:ce,destructor:function(){var a=this.constructor.Interface,\\nb;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=ce;this._dispatchInstances=this._dispatchListeners=null}});G.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\\nG.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;n(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=n({},d.Interface,a);c.extend=d.extend;de(c);return c};de(G);function ee(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}\\nfunction fe(a){if(!(a instanceof this))throw Error(u(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function de(a){a.eventPool=[];a.getPooled=ee;a.release=fe}var ge=G.extend({data:null}),he=G.extend({data:null}),ie=[9,13,27,32],je=ya&&\"CompositionEvent\"in window,ke=null;ya&&\"documentMode\"in document&&(ke=document.documentMode);\\nvar le=ya&&\"TextEvent\"in window&&!ke,me=ya&&(!je||ke&&8<ke&&11>=ke),ne=String.fromCharCode(32),oe={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"blur compositionend keydown keypress keyup mousedown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\\ncaptured:\"onCompositionStartCapture\"},dependencies:\"blur compositionstart keydown keypress keyup mousedown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")}},pe=!1;\\nfunction qe(a,b){switch(a){case \"keyup\":return-1!==ie.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"blur\":return!0;default:return!1}}function re(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var se=!1;function te(a,b){switch(a){case \"compositionend\":return re(b);case \"keypress\":if(32!==b.which)return null;pe=!0;return ne;case \"textInput\":return a=b.data,a===ne&&pe?null:a;default:return null}}\\nfunction ue(a,b){if(se)return\"compositionend\"===a||!je&&qe(a,b)?(a=ae(),$d=Zd=Yd=null,se=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return me&&\"ko\"!==b.locale?null:b.data;default:return null}}\\nvar ve={eventTypes:oe,extractEvents:function(a,b,c,d){var e;if(je)b:{switch(a){case \"compositionstart\":var f=oe.compositionStart;break b;case \"compositionend\":f=oe.compositionEnd;break b;case \"compositionupdate\":f=oe.compositionUpdate;break b}f=void 0}else se?qe(a,c)&&(f=oe.compositionEnd):\"keydown\"===a&&229===c.keyCode&&(f=oe.compositionStart);f?(me&&\"ko\"!==c.locale&&(se||f!==oe.compositionStart?f===oe.compositionEnd&&se&&(e=ae()):(Yd=d,Zd=\"value\"in Yd?Yd.value:Yd.textContent,se=!0)),f=ge.getPooled(f,\\nb,c,d),e?f.data=e:(e=re(c),null!==e&&(f.data=e)),Xd(f),e=f):e=null;(a=le?te(a,c):ue(a,c))?(b=he.getPooled(oe.beforeInput,b,c,d),b.data=a,Xd(b)):b=null;return null===e?b:null===b?e:[e,b]}},we={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function xe(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!we[a.type]:\"textarea\"===b?!0:!1}\\nvar ye={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:\"blur change click focus input keydown keyup selectionchange\".split(\" \")}};function ze(a,b,c){a=G.getPooled(ye.change,a,b,c);a.type=\"change\";Da(c);Xd(a);return a}var Ae=null,Be=null;function Ce(a){mc(a)}function De(a){var b=Pd(a);if(yb(b))return a}function Ee(a,b){if(\"change\"===a)return b}var Fe=!1;ya&&(Fe=oc(\"input\")&&(!document.documentMode||9<document.documentMode));\\nfunction Ge(){Ae&&(Ae.detachEvent(\"onpropertychange\",He),Be=Ae=null)}function He(a){if(\"value\"===a.propertyName&&De(Be))if(a=ze(Be,a,nc(a)),Ja)mc(a);else{Ja=!0;try{Fa(Ce,a)}finally{Ja=!1,La()}}}function Ie(a,b,c){\"focus\"===a?(Ge(),Ae=b,Be=c,Ae.attachEvent(\"onpropertychange\",He)):\"blur\"===a&&Ge()}function Je(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return De(Be)}function Ke(a,b){if(\"click\"===a)return De(b)}function Le(a,b){if(\"input\"===a||\"change\"===a)return De(b)}\\nvar Me={eventTypes:ye,_isInputEventSupported:Fe,extractEvents:function(a,b,c,d){var e=b?Pd(b):window,f=e.nodeName&&e.nodeName.toLowerCase();if(\"select\"===f||\"input\"===f&&\"file\"===e.type)var g=Ee;else if(xe(e))if(Fe)g=Le;else{g=Je;var h=Ie}else(f=e.nodeName)&&\"input\"===f.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)&&(g=Ke);if(g&&(g=g(a,b)))return ze(g,c,d);h&&h(a,e,b);\"blur\"===a&&(a=e._wrapperState)&&a.controlled&&\"number\"===e.type&&Db(e,\"number\",e.value)}},Ne=G.extend({view:null,detail:null}),\\nOe={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Pe(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Oe[a])?!!b[a]:!1}function Qe(){return Pe}\\nvar Re=0,Se=0,Te=!1,Ue=!1,Ve=Ne.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Qe,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if(\"movementX\"in a)return a.movementX;var b=Re;Re=a.screenX;return Te?\"mousemove\"===a.type?a.screenX-b:0:(Te=!0,0)},movementY:function(a){if(\"movementY\"in a)return a.movementY;\\nvar b=Se;Se=a.screenY;return Ue?\"mousemove\"===a.type?a.screenY-b:0:(Ue=!0,0)}}),We=Ve.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),Xe={mouseEnter:{registrationName:\"onMouseEnter\",dependencies:[\"mouseout\",\"mouseover\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"mouseout\",\"mouseover\"]},pointerEnter:{registrationName:\"onPointerEnter\",dependencies:[\"pointerout\",\"pointerover\"]},pointerLeave:{registrationName:\"onPointerLeave\",\\ndependencies:[\"pointerout\",\"pointerover\"]}},Ye={eventTypes:Xe,extractEvents:function(a,b,c,d,e){var f=\"mouseover\"===a||\"pointerover\"===a,g=\"mouseout\"===a||\"pointerout\"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;f=d.window===d?d:(f=d.ownerDocument)?f.defaultView||f.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?tc(b):null,null!==b){var h=dc(b);if(b!==h||5!==b.tag&&6!==b.tag)b=null}}else g=null;if(g===b)return null;if(\"mouseout\"===a||\"mouseover\"===\\na){var k=Ve;var l=Xe.mouseLeave;var m=Xe.mouseEnter;var p=\"mouse\"}else if(\"pointerout\"===a||\"pointerover\"===a)k=We,l=Xe.pointerLeave,m=Xe.pointerEnter,p=\"pointer\";a=null==g?f:Pd(g);f=null==b?f:Pd(b);l=k.getPooled(l,g,c,d);l.type=p+\"leave\";l.target=a;l.relatedTarget=f;c=k.getPooled(m,b,c,d);c.type=p+\"enter\";c.target=f;c.relatedTarget=a;d=g;p=b;if(d&&p)a:{k=d;m=p;g=0;for(a=k;a;a=Rd(a))g++;a=0;for(b=m;b;b=Rd(b))a++;for(;0<g-a;)k=Rd(k),g--;for(;0<a-g;)m=Rd(m),a--;for(;g--;){if(k===m||k===m.alternate)break a;\\nk=Rd(k);m=Rd(m)}k=null}else k=null;m=k;for(k=[];d&&d!==m;){g=d.alternate;if(null!==g&&g===m)break;k.push(d);d=Rd(d)}for(d=[];p&&p!==m;){g=p.alternate;if(null!==g&&g===m)break;d.push(p);p=Rd(p)}for(p=0;p<k.length;p++)Vd(k[p],\"bubbled\",l);for(p=d.length;0<p--;)Vd(d[p],\"captured\",c);return 0===(e&64)?[l]:[l,c]}};function Ze(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var $e=\"function\"===typeof Object.is?Object.is:Ze,af=Object.prototype.hasOwnProperty;\\nfunction bf(a,b){if($e(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!af.call(b,c[d])||!$e(a[c[d]],b[c[d]]))return!1;return!0}\\nvar cf=ya&&\"documentMode\"in document&&11>=document.documentMode,df={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange\".split(\" \")}},ef=null,ff=null,gf=null,hf=!1;\\nfunction jf(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(hf||null==ef||ef!==td(c))return null;c=ef;\"selectionStart\"in c&&yd(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return gf&&bf(gf,c)?null:(gf=c,a=G.getPooled(df.select,ff,a,b),a.type=\"select\",a.target=ef,Xd(a),a)}\\nvar kf={eventTypes:df,extractEvents:function(a,b,c,d,e,f){e=f||(d.window===d?d.document:9===d.nodeType?d:d.ownerDocument);if(!(f=!e)){a:{e=cc(e);f=wa.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?Pd(b):window;switch(a){case \"focus\":if(xe(e)||\"true\"===e.contentEditable)ef=e,ff=b,gf=null;break;case \"blur\":gf=ff=ef=null;break;case \"mousedown\":hf=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":return hf=!1,jf(c,d);case \"selectionchange\":if(cf)break;\\ncase \"keydown\":case \"keyup\":return jf(c,d)}return null}},lf=G.extend({animationName:null,elapsedTime:null,pseudoElement:null}),mf=G.extend({clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),nf=Ne.extend({relatedTarget:null});function of(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\\nvar pf={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},qf={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},rf=Ne.extend({key:function(a){if(a.key){var b=pf[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=of(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?qf[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Qe,charCode:function(a){return\"keypress\"===\\na.type?of(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===a.type?of(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),sf=Ve.extend({dataTransfer:null}),tf=Ne.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Qe}),uf=G.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),vf=Ve.extend({deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in\\na?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),wf={eventTypes:Wc,extractEvents:function(a,b,c,d){var e=Yc.get(a);if(!e)return null;switch(a){case \"keypress\":if(0===of(c))return null;case \"keydown\":case \"keyup\":a=rf;break;case \"blur\":case \"focus\":a=nf;break;case \"click\":if(2===c.button)return null;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":a=\\nVe;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":a=sf;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":a=tf;break;case Xb:case Yb:case Zb:a=lf;break;case $b:a=uf;break;case \"scroll\":a=Ne;break;case \"wheel\":a=vf;break;case \"copy\":case \"cut\":case \"paste\":a=mf;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":a=\\nWe;break;default:a=G}b=a.getPooled(e,b,c,d);Xd(b);return b}};if(pa)throw Error(u(101));pa=Array.prototype.slice.call(\"ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));ra();var xf=Nc;la=Qd;ma=xf;na=Pd;xa({SimpleEventPlugin:wf,EnterLeaveEventPlugin:Ye,ChangeEventPlugin:Me,SelectEventPlugin:kf,BeforeInputEventPlugin:ve});var yf=[],zf=-1;function H(a){0>zf||(a.current=yf[zf],yf[zf]=null,zf--)}\\nfunction I(a,b){zf++;yf[zf]=a.current;a.current=b}var Af={},J={current:Af},K={current:!1},Bf=Af;function Cf(a,b){var c=a.type.contextTypes;if(!c)return Af;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function L(a){a=a.childContextTypes;return null!==a&&void 0!==a}\\nfunction Df(){H(K);H(J)}function Ef(a,b,c){if(J.current!==Af)throw Error(u(168));I(J,b);I(K,c)}function Ff(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(u(108,pb(b)||\"Unknown\",e));return n({},c,{},d)}function Gf(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Af;Bf=J.current;I(J,a);I(K,K.current);return!0}\\nfunction Hf(a,b,c){var d=a.stateNode;if(!d)throw Error(u(169));c?(a=Ff(a,b,Bf),d.__reactInternalMemoizedMergedChildContext=a,H(K),H(J),I(J,a)):H(K);I(K,c)}\\nvar If=r.unstable_runWithPriority,Jf=r.unstable_scheduleCallback,Kf=r.unstable_cancelCallback,Lf=r.unstable_requestPaint,Mf=r.unstable_now,Nf=r.unstable_getCurrentPriorityLevel,Of=r.unstable_ImmediatePriority,Pf=r.unstable_UserBlockingPriority,Qf=r.unstable_NormalPriority,Rf=r.unstable_LowPriority,Sf=r.unstable_IdlePriority,Tf={},Uf=r.unstable_shouldYield,Vf=void 0!==Lf?Lf:function(){},Wf=null,Xf=null,Yf=!1,Zf=Mf(),$f=1E4>Zf?Mf:function(){return Mf()-Zf};\\nfunction ag(){switch(Nf()){case Of:return 99;case Pf:return 98;case Qf:return 97;case Rf:return 96;case Sf:return 95;default:throw Error(u(332));}}function bg(a){switch(a){case 99:return Of;case 98:return Pf;case 97:return Qf;case 96:return Rf;case 95:return Sf;default:throw Error(u(332));}}function cg(a,b){a=bg(a);return If(a,b)}function dg(a,b,c){a=bg(a);return Jf(a,b,c)}function eg(a){null===Wf?(Wf=[a],Xf=Jf(Of,fg)):Wf.push(a);return Tf}function gg(){if(null!==Xf){var a=Xf;Xf=null;Kf(a)}fg()}\\nfunction fg(){if(!Yf&&null!==Wf){Yf=!0;var a=0;try{var b=Wf;cg(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});Wf=null}catch(c){throw null!==Wf&&(Wf=Wf.slice(a+1)),Jf(Of,gg),c;}finally{Yf=!1}}}function hg(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function ig(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}var jg={current:null},kg=null,lg=null,mg=null;function ng(){mg=lg=kg=null}\\nfunction og(a){var b=jg.current;H(jg);a.type._context._currentValue=b}function pg(a,b){for(;null!==a;){var c=a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function qg(a,b){kg=a;mg=lg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(rg=!0),a.firstContext=null)}\\nfunction sg(a,b){if(mg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)mg=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===lg){if(null===kg)throw Error(u(308));lg=b;kg.dependencies={expirationTime:0,firstContext:b,responders:null}}else lg=lg.next=b}return a._currentValue}var tg=!1;function ug(a){a.updateQueue={baseState:a.memoizedState,baseQueue:null,shared:{pending:null},effects:null}}\\nfunction vg(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,baseQueue:a.baseQueue,shared:a.shared,effects:a.effects})}function wg(a,b){a={expirationTime:a,suspenseConfig:b,tag:0,payload:null,callback:null,next:null};return a.next=a}function xg(a,b){a=a.updateQueue;if(null!==a){a=a.shared;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}}\\nfunction yg(a,b){var c=a.alternate;null!==c&&vg(c,a);a=a.updateQueue;c=a.baseQueue;null===c?(a.baseQueue=b.next=b,b.next=b):(b.next=c.next,c.next=b)}\\nfunction zg(a,b,c,d){var e=a.updateQueue;tg=!1;var f=e.baseQueue,g=e.shared.pending;if(null!==g){if(null!==f){var h=f.next;f.next=g.next;g.next=h}f=g;e.shared.pending=null;h=a.alternate;null!==h&&(h=h.updateQueue,null!==h&&(h.baseQueue=g))}if(null!==f){h=f.next;var k=e.baseState,l=0,m=null,p=null,x=null;if(null!==h){var z=h;do{g=z.expirationTime;if(g<d){var ca={expirationTime:z.expirationTime,suspenseConfig:z.suspenseConfig,tag:z.tag,payload:z.payload,callback:z.callback,next:null};null===x?(p=x=\\nca,m=k):x=x.next=ca;g>l&&(l=g)}else{null!==x&&(x=x.next={expirationTime:1073741823,suspenseConfig:z.suspenseConfig,tag:z.tag,payload:z.payload,callback:z.callback,next:null});Ag(g,z.suspenseConfig);a:{var D=a,t=z;g=b;ca=c;switch(t.tag){case 1:D=t.payload;if(\"function\"===typeof D){k=D.call(ca,k,g);break a}k=D;break a;case 3:D.effectTag=D.effectTag&-4097|64;case 0:D=t.payload;g=\"function\"===typeof D?D.call(ca,k,g):D;if(null===g||void 0===g)break a;k=n({},k,g);break a;case 2:tg=!0}}null!==z.callback&&\\n(a.effectTag|=32,g=e.effects,null===g?e.effects=[z]:g.push(z))}z=z.next;if(null===z||z===h)if(g=e.shared.pending,null===g)break;else z=f.next=g.next,g.next=h,e.baseQueue=f=g,e.shared.pending=null}while(1)}null===x?m=k:x.next=p;e.baseState=m;e.baseQueue=x;Bg(l);a.expirationTime=l;a.memoizedState=k}}\\nfunction Cg(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=e;e=c;if(\"function\"!==typeof d)throw Error(u(191,d));d.call(e)}}}var Dg=Wa.ReactCurrentBatchConfig,Eg=(new aa.Component).refs;function Fg(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;0===a.expirationTime&&(a.updateQueue.baseState=c)}\\nvar Jg={isMounted:function(a){return(a=a._reactInternalFiber)?dc(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e=wg(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);xg(a,e);Ig(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e=wg(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);xg(a,e);Ig(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=Gg(),d=Dg.suspense;\\nc=Hg(c,a,d);d=wg(c,d);d.tag=2;void 0!==b&&null!==b&&(d.callback=b);xg(a,d);Ig(a,c)}};function Kg(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!bf(c,d)||!bf(e,f):!0}\\nfunction Lg(a,b,c){var d=!1,e=Af;var f=b.contextType;\"object\"===typeof f&&null!==f?f=sg(f):(e=L(b)?Bf:J.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Cf(a,e):Af);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Jg;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\\nfunction Mg(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Jg.enqueueReplaceState(b,b.state,null)}\\nfunction Ng(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=Eg;ug(a);var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=sg(f):(f=L(b)?Bf:J.current,e.context=Cf(a,f));zg(a,c,e,d);e.state=a.memoizedState;f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Fg(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||\\n(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Jg.enqueueReplaceState(e,e.state,null),zg(a,c,e,d),e.state=a.memoizedState);\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)}var Og=Array.isArray;\\nfunction Pg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(u(309));var d=c.stateNode}if(!d)throw Error(u(147,a));var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Eg&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if(\"string\"!==typeof a)throw Error(u(284));if(!c._owner)throw Error(u(290,a));}return a}\\nfunction Qg(a,b){if(\"textarea\"!==a.type)throw Error(u(31,\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\"));}\\nfunction Rg(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=Sg(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\\n2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Tg(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props),d.ref=Pg(a,b,c),d.return=a,d;d=Ug(c.type,c.key,c.props,null,a.mode,d);d.ref=Pg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==\\nc.implementation)return b=Vg(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Wg(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function p(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=Tg(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case Za:return c=Ug(b.type,b.key,b.props,null,a.mode,c),c.ref=Pg(a,null,b),c.return=a,c;case $a:return b=Vg(b,a.mode,c),b.return=a,b}if(Og(b)||\\nnb(b))return b=Wg(b,a.mode,c,null),b.return=a,b;Qg(a,b)}return null}function x(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case Za:return c.key===e?c.type===ab?m(a,b,c.props.children,d,e):k(a,b,c,d):null;case $a:return c.key===e?l(a,b,c,d):null}if(Og(c)||nb(c))return null!==e?null:m(a,b,c,d,null);Qg(a,c)}return null}function z(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=\\na.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case Za:return a=a.get(null===d.key?c:d.key)||null,d.type===ab?m(b,a,d.props.children,e,d.key):k(b,a,d,e);case $a:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Og(d)||nb(d))return a=a.get(c)||null,m(b,a,d,e,null);Qg(b,d)}return null}function ca(e,g,h,k){for(var l=null,t=null,m=g,y=g=0,A=null;null!==m&&y<h.length;y++){m.index>y?(A=m,m=null):A=m.sibling;var q=x(e,m,h[y],k);if(null===q){null===m&&(m=A);break}a&&\\nm&&null===q.alternate&&b(e,m);g=f(q,g,y);null===t?l=q:t.sibling=q;t=q;m=A}if(y===h.length)return c(e,m),l;if(null===m){for(;y<h.length;y++)m=p(e,h[y],k),null!==m&&(g=f(m,g,y),null===t?l=m:t.sibling=m,t=m);return l}for(m=d(e,m);y<h.length;y++)A=z(m,e,y,h[y],k),null!==A&&(a&&null!==A.alternate&&m.delete(null===A.key?y:A.key),g=f(A,g,y),null===t?l=A:t.sibling=A,t=A);a&&m.forEach(function(a){return b(e,a)});return l}function D(e,g,h,l){var k=nb(h);if(\"function\"!==typeof k)throw Error(u(150));h=k.call(h);\\nif(null==h)throw Error(u(151));for(var m=k=null,t=g,y=g=0,A=null,q=h.next();null!==t&&!q.done;y++,q=h.next()){t.index>y?(A=t,t=null):A=t.sibling;var D=x(e,t,q.value,l);if(null===D){null===t&&(t=A);break}a&&t&&null===D.alternate&&b(e,t);g=f(D,g,y);null===m?k=D:m.sibling=D;m=D;t=A}if(q.done)return c(e,t),k;if(null===t){for(;!q.done;y++,q=h.next())q=p(e,q.value,l),null!==q&&(g=f(q,g,y),null===m?k=q:m.sibling=q,m=q);return k}for(t=d(e,t);!q.done;y++,q=h.next())q=z(t,e,y,q.value,l),null!==q&&(a&&null!==\\nq.alternate&&t.delete(null===q.key?y:q.key),g=f(q,g,y),null===m?k=q:m.sibling=q,m=q);a&&t.forEach(function(a){return b(e,a)});return k}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===ab&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Za:a:{l=f.key;for(k=d;null!==k;){if(k.key===l){switch(k.tag){case 7:if(f.type===ab){c(a,k.sibling);d=e(k,f.props.children);d.return=a;a=d;break a}break;default:if(k.elementType===f.type){c(a,\\nk.sibling);d=e(k,f.props);d.ref=Pg(a,k,f);d.return=a;a=d;break a}}c(a,k);break}else b(a,k);k=k.sibling}f.type===ab?(d=Wg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Ug(f.type,f.key,f.props,null,a.mode,h),h.ref=Pg(a,d,f),h.return=a,a=h)}return g(a);case $a:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=\\nd.sibling}d=Vg(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===typeof f||\"number\"===typeof f)return f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=Tg(f,a.mode,h),d.return=a,a=d),g(a);if(Og(f))return ca(a,d,f,h);if(nb(f))return D(a,d,f,h);l&&Qg(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 0:throw a=a.type,Error(u(152,a.displayName||a.name||\"Component\"));}return c(a,d)}}var Xg=Rg(!0),Yg=Rg(!1),Zg={},$g={current:Zg},ah={current:Zg},bh={current:Zg};\\nfunction ch(a){if(a===Zg)throw Error(u(174));return a}function dh(a,b){I(bh,b);I(ah,a);I($g,Zg);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Ob(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=Ob(b,a)}H($g);I($g,b)}function eh(){H($g);H(ah);H(bh)}function fh(a){ch(bh.current);var b=ch($g.current);var c=Ob(b,a.type);b!==c&&(I(ah,a),I($g,c))}function gh(a){ah.current===a&&(H($g),H(ah))}var M={current:0};\\nfunction hh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===Bd||c.data===Cd))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function ih(a,b){return{responder:a,props:b}}\\nvar jh=Wa.ReactCurrentDispatcher,kh=Wa.ReactCurrentBatchConfig,lh=0,N=null,O=null,P=null,mh=!1;function Q(){throw Error(u(321));}function nh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!$e(a[c],b[c]))return!1;return!0}\\nfunction oh(a,b,c,d,e,f){lh=f;N=b;b.memoizedState=null;b.updateQueue=null;b.expirationTime=0;jh.current=null===a||null===a.memoizedState?ph:qh;a=c(d,e);if(b.expirationTime===lh){f=0;do{b.expirationTime=0;if(!(25>f))throw Error(u(301));f+=1;P=O=null;b.updateQueue=null;jh.current=rh;a=c(d,e)}while(b.expirationTime===lh)}jh.current=sh;b=null!==O&&null!==O.next;lh=0;P=O=N=null;mh=!1;if(b)throw Error(u(300));return a}\\nfunction th(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===P?N.memoizedState=P=a:P=P.next=a;return P}function uh(){if(null===O){var a=N.alternate;a=null!==a?a.memoizedState:null}else a=O.next;var b=null===P?N.memoizedState:P.next;if(null!==b)P=b,O=a;else{if(null===a)throw Error(u(310));O=a;a={memoizedState:O.memoizedState,baseState:O.baseState,baseQueue:O.baseQueue,queue:O.queue,next:null};null===P?N.memoizedState=P=a:P=P.next=a}return P}\\nfunction vh(a,b){return\"function\"===typeof b?b(a):b}\\nfunction wh(a){var b=uh(),c=b.queue;if(null===c)throw Error(u(311));c.lastRenderedReducer=a;var d=O,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,k=e;do{var l=k.expirationTime;if(l<lh){var m={expirationTime:k.expirationTime,suspenseConfig:k.suspenseConfig,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null};null===h?(g=h=m,f=d):h=h.next=m;l>N.expirationTime&&\\n(N.expirationTime=l,Bg(l))}else null!==h&&(h=h.next={expirationTime:1073741823,suspenseConfig:k.suspenseConfig,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null}),Ag(l,k.suspenseConfig),d=k.eagerReducer===a?k.eagerState:a(d,k.action);k=k.next}while(null!==k&&k!==e);null===h?f=d:h.next=g;$e(d,b.memoizedState)||(rg=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,c.dispatch]}\\nfunction xh(a){var b=uh(),c=b.queue;if(null===c)throw Error(u(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);$e(f,b.memoizedState)||(rg=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}\\nfunction yh(a){var b=th();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={pending:null,dispatch:null,lastRenderedReducer:vh,lastRenderedState:a};a=a.dispatch=zh.bind(null,N,a);return[b.memoizedState,a]}function Ah(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=N.updateQueue;null===b?(b={lastEffect:null},N.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}\\nfunction Bh(){return uh().memoizedState}function Ch(a,b,c,d){var e=th();N.effectTag|=a;e.memoizedState=Ah(1|b,c,void 0,void 0===d?null:d)}function Dh(a,b,c,d){var e=uh();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&nh(d,g.deps)){Ah(b,c,f,d);return}}N.effectTag|=a;e.memoizedState=Ah(1|b,c,f,d)}function Eh(a,b){return Ch(516,4,a,b)}function Fh(a,b){return Dh(516,4,a,b)}function Gh(a,b){return Dh(4,2,a,b)}\\nfunction Hh(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function Ih(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Dh(4,2,Hh.bind(null,b,a),c)}function Jh(){}function Kh(a,b){th().memoizedState=[a,void 0===b?null:b];return a}function Lh(a,b){var c=uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&nh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\\nfunction Mh(a,b){var c=uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&nh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Nh(a,b,c){var d=ag();cg(98>d?98:d,function(){a(!0)});cg(97<d?97:d,function(){var d=kh.suspense;kh.suspense=void 0===b?null:b;try{a(!1),c()}finally{kh.suspense=d}})}\\nfunction zh(a,b,c){var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e={expirationTime:d,suspenseConfig:e,action:c,eagerReducer:null,eagerState:null,next:null};var f=b.pending;null===f?e.next=e:(e.next=f.next,f.next=e);b.pending=e;f=a.alternate;if(a===N||null!==f&&f===N)mh=!0,e.expirationTime=lh,N.expirationTime=lh;else{if(0===a.expirationTime&&(null===f||0===f.expirationTime)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.eagerReducer=f;e.eagerState=h;if($e(h,g))return}catch(k){}finally{}Ig(a,\\nd)}}\\nvar sh={readContext:sg,useCallback:Q,useContext:Q,useEffect:Q,useImperativeHandle:Q,useLayoutEffect:Q,useMemo:Q,useReducer:Q,useRef:Q,useState:Q,useDebugValue:Q,useResponder:Q,useDeferredValue:Q,useTransition:Q},ph={readContext:sg,useCallback:Kh,useContext:sg,useEffect:Eh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Ch(4,2,Hh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Ch(4,2,a,b)},useMemo:function(a,b){var c=th();b=void 0===b?null:b;a=a();c.memoizedState=[a,\\nb];return a},useReducer:function(a,b,c){var d=th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={pending:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=zh.bind(null,N,a);return[d.memoizedState,a]},useRef:function(a){var b=th();a={current:a};return b.memoizedState=a},useState:yh,useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=yh(a),d=c[0],e=c[1];Eh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=\\nc}},[a,b]);return d},useTransition:function(a){var b=yh(!1),c=b[0];b=b[1];return[Kh(Nh.bind(null,b,a),[b,a]),c]}},qh={readContext:sg,useCallback:Lh,useContext:sg,useEffect:Fh,useImperativeHandle:Ih,useLayoutEffect:Gh,useMemo:Mh,useReducer:wh,useRef:Bh,useState:function(){return wh(vh)},useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=wh(vh),d=c[0],e=c[1];Fh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=c}},[a,b]);return d},useTransition:function(a){var b=\\nwh(vh),c=b[0];b=b[1];return[Lh(Nh.bind(null,b,a),[b,a]),c]}},rh={readContext:sg,useCallback:Lh,useContext:sg,useEffect:Fh,useImperativeHandle:Ih,useLayoutEffect:Gh,useMemo:Mh,useReducer:xh,useRef:Bh,useState:function(){return xh(vh)},useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=xh(vh),d=c[0],e=c[1];Fh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=c}},[a,b]);return d},useTransition:function(a){var b=xh(vh),c=b[0];b=b[1];return[Lh(Nh.bind(null,\\nb,a),[b,a]),c]}},Oh=null,Ph=null,Qh=!1;function Rh(a,b){var c=Sh(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}\\nfunction Th(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\\nfunction Uh(a){if(Qh){var b=Ph;if(b){var c=b;if(!Th(a,b)){b=Jd(c.nextSibling);if(!b||!Th(a,b)){a.effectTag=a.effectTag&-1025|2;Qh=!1;Oh=a;return}Rh(Oh,c)}Oh=a;Ph=Jd(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,Qh=!1,Oh=a}}function Vh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;Oh=a}\\nfunction Wh(a){if(a!==Oh)return!1;if(!Qh)return Vh(a),Qh=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!Gd(b,a.memoizedProps))for(b=Ph;b;)Rh(a,b),b=Jd(b.nextSibling);Vh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(u(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===Ad){if(0===b){Ph=Jd(a.nextSibling);break a}b--}else c!==zd&&c!==Cd&&c!==Bd||b++}a=a.nextSibling}Ph=null}}else Ph=Oh?Jd(a.stateNode.nextSibling):null;return!0}\\nfunction Xh(){Ph=Oh=null;Qh=!1}var Yh=Wa.ReactCurrentOwner,rg=!1;function R(a,b,c,d){b.child=null===a?Yg(b,null,c,d):Xg(b,a.child,c,d)}function Zh(a,b,c,d,e){c=c.render;var f=b.ref;qg(b,e);d=oh(a,b,c,d,f,e);if(null!==a&&!rg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,d,e);return b.child}\\nfunction ai(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!bi(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ci(a,b,g,d,e,f);a=Ug(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:bf,c(e,d)&&a.ref===b.ref))return $h(a,b,f);b.effectTag|=1;a=Sg(g,d);a.ref=b.ref;a.return=b;return b.child=a}\\nfunction ci(a,b,c,d,e,f){return null!==a&&bf(a.memoizedProps,d)&&a.ref===b.ref&&(rg=!1,e<f)?(b.expirationTime=a.expirationTime,$h(a,b,f)):di(a,b,c,d,f)}function ei(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function di(a,b,c,d,e){var f=L(c)?Bf:J.current;f=Cf(b,f);qg(b,e);c=oh(a,b,c,d,f,e);if(null!==a&&!rg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,c,e);return b.child}\\nfunction fi(a,b,c,d,e){if(L(c)){var f=!0;Gf(b)}else f=!1;qg(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),Lg(b,c,d),Ng(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=sg(l):(l=L(c)?Bf:J.current,l=Cf(b,l));var m=c.getDerivedStateFromProps,p=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;p||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\\n\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Mg(b,g,d,l);tg=!1;var x=b.memoizedState;g.state=x;zg(b,d,g,e);k=b.memoizedState;h!==d||x!==k||K.current||tg?(\"function\"===typeof m&&(Fg(b,c,m,d),k=b.memoizedState),(h=tg||Kg(b,c,h,d,x,k,l))?(p||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===\\ntypeof g.componentDidMount&&(b.effectTag|=4)):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,vg(a,b),h=b.memoizedProps,g.props=b.type===b.elementType?h:ig(b.type,h),k=g.context,l=c.contextType,\"object\"===typeof l&&null!==l?l=sg(l):(l=L(c)?Bf:J.current,l=Cf(b,l)),m=c.getDerivedStateFromProps,(p=\"function\"===typeof m||\"function\"===\\ntypeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Mg(b,g,d,l),tg=!1,k=b.memoizedState,g.state=k,zg(b,d,g,e),x=b.memoizedState,h!==d||k!==x||K.current||tg?(\"function\"===typeof m&&(Fg(b,c,m,d),x=b.memoizedState),(m=tg||Kg(b,c,h,d,k,x,l))?(p||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,\\nx,l),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,x,l)),\"function\"===typeof g.componentDidUpdate&&(b.effectTag|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=x),g.props=d,g.state=x,g.context=l,d=m):\\n(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),d=!1);return gi(a,b,c,d,f,e)}\\nfunction gi(a,b,c,d,e,f){ei(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Hf(b,c,!1),$h(a,b,f);d=b.stateNode;Yh.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.effectTag|=1;null!==a&&g?(b.child=Xg(b,a.child,null,f),b.child=Xg(b,null,h,f)):R(a,b,h,f);b.memoizedState=d.state;e&&Hf(b,c,!0);return b.child}function hi(a){var b=a.stateNode;b.pendingContext?Ef(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Ef(a,b.context,!1);dh(a,b.containerInfo)}\\nvar ii={dehydrated:null,retryTime:0};\\nfunction ji(a,b,c){var d=b.mode,e=b.pendingProps,f=M.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);I(M,f&1);if(null===a){void 0!==e.fallback&&Uh(b);if(g){g=e.fallback;e=Wg(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Wg(g,d,c,null);c.return=\\nb;e.sibling=c;b.memoizedState=ii;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Yg(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;c=Sg(a,a.pendingProps);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Sg(d,e);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=ii;b.child=c;return d}c=Xg(b,a.child,e.children,c);b.memoizedState=null;return b.child=\\nc}a=a.child;if(g){g=e.fallback;e=Wg(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Wg(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=ii;b.child=e;return c}b.memoizedState=null;return b.child=Xg(b,a,e.children,c)}\\nfunction ki(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);pg(a.return,b)}function li(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailExpiration:0,tailMode:e,lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.renderingStartTime=0,g.last=d,g.tail=c,g.tailExpiration=0,g.tailMode=e,g.lastEffect=f)}\\nfunction mi(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;R(a,b,d.children,c);d=M.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&ki(a,c);else if(19===a.tag)ki(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}I(M,d);if(0===(b.mode&2))b.memoizedState=\\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===hh(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);li(b,!1,e,c,f,b.lastEffect);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===hh(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}li(b,!0,c,null,f,b.lastEffect);break;case \"together\":li(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}\\nfunction $h(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Bg(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(u(153));if(null!==b.child){a=b.child;c=Sg(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Sg(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}var ni,oi,pi,qi;\\nni=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};oi=function(){};\\npi=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;ch($g.current);a=null;switch(c){case \"input\":f=zb(g,f);d=zb(g,d);a=[];break;case \"option\":f=Gb(g,f);d=Gb(g,d);a=[];break;case \"select\":f=n({},f,{value:void 0});d=n({},d,{value:void 0});a=[];break;case \"textarea\":f=Ib(g,f);d=Ib(g,d);a=[];break;default:\"function\"!==typeof f.onClick&&\"function\"===typeof d.onClick&&(g.onclick=sd)}od(c,d);var h,k;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if(\"style\"===\\nh)for(k in g=f[h],g)g.hasOwnProperty(k)&&(c||(c={}),c[k]=\"\");else\"dangerouslySetInnerHTML\"!==h&&\"children\"!==h&&\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(va.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var l=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&l!==g&&(null!=l||null!=g))if(\"style\"===h)if(g){for(k in g)!g.hasOwnProperty(k)||l&&l.hasOwnProperty(k)||(c||(c={}),c[k]=\"\");for(k in l)l.hasOwnProperty(k)&&g[k]!==l[k]&&(c||(c={}),\\nc[k]=l[k])}else c||(a||(a=[]),a.push(h,c)),c=l;else\"dangerouslySetInnerHTML\"===h?(l=l?l.__html:void 0,g=g?g.__html:void 0,null!=l&&g!==l&&(a=a||[]).push(h,l)):\"children\"===h?g===l||\"string\"!==typeof l&&\"number\"!==typeof l||(a=a||[]).push(h,\"\"+l):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&(va.hasOwnProperty(h)?(null!=l&&rd(e,h),a||g===l||(a=[])):(a=a||[]).push(h,l))}c&&(a=a||[]).push(\"style\",c);e=a;if(b.updateQueue=e)b.effectTag|=4}};\\nqi=function(a,b,c,d){c!==d&&(b.effectTag|=4)};function ri(a,b){switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\\nfunction si(a,b,c){var d=b.pendingProps;switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return L(b.type)&&Df(),null;case 3:return eh(),H(K),H(J),c=b.stateNode,c.pendingContext&&(c.context=c.pendingContext,c.pendingContext=null),null!==a&&null!==a.child||!Wh(b)||(b.effectTag|=4),oi(b),null;case 5:gh(b);c=ch(bh.current);var e=b.type;if(null!==a&&null!=b.stateNode)pi(a,b,e,d,c),a.ref!==b.ref&&(b.effectTag|=128);else{if(!d){if(null===b.stateNode)throw Error(u(166));\\nreturn null}a=ch($g.current);if(Wh(b)){d=b.stateNode;e=b.type;var f=b.memoizedProps;d[Md]=b;d[Nd]=f;switch(e){case \"iframe\":case \"object\":case \"embed\":F(\"load\",d);break;case \"video\":case \"audio\":for(a=0;a<ac.length;a++)F(ac[a],d);break;case \"source\":F(\"error\",d);break;case \"img\":case \"image\":case \"link\":F(\"error\",d);F(\"load\",d);break;case \"form\":F(\"reset\",d);F(\"submit\",d);break;case \"details\":F(\"toggle\",d);break;case \"input\":Ab(d,f);F(\"invalid\",d);rd(c,\"onChange\");break;case \"select\":d._wrapperState=\\n{wasMultiple:!!f.multiple};F(\"invalid\",d);rd(c,\"onChange\");break;case \"textarea\":Jb(d,f),F(\"invalid\",d),rd(c,\"onChange\")}od(e,f);a=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];\"children\"===g?\"string\"===typeof h?d.textContent!==h&&(a=[\"children\",h]):\"number\"===typeof h&&d.textContent!==\"\"+h&&(a=[\"children\",\"\"+h]):va.hasOwnProperty(g)&&null!=h&&rd(c,g)}switch(e){case \"input\":xb(d);Eb(d,f,!0);break;case \"textarea\":xb(d);Lb(d);break;case \"select\":case \"option\":break;default:\"function\"===typeof f.onClick&&\\n(d.onclick=sd)}c=a;b.updateQueue=c;null!==c&&(b.effectTag|=4)}else{g=9===c.nodeType?c:c.ownerDocument;a===qd&&(a=Nb(e));a===qd?\"script\"===e?(a=g.createElement(\"div\"),a.innerHTML=\"<script>\\\\x3c/script>\",a=a.removeChild(a.firstChild)):\"string\"===typeof d.is?a=g.createElement(e,{is:d.is}):(a=g.createElement(e),\"select\"===e&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,e);a[Md]=b;a[Nd]=d;ni(a,b,!1,!1);b.stateNode=a;g=pd(e,d);switch(e){case \"iframe\":case \"object\":case \"embed\":F(\"load\",\\na);h=d;break;case \"video\":case \"audio\":for(h=0;h<ac.length;h++)F(ac[h],a);h=d;break;case \"source\":F(\"error\",a);h=d;break;case \"img\":case \"image\":case \"link\":F(\"error\",a);F(\"load\",a);h=d;break;case \"form\":F(\"reset\",a);F(\"submit\",a);h=d;break;case \"details\":F(\"toggle\",a);h=d;break;case \"input\":Ab(a,d);h=zb(a,d);F(\"invalid\",a);rd(c,\"onChange\");break;case \"option\":h=Gb(a,d);break;case \"select\":a._wrapperState={wasMultiple:!!d.multiple};h=n({},d,{value:void 0});F(\"invalid\",a);rd(c,\"onChange\");break;case \"textarea\":Jb(a,\\nd);h=Ib(a,d);F(\"invalid\",a);rd(c,\"onChange\");break;default:h=d}od(e,h);var k=h;for(f in k)if(k.hasOwnProperty(f)){var l=k[f];\"style\"===f?md(a,l):\"dangerouslySetInnerHTML\"===f?(l=l?l.__html:void 0,null!=l&&Qb(a,l)):\"children\"===f?\"string\"===typeof l?(\"textarea\"!==e||\"\"!==l)&&Rb(a,l):\"number\"===typeof l&&Rb(a,\"\"+l):\"suppressContentEditableWarning\"!==f&&\"suppressHydrationWarning\"!==f&&\"autoFocus\"!==f&&(va.hasOwnProperty(f)?null!=l&&rd(c,f):null!=l&&Xa(a,f,l,g))}switch(e){case \"input\":xb(a);Eb(a,d,!1);\\nbreak;case \"textarea\":xb(a);Lb(a);break;case \"option\":null!=d.value&&a.setAttribute(\"value\",\"\"+rb(d.value));break;case \"select\":a.multiple=!!d.multiple;c=d.value;null!=c?Hb(a,!!d.multiple,c,!1):null!=d.defaultValue&&Hb(a,!!d.multiple,d.defaultValue,!0);break;default:\"function\"===typeof h.onClick&&(a.onclick=sd)}Fd(e,d)&&(b.effectTag|=4)}null!==b.ref&&(b.effectTag|=128)}return null;case 6:if(a&&null!=b.stateNode)qi(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d&&null===b.stateNode)throw Error(u(166));\\nc=ch(bh.current);ch($g.current);Wh(b)?(c=b.stateNode,d=b.memoizedProps,c[Md]=b,c.nodeValue!==d&&(b.effectTag|=4)):(c=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),c[Md]=b,b.stateNode=c)}return null;case 13:H(M);d=b.memoizedState;if(0!==(b.effectTag&64))return b.expirationTime=c,b;c=null!==d;d=!1;null===a?void 0!==b.memoizedProps.fallback&&Wh(b):(e=a.memoizedState,d=null!==e,c||null===e||(e=a.child.sibling,null!==e&&(f=b.firstEffect,null!==f?(b.firstEffect=e,e.nextEffect=f):(b.firstEffect=b.lastEffect=\\ne,e.nextEffect=null),e.effectTag=8)));if(c&&!d&&0!==(b.mode&2))if(null===a&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(M.current&1))S===ti&&(S=ui);else{if(S===ti||S===ui)S=vi;0!==wi&&null!==T&&(xi(T,U),yi(T,wi))}if(c||d)b.effectTag|=4;return null;case 4:return eh(),oi(b),null;case 10:return og(b),null;case 17:return L(b.type)&&Df(),null;case 19:H(M);d=b.memoizedState;if(null===d)return null;e=0!==(b.effectTag&64);f=d.rendering;if(null===f)if(e)ri(d,!1);else{if(S!==ti||null!==a&&0!==(a.effectTag&\\n64))for(f=b.child;null!==f;){a=hh(f);if(null!==a){b.effectTag|=64;ri(d,!1);e=a.updateQueue;null!==e&&(b.updateQueue=e,b.effectTag|=4);null===d.lastEffect&&(b.firstEffect=null);b.lastEffect=d.lastEffect;for(d=b.child;null!==d;)e=d,f=c,e.effectTag&=2,e.nextEffect=null,e.firstEffect=null,e.lastEffect=null,a=e.alternate,null===a?(e.childExpirationTime=0,e.expirationTime=f,e.child=null,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null):(e.childExpirationTime=a.childExpirationTime,\\ne.expirationTime=a.expirationTime,e.child=a.child,e.memoizedProps=a.memoizedProps,e.memoizedState=a.memoizedState,e.updateQueue=a.updateQueue,f=a.dependencies,e.dependencies=null===f?null:{expirationTime:f.expirationTime,firstContext:f.firstContext,responders:f.responders}),d=d.sibling;I(M,M.current&1|2);return b.child}f=f.sibling}}else{if(!e)if(a=hh(f),null!==a){if(b.effectTag|=64,e=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.effectTag|=4),ri(d,!0),null===d.tail&&\"hidden\"===d.tailMode&&!f.alternate)return b=\\nb.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*$f()-d.renderingStartTime>d.tailExpiration&&1<c&&(b.effectTag|=64,e=!0,ri(d,!1),b.expirationTime=b.childExpirationTime=c-1);d.isBackwards?(f.sibling=b.child,b.child=f):(c=d.last,null!==c?c.sibling=f:b.child=f,d.last=f)}return null!==d.tail?(0===d.tailExpiration&&(d.tailExpiration=$f()+500),c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=$f(),c.sibling=null,b=M.current,I(M,e?b&1|2:b&1),c):null}throw Error(u(156,\\nb.tag));}function zi(a){switch(a.tag){case 1:L(a.type)&&Df();var b=a.effectTag;return b&4096?(a.effectTag=b&-4097|64,a):null;case 3:eh();H(K);H(J);b=a.effectTag;if(0!==(b&64))throw Error(u(285));a.effectTag=b&-4097|64;return a;case 5:return gh(a),null;case 13:return H(M),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return H(M),null;case 4:return eh(),null;case 10:return og(a),null;default:return null}}function Ai(a,b){return{value:a,source:b,stack:qb(b)}}\\nvar Bi=\"function\"===typeof WeakSet?WeakSet:Set;function Ci(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=qb(c));null!==c&&pb(c.type);b=b.value;null!==a&&1===a.tag&&pb(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function Di(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){Ei(a,c)}}function Fi(a){var b=a.ref;if(null!==b)if(\"function\"===typeof b)try{b(null)}catch(c){Ei(a,c)}else b.current=null}\\nfunction Gi(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:ig(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:case 5:case 6:case 4:case 17:return}throw Error(u(163));}\\nfunction Hi(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.destroy;c.destroy=void 0;void 0!==d&&d()}c=c.next}while(c!==b)}}function Ii(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}\\nfunction Ji(a,b,c){switch(c.tag){case 0:case 11:case 15:case 22:Ii(3,c);return;case 1:a=c.stateNode;if(c.effectTag&4)if(null===b)a.componentDidMount();else{var d=c.elementType===c.type?b.memoizedProps:ig(c.type,b.memoizedProps);a.componentDidUpdate(d,b.memoizedState,a.__reactInternalSnapshotBeforeUpdate)}b=c.updateQueue;null!==b&&Cg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Cg(c,b,a)}return;\\ncase 5:a=c.stateNode;null===b&&c.effectTag&4&&Fd(c.type,c.memoizedProps)&&a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&Vc(c))));return;case 19:case 17:case 20:case 21:return}throw Error(u(163));}\\nfunction Ki(a,b,c){\"function\"===typeof Li&&Li(b);switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;cg(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Ei(g,h)}}a=a.next}while(a!==d)})}break;case 1:Fi(b);c=b.stateNode;\"function\"===typeof c.componentWillUnmount&&Di(b,c);break;case 5:Fi(b);break;case 4:Mi(a,b,c)}}\\nfunction Ni(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;a.stateNode=null;null!==b&&Ni(b)}function Oi(a){return 5===a.tag||3===a.tag||4===a.tag}\\nfunction Pi(a){a:{for(var b=a.return;null!==b;){if(Oi(b)){var c=b;break a}b=b.return}throw Error(u(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(u(161));}c.effectTag&16&&(Rb(b,\"\"),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Oi(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;\\nif(null===c.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}d?Qi(a,c,b):Ri(a,c,b)}\\nfunction Qi(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=sd));else if(4!==d&&(a=a.child,null!==a))for(Qi(a,b,c),a=a.sibling;null!==a;)Qi(a,b,c),a=a.sibling}\\nfunction Ri(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Ri(a,b,c),a=a.sibling;null!==a;)Ri(a,b,c),a=a.sibling}\\nfunction Mi(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(u(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,m=k;;)if(Ki(h,m,l),null!==m.child&&4!==m.tag)m.child.return=m,m=m.child;else{if(m===k)break a;for(;null===m.sibling;){if(null===m.return||m.return===k)break a;m=m.return}m.sibling.return=m.return;m=m.sibling}g?(h=\\nf,k=d.stateNode,8===h.nodeType?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Ki(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}\\nfunction Si(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:Hi(3,b);return;case 1:return;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[Nd]=d;\"input\"===a&&\"radio\"===d.type&&null!=d.name&&Bb(c,d);pd(a,e);b=pd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];\"style\"===g?md(c,h):\"dangerouslySetInnerHTML\"===g?Qb(c,h):\"children\"===g?Rb(c,h):Xa(c,g,h,b)}switch(a){case \"input\":Cb(c,d);break;\\ncase \"textarea\":Kb(c,d);break;case \"select\":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?Hb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?Hb(c,!!d.multiple,d.defaultValue,!0):Hb(c,!!d.multiple,d.multiple?[]:\"\",!1))}}}return;case 6:if(null===b.stateNode)throw Error(u(162));b.stateNode.nodeValue=b.memoizedProps;return;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,Vc(b.containerInfo));return;case 12:return;case 13:c=b;null===b.memoizedState?\\nd=!1:(d=!0,c=b.child,Ti=$f());if(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty(\"display\")?e.display:null,f.style.display=ld(\"display\",e));else if(6===a.tag)a.stateNode.nodeValue=d?\"\":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=\\nf;continue}else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===c)break;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Ui(b);return;case 19:Ui(b);return;case 17:return}throw Error(u(163));}function Ui(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Bi);b.forEach(function(b){var d=Vi.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\\nvar Wi=\"function\"===typeof WeakMap?WeakMap:Map;function Xi(a,b,c){c=wg(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Yi||(Yi=!0,Zi=d);Ci(a,b)};return c}\\nfunction $i(a,b,c){c=wg(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){Ci(a,b);return d(e)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){\"function\"!==typeof d&&(null===aj?aj=new Set([this]):aj.add(this),Ci(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\\nvar bj=Math.ceil,cj=Wa.ReactCurrentDispatcher,dj=Wa.ReactCurrentOwner,V=0,ej=8,fj=16,gj=32,ti=0,hj=1,ij=2,ui=3,vi=4,jj=5,W=V,T=null,X=null,U=0,S=ti,kj=null,lj=1073741823,mj=1073741823,nj=null,wi=0,oj=!1,Ti=0,pj=500,Y=null,Yi=!1,Zi=null,aj=null,qj=!1,rj=null,sj=90,tj=null,uj=0,vj=null,wj=0;function Gg(){return(W&(fj|gj))!==V?1073741821-($f()/10|0):0!==wj?wj:wj=1073741821-($f()/10|0)}\\nfunction Hg(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=ag();if(0===(b&4))return 99===d?1073741823:1073741822;if((W&fj)!==V)return U;if(null!==c)a=hg(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=hg(a,150,100);break;case 97:case 96:a=hg(a,5E3,250);break;case 95:a=2;break;default:throw Error(u(326));}null!==T&&a===U&&--a;return a}\\nfunction Ig(a,b){if(50<uj)throw uj=0,vj=null,Error(u(185));a=xj(a,b);if(null!==a){var c=ag();1073741823===b?(W&ej)!==V&&(W&(fj|gj))===V?yj(a):(Z(a),W===V&&gg()):Z(a);(W&4)===V||98!==c&&99!==c||(null===tj?tj=new Map([[a,b]]):(c=tj.get(a),(void 0===c||c>b)&&tj.set(a,b)))}}\\nfunction xj(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&(T===e&&(Bg(b),S===vi&&xi(e,U)),yi(e,b));return e}\\nfunction zj(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Aj(a,b))return b;var c=a.lastPingedTime;a=a.nextKnownPendingLevel;a=c>a?c:a;return 2>=a&&b!==a?0:a}\\nfunction Z(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=eg(yj.bind(null,a));else{var b=zj(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=Gg();1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Tf&&Kf(c)}a.callbackExpirationTime=\\nb;a.callbackPriority=d;b=1073741823===b?eg(yj.bind(null,a)):dg(d,Bj.bind(null,a),{timeout:10*(1073741821-b)-$f()});a.callbackNode=b}}}\\nfunction Bj(a,b){wj=0;if(b)return b=Gg(),Cj(a,b),Z(a),null;var c=zj(a);if(0!==c){b=a.callbackNode;if((W&(fj|gj))!==V)throw Error(u(327));Dj();a===T&&c===U||Ej(a,c);if(null!==X){var d=W;W|=fj;var e=Fj();do try{Gj();break}catch(h){Hj(a,h)}while(1);ng();W=d;cj.current=e;if(S===hj)throw b=kj,Ej(a,c),xi(a,c),Z(a),b;if(null===X)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=S,T=null,d){case ti:case hj:throw Error(u(345));case ij:Cj(a,2<c?2:c);break;case ui:xi(a,c);d=a.lastSuspendedTime;\\nc===d&&(a.nextKnownPendingLevel=Ij(e));if(1073741823===lj&&(e=Ti+pj-$f(),10<e)){if(oj){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=c;Ej(a,c);break}}f=zj(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=Hd(Jj.bind(null,a),e);break}Jj(a);break;case vi:xi(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ij(e));if(oj&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;Ej(a,c);break}e=zj(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=\\nd;break}1073741823!==mj?d=10*(1073741821-mj)-$f():1073741823===lj?d=0:(d=10*(1073741821-lj)-5E3,e=$f(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*bj(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=Hd(Jj.bind(null,a),d);break}Jj(a);break;case jj:if(1073741823!==lj&&null!==nj){f=lj;var g=nj;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=$f()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){xi(a,c);a.timeoutHandle=\\nHd(Jj.bind(null,a),d);break}}Jj(a);break;default:throw Error(u(329));}Z(a);if(a.callbackNode===b)return Bj.bind(null,a)}}return null}\\nfunction yj(a){var b=a.lastExpiredTime;b=0!==b?b:1073741823;if((W&(fj|gj))!==V)throw Error(u(327));Dj();a===T&&b===U||Ej(a,b);if(null!==X){var c=W;W|=fj;var d=Fj();do try{Kj();break}catch(e){Hj(a,e)}while(1);ng();W=c;cj.current=d;if(S===hj)throw c=kj,Ej(a,b),xi(a,b),Z(a),c;if(null!==X)throw Error(u(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;T=null;Jj(a);Z(a)}return null}function Lj(){if(null!==tj){var a=tj;tj=null;a.forEach(function(a,c){Cj(c,a);Z(c)});gg()}}\\nfunction Mj(a,b){var c=W;W|=1;try{return a(b)}finally{W=c,W===V&&gg()}}function Nj(a,b){var c=W;W&=-2;W|=ej;try{return a(b)}finally{W=c,W===V&&gg()}}\\nfunction Ej(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Id(c));if(null!==X)for(c=X.return;null!==c;){var d=c;switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&Df();break;case 3:eh();H(K);H(J);break;case 5:gh(d);break;case 4:eh();break;case 13:H(M);break;case 19:H(M);break;case 10:og(d)}c=c.return}T=a;X=Sg(a.current,null);U=b;S=ti;kj=null;mj=lj=1073741823;nj=null;wi=0;oj=!1}\\nfunction Hj(a,b){do{try{ng();jh.current=sh;if(mh)for(var c=N.memoizedState;null!==c;){var d=c.queue;null!==d&&(d.pending=null);c=c.next}lh=0;P=O=N=null;mh=!1;if(null===X||null===X.return)return S=hj,kj=b,X=null;a:{var e=a,f=X.return,g=X,h=b;b=U;g.effectTag|=2048;g.firstEffect=g.lastEffect=null;if(null!==h&&\"object\"===typeof h&&\"function\"===typeof h.then){var k=h;if(0===(g.mode&2)){var l=g.alternate;l?(g.updateQueue=l.updateQueue,g.memoizedState=l.memoizedState,g.expirationTime=l.expirationTime):(g.updateQueue=\\nnull,g.memoizedState=null)}var m=0!==(M.current&1),p=f;do{var x;if(x=13===p.tag){var z=p.memoizedState;if(null!==z)x=null!==z.dehydrated?!0:!1;else{var ca=p.memoizedProps;x=void 0===ca.fallback?!1:!0!==ca.unstable_avoidThisFallback?!0:m?!1:!0}}if(x){var D=p.updateQueue;if(null===D){var t=new Set;t.add(k);p.updateQueue=t}else D.add(k);if(0===(p.mode&2)){p.effectTag|=64;g.effectTag&=-2981;if(1===g.tag)if(null===g.alternate)g.tag=17;else{var y=wg(1073741823,null);y.tag=2;xg(g,y)}g.expirationTime=1073741823;\\nbreak a}h=void 0;g=b;var A=e.pingCache;null===A?(A=e.pingCache=new Wi,h=new Set,A.set(k,h)):(h=A.get(k),void 0===h&&(h=new Set,A.set(k,h)));if(!h.has(g)){h.add(g);var q=Oj.bind(null,e,k,g);k.then(q,q)}p.effectTag|=4096;p.expirationTime=b;break a}p=p.return}while(null!==p);h=Error((pb(g.type)||\"A React component\")+\" suspended while rendering, but no fallback UI was specified.\\\\n\\\\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.\"+qb(g))}S!==\\njj&&(S=ij);h=Ai(h,g);p=f;do{switch(p.tag){case 3:k=h;p.effectTag|=4096;p.expirationTime=b;var B=Xi(p,k,b);yg(p,B);break a;case 1:k=h;var w=p.type,ub=p.stateNode;if(0===(p.effectTag&64)&&(\"function\"===typeof w.getDerivedStateFromError||null!==ub&&\"function\"===typeof ub.componentDidCatch&&(null===aj||!aj.has(ub)))){p.effectTag|=4096;p.expirationTime=b;var vb=$i(p,k,b);yg(p,vb);break a}}p=p.return}while(null!==p)}X=Pj(X)}catch(Xc){b=Xc;continue}break}while(1)}\\nfunction Fj(){var a=cj.current;cj.current=sh;return null===a?sh:a}function Ag(a,b){a<lj&&2<a&&(lj=a);null!==b&&a<mj&&2<a&&(mj=a,nj=b)}function Bg(a){a>wi&&(wi=a)}function Kj(){for(;null!==X;)X=Qj(X)}function Gj(){for(;null!==X&&!Uf();)X=Qj(X)}function Qj(a){var b=Rj(a.alternate,a,U);a.memoizedProps=a.pendingProps;null===b&&(b=Pj(a));dj.current=null;return b}\\nfunction Pj(a){X=a;do{var b=X.alternate;a=X.return;if(0===(X.effectTag&2048)){b=si(b,X,U);if(1===U||1!==X.childExpirationTime){for(var c=0,d=X.child;null!==d;){var e=d.expirationTime,f=d.childExpirationTime;e>c&&(c=e);f>c&&(c=f);d=d.sibling}X.childExpirationTime=c}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=X.firstEffect),null!==X.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=X.firstEffect),a.lastEffect=X.lastEffect),1<X.effectTag&&(null!==\\na.lastEffect?a.lastEffect.nextEffect=X:a.firstEffect=X,a.lastEffect=X))}else{b=zi(X);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=2048)}b=X.sibling;if(null!==b)return b;X=a}while(null!==X);S===ti&&(S=jj);return null}function Ij(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function Jj(a){var b=ag();cg(99,Sj.bind(null,a,b));return null}\\nfunction Sj(a,b){do Dj();while(null!==rj);if((W&(fj|gj))!==V)throw Error(u(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(u(177));a.callbackNode=null;a.callbackExpirationTime=0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Ij(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=\\nd-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===T&&(X=T=null,U=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=W;W|=gj;dj.current=null;Dd=fd;var g=xd();if(yd(g)){if(\"selectionStart\"in g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var k=h.getSelection&&h.getSelection();if(k&&0!==k.rangeCount){h=k.anchorNode;var l=k.anchorOffset,\\nm=k.focusNode;k=k.focusOffset;try{h.nodeType,m.nodeType}catch(wb){h=null;break a}var p=0,x=-1,z=-1,ca=0,D=0,t=g,y=null;b:for(;;){for(var A;;){t!==h||0!==l&&3!==t.nodeType||(x=p+l);t!==m||0!==k&&3!==t.nodeType||(z=p+k);3===t.nodeType&&(p+=t.nodeValue.length);if(null===(A=t.firstChild))break;y=t;t=A}for(;;){if(t===g)break b;y===h&&++ca===l&&(x=p);y===m&&++D===k&&(z=p);if(null!==(A=t.nextSibling))break;t=y;y=t.parentNode}t=A}h=-1===x||-1===z?null:{start:x,end:z}}else h=null}h=h||{start:0,end:0}}else h=\\nnull;Ed={activeElementDetached:null,focusedElem:g,selectionRange:h};fd=!1;Y=e;do try{Tj()}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);Y=e;do try{for(g=a,h=b;null!==Y;){var q=Y.effectTag;q&16&&Rb(Y.stateNode,\"\");if(q&128){var B=Y.alternate;if(null!==B){var w=B.ref;null!==w&&(\"function\"===typeof w?w(null):w.current=null)}}switch(q&1038){case 2:Pi(Y);Y.effectTag&=-3;break;case 6:Pi(Y);Y.effectTag&=-3;Si(Y.alternate,Y);break;case 1024:Y.effectTag&=-1025;break;case 1028:Y.effectTag&=\\n-1025;Si(Y.alternate,Y);break;case 4:Si(Y.alternate,Y);break;case 8:l=Y,Mi(g,l,h),Ni(l)}Y=Y.nextEffect}}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);w=Ed;B=xd();q=w.focusedElem;h=w.selectionRange;if(B!==q&&q&&q.ownerDocument&&wd(q.ownerDocument.documentElement,q)){null!==h&&yd(q)&&(B=h.start,w=h.end,void 0===w&&(w=B),\"selectionStart\"in q?(q.selectionStart=B,q.selectionEnd=Math.min(w,q.value.length)):(w=(B=q.ownerDocument||document)&&B.defaultView||window,w.getSelection&&\\n(w=w.getSelection(),l=q.textContent.length,g=Math.min(h.start,l),h=void 0===h.end?g:Math.min(h.end,l),!w.extend&&g>h&&(l=h,h=g,g=l),l=vd(q,g),m=vd(q,h),l&&m&&(1!==w.rangeCount||w.anchorNode!==l.node||w.anchorOffset!==l.offset||w.focusNode!==m.node||w.focusOffset!==m.offset)&&(B=B.createRange(),B.setStart(l.node,l.offset),w.removeAllRanges(),g>h?(w.addRange(B),w.extend(m.node,m.offset)):(B.setEnd(m.node,m.offset),w.addRange(B))))));B=[];for(w=q;w=w.parentNode;)1===w.nodeType&&B.push({element:w,left:w.scrollLeft,\\ntop:w.scrollTop});\"function\"===typeof q.focus&&q.focus();for(q=0;q<B.length;q++)w=B[q],w.element.scrollLeft=w.left,w.element.scrollTop=w.top}fd=!!Dd;Ed=Dd=null;a.current=c;Y=e;do try{for(q=a;null!==Y;){var ub=Y.effectTag;ub&36&&Ji(q,Y.alternate,Y);if(ub&128){B=void 0;var vb=Y.ref;if(null!==vb){var Xc=Y.stateNode;switch(Y.tag){case 5:B=Xc;break;default:B=Xc}\"function\"===typeof vb?vb(B):vb.current=B}}Y=Y.nextEffect}}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);Y=\\nnull;Vf();W=f}else a.current=c;if(qj)qj=!1,rj=a,sj=b;else for(Y=e;null!==Y;)b=Y.nextEffect,Y.nextEffect=null,Y=b;b=a.firstPendingTime;0===b&&(aj=null);1073741823===b?a===vj?uj++:(uj=0,vj=a):uj=0;\"function\"===typeof Uj&&Uj(c.stateNode,d);Z(a);if(Yi)throw Yi=!1,a=Zi,Zi=null,a;if((W&ej)!==V)return null;gg();return null}function Tj(){for(;null!==Y;){var a=Y.effectTag;0!==(a&256)&&Gi(Y.alternate,Y);0===(a&512)||qj||(qj=!0,dg(97,function(){Dj();return null}));Y=Y.nextEffect}}\\nfunction Dj(){if(90!==sj){var a=97<sj?97:sj;sj=90;return cg(a,Vj)}}function Vj(){if(null===rj)return!1;var a=rj;rj=null;if((W&(fj|gj))!==V)throw Error(u(331));var b=W;W|=gj;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:case 22:Hi(5,c),Ii(5,c)}}catch(d){if(null===a)throw Error(u(330));Ei(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}W=b;gg();return!0}\\nfunction Wj(a,b,c){b=Ai(c,b);b=Xi(a,b,1073741823);xg(a,b);a=xj(a,1073741823);null!==a&&Z(a)}function Ei(a,b){if(3===a.tag)Wj(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){Wj(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===aj||!aj.has(d))){a=Ai(b,a);a=$i(c,a,1073741823);xg(c,a);c=xj(c,1073741823);null!==c&&Z(c);break}}c=c.return}}\\nfunction Oj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);T===a&&U===c?S===vi||S===ui&&1073741823===lj&&$f()-Ti<pj?Ej(a,U):oj=!0:Aj(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,Z(a)))}function Vi(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=Gg(),b=Hg(b,a,null));a=xj(a,b);null!==a&&Z(a)}var Rj;\\nRj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||K.current)rg=!0;else{if(d<c){rg=!1;switch(b.tag){case 3:hi(b);Xh();break;case 5:fh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:L(b.type)&&Gf(b);break;case 4:dh(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;e=b.type._context;I(jg,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;\\nif(0!==d&&d>=c)return ji(a,b,c);I(M,M.current&1);b=$h(a,b,c);return null!==b?b.sibling:null}I(M,M.current&1);break;case 19:d=b.childExpirationTime>=c;if(0!==(a.effectTag&64)){if(d)return mi(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);I(M,M.current);if(!d)return null}return $h(a,b,c)}rg=!1}}else rg=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=Cf(b,J.current);qg(b,c);e=oh(null,\\nb,d,a,e,c);b.effectTag|=1;if(\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(L(d)){var f=!0;Gf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;ug(b);var g=d.getDerivedStateFromProps;\"function\"===typeof g&&Fg(b,d,g,a);e.updater=Jg;b.stateNode=e;e._reactInternalFiber=b;Ng(b,d,a,c);b=gi(null,b,d,!0,f,c)}else b.tag=0,R(null,b,e,c),b=b.child;return b;case 16:a:{e=b.elementType;null!==a&&(a.alternate=\\nnull,b.alternate=null,b.effectTag|=2);a=b.pendingProps;ob(e);if(1!==e._status)throw e._result;e=e._result;b.type=e;f=b.tag=Xj(e);a=ig(e,a);switch(f){case 0:b=di(null,b,e,a,c);break a;case 1:b=fi(null,b,e,a,c);break a;case 11:b=Zh(null,b,e,a,c);break a;case 14:b=ai(null,b,e,ig(e.type,a),d,c);break a}throw Error(u(306,e,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),di(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),fi(a,b,d,e,c);\\ncase 3:hi(b);d=b.updateQueue;if(null===a||null===d)throw Error(u(282));d=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;vg(a,b);zg(b,d,null,c);d=b.memoizedState.element;if(d===e)Xh(),b=$h(a,b,c);else{if(e=b.stateNode.hydrate)Ph=Jd(b.stateNode.containerInfo.firstChild),Oh=b,e=Qh=!0;if(e)for(c=Yg(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else R(a,b,d,c),Xh();b=b.child}return b;case 5:return fh(b),null===a&&Uh(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:\\nnull,g=e.children,Gd(d,e)?g=null:null!==f&&Gd(d,f)&&(b.effectTag|=16),ei(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(R(a,b,g,c),b=b.child),b;case 6:return null===a&&Uh(b),null;case 13:return ji(a,b,c);case 4:return dh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Xg(b,null,d,c):R(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),Zh(a,b,d,e,c);case 7:return R(a,b,b.pendingProps,c),b.child;case 8:return R(a,\\nb,b.pendingProps.children,c),b.child;case 12:return R(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;var h=b.type._context;I(jg,h._currentValue);h._currentValue=f;if(null!==g)if(h=g.value,f=$e(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0,0===f){if(g.children===e.children&&!K.current){b=$h(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==\\nk){g=h.child;for(var l=k.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=wg(c,null),l.tag=2,xg(h,l));h.expirationTime<c&&(h.expirationTime=c);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);pg(h.return,c);k.expirationTime<c&&(k.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=\\ng}R(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,qg(b,c),e=sg(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,R(a,b,d,c),b.child;case 14:return e=b.type,f=ig(e,b.pendingProps),f=ig(e.type,f),ai(a,b,e,f,d,c);case 15:return ci(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,L(d)?(a=!0,Gf(b)):a=!1,qg(b,c),Lg(b,d,e),Ng(b,d,e,c),gi(null,\\nb,d,!0,a,c);case 19:return mi(a,b,c)}throw Error(u(156,b.tag));};var Uj=null,Li=null;function Yj(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Uj=function(a){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(e){}};Li=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}\\nfunction Zj(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Sh(a,b,c,d){return new Zj(a,b,c,d)}\\nfunction bi(a){a=a.prototype;return!(!a||!a.isReactComponent)}function Xj(a){if(\"function\"===typeof a)return bi(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===gb)return 11;if(a===jb)return 14}return 2}\\nfunction Sg(a,b){var c=a.alternate;null===c?(c=Sh(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,\\nfirstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\\nfunction Ug(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)bi(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ab:return Wg(c.children,e,f,b);case fb:g=8;e|=7;break;case bb:g=8;e|=1;break;case cb:return a=Sh(12,c,b,e|8),a.elementType=cb,a.type=cb,a.expirationTime=f,a;case hb:return a=Sh(13,c,b,e),a.type=hb,a.elementType=hb,a.expirationTime=f,a;case ib:return a=Sh(19,c,b,e),a.elementType=ib,a.expirationTime=f,a;default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case db:g=\\n10;break a;case eb:g=9;break a;case gb:g=11;break a;case jb:g=14;break a;case kb:g=16;d=null;break a;case lb:g=22;break a}throw Error(u(130,null==a?a:typeof a,\"\"));}b=Sh(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Wg(a,b,c,d){a=Sh(7,a,d,b);a.expirationTime=c;return a}function Tg(a,b,c){a=Sh(6,a,null,b);a.expirationTime=c;return a}\\nfunction Vg(a,b,c){b=Sh(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\\nfunction ak(a,b,c){this.tag=b;this.current=null;this.containerInfo=a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}\\nfunction Aj(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function xi(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}\\nfunction yi(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Cj(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}\\nfunction bk(a,b,c,d){var e=b.current,f=Gg(),g=Dg.suspense;f=Hg(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(dc(c)!==c||1!==c.tag)throw Error(u(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(L(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(u(171));}if(1===c.tag){var k=c.type;if(L(k)){c=Ff(c,k,h);break a}}c=h}else c=Af;null===b.context?b.context=c:b.pendingContext=c;b=wg(f,g);b.payload={element:a};d=void 0===\\nd?null:d;null!==d&&(b.callback=d);xg(e,b);Ig(e,f);return f}function ck(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function dk(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function ek(a,b){dk(a,b);(a=a.alternate)&&dk(a,b)}\\nfunction fk(a,b,c){c=null!=c&&!0===c.hydrate;var d=new ak(a,b,c),e=Sh(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;ug(e);a[Od]=d.current;c&&0!==b&&Jc(a,9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}fk.prototype.render=function(a){bk(a,this._internalRoot,null,null)};fk.prototype.unmount=function(){var a=this._internalRoot,b=a.containerInfo;bk(null,a,null,function(){b[Od]=null})};\\nfunction gk(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}function hk(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new fk(a,0,b?{hydrate:!0}:void 0)}\\nfunction ik(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if(\"function\"===typeof e){var h=e;e=function(){var a=ck(g);h.call(a)}}bk(b,g,a,e)}else{f=c._reactRootContainer=hk(c,d);g=f._internalRoot;if(\"function\"===typeof e){var k=e;e=function(){var a=ck(g);k.call(a)}}Nj(function(){bk(b,g,a,e)})}return ck(g)}function jk(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:$a,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\\nwc=function(a){if(13===a.tag){var b=hg(Gg(),150,100);Ig(a,b);ek(a,b)}};xc=function(a){13===a.tag&&(Ig(a,3),ek(a,3))};yc=function(a){if(13===a.tag){var b=Gg();b=Hg(b,a,null);Ig(a,b);ek(a,b)}};\\nza=function(a,b,c){switch(b){case \"input\":Cb(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+\\'][type=\"radio\"]\\');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Qd(d);if(!e)throw Error(u(90));yb(d);Cb(d,e)}}}break;case \"textarea\":Kb(a,c);break;case \"select\":b=c.value,null!=b&&Hb(a,!!c.multiple,b,!1)}};Fa=Mj;\\nGa=function(a,b,c,d,e){var f=W;W|=4;try{return cg(98,a.bind(null,b,c,d,e))}finally{W=f,W===V&&gg()}};Ha=function(){(W&(1|fj|gj))===V&&(Lj(),Dj())};Ia=function(a,b){var c=W;W|=2;try{return a(b)}finally{W=c,W===V&&gg()}};function kk(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!gk(b))throw Error(u(200));return jk(a,b,null,c)}var lk={Events:[Nc,Pd,Qd,xa,ta,Xd,function(a){jc(a,Wd)},Da,Ea,id,mc,Dj,{current:!1}]};\\n(function(a){var b=a.findFiberByHostInstance;return Yj(n({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Wa.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=hc(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:tc,bundleType:0,version:\"16.13.1\",\\nrendererPackageName:\"react-dom\"});exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=lk;exports.createPortal=kk;exports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;if(void 0===b){if(\"function\"===typeof a.render)throw Error(u(188));throw Error(u(268,Object.keys(a)));}a=hc(b);a=null===a?null:a.stateNode;return a};\\nexports.flushSync=function(a,b){if((W&(fj|gj))!==V)throw Error(u(187));var c=W;W|=1;try{return cg(99,a.bind(null,b))}finally{W=c,gg()}};exports.hydrate=function(a,b,c){if(!gk(b))throw Error(u(200));return ik(null,a,b,!0,c)};exports.render=function(a,b,c){if(!gk(b))throw Error(u(200));return ik(null,a,b,!1,c)};\\nexports.unmountComponentAtNode=function(a){if(!gk(a))throw Error(u(40));return a._reactRootContainer?(Nj(function(){ik(null,null,a,!1,function(){a._reactRootContainer=null;a[Od]=null})}),!0):!1};exports.unstable_batchedUpdates=Mj;exports.unstable_createPortal=function(a,b){return kk(a,b,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)};\\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!gk(c))throw Error(u(200));if(null==a||void 0===a._reactInternalFiber)throw Error(u(38));return ik(a,b,c,!1,d)};exports.version=\"16.13.1\";\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanM/Yjk1NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNhLE9BQU8sbUJBQU8sQ0FBQyxDQUFPLElBQUksbUJBQU8sQ0FBQyxDQUFlLElBQUksbUJBQU8sQ0FBQyxFQUFXLEVBQUUsY0FBYyx5RUFBeUUsbUJBQW1CLG1EQUFtRCxtQ0FBbUMsNEhBQTRIO0FBQ25aLCtCQUErQiw4Q0FBOEMsSUFBSSxhQUFhLFNBQVMsaUJBQWlCLG9DQUFvQyxvQkFBb0IsTUFBTSxPQUFPLCtCQUErQixNQUFNLFFBQVEsdUJBQXVCLCtCQUErQix5QkFBeUIsT0FBTyxPQUFPLFNBQVMsTUFBTSxRQUFRLHlCQUF5QixrQkFBa0I7QUFDelksbUJBQW1CLDhCQUE4QixzQkFBc0IsaUJBQWlCLHFCQUFxQjtBQUM3RyxjQUFjLHVCQUF1Qiw0QkFBNEIsZ0NBQWdDLFdBQVcseUNBQXlDLFFBQVEsZUFBZSxnQkFBZ0IsYUFBYSxtQkFBbUIsNkNBQTZDLFFBQVEsZ0NBQWdDLE1BQU0sNkNBQTZDLEtBQUssK0RBQStEO0FBQ3hhLG1CQUFtQiwrQkFBK0IsUUFBUSxtQ0FBbUMsZUFBZSxNQUFNLE9BQU8sZUFBZSxXQUFXLG1DQUFtQyxXQUFXLHFDQUFxQywrQkFBK0IsUUFBUSxNQUFNLFFBQVE7QUFDM1IsZUFBZSxZQUFZLDhDQUE4QyxrQkFBa0IsdUNBQXVDLGVBQWUsNkJBQTZCLGNBQWMsT0FBTyxjQUFjLFdBQVcsTUFBTSxhQUFhLFdBQVcsY0FBYyxpQkFBaUIsWUFBWSx1QkFBdUIsa0JBQWtCLGVBQWUsc0JBQXNCLGNBQWM7QUFDalksbUJBQW1CLG9CQUFvQixNQUFNLElBQUksaUJBQWlCLFFBQVEsWUFBWSw2WUFBNlk7QUFDbmUsZUFBZSwwQkFBMEIsMEJBQTBC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LElBQUksWUFBWSxRQUFRLGtCQUFrQixpQkFBaUIsa0VBQWtFLDhCQUE4QixzQkFBc0IsUUFBUSxzQ0FBc0MsU0FBUyxpQkFBaUIsV0FBVztBQUNyYixhQUFhLGdDQUFnQyxjQUFjLElBQUkseUtBQXlLLFFBQVEsaUNBQWlDLHFDQUFxQyxtQkFBbUIscUhBQXFILEdBQUcsR0FBRztBQUNwYyxnQ0FBZ0MsRUFBRSw4REFBOEQsd0JBQXdCLGdDQUFnQyx1QkFBdUIsMkJBQTJCLDRCQUE0QixlQUFlLG9EQUFvRCxvQ0FBb0MsUUFBUSw0QkFBNEI7QUFDalgsZ0NBQWdDLHVDQUF1QyxRQUFRLEtBQUssSUFBSSw2QkFBNkIsUUFBUSxXQUFXLGdDQUFnQyw4QkFBOEIsMEJBQTBCLCtCQUErQiw4QkFBOEI7QUFDN1IsMkNBQTJDLDZCQUE2Qiw0Q0FBNEMsNkJBQTZCLDJCQUEyQixXQUFXLEVBQUUsVUFBVSxtQ0FBbUMsNENBQTRDO0FBQ2xSLDhEQUE4RCw4QkFBOEIsOERBQThELHVCQUF1QiIsImZpbGUiOiIyMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLypcbiBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiovXG4ndXNlIHN0cmljdCc7dmFyIGFhPXJlcXVpcmUoXCJyZWFjdFwiKSxuPXJlcXVpcmUoXCJvYmplY3QtYXNzaWduXCIpLHI9cmVxdWlyZShcInNjaGVkdWxlclwiKTtmdW5jdGlvbiB1KGEpe2Zvcih2YXIgYj1cImh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PVwiK2EsYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYis9XCImYXJnc1tdPVwiK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbY10pO3JldHVyblwiTWluaWZpZWQgUmVhY3QgZXJyb3IgI1wiK2ErXCI7IHZpc2l0IFwiK2IrXCIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLlwifWlmKCFhYSl0aHJvdyBFcnJvcih1KDIyNykpO1xuZnVuY3Rpb24gYmEoYSxiLGMsZCxlLGYsZyxoLGspe3ZhciBsPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7Yi5hcHBseShjLGwpfWNhdGNoKG0pe3RoaXMub25FcnJvcihtKX19dmFyIGRhPSExLGVhPW51bGwsZmE9ITEsaGE9bnVsbCxpYT17b25FcnJvcjpmdW5jdGlvbihhKXtkYT0hMDtlYT1hfX07ZnVuY3Rpb24gamEoYSxiLGMsZCxlLGYsZyxoLGspe2RhPSExO2VhPW51bGw7YmEuYXBwbHkoaWEsYXJndW1lbnRzKX1mdW5jdGlvbiBrYShhLGIsYyxkLGUsZixnLGgsayl7amEuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKGRhKXtpZihkYSl7dmFyIGw9ZWE7ZGE9ITE7ZWE9bnVsbH1lbHNlIHRocm93IEVycm9yKHUoMTk4KSk7ZmF8fChmYT0hMCxoYT1sKX19dmFyIGxhPW51bGwsbWE9bnVsbCxuYT1udWxsO1xuZnVuY3Rpb24gb2EoYSxiLGMpe3ZhciBkPWEudHlwZXx8XCJ1bmtub3duLWV2ZW50XCI7YS5jdXJyZW50VGFyZ2V0PW5hKGMpO2thKGQsYix2b2lkIDAsYSk7YS5jdXJyZW50VGFyZ2V0PW51bGx9dmFyIHBhPW51bGwscWE9e307XG5mdW5jdGlvbiByYSgpe2lmKHBhKWZvcih2YXIgYSBpbiBxYSl7dmFyIGI9cWFbYV0sYz1wYS5pbmRleE9mKGEpO2lmKCEoLTE8YykpdGhyb3cgRXJyb3IodSg5NixhKSk7aWYoIXNhW2NdKXtpZighYi5leHRyYWN0RXZlbnRzKXRocm93IEVycm9yKHUoOTcsYSkpO3NhW2NdPWI7Yz1iLmV2ZW50VHlwZXM7Zm9yKHZhciBkIGluIGMpe3ZhciBlPXZvaWQgMDt2YXIgZj1jW2RdLGc9YixoPWQ7aWYodGEuaGFzT3duUHJvcGVydHkoaCkpdGhyb3cgRXJyb3IodSg5OSxoKSk7dGFbaF09Zjt2YXIgaz1mLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzO2lmKGspe2ZvcihlIGluIGspay5oYXNPd25Qcm9wZXJ0eShlKSYmdWEoa1tlXSxnLGgpO2U9ITB9ZWxzZSBmLnJlZ2lzdHJhdGlvbk5hbWU/KHVhKGYucmVnaXN0cmF0aW9uTmFtZSxnLGgpLGU9ITApOmU9ITE7aWYoIWUpdGhyb3cgRXJyb3IodSg5OCxkLGEpKTt9fX19XG5mdW5jdGlvbiB1YShhLGIsYyl7aWYodmFbYV0pdGhyb3cgRXJyb3IodSgxMDAsYSkpO3ZhW2FdPWI7d2FbYV09Yi5ldmVudFR5cGVzW2NdLmRlcGVuZGVuY2llc312YXIgc2E9W10sdGE9e30sdmE9e30sd2E9e307ZnVuY3Rpb24geGEoYSl7dmFyIGI9ITEsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe3ZhciBkPWFbY107aWYoIXFhLmhhc093blByb3BlcnR5KGMpfHxxYVtjXSE9PWQpe2lmKHFhW2NdKXRocm93IEVycm9yKHUoMTAyLGMpKTtxYVtjXT1kO2I9ITB9fWImJnJhKCl9dmFyIHlhPSEoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50fHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KSx6YT1udWxsLEFhPW51bGwsQmE9bnVsbDtcbmZ1bmN0aW9uIENhKGEpe2lmKGE9bWEoYSkpe2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiB6YSl0aHJvdyBFcnJvcih1KDI4MCkpO3ZhciBiPWEuc3RhdGVOb2RlO2ImJihiPWxhKGIpLHphKGEuc3RhdGVOb2RlLGEudHlwZSxiKSl9fWZ1bmN0aW9uIERhKGEpe0FhP0JhP0JhLnB1c2goYSk6QmE9W2FdOkFhPWF9ZnVuY3Rpb24gRWEoKXtpZihBYSl7dmFyIGE9QWEsYj1CYTtCYT1BYT1udWxsO0NhKGEpO2lmKGIpZm9yKGE9MDthPGIubGVuZ3RoO2ErKylDYShiW2FdKX19ZnVuY3Rpb24gRmEoYSxiKXtyZXR1cm4gYShiKX1mdW5jdGlvbiBHYShhLGIsYyxkLGUpe3JldHVybiBhKGIsYyxkLGUpfWZ1bmN0aW9uIEhhKCl7fXZhciBJYT1GYSxKYT0hMSxLYT0hMTtmdW5jdGlvbiBMYSgpe2lmKG51bGwhPT1BYXx8bnVsbCE9PUJhKUhhKCksRWEoKX1cbmZ1bmN0aW9uIE1hKGEsYixjKXtpZihLYSlyZXR1cm4gYShiLGMpO0thPSEwO3RyeXtyZXR1cm4gSWEoYSxiLGMpfWZpbmFsbHl7S2E9ITEsTGEoKX19dmFyIE5hPS9eWzpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXVs6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXSokLyxPYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFBhPXt9LFFhPXt9O1xuZnVuY3Rpb24gUmEoYSl7aWYoT2EuY2FsbChRYSxhKSlyZXR1cm4hMDtpZihPYS5jYWxsKFBhLGEpKXJldHVybiExO2lmKE5hLnRlc3QoYSkpcmV0dXJuIFFhW2FdPSEwO1BhW2FdPSEwO3JldHVybiExfWZ1bmN0aW9uIFNhKGEsYixjLGQpe2lmKG51bGwhPT1jJiYwPT09Yy50eXBlKXJldHVybiExO3N3aXRjaCh0eXBlb2YgYil7Y2FzZSBcImZ1bmN0aW9uXCI6Y2FzZSBcInN5bWJvbFwiOnJldHVybiEwO2Nhc2UgXCJib29sZWFuXCI6aWYoZClyZXR1cm4hMTtpZihudWxsIT09YylyZXR1cm4hYy5hY2NlcHRzQm9vbGVhbnM7YT1hLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw1KTtyZXR1cm5cImRhdGEtXCIhPT1hJiZcImFyaWEtXCIhPT1hO2RlZmF1bHQ6cmV0dXJuITF9fVxuZnVuY3Rpb24gVGEoYSxiLGMsZCl7aWYobnVsbD09PWJ8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYnx8U2EoYSxiLGMsZCkpcmV0dXJuITA7aWYoZClyZXR1cm4hMTtpZihudWxsIT09Yylzd2l0Y2goYy50eXBlKXtjYXNlIDM6cmV0dXJuIWI7Y2FzZSA0OnJldHVybiExPT09YjtjYXNlIDU6cmV0dXJuIGlzTmFOKGIpO2Nhc2UgNjpyZXR1cm4gaXNOYU4oYil8fDE+Yn1yZXR1cm4hMX1mdW5jdGlvbiB2KGEsYixjLGQsZSxmKXt0aGlzLmFjY2VwdHNCb29sZWFucz0yPT09Ynx8Mz09PWJ8fDQ9PT1iO3RoaXMuYXR0cmlidXRlTmFtZT1kO3RoaXMuYXR0cmlidXRlTmFtZXNwYWNlPWU7dGhpcy5tdXN0VXNlUHJvcGVydHk9Yzt0aGlzLnByb3BlcnR5TmFtZT1hO3RoaXMudHlwZT1iO3RoaXMuc2FuaXRpemVVUkw9Zn12YXIgQz17fTtcblwiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7Q1thXT1uZXcgdihhLDAsITEsYSxudWxsLCExKX0pO1tbXCJhY2NlcHRDaGFyc2V0XCIsXCJhY2NlcHQtY2hhcnNldFwiXSxbXCJjbGFzc05hbWVcIixcImNsYXNzXCJdLFtcImh0bWxGb3JcIixcImZvclwiXSxbXCJodHRwRXF1aXZcIixcImh0dHAtZXF1aXZcIl1dLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YVswXTtDW2JdPW5ldyB2KGIsMSwhMSxhWzFdLG51bGwsITEpfSk7W1wiY29udGVudEVkaXRhYmxlXCIsXCJkcmFnZ2FibGVcIixcInNwZWxsQ2hlY2tcIixcInZhbHVlXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7Q1thXT1uZXcgdihhLDIsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEpfSk7XG5bXCJhdXRvUmV2ZXJzZVwiLFwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFwiLFwiZm9jdXNhYmxlXCIsXCJwcmVzZXJ2ZUFscGhhXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7Q1thXT1uZXcgdihhLDIsITEsYSxudWxsLCExKX0pO1wiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGZvcm1Ob1ZhbGlkYXRlIGhpZGRlbiBsb29wIG5vTW9kdWxlIG5vVmFsaWRhdGUgb3BlbiBwbGF5c0lubGluZSByZWFkT25seSByZXF1aXJlZCByZXZlcnNlZCBzY29wZWQgc2VhbWxlc3MgaXRlbVNjb3BlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7Q1thXT1uZXcgdihhLDMsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEpfSk7XG5bXCJjaGVja2VkXCIsXCJtdWx0aXBsZVwiLFwibXV0ZWRcIixcInNlbGVjdGVkXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7Q1thXT1uZXcgdihhLDMsITAsYSxudWxsLCExKX0pO1tcImNhcHR1cmVcIixcImRvd25sb2FkXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7Q1thXT1uZXcgdihhLDQsITEsYSxudWxsLCExKX0pO1tcImNvbHNcIixcInJvd3NcIixcInNpemVcIixcInNwYW5cIl0uZm9yRWFjaChmdW5jdGlvbihhKXtDW2FdPW5ldyB2KGEsNiwhMSxhLG51bGwsITEpfSk7W1wicm93U3BhblwiLFwic3RhcnRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXtDW2FdPW5ldyB2KGEsNSwhMSxhLnRvTG93ZXJDYXNlKCksbnVsbCwhMSl9KTt2YXIgVWE9L1tcXC06XShbYS16XSkvZztmdW5jdGlvbiBWYShhKXtyZXR1cm4gYVsxXS50b1VwcGVyQ2FzZSgpfVxuXCJhY2NlbnQtaGVpZ2h0IGFsaWdubWVudC1iYXNlbGluZSBhcmFiaWMtZm9ybSBiYXNlbGluZS1zaGlmdCBjYXAtaGVpZ2h0IGNsaXAtcGF0aCBjbGlwLXJ1bGUgY29sb3ItaW50ZXJwb2xhdGlvbiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMgY29sb3ItcHJvZmlsZSBjb2xvci1yZW5kZXJpbmcgZG9taW5hbnQtYmFzZWxpbmUgZW5hYmxlLWJhY2tncm91bmQgZmlsbC1vcGFjaXR5IGZpbGwtcnVsZSBmbG9vZC1jb2xvciBmbG9vZC1vcGFjaXR5IGZvbnQtZmFtaWx5IGZvbnQtc2l6ZSBmb250LXNpemUtYWRqdXN0IGZvbnQtc3RyZXRjaCBmb250LXN0eWxlIGZvbnQtdmFyaWFudCBmb250LXdlaWdodCBnbHlwaC1uYW1lIGdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwgZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwgaG9yaXotYWR2LXggaG9yaXotb3JpZ2luLXggaW1hZ2UtcmVuZGVyaW5nIGxldHRlci1zcGFjaW5nIGxpZ2h0aW5nLWNvbG9yIG1hcmtlci1lbmQgbWFya2VyLW1pZCBtYXJrZXItc3RhcnQgb3ZlcmxpbmUtcG9zaXRpb24gb3ZlcmxpbmUtdGhpY2tuZXNzIHBhaW50LW9yZGVyIHBhbm9zZS0xIHBvaW50ZXItZXZlbnRzIHJlbmRlcmluZy1pbnRlbnQgc2hhcGUtcmVuZGVyaW5nIHN0b3AtY29sb3Igc3RvcC1vcGFjaXR5IHN0cmlrZXRocm91Z2gtcG9zaXRpb24gc3RyaWtldGhyb3VnaC10aGlja25lc3Mgc3Ryb2tlLWRhc2hhcnJheSBzdHJva2UtZGFzaG9mZnNldCBzdHJva2UtbGluZWNhcCBzdHJva2UtbGluZWpvaW4gc3Ryb2tlLW1pdGVybGltaXQgc3Ryb2tlLW9wYWNpdHkgc3Ryb2tlLXdpZHRoIHRleHQtYW5jaG9yIHRleHQtZGVjb3JhdGlvbiB0ZXh0LXJlbmRlcmluZyB1bmRlcmxpbmUtcG9zaXRpb24gdW5kZXJsaW5lLXRoaWNrbmVzcyB1bmljb2RlLWJpZGkgdW5pY29kZS1yYW5nZSB1bml0cy1wZXItZW0gdi1hbHBoYWJldGljIHYtaGFuZ2luZyB2LWlkZW9ncmFwaGljIHYtbWF0aGVtYXRpY2FsIHZlY3Rvci1lZmZlY3QgdmVydC1hZHYteSB2ZXJ0LW9yaWdpbi14IHZlcnQtb3JpZ2luLXkgd29yZC1zcGFjaW5nIHdyaXRpbmctbW9kZSB4bWxuczp4bGluayB4LWhlaWdodFwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShVYSxcblZhKTtDW2JdPW5ldyB2KGIsMSwhMSxhLG51bGwsITEpfSk7XCJ4bGluazphY3R1YXRlIHhsaW5rOmFyY3JvbGUgeGxpbms6cm9sZSB4bGluazpzaG93IHhsaW5rOnRpdGxlIHhsaW5rOnR5cGVcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoVWEsVmEpO0NbYl09bmV3IHYoYiwxLCExLGEsXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsITEpfSk7W1wieG1sOmJhc2VcIixcInhtbDpsYW5nXCIsXCJ4bWw6c3BhY2VcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoVWEsVmEpO0NbYl09bmV3IHYoYiwxLCExLGEsXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIiwhMSl9KTtbXCJ0YWJJbmRleFwiLFwiY3Jvc3NPcmlnaW5cIl0uZm9yRWFjaChmdW5jdGlvbihhKXtDW2FdPW5ldyB2KGEsMSwhMSxhLnRvTG93ZXJDYXNlKCksbnVsbCwhMSl9KTtcbkMueGxpbmtIcmVmPW5ldyB2KFwieGxpbmtIcmVmXCIsMSwhMSxcInhsaW5rOmhyZWZcIixcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiwhMCk7W1wic3JjXCIsXCJocmVmXCIsXCJhY3Rpb25cIixcImZvcm1BY3Rpb25cIl0uZm9yRWFjaChmdW5jdGlvbihhKXtDW2FdPW5ldyB2KGEsMSwhMSxhLnRvTG93ZXJDYXNlKCksbnVsbCwhMCl9KTt2YXIgV2E9YWEuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7V2EuaGFzT3duUHJvcGVydHkoXCJSZWFjdEN1cnJlbnREaXNwYXRjaGVyXCIpfHwoV2EuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcj17Y3VycmVudDpudWxsfSk7V2EuaGFzT3duUHJvcGVydHkoXCJSZWFjdEN1cnJlbnRCYXRjaENvbmZpZ1wiKXx8KFdhLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnPXtzdXNwZW5zZTpudWxsfSk7XG5mdW5jdGlvbiBYYShhLGIsYyxkKXt2YXIgZT1DLmhhc093blByb3BlcnR5KGIpP0NbYl06bnVsbDt2YXIgZj1udWxsIT09ZT8wPT09ZS50eXBlOmQ/ITE6ISgyPGIubGVuZ3RoKXx8XCJvXCIhPT1iWzBdJiZcIk9cIiE9PWJbMF18fFwiblwiIT09YlsxXSYmXCJOXCIhPT1iWzFdPyExOiEwO2Z8fChUYShiLGMsZSxkKSYmKGM9bnVsbCksZHx8bnVsbD09PWU/UmEoYikmJihudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTphLnNldEF0dHJpYnV0ZShiLFwiXCIrYykpOmUubXVzdFVzZVByb3BlcnR5P2FbZS5wcm9wZXJ0eU5hbWVdPW51bGw9PT1jPzM9PT1lLnR5cGU/ITE6XCJcIjpjOihiPWUuYXR0cmlidXRlTmFtZSxkPWUuYXR0cmlidXRlTmFtZXNwYWNlLG51bGw9PT1jP2EucmVtb3ZlQXR0cmlidXRlKGIpOihlPWUudHlwZSxjPTM9PT1lfHw0PT09ZSYmITA9PT1jP1wiXCI6XCJcIitjLGQ/YS5zZXRBdHRyaWJ1dGVOUyhkLGIsYyk6YS5zZXRBdHRyaWJ1dGUoYixjKSkpKX1cbnZhciBZYT0vXiguKilbXFxcXFxcL10vLEU9XCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvcixaYT1FP1N5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpOjYwMTAzLCRhPUU/U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTo2MDEwNixhYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKTo2MDEwNyxiYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTo2MDEwOCxjYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTo2MDExNCxkYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKTo2MDEwOSxlYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpOjYwMTEwLGZiPUU/U3ltYm9sLmZvcihcInJlYWN0LmNvbmN1cnJlbnRfbW9kZVwiKTo2MDExMSxnYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTo2MDExMixoYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKTo2MDExMyxpYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpOlxuNjAxMjAsamI9RT9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSxrYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpOjYwMTE2LGxiPUU/U3ltYm9sLmZvcihcInJlYWN0LmJsb2NrXCIpOjYwMTIxLG1iPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBuYihhKXtpZihudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBhKXJldHVybiBudWxsO2E9bWImJmFbbWJdfHxhW1wiQEBpdGVyYXRvclwiXTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYT9hOm51bGx9ZnVuY3Rpb24gb2IoYSl7aWYoLTE9PT1hLl9zdGF0dXMpe2EuX3N0YXR1cz0wO3ZhciBiPWEuX2N0b3I7Yj1iKCk7YS5fcmVzdWx0PWI7Yi50aGVuKGZ1bmN0aW9uKGIpezA9PT1hLl9zdGF0dXMmJihiPWIuZGVmYXVsdCxhLl9zdGF0dXM9MSxhLl9yZXN1bHQ9Yil9LGZ1bmN0aW9uKGIpezA9PT1hLl9zdGF0dXMmJihhLl9zdGF0dXM9MixhLl9yZXN1bHQ9Yil9KX19XG5mdW5jdGlvbiBwYihhKXtpZihudWxsPT1hKXJldHVybiBudWxsO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKXJldHVybiBhLmRpc3BsYXlOYW1lfHxhLm5hbWV8fG51bGw7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBhO3N3aXRjaChhKXtjYXNlIGFiOnJldHVyblwiRnJhZ21lbnRcIjtjYXNlICRhOnJldHVyblwiUG9ydGFsXCI7Y2FzZSBjYjpyZXR1cm5cIlByb2ZpbGVyXCI7Y2FzZSBiYjpyZXR1cm5cIlN0cmljdE1vZGVcIjtjYXNlIGhiOnJldHVyblwiU3VzcGVuc2VcIjtjYXNlIGliOnJldHVyblwiU3VzcGVuc2VMaXN0XCJ9aWYoXCJvYmplY3RcIj09PXR5cGVvZiBhKXN3aXRjaChhLiQkdHlwZW9mKXtjYXNlIGViOnJldHVyblwiQ29udGV4dC5Db25zdW1lclwiO2Nhc2UgZGI6cmV0dXJuXCJDb250ZXh0LlByb3ZpZGVyXCI7Y2FzZSBnYjp2YXIgYj1hLnJlbmRlcjtiPWIuZGlzcGxheU5hbWV8fGIubmFtZXx8XCJcIjtyZXR1cm4gYS5kaXNwbGF5TmFtZXx8KFwiXCIhPT1iP1wiRm9yd2FyZFJlZihcIitiK1wiKVwiOlxuXCJGb3J3YXJkUmVmXCIpO2Nhc2UgamI6cmV0dXJuIHBiKGEudHlwZSk7Y2FzZSBsYjpyZXR1cm4gcGIoYS5yZW5kZXIpO2Nhc2Uga2I6aWYoYT0xPT09YS5fc3RhdHVzP2EuX3Jlc3VsdDpudWxsKXJldHVybiBwYihhKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBxYihhKXt2YXIgYj1cIlwiO2Rve2E6c3dpdGNoKGEudGFnKXtjYXNlIDM6Y2FzZSA0OmNhc2UgNjpjYXNlIDc6Y2FzZSAxMDpjYXNlIDk6dmFyIGM9XCJcIjticmVhayBhO2RlZmF1bHQ6dmFyIGQ9YS5fZGVidWdPd25lcixlPWEuX2RlYnVnU291cmNlLGY9cGIoYS50eXBlKTtjPW51bGw7ZCYmKGM9cGIoZC50eXBlKSk7ZD1mO2Y9XCJcIjtlP2Y9XCIgKGF0IFwiK2UuZmlsZU5hbWUucmVwbGFjZShZYSxcIlwiKStcIjpcIitlLmxpbmVOdW1iZXIrXCIpXCI6YyYmKGY9XCIgKGNyZWF0ZWQgYnkgXCIrYytcIilcIik7Yz1cIlxcbiAgICBpbiBcIisoZHx8XCJVbmtub3duXCIpK2Z9Yis9YzthPWEucmV0dXJufXdoaWxlKGEpO3JldHVybiBifVxuZnVuY3Rpb24gcmIoYSl7c3dpdGNoKHR5cGVvZiBhKXtjYXNlIFwiYm9vbGVhblwiOmNhc2UgXCJudW1iZXJcIjpjYXNlIFwib2JqZWN0XCI6Y2FzZSBcInN0cmluZ1wiOmNhc2UgXCJ1bmRlZmluZWRcIjpyZXR1cm4gYTtkZWZhdWx0OnJldHVyblwiXCJ9fWZ1bmN0aW9uIHNiKGEpe3ZhciBiPWEudHlwZTtyZXR1cm4oYT1hLm5vZGVOYW1lKSYmXCJpbnB1dFwiPT09YS50b0xvd2VyQ2FzZSgpJiYoXCJjaGVja2JveFwiPT09Ynx8XCJyYWRpb1wiPT09Yil9XG5mdW5jdGlvbiB0YihhKXt2YXIgYj1zYihhKT9cImNoZWNrZWRcIjpcInZhbHVlXCIsYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEuY29uc3RydWN0b3IucHJvdG90eXBlLGIpLGQ9XCJcIithW2JdO2lmKCFhLmhhc093blByb3BlcnR5KGIpJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIGMmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLmdldCYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGMuc2V0KXt2YXIgZT1jLmdldCxmPWMuc2V0O09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYSl7ZD1cIlwiK2E7Zi5jYWxsKHRoaXMsYSl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7ZW51bWVyYWJsZTpjLmVudW1lcmFibGV9KTtyZXR1cm57Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZH0sc2V0VmFsdWU6ZnVuY3Rpb24oYSl7ZD1cIlwiK2F9LHN0b3BUcmFja2luZzpmdW5jdGlvbigpe2EuX3ZhbHVlVHJhY2tlcj1cbm51bGw7ZGVsZXRlIGFbYl19fX19ZnVuY3Rpb24geGIoYSl7YS5fdmFsdWVUcmFja2VyfHwoYS5fdmFsdWVUcmFja2VyPXRiKGEpKX1mdW5jdGlvbiB5YihhKXtpZighYSlyZXR1cm4hMTt2YXIgYj1hLl92YWx1ZVRyYWNrZXI7aWYoIWIpcmV0dXJuITA7dmFyIGM9Yi5nZXRWYWx1ZSgpO3ZhciBkPVwiXCI7YSYmKGQ9c2IoYSk/YS5jaGVja2VkP1widHJ1ZVwiOlwiZmFsc2VcIjphLnZhbHVlKTthPWQ7cmV0dXJuIGEhPT1jPyhiLnNldFZhbHVlKGEpLCEwKTohMX1mdW5jdGlvbiB6YihhLGIpe3ZhciBjPWIuY2hlY2tlZDtyZXR1cm4gbih7fSxiLHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTp2b2lkIDAsY2hlY2tlZDpudWxsIT1jP2M6YS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9XG5mdW5jdGlvbiBBYihhLGIpe3ZhciBjPW51bGw9PWIuZGVmYXVsdFZhbHVlP1wiXCI6Yi5kZWZhdWx0VmFsdWUsZD1udWxsIT1iLmNoZWNrZWQ/Yi5jaGVja2VkOmIuZGVmYXVsdENoZWNrZWQ7Yz1yYihudWxsIT1iLnZhbHVlP2IudmFsdWU6Yyk7YS5fd3JhcHBlclN0YXRlPXtpbml0aWFsQ2hlY2tlZDpkLGluaXRpYWxWYWx1ZTpjLGNvbnRyb2xsZWQ6XCJjaGVja2JveFwiPT09Yi50eXBlfHxcInJhZGlvXCI9PT1iLnR5cGU/bnVsbCE9Yi5jaGVja2VkOm51bGwhPWIudmFsdWV9fWZ1bmN0aW9uIEJiKGEsYil7Yj1iLmNoZWNrZWQ7bnVsbCE9YiYmWGEoYSxcImNoZWNrZWRcIixiLCExKX1cbmZ1bmN0aW9uIENiKGEsYil7QmIoYSxiKTt2YXIgYz1yYihiLnZhbHVlKSxkPWIudHlwZTtpZihudWxsIT1jKWlmKFwibnVtYmVyXCI9PT1kKXtpZigwPT09YyYmXCJcIj09PWEudmFsdWV8fGEudmFsdWUhPWMpYS52YWx1ZT1cIlwiK2N9ZWxzZSBhLnZhbHVlIT09XCJcIitjJiYoYS52YWx1ZT1cIlwiK2MpO2Vsc2UgaWYoXCJzdWJtaXRcIj09PWR8fFwicmVzZXRcIj09PWQpe2EucmVtb3ZlQXR0cmlidXRlKFwidmFsdWVcIik7cmV0dXJufWIuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKT9EYihhLGIudHlwZSxjKTpiLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpJiZEYihhLGIudHlwZSxyYihiLmRlZmF1bHRWYWx1ZSkpO251bGw9PWIuY2hlY2tlZCYmbnVsbCE9Yi5kZWZhdWx0Q2hlY2tlZCYmKGEuZGVmYXVsdENoZWNrZWQ9ISFiLmRlZmF1bHRDaGVja2VkKX1cbmZ1bmN0aW9uIEViKGEsYixjKXtpZihiLmhhc093blByb3BlcnR5KFwidmFsdWVcIil8fGIuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikpe3ZhciBkPWIudHlwZTtpZighKFwic3VibWl0XCIhPT1kJiZcInJlc2V0XCIhPT1kfHx2b2lkIDAhPT1iLnZhbHVlJiZudWxsIT09Yi52YWx1ZSkpcmV0dXJuO2I9XCJcIithLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlO2N8fGI9PT1hLnZhbHVlfHwoYS52YWx1ZT1iKTthLmRlZmF1bHRWYWx1ZT1ifWM9YS5uYW1lO1wiXCIhPT1jJiYoYS5uYW1lPVwiXCIpO2EuZGVmYXVsdENoZWNrZWQ9ISFhLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XCJcIiE9PWMmJihhLm5hbWU9Yyl9XG5mdW5jdGlvbiBEYihhLGIsYyl7aWYoXCJudW1iZXJcIiE9PWJ8fGEub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50IT09YSludWxsPT1jP2EuZGVmYXVsdFZhbHVlPVwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTphLmRlZmF1bHRWYWx1ZSE9PVwiXCIrYyYmKGEuZGVmYXVsdFZhbHVlPVwiXCIrYyl9ZnVuY3Rpb24gRmIoYSl7dmFyIGI9XCJcIjthYS5DaGlsZHJlbi5mb3JFYWNoKGEsZnVuY3Rpb24oYSl7bnVsbCE9YSYmKGIrPWEpfSk7cmV0dXJuIGJ9ZnVuY3Rpb24gR2IoYSxiKXthPW4oe2NoaWxkcmVuOnZvaWQgMH0sYik7aWYoYj1GYihiLmNoaWxkcmVuKSlhLmNoaWxkcmVuPWI7cmV0dXJuIGF9XG5mdW5jdGlvbiBIYihhLGIsYyxkKXthPWEub3B0aW9ucztpZihiKXtiPXt9O2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKWJbXCIkXCIrY1tlXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyllPWIuaGFzT3duUHJvcGVydHkoXCIkXCIrYVtjXS52YWx1ZSksYVtjXS5zZWxlY3RlZCE9PWUmJihhW2NdLnNlbGVjdGVkPWUpLGUmJmQmJihhW2NdLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtjPVwiXCIrcmIoYyk7Yj1udWxsO2ZvcihlPTA7ZTxhLmxlbmd0aDtlKyspe2lmKGFbZV0udmFsdWU9PT1jKXthW2VdLnNlbGVjdGVkPSEwO2QmJihhW2VdLmRlZmF1bHRTZWxlY3RlZD0hMCk7cmV0dXJufW51bGwhPT1ifHxhW2VdLmRpc2FibGVkfHwoYj1hW2VdKX1udWxsIT09YiYmKGIuc2VsZWN0ZWQ9ITApfX1cbmZ1bmN0aW9uIEliKGEsYil7aWYobnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCl0aHJvdyBFcnJvcih1KDkxKSk7cmV0dXJuIG4oe30sYix7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46XCJcIithLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlfSl9ZnVuY3Rpb24gSmIoYSxiKXt2YXIgYz1iLnZhbHVlO2lmKG51bGw9PWMpe2M9Yi5jaGlsZHJlbjtiPWIuZGVmYXVsdFZhbHVlO2lmKG51bGwhPWMpe2lmKG51bGwhPWIpdGhyb3cgRXJyb3IodSg5MikpO2lmKEFycmF5LmlzQXJyYXkoYykpe2lmKCEoMT49Yy5sZW5ndGgpKXRocm93IEVycm9yKHUoOTMpKTtjPWNbMF19Yj1jfW51bGw9PWImJihiPVwiXCIpO2M9Yn1hLl93cmFwcGVyU3RhdGU9e2luaXRpYWxWYWx1ZTpyYihjKX19XG5mdW5jdGlvbiBLYihhLGIpe3ZhciBjPXJiKGIudmFsdWUpLGQ9cmIoYi5kZWZhdWx0VmFsdWUpO251bGwhPWMmJihjPVwiXCIrYyxjIT09YS52YWx1ZSYmKGEudmFsdWU9YyksbnVsbD09Yi5kZWZhdWx0VmFsdWUmJmEuZGVmYXVsdFZhbHVlIT09YyYmKGEuZGVmYXVsdFZhbHVlPWMpKTtudWxsIT1kJiYoYS5kZWZhdWx0VmFsdWU9XCJcIitkKX1mdW5jdGlvbiBMYihhKXt2YXIgYj1hLnRleHRDb250ZW50O2I9PT1hLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlJiZcIlwiIT09YiYmbnVsbCE9PWImJihhLnZhbHVlPWIpfXZhciBNYj17aHRtbDpcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIixtYXRobWw6XCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCIsc3ZnOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIn07XG5mdW5jdGlvbiBOYihhKXtzd2l0Y2goYSl7Y2FzZSBcInN2Z1wiOnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtjYXNlIFwibWF0aFwiOnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiO2RlZmF1bHQ6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCJ9fWZ1bmN0aW9uIE9iKGEsYil7cmV0dXJuIG51bGw9PWF8fFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPT09YT9OYihiKTpcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI9PT1hJiZcImZvcmVpZ25PYmplY3RcIj09PWI/XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI6YX1cbnZhciBQYixRYj1mdW5jdGlvbihhKXtyZXR1cm5cInVuZGVmaW5lZFwiIT09dHlwZW9mIE1TQXBwJiZNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbj9mdW5jdGlvbihiLGMsZCxlKXtNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbigpe3JldHVybiBhKGIsYyxkLGUpfSl9OmF9KGZ1bmN0aW9uKGEsYil7aWYoYS5uYW1lc3BhY2VVUkkhPT1NYi5zdmd8fFwiaW5uZXJIVE1MXCJpbiBhKWEuaW5uZXJIVE1MPWI7ZWxzZXtQYj1QYnx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtQYi5pbm5lckhUTUw9XCI8c3ZnPlwiK2IudmFsdWVPZigpLnRvU3RyaW5nKCkrXCI8L3N2Zz5cIjtmb3IoYj1QYi5maXJzdENoaWxkO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Zvcig7Yi5maXJzdENoaWxkOylhLmFwcGVuZENoaWxkKGIuZmlyc3RDaGlsZCl9fSk7XG5mdW5jdGlvbiBSYihhLGIpe2lmKGIpe3ZhciBjPWEuZmlyc3RDaGlsZDtpZihjJiZjPT09YS5sYXN0Q2hpbGQmJjM9PT1jLm5vZGVUeXBlKXtjLm5vZGVWYWx1ZT1iO3JldHVybn19YS50ZXh0Q29udGVudD1ifWZ1bmN0aW9uIFNiKGEsYil7dmFyIGM9e307Y1thLnRvTG93ZXJDYXNlKCldPWIudG9Mb3dlckNhc2UoKTtjW1wiV2Via2l0XCIrYV09XCJ3ZWJraXRcIitiO2NbXCJNb3pcIithXT1cIm1velwiK2I7cmV0dXJuIGN9dmFyIFRiPXthbmltYXRpb25lbmQ6U2IoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvbkVuZFwiKSxhbmltYXRpb25pdGVyYXRpb246U2IoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvbkl0ZXJhdGlvblwiKSxhbmltYXRpb25zdGFydDpTYihcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uU3RhcnRcIiksdHJhbnNpdGlvbmVuZDpTYihcIlRyYW5zaXRpb25cIixcIlRyYW5zaXRpb25FbmRcIil9LFViPXt9LFZiPXt9O1xueWEmJihWYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLnN0eWxlLFwiQW5pbWF0aW9uRXZlbnRcImluIHdpbmRvd3x8KGRlbGV0ZSBUYi5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBUYi5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBUYi5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLFwiVHJhbnNpdGlvbkV2ZW50XCJpbiB3aW5kb3d8fGRlbGV0ZSBUYi50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb24pO2Z1bmN0aW9uIFdiKGEpe2lmKFViW2FdKXJldHVybiBVYlthXTtpZighVGJbYV0pcmV0dXJuIGE7dmFyIGI9VGJbYV0sYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykmJmMgaW4gVmIpcmV0dXJuIFViW2FdPWJbY107cmV0dXJuIGF9XG52YXIgWGI9V2IoXCJhbmltYXRpb25lbmRcIiksWWI9V2IoXCJhbmltYXRpb25pdGVyYXRpb25cIiksWmI9V2IoXCJhbmltYXRpb25zdGFydFwiKSwkYj1XYihcInRyYW5zaXRpb25lbmRcIiksYWM9XCJhYm9ydCBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIGR1cmF0aW9uY2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGxvYWRlZGRhdGEgbG9hZGVkbWV0YWRhdGEgbG9hZHN0YXJ0IHBhdXNlIHBsYXkgcGxheWluZyBwcm9ncmVzcyByYXRlY2hhbmdlIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nXCIuc3BsaXQoXCIgXCIpLGJjPW5ldyAoXCJmdW5jdGlvblwiPT09dHlwZW9mIFdlYWtNYXA/V2Vha01hcDpNYXApO2Z1bmN0aW9uIGNjKGEpe3ZhciBiPWJjLmdldChhKTt2b2lkIDA9PT1iJiYoYj1uZXcgTWFwLGJjLnNldChhLGIpKTtyZXR1cm4gYn1cbmZ1bmN0aW9uIGRjKGEpe3ZhciBiPWEsYz1hO2lmKGEuYWx0ZXJuYXRlKWZvcig7Yi5yZXR1cm47KWI9Yi5yZXR1cm47ZWxzZXthPWI7ZG8gYj1hLDAhPT0oYi5lZmZlY3RUYWcmMTAyNikmJihjPWIucmV0dXJuKSxhPWIucmV0dXJuO3doaWxlKGEpfXJldHVybiAzPT09Yi50YWc/YzpudWxsfWZ1bmN0aW9uIGVjKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPWEubWVtb2l6ZWRTdGF0ZTtudWxsPT09YiYmKGE9YS5hbHRlcm5hdGUsbnVsbCE9PWEmJihiPWEubWVtb2l6ZWRTdGF0ZSkpO2lmKG51bGwhPT1iKXJldHVybiBiLmRlaHlkcmF0ZWR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZmMoYSl7aWYoZGMoYSkhPT1hKXRocm93IEVycm9yKHUoMTg4KSk7fVxuZnVuY3Rpb24gZ2MoYSl7dmFyIGI9YS5hbHRlcm5hdGU7aWYoIWIpe2I9ZGMoYSk7aWYobnVsbD09PWIpdGhyb3cgRXJyb3IodSgxODgpKTtyZXR1cm4gYiE9PWE/bnVsbDphfWZvcih2YXIgYz1hLGQ9Yjs7KXt2YXIgZT1jLnJldHVybjtpZihudWxsPT09ZSlicmVhazt2YXIgZj1lLmFsdGVybmF0ZTtpZihudWxsPT09Zil7ZD1lLnJldHVybjtpZihudWxsIT09ZCl7Yz1kO2NvbnRpbnVlfWJyZWFrfWlmKGUuY2hpbGQ9PT1mLmNoaWxkKXtmb3IoZj1lLmNoaWxkO2Y7KXtpZihmPT09YylyZXR1cm4gZmMoZSksYTtpZihmPT09ZClyZXR1cm4gZmMoZSksYjtmPWYuc2libGluZ310aHJvdyBFcnJvcih1KDE4OCkpO31pZihjLnJldHVybiE9PWQucmV0dXJuKWM9ZSxkPWY7ZWxzZXtmb3IodmFyIGc9ITEsaD1lLmNoaWxkO2g7KXtpZihoPT09Yyl7Zz0hMDtjPWU7ZD1mO2JyZWFrfWlmKGg9PT1kKXtnPSEwO2Q9ZTtjPWY7YnJlYWt9aD1oLnNpYmxpbmd9aWYoIWcpe2ZvcihoPWYuY2hpbGQ7aDspe2lmKGg9PT1cbmMpe2c9ITA7Yz1mO2Q9ZTticmVha31pZihoPT09ZCl7Zz0hMDtkPWY7Yz1lO2JyZWFrfWg9aC5zaWJsaW5nfWlmKCFnKXRocm93IEVycm9yKHUoMTg5KSk7fX1pZihjLmFsdGVybmF0ZSE9PWQpdGhyb3cgRXJyb3IodSgxOTApKTt9aWYoMyE9PWMudGFnKXRocm93IEVycm9yKHUoMTg4KSk7cmV0dXJuIGMuc3RhdGVOb2RlLmN1cnJlbnQ9PT1jP2E6Yn1mdW5jdGlvbiBoYyhhKXthPWdjKGEpO2lmKCFhKXJldHVybiBudWxsO2Zvcih2YXIgYj1hOzspe2lmKDU9PT1iLnRhZ3x8Nj09PWIudGFnKXJldHVybiBiO2lmKGIuY2hpbGQpYi5jaGlsZC5yZXR1cm49YixiPWIuY2hpbGQ7ZWxzZXtpZihiPT09YSlicmVhaztmb3IoOyFiLnNpYmxpbmc7KXtpZighYi5yZXR1cm58fGIucmV0dXJuPT09YSlyZXR1cm4gbnVsbDtiPWIucmV0dXJufWIuc2libGluZy5yZXR1cm49Yi5yZXR1cm47Yj1iLnNpYmxpbmd9fXJldHVybiBudWxsfVxuZnVuY3Rpb24gaWMoYSxiKXtpZihudWxsPT1iKXRocm93IEVycm9yKHUoMzApKTtpZihudWxsPT1hKXJldHVybiBiO2lmKEFycmF5LmlzQXJyYXkoYSkpe2lmKEFycmF5LmlzQXJyYXkoYikpcmV0dXJuIGEucHVzaC5hcHBseShhLGIpLGE7YS5wdXNoKGIpO3JldHVybiBhfXJldHVybiBBcnJheS5pc0FycmF5KGIpP1thXS5jb25jYXQoYik6W2EsYl19ZnVuY3Rpb24gamMoYSxiLGMpe0FycmF5LmlzQXJyYXkoYSk/YS5mb3JFYWNoKGIsYyk6YSYmYi5jYWxsKGMsYSl9dmFyIGtjPW51bGw7XG5mdW5jdGlvbiBsYyhhKXtpZihhKXt2YXIgYj1hLl9kaXNwYXRjaExpc3RlbmVycyxjPWEuX2Rpc3BhdGNoSW5zdGFuY2VzO2lmKEFycmF5LmlzQXJyYXkoYikpZm9yKHZhciBkPTA7ZDxiLmxlbmd0aCYmIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtkKyspb2EoYSxiW2RdLGNbZF0pO2Vsc2UgYiYmb2EoYSxiLGMpO2EuX2Rpc3BhdGNoTGlzdGVuZXJzPW51bGw7YS5fZGlzcGF0Y2hJbnN0YW5jZXM9bnVsbDthLmlzUGVyc2lzdGVudCgpfHxhLmNvbnN0cnVjdG9yLnJlbGVhc2UoYSl9fWZ1bmN0aW9uIG1jKGEpe251bGwhPT1hJiYoa2M9aWMoa2MsYSkpO2E9a2M7a2M9bnVsbDtpZihhKXtqYyhhLGxjKTtpZihrYyl0aHJvdyBFcnJvcih1KDk1KSk7aWYoZmEpdGhyb3cgYT1oYSxmYT0hMSxoYT1udWxsLGE7fX1cbmZ1bmN0aW9uIG5jKGEpe2E9YS50YXJnZXR8fGEuc3JjRWxlbWVudHx8d2luZG93O2EuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJihhPWEuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpO3JldHVybiAzPT09YS5ub2RlVHlwZT9hLnBhcmVudE5vZGU6YX1mdW5jdGlvbiBvYyhhKXtpZigheWEpcmV0dXJuITE7YT1cIm9uXCIrYTt2YXIgYj1hIGluIGRvY3VtZW50O2J8fChiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksYi5zZXRBdHRyaWJ1dGUoYSxcInJldHVybjtcIiksYj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgYlthXSk7cmV0dXJuIGJ9dmFyIHBjPVtdO2Z1bmN0aW9uIHFjKGEpe2EudG9wTGV2ZWxUeXBlPW51bGw7YS5uYXRpdmVFdmVudD1udWxsO2EudGFyZ2V0SW5zdD1udWxsO2EuYW5jZXN0b3JzLmxlbmd0aD0wOzEwPnBjLmxlbmd0aCYmcGMucHVzaChhKX1cbmZ1bmN0aW9uIHJjKGEsYixjLGQpe2lmKHBjLmxlbmd0aCl7dmFyIGU9cGMucG9wKCk7ZS50b3BMZXZlbFR5cGU9YTtlLmV2ZW50U3lzdGVtRmxhZ3M9ZDtlLm5hdGl2ZUV2ZW50PWI7ZS50YXJnZXRJbnN0PWM7cmV0dXJuIGV9cmV0dXJue3RvcExldmVsVHlwZTphLGV2ZW50U3lzdGVtRmxhZ3M6ZCxuYXRpdmVFdmVudDpiLHRhcmdldEluc3Q6YyxhbmNlc3RvcnM6W119fVxuZnVuY3Rpb24gc2MoYSl7dmFyIGI9YS50YXJnZXRJbnN0LGM9Yjtkb3tpZighYyl7YS5hbmNlc3RvcnMucHVzaChjKTticmVha312YXIgZD1jO2lmKDM9PT1kLnRhZylkPWQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87ZWxzZXtmb3IoO2QucmV0dXJuOylkPWQucmV0dXJuO2Q9MyE9PWQudGFnP251bGw6ZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mb31pZighZClicmVhaztiPWMudGFnOzUhPT1iJiY2IT09Ynx8YS5hbmNlc3RvcnMucHVzaChjKTtjPXRjKGQpfXdoaWxlKGMpO2ZvcihjPTA7YzxhLmFuY2VzdG9ycy5sZW5ndGg7YysrKXtiPWEuYW5jZXN0b3JzW2NdO3ZhciBlPW5jKGEubmF0aXZlRXZlbnQpO2Q9YS50b3BMZXZlbFR5cGU7dmFyIGY9YS5uYXRpdmVFdmVudCxnPWEuZXZlbnRTeXN0ZW1GbGFnczswPT09YyYmKGd8PTY0KTtmb3IodmFyIGg9bnVsbCxrPTA7azxzYS5sZW5ndGg7aysrKXt2YXIgbD1zYVtrXTtsJiYobD1sLmV4dHJhY3RFdmVudHMoZCxiLGYsZSxnKSkmJihoPVxuaWMoaCxsKSl9bWMoaCl9fWZ1bmN0aW9uIHVjKGEsYixjKXtpZighYy5oYXMoYSkpe3N3aXRjaChhKXtjYXNlIFwic2Nyb2xsXCI6dmMoYixcInNjcm9sbFwiLCEwKTticmVhaztjYXNlIFwiZm9jdXNcIjpjYXNlIFwiYmx1clwiOnZjKGIsXCJmb2N1c1wiLCEwKTt2YyhiLFwiYmx1clwiLCEwKTtjLnNldChcImJsdXJcIixudWxsKTtjLnNldChcImZvY3VzXCIsbnVsbCk7YnJlYWs7Y2FzZSBcImNhbmNlbFwiOmNhc2UgXCJjbG9zZVwiOm9jKGEpJiZ2YyhiLGEsITApO2JyZWFrO2Nhc2UgXCJpbnZhbGlkXCI6Y2FzZSBcInN1Ym1pdFwiOmNhc2UgXCJyZXNldFwiOmJyZWFrO2RlZmF1bHQ6LTE9PT1hYy5pbmRleE9mKGEpJiZGKGEsYil9Yy5zZXQoYSxudWxsKX19XG52YXIgd2MseGMseWMsemM9ITEsQWM9W10sQmM9bnVsbCxDYz1udWxsLERjPW51bGwsRWM9bmV3IE1hcCxGYz1uZXcgTWFwLEdjPVtdLEhjPVwibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY2xvc2UgY2FuY2VsIGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldCBzdWJtaXRcIi5zcGxpdChcIiBcIiksSWM9XCJmb2N1cyBibHVyIGRyYWdlbnRlciBkcmFnbGVhdmUgbW91c2VvdmVyIG1vdXNlb3V0IHBvaW50ZXJvdmVyIHBvaW50ZXJvdXQgZ290cG9pbnRlcmNhcHR1cmUgbG9zdHBvaW50ZXJjYXB0dXJlXCIuc3BsaXQoXCIgXCIpO1xuZnVuY3Rpb24gSmMoYSxiKXt2YXIgYz1jYyhiKTtIYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3VjKGEsYixjKX0pO0ljLmZvckVhY2goZnVuY3Rpb24oYSl7dWMoYSxiLGMpfSl9ZnVuY3Rpb24gS2MoYSxiLGMsZCxlKXtyZXR1cm57YmxvY2tlZE9uOmEsdG9wTGV2ZWxUeXBlOmIsZXZlbnRTeXN0ZW1GbGFnczpjfDMyLG5hdGl2ZUV2ZW50OmUsY29udGFpbmVyOmR9fVxuZnVuY3Rpb24gTGMoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImZvY3VzXCI6Y2FzZSBcImJsdXJcIjpCYz1udWxsO2JyZWFrO2Nhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6Q2M9bnVsbDticmVhaztjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcIm1vdXNlb3V0XCI6RGM9bnVsbDticmVhaztjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcm91dFwiOkVjLmRlbGV0ZShiLnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOkZjLmRlbGV0ZShiLnBvaW50ZXJJZCl9fWZ1bmN0aW9uIE1jKGEsYixjLGQsZSxmKXtpZihudWxsPT09YXx8YS5uYXRpdmVFdmVudCE9PWYpcmV0dXJuIGE9S2MoYixjLGQsZSxmKSxudWxsIT09YiYmKGI9TmMoYiksbnVsbCE9PWImJnhjKGIpKSxhO2EuZXZlbnRTeXN0ZW1GbGFnc3w9ZDtyZXR1cm4gYX1cbmZ1bmN0aW9uIE9jKGEsYixjLGQsZSl7c3dpdGNoKGIpe2Nhc2UgXCJmb2N1c1wiOnJldHVybiBCYz1NYyhCYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJkcmFnZW50ZXJcIjpyZXR1cm4gQ2M9TWMoQ2MsYSxiLGMsZCxlKSwhMDtjYXNlIFwibW91c2VvdmVyXCI6cmV0dXJuIERjPU1jKERjLGEsYixjLGQsZSksITA7Y2FzZSBcInBvaW50ZXJvdmVyXCI6dmFyIGY9ZS5wb2ludGVySWQ7RWMuc2V0KGYsTWMoRWMuZ2V0KGYpfHxudWxsLGEsYixjLGQsZSkpO3JldHVybiEwO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOnJldHVybiBmPWUucG9pbnRlcklkLEZjLnNldChmLE1jKEZjLmdldChmKXx8bnVsbCxhLGIsYyxkLGUpKSwhMH1yZXR1cm4hMX1cbmZ1bmN0aW9uIFBjKGEpe3ZhciBiPXRjKGEudGFyZ2V0KTtpZihudWxsIT09Yil7dmFyIGM9ZGMoYik7aWYobnVsbCE9PWMpaWYoYj1jLnRhZywxMz09PWIpe2lmKGI9ZWMoYyksbnVsbCE9PWIpe2EuYmxvY2tlZE9uPWI7ci51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkoYS5wcmlvcml0eSxmdW5jdGlvbigpe3ljKGMpfSk7cmV0dXJufX1lbHNlIGlmKDM9PT1iJiZjLnN0YXRlTm9kZS5oeWRyYXRlKXthLmJsb2NrZWRPbj0zPT09Yy50YWc/Yy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3JldHVybn19YS5ibG9ja2VkT249bnVsbH1mdW5jdGlvbiBRYyhhKXtpZihudWxsIT09YS5ibG9ja2VkT24pcmV0dXJuITE7dmFyIGI9UmMoYS50b3BMZXZlbFR5cGUsYS5ldmVudFN5c3RlbUZsYWdzLGEuY29udGFpbmVyLGEubmF0aXZlRXZlbnQpO2lmKG51bGwhPT1iKXt2YXIgYz1OYyhiKTtudWxsIT09YyYmeGMoYyk7YS5ibG9ja2VkT249YjtyZXR1cm4hMX1yZXR1cm4hMH1cbmZ1bmN0aW9uIFNjKGEsYixjKXtRYyhhKSYmYy5kZWxldGUoYil9ZnVuY3Rpb24gVGMoKXtmb3IoemM9ITE7MDxBYy5sZW5ndGg7KXt2YXIgYT1BY1swXTtpZihudWxsIT09YS5ibG9ja2VkT24pe2E9TmMoYS5ibG9ja2VkT24pO251bGwhPT1hJiZ3YyhhKTticmVha312YXIgYj1SYyhhLnRvcExldmVsVHlwZSxhLmV2ZW50U3lzdGVtRmxhZ3MsYS5jb250YWluZXIsYS5uYXRpdmVFdmVudCk7bnVsbCE9PWI/YS5ibG9ja2VkT249YjpBYy5zaGlmdCgpfW51bGwhPT1CYyYmUWMoQmMpJiYoQmM9bnVsbCk7bnVsbCE9PUNjJiZRYyhDYykmJihDYz1udWxsKTtudWxsIT09RGMmJlFjKERjKSYmKERjPW51bGwpO0VjLmZvckVhY2goU2MpO0ZjLmZvckVhY2goU2MpfWZ1bmN0aW9uIFVjKGEsYil7YS5ibG9ja2VkT249PT1iJiYoYS5ibG9ja2VkT249bnVsbCx6Y3x8KHpjPSEwLHIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFRjKSkpfVxuZnVuY3Rpb24gVmMoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gVWMoYixhKX1pZigwPEFjLmxlbmd0aCl7VWMoQWNbMF0sYSk7Zm9yKHZhciBjPTE7YzxBYy5sZW5ndGg7YysrKXt2YXIgZD1BY1tjXTtkLmJsb2NrZWRPbj09PWEmJihkLmJsb2NrZWRPbj1udWxsKX19bnVsbCE9PUJjJiZVYyhCYyxhKTtudWxsIT09Q2MmJlVjKENjLGEpO251bGwhPT1EYyYmVWMoRGMsYSk7RWMuZm9yRWFjaChiKTtGYy5mb3JFYWNoKGIpO2ZvcihjPTA7YzxHYy5sZW5ndGg7YysrKWQ9R2NbY10sZC5ibG9ja2VkT249PT1hJiYoZC5ibG9ja2VkT249bnVsbCk7Zm9yKDswPEdjLmxlbmd0aCYmKGM9R2NbMF0sbnVsbD09PWMuYmxvY2tlZE9uKTspUGMoYyksbnVsbD09PWMuYmxvY2tlZE9uJiZHYy5zaGlmdCgpfVxudmFyIFdjPXt9LFljPW5ldyBNYXAsWmM9bmV3IE1hcCwkYz1bXCJhYm9ydFwiLFwiYWJvcnRcIixYYixcImFuaW1hdGlvbkVuZFwiLFliLFwiYW5pbWF0aW9uSXRlcmF0aW9uXCIsWmIsXCJhbmltYXRpb25TdGFydFwiLFwiY2FucGxheVwiLFwiY2FuUGxheVwiLFwiY2FucGxheXRocm91Z2hcIixcImNhblBsYXlUaHJvdWdoXCIsXCJkdXJhdGlvbmNoYW5nZVwiLFwiZHVyYXRpb25DaGFuZ2VcIixcImVtcHRpZWRcIixcImVtcHRpZWRcIixcImVuY3J5cHRlZFwiLFwiZW5jcnlwdGVkXCIsXCJlbmRlZFwiLFwiZW5kZWRcIixcImVycm9yXCIsXCJlcnJvclwiLFwiZ290cG9pbnRlcmNhcHR1cmVcIixcImdvdFBvaW50ZXJDYXB0dXJlXCIsXCJsb2FkXCIsXCJsb2FkXCIsXCJsb2FkZWRkYXRhXCIsXCJsb2FkZWREYXRhXCIsXCJsb2FkZWRtZXRhZGF0YVwiLFwibG9hZGVkTWV0YWRhdGFcIixcImxvYWRzdGFydFwiLFwibG9hZFN0YXJ0XCIsXCJsb3N0cG9pbnRlcmNhcHR1cmVcIixcImxvc3RQb2ludGVyQ2FwdHVyZVwiLFwicGxheWluZ1wiLFwicGxheWluZ1wiLFwicHJvZ3Jlc3NcIixcInByb2dyZXNzXCIsXCJzZWVraW5nXCIsXG5cInNlZWtpbmdcIixcInN0YWxsZWRcIixcInN0YWxsZWRcIixcInN1c3BlbmRcIixcInN1c3BlbmRcIixcInRpbWV1cGRhdGVcIixcInRpbWVVcGRhdGVcIiwkYixcInRyYW5zaXRpb25FbmRcIixcIndhaXRpbmdcIixcIndhaXRpbmdcIl07ZnVuY3Rpb24gYWQoYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrPTIpe3ZhciBkPWFbY10sZT1hW2MrMV0sZj1cIm9uXCIrKGVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpKTtmPXtwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpmLGNhcHR1cmVkOmYrXCJDYXB0dXJlXCJ9LGRlcGVuZGVuY2llczpbZF0sZXZlbnRQcmlvcml0eTpifTtaYy5zZXQoZCxiKTtZYy5zZXQoZCxmKTtXY1tlXT1mfX1cbmFkKFwiYmx1ciBibHVyIGNhbmNlbCBjYW5jZWwgY2xpY2sgY2xpY2sgY2xvc2UgY2xvc2UgY29udGV4dG1lbnUgY29udGV4dE1lbnUgY29weSBjb3B5IGN1dCBjdXQgYXV4Y2xpY2sgYXV4Q2xpY2sgZGJsY2xpY2sgZG91YmxlQ2xpY2sgZHJhZ2VuZCBkcmFnRW5kIGRyYWdzdGFydCBkcmFnU3RhcnQgZHJvcCBkcm9wIGZvY3VzIGZvY3VzIGlucHV0IGlucHV0IGludmFsaWQgaW52YWxpZCBrZXlkb3duIGtleURvd24ga2V5cHJlc3Mga2V5UHJlc3Mga2V5dXAga2V5VXAgbW91c2Vkb3duIG1vdXNlRG93biBtb3VzZXVwIG1vdXNlVXAgcGFzdGUgcGFzdGUgcGF1c2UgcGF1c2UgcGxheSBwbGF5IHBvaW50ZXJjYW5jZWwgcG9pbnRlckNhbmNlbCBwb2ludGVyZG93biBwb2ludGVyRG93biBwb2ludGVydXAgcG9pbnRlclVwIHJhdGVjaGFuZ2UgcmF0ZUNoYW5nZSByZXNldCByZXNldCBzZWVrZWQgc2Vla2VkIHN1Ym1pdCBzdWJtaXQgdG91Y2hjYW5jZWwgdG91Y2hDYW5jZWwgdG91Y2hlbmQgdG91Y2hFbmQgdG91Y2hzdGFydCB0b3VjaFN0YXJ0IHZvbHVtZWNoYW5nZSB2b2x1bWVDaGFuZ2VcIi5zcGxpdChcIiBcIiksMCk7XG5hZChcImRyYWcgZHJhZyBkcmFnZW50ZXIgZHJhZ0VudGVyIGRyYWdleGl0IGRyYWdFeGl0IGRyYWdsZWF2ZSBkcmFnTGVhdmUgZHJhZ292ZXIgZHJhZ092ZXIgbW91c2Vtb3ZlIG1vdXNlTW92ZSBtb3VzZW91dCBtb3VzZU91dCBtb3VzZW92ZXIgbW91c2VPdmVyIHBvaW50ZXJtb3ZlIHBvaW50ZXJNb3ZlIHBvaW50ZXJvdXQgcG9pbnRlck91dCBwb2ludGVyb3ZlciBwb2ludGVyT3ZlciBzY3JvbGwgc2Nyb2xsIHRvZ2dsZSB0b2dnbGUgdG91Y2htb3ZlIHRvdWNoTW92ZSB3aGVlbCB3aGVlbFwiLnNwbGl0KFwiIFwiKSwxKTthZCgkYywyKTtmb3IodmFyIGJkPVwiY2hhbmdlIHNlbGVjdGlvbmNoYW5nZSB0ZXh0SW5wdXQgY29tcG9zaXRpb25zdGFydCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnVwZGF0ZVwiLnNwbGl0KFwiIFwiKSxjZD0wO2NkPGJkLmxlbmd0aDtjZCsrKVpjLnNldChiZFtjZF0sMCk7XG52YXIgZGQ9ci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxlZD1yLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxmZD0hMDtmdW5jdGlvbiBGKGEsYil7dmMoYixhLCExKX1mdW5jdGlvbiB2YyhhLGIsYyl7dmFyIGQ9WmMuZ2V0KGIpO3N3aXRjaCh2b2lkIDA9PT1kPzI6ZCl7Y2FzZSAwOmQ9Z2QuYmluZChudWxsLGIsMSxhKTticmVhaztjYXNlIDE6ZD1oZC5iaW5kKG51bGwsYiwxLGEpO2JyZWFrO2RlZmF1bHQ6ZD1pZC5iaW5kKG51bGwsYiwxLGEpfWM/YS5hZGRFdmVudExpc3RlbmVyKGIsZCwhMCk6YS5hZGRFdmVudExpc3RlbmVyKGIsZCwhMSl9ZnVuY3Rpb24gZ2QoYSxiLGMsZCl7SmF8fEhhKCk7dmFyIGU9aWQsZj1KYTtKYT0hMDt0cnl7R2EoZSxhLGIsYyxkKX1maW5hbGx5eyhKYT1mKXx8TGEoKX19ZnVuY3Rpb24gaGQoYSxiLGMsZCl7ZWQoZGQsaWQuYmluZChudWxsLGEsYixjLGQpKX1cbmZ1bmN0aW9uIGlkKGEsYixjLGQpe2lmKGZkKWlmKDA8QWMubGVuZ3RoJiYtMTxIYy5pbmRleE9mKGEpKWE9S2MobnVsbCxhLGIsYyxkKSxBYy5wdXNoKGEpO2Vsc2V7dmFyIGU9UmMoYSxiLGMsZCk7aWYobnVsbD09PWUpTGMoYSxkKTtlbHNlIGlmKC0xPEhjLmluZGV4T2YoYSkpYT1LYyhlLGEsYixjLGQpLEFjLnB1c2goYSk7ZWxzZSBpZighT2MoZSxhLGIsYyxkKSl7TGMoYSxkKTthPXJjKGEsZCxudWxsLGIpO3RyeXtNYShzYyxhKX1maW5hbGx5e3FjKGEpfX19fVxuZnVuY3Rpb24gUmMoYSxiLGMsZCl7Yz1uYyhkKTtjPXRjKGMpO2lmKG51bGwhPT1jKXt2YXIgZT1kYyhjKTtpZihudWxsPT09ZSljPW51bGw7ZWxzZXt2YXIgZj1lLnRhZztpZigxMz09PWYpe2M9ZWMoZSk7aWYobnVsbCE9PWMpcmV0dXJuIGM7Yz1udWxsfWVsc2UgaWYoMz09PWYpe2lmKGUuc3RhdGVOb2RlLmh5ZHJhdGUpcmV0dXJuIDM9PT1lLnRhZz9lLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7Yz1udWxsfWVsc2UgZSE9PWMmJihjPW51bGwpfX1hPXJjKGEsZCxjLGIpO3RyeXtNYShzYyxhKX1maW5hbGx5e3FjKGEpfXJldHVybiBudWxsfVxudmFyIGpkPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxib3JkZXJJbWFnZU91dHNldDohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGNvbHVtbnM6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRBcmVhOiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3BhbjohMCxncmlkUm93U3RhcnQ6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TcGFuOiEwLGdyaWRDb2x1bW5TdGFydDohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxcbmZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VEYXNoYXJyYXk6ITAsc3Ryb2tlRGFzaG9mZnNldDohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITAsc3Ryb2tlV2lkdGg6ITB9LGtkPVtcIldlYmtpdFwiLFwibXNcIixcIk1velwiLFwiT1wiXTtPYmplY3Qua2V5cyhqZCkuZm9yRWFjaChmdW5jdGlvbihhKXtrZC5mb3JFYWNoKGZ1bmN0aW9uKGIpe2I9YithLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyaW5nKDEpO2pkW2JdPWpkW2FdfSl9KTtmdW5jdGlvbiBsZChhLGIsYyl7cmV0dXJuIG51bGw9PWJ8fFwiYm9vbGVhblwiPT09dHlwZW9mIGJ8fFwiXCI9PT1iP1wiXCI6Y3x8XCJudW1iZXJcIiE9PXR5cGVvZiBifHwwPT09Ynx8amQuaGFzT3duUHJvcGVydHkoYSkmJmpkW2FdPyhcIlwiK2IpLnRyaW0oKTpiK1wicHhcIn1cbmZ1bmN0aW9uIG1kKGEsYil7YT1hLnN0eWxlO2Zvcih2YXIgYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe3ZhciBkPTA9PT1jLmluZGV4T2YoXCItLVwiKSxlPWxkKGMsYltjXSxkKTtcImZsb2F0XCI9PT1jJiYoYz1cImNzc0Zsb2F0XCIpO2Q/YS5zZXRQcm9wZXJ0eShjLGUpOmFbY109ZX19dmFyIG5kPW4oe21lbnVpdGVtOiEwfSx7YXJlYTohMCxiYXNlOiEwLGJyOiEwLGNvbDohMCxlbWJlZDohMCxocjohMCxpbWc6ITAsaW5wdXQ6ITAsa2V5Z2VuOiEwLGxpbms6ITAsbWV0YTohMCxwYXJhbTohMCxzb3VyY2U6ITAsdHJhY2s6ITAsd2JyOiEwfSk7XG5mdW5jdGlvbiBvZChhLGIpe2lmKGIpe2lmKG5kW2FdJiYobnVsbCE9Yi5jaGlsZHJlbnx8bnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCkpdGhyb3cgRXJyb3IodSgxMzcsYSxcIlwiKSk7aWYobnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCl7aWYobnVsbCE9Yi5jaGlsZHJlbil0aHJvdyBFcnJvcih1KDYwKSk7aWYoIShcIm9iamVjdFwiPT09dHlwZW9mIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJlwiX19odG1sXCJpbiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcih1KDYxKSk7fWlmKG51bGwhPWIuc3R5bGUmJlwib2JqZWN0XCIhPT10eXBlb2YgYi5zdHlsZSl0aHJvdyBFcnJvcih1KDYyLFwiXCIpKTt9fVxuZnVuY3Rpb24gcGQoYSxiKXtpZigtMT09PWEuaW5kZXhPZihcIi1cIikpcmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBiLmlzO3N3aXRjaChhKXtjYXNlIFwiYW5ub3RhdGlvbi14bWxcIjpjYXNlIFwiY29sb3ItcHJvZmlsZVwiOmNhc2UgXCJmb250LWZhY2VcIjpjYXNlIFwiZm9udC1mYWNlLXNyY1wiOmNhc2UgXCJmb250LWZhY2UtdXJpXCI6Y2FzZSBcImZvbnQtZmFjZS1mb3JtYXRcIjpjYXNlIFwiZm9udC1mYWNlLW5hbWVcIjpjYXNlIFwibWlzc2luZy1nbHlwaFwiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fXZhciBxZD1NYi5odG1sO2Z1bmN0aW9uIHJkKGEsYil7YT05PT09YS5ub2RlVHlwZXx8MTE9PT1hLm5vZGVUeXBlP2E6YS5vd25lckRvY3VtZW50O3ZhciBjPWNjKGEpO2I9d2FbYl07Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspdWMoYltkXSxhLGMpfWZ1bmN0aW9uIHNkKCl7fVxuZnVuY3Rpb24gdGQoYSl7YT1hfHwoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudDp2b2lkIDApO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudHx8YS5ib2R5fWNhdGNoKGIpe3JldHVybiBhLmJvZHl9fWZ1bmN0aW9uIHVkKGEpe2Zvcig7YSYmYS5maXJzdENoaWxkOylhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX1mdW5jdGlvbiB2ZChhLGIpe3ZhciBjPXVkKGEpO2E9MDtmb3IodmFyIGQ7Yzspe2lmKDM9PT1jLm5vZGVUeXBlKXtkPWErYy50ZXh0Q29udGVudC5sZW5ndGg7aWYoYTw9YiYmZD49YilyZXR1cm57bm9kZTpjLG9mZnNldDpiLWF9O2E9ZH1hOntmb3IoO2M7KXtpZihjLm5leHRTaWJsaW5nKXtjPWMubmV4dFNpYmxpbmc7YnJlYWsgYX1jPWMucGFyZW50Tm9kZX1jPXZvaWQgMH1jPXVkKGMpfX1cbmZ1bmN0aW9uIHdkKGEsYil7cmV0dXJuIGEmJmI/YT09PWI/ITA6YSYmMz09PWEubm9kZVR5cGU/ITE6YiYmMz09PWIubm9kZVR5cGU/d2QoYSxiLnBhcmVudE5vZGUpOlwiY29udGFpbnNcImluIGE/YS5jb250YWlucyhiKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPyEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpOiExOiExfWZ1bmN0aW9uIHhkKCl7Zm9yKHZhciBhPXdpbmRvdyxiPXRkKCk7YiBpbnN0YW5jZW9mIGEuSFRNTElGcmFtZUVsZW1lbnQ7KXt0cnl7dmFyIGM9XCJzdHJpbmdcIj09PXR5cGVvZiBiLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZn1jYXRjaChkKXtjPSExfWlmKGMpYT1iLmNvbnRlbnRXaW5kb3c7ZWxzZSBicmVhaztiPXRkKGEuZG9jdW1lbnQpfXJldHVybiBifVxuZnVuY3Rpb24geWQoYSl7dmFyIGI9YSYmYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiJiYoXCJpbnB1dFwiPT09YiYmKFwidGV4dFwiPT09YS50eXBlfHxcInNlYXJjaFwiPT09YS50eXBlfHxcInRlbFwiPT09YS50eXBlfHxcInVybFwiPT09YS50eXBlfHxcInBhc3N3b3JkXCI9PT1hLnR5cGUpfHxcInRleHRhcmVhXCI9PT1ifHxcInRydWVcIj09PWEuY29udGVudEVkaXRhYmxlKX12YXIgemQ9XCIkXCIsQWQ9XCIvJFwiLEJkPVwiJD9cIixDZD1cIiQhXCIsRGQ9bnVsbCxFZD1udWxsO2Z1bmN0aW9uIEZkKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJidXR0b25cIjpjYXNlIFwiaW5wdXRcIjpjYXNlIFwic2VsZWN0XCI6Y2FzZSBcInRleHRhcmVhXCI6cmV0dXJuISFiLmF1dG9Gb2N1c31yZXR1cm4hMX1cbmZ1bmN0aW9uIEdkKGEsYil7cmV0dXJuXCJ0ZXh0YXJlYVwiPT09YXx8XCJvcHRpb25cIj09PWF8fFwibm9zY3JpcHRcIj09PWF8fFwic3RyaW5nXCI9PT10eXBlb2YgYi5jaGlsZHJlbnx8XCJudW1iZXJcIj09PXR5cGVvZiBiLmNoaWxkcmVufHxcIm9iamVjdFwiPT09dHlwZW9mIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJm51bGwhPT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbH12YXIgSGQ9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDp2b2lkIDAsSWQ9XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6dm9pZCAwO2Z1bmN0aW9uIEpkKGEpe2Zvcig7bnVsbCE9YTthPWEubmV4dFNpYmxpbmcpe3ZhciBiPWEubm9kZVR5cGU7aWYoMT09PWJ8fDM9PT1iKWJyZWFrfXJldHVybiBhfVxuZnVuY3Rpb24gS2QoYSl7YT1hLnByZXZpb3VzU2libGluZztmb3IodmFyIGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihjPT09emR8fGM9PT1DZHx8Yz09PUJkKXtpZigwPT09YilyZXR1cm4gYTtiLS19ZWxzZSBjPT09QWQmJmIrK31hPWEucHJldmlvdXNTaWJsaW5nfXJldHVybiBudWxsfXZhciBMZD1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxNZD1cIl9fcmVhY3RJbnRlcm5hbEluc3RhbmNlJFwiK0xkLE5kPVwiX19yZWFjdEV2ZW50SGFuZGxlcnMkXCIrTGQsT2Q9XCJfX3JlYWN0Q29udGFpbmVyZSRcIitMZDtcbmZ1bmN0aW9uIHRjKGEpe3ZhciBiPWFbTWRdO2lmKGIpcmV0dXJuIGI7Zm9yKHZhciBjPWEucGFyZW50Tm9kZTtjOyl7aWYoYj1jW09kXXx8Y1tNZF0pe2M9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWIuY2hpbGR8fG51bGwhPT1jJiZudWxsIT09Yy5jaGlsZClmb3IoYT1LZChhKTtudWxsIT09YTspe2lmKGM9YVtNZF0pcmV0dXJuIGM7YT1LZChhKX1yZXR1cm4gYn1hPWM7Yz1hLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gTmMoYSl7YT1hW01kXXx8YVtPZF07cmV0dXJuIWF8fDUhPT1hLnRhZyYmNiE9PWEudGFnJiYxMyE9PWEudGFnJiYzIT09YS50YWc/bnVsbDphfWZ1bmN0aW9uIFBkKGEpe2lmKDU9PT1hLnRhZ3x8Nj09PWEudGFnKXJldHVybiBhLnN0YXRlTm9kZTt0aHJvdyBFcnJvcih1KDMzKSk7fWZ1bmN0aW9uIFFkKGEpe3JldHVybiBhW05kXXx8bnVsbH1cbmZ1bmN0aW9uIFJkKGEpe2RvIGE9YS5yZXR1cm47d2hpbGUoYSYmNSE9PWEudGFnKTtyZXR1cm4gYT9hOm51bGx9XG5mdW5jdGlvbiBTZChhLGIpe3ZhciBjPWEuc3RhdGVOb2RlO2lmKCFjKXJldHVybiBudWxsO3ZhciBkPWxhKGMpO2lmKCFkKXJldHVybiBudWxsO2M9ZFtiXTthOnN3aXRjaChiKXtjYXNlIFwib25DbGlja1wiOmNhc2UgXCJvbkNsaWNrQ2FwdHVyZVwiOmNhc2UgXCJvbkRvdWJsZUNsaWNrXCI6Y2FzZSBcIm9uRG91YmxlQ2xpY2tDYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VEb3duXCI6Y2FzZSBcIm9uTW91c2VEb3duQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlTW92ZVwiOmNhc2UgXCJvbk1vdXNlTW92ZUNhcHR1cmVcIjpjYXNlIFwib25Nb3VzZVVwXCI6Y2FzZSBcIm9uTW91c2VVcENhcHR1cmVcIjpjYXNlIFwib25Nb3VzZUVudGVyXCI6KGQ9IWQuZGlzYWJsZWQpfHwoYT1hLnR5cGUsZD0hKFwiYnV0dG9uXCI9PT1hfHxcImlucHV0XCI9PT1hfHxcInNlbGVjdFwiPT09YXx8XCJ0ZXh0YXJlYVwiPT09YSkpO2E9IWQ7YnJlYWsgYTtkZWZhdWx0OmE9ITF9aWYoYSlyZXR1cm4gbnVsbDtpZihjJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYyl0aHJvdyBFcnJvcih1KDIzMSxcbmIsdHlwZW9mIGMpKTtyZXR1cm4gY31mdW5jdGlvbiBUZChhLGIsYyl7aWYoYj1TZChhLGMuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbYl0pKWMuX2Rpc3BhdGNoTGlzdGVuZXJzPWljKGMuX2Rpc3BhdGNoTGlzdGVuZXJzLGIpLGMuX2Rpc3BhdGNoSW5zdGFuY2VzPWljKGMuX2Rpc3BhdGNoSW5zdGFuY2VzLGEpfWZ1bmN0aW9uIFVkKGEpe2lmKGEmJmEuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpe2Zvcih2YXIgYj1hLl90YXJnZXRJbnN0LGM9W107YjspYy5wdXNoKGIpLGI9UmQoYik7Zm9yKGI9Yy5sZW5ndGg7MDxiLS07KVRkKGNbYl0sXCJjYXB0dXJlZFwiLGEpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspVGQoY1tiXSxcImJ1YmJsZWRcIixhKX19XG5mdW5jdGlvbiBWZChhLGIsYyl7YSYmYyYmYy5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lJiYoYj1TZChhLGMuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSkpJiYoYy5fZGlzcGF0Y2hMaXN0ZW5lcnM9aWMoYy5fZGlzcGF0Y2hMaXN0ZW5lcnMsYiksYy5fZGlzcGF0Y2hJbnN0YW5jZXM9aWMoYy5fZGlzcGF0Y2hJbnN0YW5jZXMsYSkpfWZ1bmN0aW9uIFdkKGEpe2EmJmEuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSYmVmQoYS5fdGFyZ2V0SW5zdCxudWxsLGEpfWZ1bmN0aW9uIFhkKGEpe2pjKGEsVWQpfXZhciBZZD1udWxsLFpkPW51bGwsJGQ9bnVsbDtcbmZ1bmN0aW9uIGFlKCl7aWYoJGQpcmV0dXJuICRkO3ZhciBhLGI9WmQsYz1iLmxlbmd0aCxkLGU9XCJ2YWx1ZVwiaW4gWWQ/WWQudmFsdWU6WWQudGV4dENvbnRlbnQsZj1lLmxlbmd0aDtmb3IoYT0wO2E8YyYmYlthXT09PWVbYV07YSsrKTt2YXIgZz1jLWE7Zm9yKGQ9MTtkPD1nJiZiW2MtZF09PT1lW2YtZF07ZCsrKTtyZXR1cm4gJGQ9ZS5zbGljZShhLDE8ZD8xLWQ6dm9pZCAwKX1mdW5jdGlvbiBiZSgpe3JldHVybiEwfWZ1bmN0aW9uIGNlKCl7cmV0dXJuITF9XG5mdW5jdGlvbiBHKGEsYixjLGQpe3RoaXMuZGlzcGF0Y2hDb25maWc9YTt0aGlzLl90YXJnZXRJbnN0PWI7dGhpcy5uYXRpdmVFdmVudD1jO2E9dGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7Zm9yKHZhciBlIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShlKSYmKChiPWFbZV0pP3RoaXNbZV09YihjKTpcInRhcmdldFwiPT09ZT90aGlzLnRhcmdldD1kOnRoaXNbZV09Y1tlXSk7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9KG51bGwhPWMuZGVmYXVsdFByZXZlbnRlZD9jLmRlZmF1bHRQcmV2ZW50ZWQ6ITE9PT1jLnJldHVyblZhbHVlKT9iZTpjZTt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWNlO3JldHVybiB0aGlzfVxubihHLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6XCJ1bmtub3duXCIhPT10eXBlb2YgYS5yZXR1cm5WYWx1ZSYmKGEucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWJlKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5zdG9wUHJvcGFnYXRpb24/YS5zdG9wUHJvcGFnYXRpb24oKTpcInVua25vd25cIiE9PXR5cGVvZiBhLmNhbmNlbEJ1YmJsZSYmKGEuY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWJlKX0scGVyc2lzdDpmdW5jdGlvbigpe3RoaXMuaXNQZXJzaXN0ZW50PWJlfSxpc1BlcnNpc3RlbnQ6Y2UsZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlLFxuYjtmb3IoYiBpbiBhKXRoaXNbYl09bnVsbDt0aGlzLm5hdGl2ZUV2ZW50PXRoaXMuX3RhcmdldEluc3Q9dGhpcy5kaXNwYXRjaENvbmZpZz1udWxsO3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Y2U7dGhpcy5fZGlzcGF0Y2hJbnN0YW5jZXM9dGhpcy5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbH19KTtHLkludGVyZmFjZT17dHlwZTpudWxsLHRhcmdldDpudWxsLGN1cnJlbnRUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZXZlbnRQaGFzZTpudWxsLGJ1YmJsZXM6bnVsbCxjYW5jZWxhYmxlOm51bGwsdGltZVN0YW1wOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDpudWxsLGlzVHJ1c3RlZDpudWxsfTtcbkcuZXh0ZW5kPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXt9ZnVuY3Rpb24gYygpe3JldHVybiBkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX12YXIgZD10aGlzO2IucHJvdG90eXBlPWQucHJvdG90eXBlO3ZhciBlPW5ldyBiO24oZSxjLnByb3RvdHlwZSk7Yy5wcm90b3R5cGU9ZTtjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jO2MuSW50ZXJmYWNlPW4oe30sZC5JbnRlcmZhY2UsYSk7Yy5leHRlbmQ9ZC5leHRlbmQ7ZGUoYyk7cmV0dXJuIGN9O2RlKEcpO2Z1bmN0aW9uIGVlKGEsYixjLGQpe2lmKHRoaXMuZXZlbnRQb29sLmxlbmd0aCl7dmFyIGU9dGhpcy5ldmVudFBvb2wucG9wKCk7dGhpcy5jYWxsKGUsYSxiLGMsZCk7cmV0dXJuIGV9cmV0dXJuIG5ldyB0aGlzKGEsYixjLGQpfVxuZnVuY3Rpb24gZmUoYSl7aWYoIShhIGluc3RhbmNlb2YgdGhpcykpdGhyb3cgRXJyb3IodSgyNzkpKTthLmRlc3RydWN0b3IoKTsxMD50aGlzLmV2ZW50UG9vbC5sZW5ndGgmJnRoaXMuZXZlbnRQb29sLnB1c2goYSl9ZnVuY3Rpb24gZGUoYSl7YS5ldmVudFBvb2w9W107YS5nZXRQb29sZWQ9ZWU7YS5yZWxlYXNlPWZlfXZhciBnZT1HLmV4dGVuZCh7ZGF0YTpudWxsfSksaGU9Ry5leHRlbmQoe2RhdGE6bnVsbH0pLGllPVs5LDEzLDI3LDMyXSxqZT15YSYmXCJDb21wb3NpdGlvbkV2ZW50XCJpbiB3aW5kb3csa2U9bnVsbDt5YSYmXCJkb2N1bWVudE1vZGVcImluIGRvY3VtZW50JiYoa2U9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTtcbnZhciBsZT15YSYmXCJUZXh0RXZlbnRcImluIHdpbmRvdyYmIWtlLG1lPXlhJiYoIWplfHxrZSYmODxrZSYmMTE+PWtlKSxuZT1TdHJpbmcuZnJvbUNoYXJDb2RlKDMyKSxvZT17YmVmb3JlSW5wdXQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOlwib25CZWZvcmVJbnB1dFwiLGNhcHR1cmVkOlwib25CZWZvcmVJbnB1dENhcHR1cmVcIn0sZGVwZW5kZW5jaWVzOltcImNvbXBvc2l0aW9uZW5kXCIsXCJrZXlwcmVzc1wiLFwidGV4dElucHV0XCIsXCJwYXN0ZVwiXX0sY29tcG9zaXRpb25FbmQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOlwib25Db21wb3NpdGlvbkVuZFwiLGNhcHR1cmVkOlwib25Db21wb3NpdGlvbkVuZENhcHR1cmVcIn0sZGVwZW5kZW5jaWVzOlwiYmx1ciBjb21wb3NpdGlvbmVuZCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKX0sY29tcG9zaXRpb25TdGFydDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6XCJvbkNvbXBvc2l0aW9uU3RhcnRcIixcbmNhcHR1cmVkOlwib25Db21wb3NpdGlvblN0YXJ0Q2FwdHVyZVwifSxkZXBlbmRlbmNpZXM6XCJibHVyIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIil9LGNvbXBvc2l0aW9uVXBkYXRlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpcIm9uQ29tcG9zaXRpb25VcGRhdGVcIixjYXB0dXJlZDpcIm9uQ29tcG9zaXRpb25VcGRhdGVDYXB0dXJlXCJ9LGRlcGVuZGVuY2llczpcImJsdXIgY29tcG9zaXRpb251cGRhdGUga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIil9fSxwZT0hMTtcbmZ1bmN0aW9uIHFlKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJrZXl1cFwiOnJldHVybi0xIT09aWUuaW5kZXhPZihiLmtleUNvZGUpO2Nhc2UgXCJrZXlkb3duXCI6cmV0dXJuIDIyOSE9PWIua2V5Q29kZTtjYXNlIFwia2V5cHJlc3NcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcImJsdXJcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiByZShhKXthPWEuZGV0YWlsO3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmXCJkYXRhXCJpbiBhP2EuZGF0YTpudWxsfXZhciBzZT0hMTtmdW5jdGlvbiB0ZShhLGIpe3N3aXRjaChhKXtjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpyZXR1cm4gcmUoYik7Y2FzZSBcImtleXByZXNzXCI6aWYoMzIhPT1iLndoaWNoKXJldHVybiBudWxsO3BlPSEwO3JldHVybiBuZTtjYXNlIFwidGV4dElucHV0XCI6cmV0dXJuIGE9Yi5kYXRhLGE9PT1uZSYmcGU/bnVsbDphO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxuZnVuY3Rpb24gdWUoYSxiKXtpZihzZSlyZXR1cm5cImNvbXBvc2l0aW9uZW5kXCI9PT1hfHwhamUmJnFlKGEsYik/KGE9YWUoKSwkZD1aZD1ZZD1udWxsLHNlPSExLGEpOm51bGw7c3dpdGNoKGEpe2Nhc2UgXCJwYXN0ZVwiOnJldHVybiBudWxsO2Nhc2UgXCJrZXlwcmVzc1wiOmlmKCEoYi5jdHJsS2V5fHxiLmFsdEtleXx8Yi5tZXRhS2V5KXx8Yi5jdHJsS2V5JiZiLmFsdEtleSl7aWYoYi5jaGFyJiYxPGIuY2hhci5sZW5ndGgpcmV0dXJuIGIuY2hhcjtpZihiLndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIud2hpY2gpfXJldHVybiBudWxsO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOnJldHVybiBtZSYmXCJrb1wiIT09Yi5sb2NhbGU/bnVsbDpiLmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19XG52YXIgdmU9e2V2ZW50VHlwZXM6b2UsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZTtpZihqZSliOntzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjp2YXIgZj1vZS5jb21wb3NpdGlvblN0YXJ0O2JyZWFrIGI7Y2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6Zj1vZS5jb21wb3NpdGlvbkVuZDticmVhayBiO2Nhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOmY9b2UuY29tcG9zaXRpb25VcGRhdGU7YnJlYWsgYn1mPXZvaWQgMH1lbHNlIHNlP3FlKGEsYykmJihmPW9lLmNvbXBvc2l0aW9uRW5kKTpcImtleWRvd25cIj09PWEmJjIyOT09PWMua2V5Q29kZSYmKGY9b2UuY29tcG9zaXRpb25TdGFydCk7Zj8obWUmJlwia29cIiE9PWMubG9jYWxlJiYoc2V8fGYhPT1vZS5jb21wb3NpdGlvblN0YXJ0P2Y9PT1vZS5jb21wb3NpdGlvbkVuZCYmc2UmJihlPWFlKCkpOihZZD1kLFpkPVwidmFsdWVcImluIFlkP1lkLnZhbHVlOllkLnRleHRDb250ZW50LHNlPSEwKSksZj1nZS5nZXRQb29sZWQoZixcbmIsYyxkKSxlP2YuZGF0YT1lOihlPXJlKGMpLG51bGwhPT1lJiYoZi5kYXRhPWUpKSxYZChmKSxlPWYpOmU9bnVsbDsoYT1sZT90ZShhLGMpOnVlKGEsYykpPyhiPWhlLmdldFBvb2xlZChvZS5iZWZvcmVJbnB1dCxiLGMsZCksYi5kYXRhPWEsWGQoYikpOmI9bnVsbDtyZXR1cm4gbnVsbD09PWU/YjpudWxsPT09Yj9lOltlLGJdfX0sd2U9e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsXCJkYXRldGltZS1sb2NhbFwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24geGUoYSl7dmFyIGI9YSYmYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVyblwiaW5wdXRcIj09PWI/ISF3ZVthLnR5cGVdOlwidGV4dGFyZWFcIj09PWI/ITA6ITF9XG52YXIgeWU9e2NoYW5nZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6XCJvbkNoYW5nZVwiLGNhcHR1cmVkOlwib25DaGFuZ2VDYXB0dXJlXCJ9LGRlcGVuZGVuY2llczpcImJsdXIgY2hhbmdlIGNsaWNrIGZvY3VzIGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXCIgXCIpfX07ZnVuY3Rpb24gemUoYSxiLGMpe2E9Ry5nZXRQb29sZWQoeWUuY2hhbmdlLGEsYixjKTthLnR5cGU9XCJjaGFuZ2VcIjtEYShjKTtYZChhKTtyZXR1cm4gYX12YXIgQWU9bnVsbCxCZT1udWxsO2Z1bmN0aW9uIENlKGEpe21jKGEpfWZ1bmN0aW9uIERlKGEpe3ZhciBiPVBkKGEpO2lmKHliKGIpKXJldHVybiBhfWZ1bmN0aW9uIEVlKGEsYil7aWYoXCJjaGFuZ2VcIj09PWEpcmV0dXJuIGJ9dmFyIEZlPSExO3lhJiYoRmU9b2MoXCJpbnB1dFwiKSYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fDk8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSk7XG5mdW5jdGlvbiBHZSgpe0FlJiYoQWUuZGV0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsSGUpLEJlPUFlPW51bGwpfWZ1bmN0aW9uIEhlKGEpe2lmKFwidmFsdWVcIj09PWEucHJvcGVydHlOYW1lJiZEZShCZSkpaWYoYT16ZShCZSxhLG5jKGEpKSxKYSltYyhhKTtlbHNle0phPSEwO3RyeXtGYShDZSxhKX1maW5hbGx5e0phPSExLExhKCl9fX1mdW5jdGlvbiBJZShhLGIsYyl7XCJmb2N1c1wiPT09YT8oR2UoKSxBZT1iLEJlPWMsQWUuYXR0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsSGUpKTpcImJsdXJcIj09PWEmJkdlKCl9ZnVuY3Rpb24gSmUoYSl7aWYoXCJzZWxlY3Rpb25jaGFuZ2VcIj09PWF8fFwia2V5dXBcIj09PWF8fFwia2V5ZG93blwiPT09YSlyZXR1cm4gRGUoQmUpfWZ1bmN0aW9uIEtlKGEsYil7aWYoXCJjbGlja1wiPT09YSlyZXR1cm4gRGUoYil9ZnVuY3Rpb24gTGUoYSxiKXtpZihcImlucHV0XCI9PT1hfHxcImNoYW5nZVwiPT09YSlyZXR1cm4gRGUoYil9XG52YXIgTWU9e2V2ZW50VHlwZXM6eWUsX2lzSW5wdXRFdmVudFN1cHBvcnRlZDpGZSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWI/UGQoYik6d2luZG93LGY9ZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKFwic2VsZWN0XCI9PT1mfHxcImlucHV0XCI9PT1mJiZcImZpbGVcIj09PWUudHlwZSl2YXIgZz1FZTtlbHNlIGlmKHhlKGUpKWlmKEZlKWc9TGU7ZWxzZXtnPUplO3ZhciBoPUllfWVsc2UoZj1lLm5vZGVOYW1lKSYmXCJpbnB1dFwiPT09Zi50b0xvd2VyQ2FzZSgpJiYoXCJjaGVja2JveFwiPT09ZS50eXBlfHxcInJhZGlvXCI9PT1lLnR5cGUpJiYoZz1LZSk7aWYoZyYmKGc9ZyhhLGIpKSlyZXR1cm4gemUoZyxjLGQpO2gmJmgoYSxlLGIpO1wiYmx1clwiPT09YSYmKGE9ZS5fd3JhcHBlclN0YXRlKSYmYS5jb250cm9sbGVkJiZcIm51bWJlclwiPT09ZS50eXBlJiZEYihlLFwibnVtYmVyXCIsZS52YWx1ZSl9fSxOZT1HLmV4dGVuZCh7dmlldzpudWxsLGRldGFpbDpudWxsfSksXG5PZT17QWx0OlwiYWx0S2V5XCIsQ29udHJvbDpcImN0cmxLZXlcIixNZXRhOlwibWV0YUtleVwiLFNoaWZ0Olwic2hpZnRLZXlcIn07ZnVuY3Rpb24gUGUoYSl7dmFyIGI9dGhpcy5uYXRpdmVFdmVudDtyZXR1cm4gYi5nZXRNb2RpZmllclN0YXRlP2IuZ2V0TW9kaWZpZXJTdGF0ZShhKTooYT1PZVthXSk/ISFiW2FdOiExfWZ1bmN0aW9uIFFlKCl7cmV0dXJuIFBlfVxudmFyIFJlPTAsU2U9MCxUZT0hMSxVZT0hMSxWZT1OZS5leHRlbmQoe3NjcmVlblg6bnVsbCxzY3JlZW5ZOm51bGwsY2xpZW50WDpudWxsLGNsaWVudFk6bnVsbCxwYWdlWDpudWxsLHBhZ2VZOm51bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGwsYWx0S2V5Om51bGwsbWV0YUtleTpudWxsLGdldE1vZGlmaWVyU3RhdGU6UWUsYnV0dG9uOm51bGwsYnV0dG9uczpudWxsLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVsYXRlZFRhcmdldHx8KGEuZnJvbUVsZW1lbnQ9PT1hLnNyY0VsZW1lbnQ/YS50b0VsZW1lbnQ6YS5mcm9tRWxlbWVudCl9LG1vdmVtZW50WDpmdW5jdGlvbihhKXtpZihcIm1vdmVtZW50WFwiaW4gYSlyZXR1cm4gYS5tb3ZlbWVudFg7dmFyIGI9UmU7UmU9YS5zY3JlZW5YO3JldHVybiBUZT9cIm1vdXNlbW92ZVwiPT09YS50eXBlP2Euc2NyZWVuWC1iOjA6KFRlPSEwLDApfSxtb3ZlbWVudFk6ZnVuY3Rpb24oYSl7aWYoXCJtb3ZlbWVudFlcImluIGEpcmV0dXJuIGEubW92ZW1lbnRZO1xudmFyIGI9U2U7U2U9YS5zY3JlZW5ZO3JldHVybiBVZT9cIm1vdXNlbW92ZVwiPT09YS50eXBlP2Euc2NyZWVuWS1iOjA6KFVlPSEwLDApfX0pLFdlPVZlLmV4dGVuZCh7cG9pbnRlcklkOm51bGwsd2lkdGg6bnVsbCxoZWlnaHQ6bnVsbCxwcmVzc3VyZTpudWxsLHRhbmdlbnRpYWxQcmVzc3VyZTpudWxsLHRpbHRYOm51bGwsdGlsdFk6bnVsbCx0d2lzdDpudWxsLHBvaW50ZXJUeXBlOm51bGwsaXNQcmltYXJ5Om51bGx9KSxYZT17bW91c2VFbnRlcjp7cmVnaXN0cmF0aW9uTmFtZTpcIm9uTW91c2VFbnRlclwiLGRlcGVuZGVuY2llczpbXCJtb3VzZW91dFwiLFwibW91c2VvdmVyXCJdfSxtb3VzZUxlYXZlOntyZWdpc3RyYXRpb25OYW1lOlwib25Nb3VzZUxlYXZlXCIsZGVwZW5kZW5jaWVzOltcIm1vdXNlb3V0XCIsXCJtb3VzZW92ZXJcIl19LHBvaW50ZXJFbnRlcjp7cmVnaXN0cmF0aW9uTmFtZTpcIm9uUG9pbnRlckVudGVyXCIsZGVwZW5kZW5jaWVzOltcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdfSxwb2ludGVyTGVhdmU6e3JlZ2lzdHJhdGlvbk5hbWU6XCJvblBvaW50ZXJMZWF2ZVwiLFxuZGVwZW5kZW5jaWVzOltcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdfX0sWWU9e2V2ZW50VHlwZXM6WGUsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPVwibW91c2VvdmVyXCI9PT1hfHxcInBvaW50ZXJvdmVyXCI9PT1hLGc9XCJtb3VzZW91dFwiPT09YXx8XCJwb2ludGVyb3V0XCI9PT1hO2lmKGYmJjA9PT0oZSYzMikmJihjLnJlbGF0ZWRUYXJnZXR8fGMuZnJvbUVsZW1lbnQpfHwhZyYmIWYpcmV0dXJuIG51bGw7Zj1kLndpbmRvdz09PWQ/ZDooZj1kLm93bmVyRG9jdW1lbnQpP2YuZGVmYXVsdFZpZXd8fGYucGFyZW50V2luZG93OndpbmRvdztpZihnKXtpZihnPWIsYj0oYj1jLnJlbGF0ZWRUYXJnZXR8fGMudG9FbGVtZW50KT90YyhiKTpudWxsLG51bGwhPT1iKXt2YXIgaD1kYyhiKTtpZihiIT09aHx8NSE9PWIudGFnJiY2IT09Yi50YWcpYj1udWxsfX1lbHNlIGc9bnVsbDtpZihnPT09YilyZXR1cm4gbnVsbDtpZihcIm1vdXNlb3V0XCI9PT1hfHxcIm1vdXNlb3ZlclwiPT09XG5hKXt2YXIgaz1WZTt2YXIgbD1YZS5tb3VzZUxlYXZlO3ZhciBtPVhlLm1vdXNlRW50ZXI7dmFyIHA9XCJtb3VzZVwifWVsc2UgaWYoXCJwb2ludGVyb3V0XCI9PT1hfHxcInBvaW50ZXJvdmVyXCI9PT1hKWs9V2UsbD1YZS5wb2ludGVyTGVhdmUsbT1YZS5wb2ludGVyRW50ZXIscD1cInBvaW50ZXJcIjthPW51bGw9PWc/ZjpQZChnKTtmPW51bGw9PWI/ZjpQZChiKTtsPWsuZ2V0UG9vbGVkKGwsZyxjLGQpO2wudHlwZT1wK1wibGVhdmVcIjtsLnRhcmdldD1hO2wucmVsYXRlZFRhcmdldD1mO2M9ay5nZXRQb29sZWQobSxiLGMsZCk7Yy50eXBlPXArXCJlbnRlclwiO2MudGFyZ2V0PWY7Yy5yZWxhdGVkVGFyZ2V0PWE7ZD1nO3A9YjtpZihkJiZwKWE6e2s9ZDttPXA7Zz0wO2ZvcihhPWs7YTthPVJkKGEpKWcrKzthPTA7Zm9yKGI9bTtiO2I9UmQoYikpYSsrO2Zvcig7MDxnLWE7KWs9UmQoayksZy0tO2Zvcig7MDxhLWc7KW09UmQobSksYS0tO2Zvcig7Zy0tOyl7aWYoaz09PW18fGs9PT1tLmFsdGVybmF0ZSlicmVhayBhO1xuaz1SZChrKTttPVJkKG0pfWs9bnVsbH1lbHNlIGs9bnVsbDttPWs7Zm9yKGs9W107ZCYmZCE9PW07KXtnPWQuYWx0ZXJuYXRlO2lmKG51bGwhPT1nJiZnPT09bSlicmVhaztrLnB1c2goZCk7ZD1SZChkKX1mb3IoZD1bXTtwJiZwIT09bTspe2c9cC5hbHRlcm5hdGU7aWYobnVsbCE9PWcmJmc9PT1tKWJyZWFrO2QucHVzaChwKTtwPVJkKHApfWZvcihwPTA7cDxrLmxlbmd0aDtwKyspVmQoa1twXSxcImJ1YmJsZWRcIixsKTtmb3IocD1kLmxlbmd0aDswPHAtLTspVmQoZFtwXSxcImNhcHR1cmVkXCIsYyk7cmV0dXJuIDA9PT0oZSY2NCk/W2xdOltsLGNdfX07ZnVuY3Rpb24gWmUoYSxiKXtyZXR1cm4gYT09PWImJigwIT09YXx8MS9hPT09MS9iKXx8YSE9PWEmJmIhPT1ifXZhciAkZT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgT2JqZWN0LmlzP09iamVjdC5pczpaZSxhZj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gYmYoYSxiKXtpZigkZShhLGIpKXJldHVybiEwO2lmKFwib2JqZWN0XCIhPT10eXBlb2YgYXx8bnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYnx8bnVsbD09PWIpcmV0dXJuITE7dmFyIGM9T2JqZWN0LmtleXMoYSksZD1PYmplY3Qua2V5cyhiKTtpZihjLmxlbmd0aCE9PWQubGVuZ3RoKXJldHVybiExO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKyspaWYoIWFmLmNhbGwoYixjW2RdKXx8ISRlKGFbY1tkXV0sYltjW2RdXSkpcmV0dXJuITE7cmV0dXJuITB9XG52YXIgY2Y9eWEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxkZj17c2VsZWN0OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpcIm9uU2VsZWN0XCIsY2FwdHVyZWQ6XCJvblNlbGVjdENhcHR1cmVcIn0sZGVwZW5kZW5jaWVzOlwiYmx1ciBjb250ZXh0bWVudSBkcmFnZW5kIGZvY3VzIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXCIgXCIpfX0sZWY9bnVsbCxmZj1udWxsLGdmPW51bGwsaGY9ITE7XG5mdW5jdGlvbiBqZihhLGIpe3ZhciBjPWIud2luZG93PT09Yj9iLmRvY3VtZW50Ojk9PT1iLm5vZGVUeXBlP2I6Yi5vd25lckRvY3VtZW50O2lmKGhmfHxudWxsPT1lZnx8ZWYhPT10ZChjKSlyZXR1cm4gbnVsbDtjPWVmO1wic2VsZWN0aW9uU3RhcnRcImluIGMmJnlkKGMpP2M9e3N0YXJ0OmMuc2VsZWN0aW9uU3RhcnQsZW5kOmMuc2VsZWN0aW9uRW5kfTooYz0oYy5vd25lckRvY3VtZW50JiZjLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCksYz17YW5jaG9yTm9kZTpjLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OmMuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpjLmZvY3VzTm9kZSxmb2N1c09mZnNldDpjLmZvY3VzT2Zmc2V0fSk7cmV0dXJuIGdmJiZiZihnZixjKT9udWxsOihnZj1jLGE9Ry5nZXRQb29sZWQoZGYuc2VsZWN0LGZmLGEsYiksYS50eXBlPVwic2VsZWN0XCIsYS50YXJnZXQ9ZWYsWGQoYSksYSl9XG52YXIga2Y9e2V2ZW50VHlwZXM6ZGYsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihhLGIsYyxkLGUsZil7ZT1mfHwoZC53aW5kb3c9PT1kP2QuZG9jdW1lbnQ6OT09PWQubm9kZVR5cGU/ZDpkLm93bmVyRG9jdW1lbnQpO2lmKCEoZj0hZSkpe2E6e2U9Y2MoZSk7Zj13YS5vblNlbGVjdDtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKylpZighZS5oYXMoZltnXSkpe2U9ITE7YnJlYWsgYX1lPSEwfWY9IWV9aWYoZilyZXR1cm4gbnVsbDtlPWI/UGQoYik6d2luZG93O3N3aXRjaChhKXtjYXNlIFwiZm9jdXNcIjppZih4ZShlKXx8XCJ0cnVlXCI9PT1lLmNvbnRlbnRFZGl0YWJsZSllZj1lLGZmPWIsZ2Y9bnVsbDticmVhaztjYXNlIFwiYmx1clwiOmdmPWZmPWVmPW51bGw7YnJlYWs7Y2FzZSBcIm1vdXNlZG93blwiOmhmPSEwO2JyZWFrO2Nhc2UgXCJjb250ZXh0bWVudVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcImRyYWdlbmRcIjpyZXR1cm4gaGY9ITEsamYoYyxkKTtjYXNlIFwic2VsZWN0aW9uY2hhbmdlXCI6aWYoY2YpYnJlYWs7XG5jYXNlIFwia2V5ZG93blwiOmNhc2UgXCJrZXl1cFwiOnJldHVybiBqZihjLGQpfXJldHVybiBudWxsfX0sbGY9Ry5leHRlbmQoe2FuaW1hdGlvbk5hbWU6bnVsbCxlbGFwc2VkVGltZTpudWxsLHBzZXVkb0VsZW1lbnQ6bnVsbH0pLG1mPUcuZXh0ZW5kKHtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGEpe3JldHVyblwiY2xpcGJvYXJkRGF0YVwiaW4gYT9hLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fSksbmY9TmUuZXh0ZW5kKHtyZWxhdGVkVGFyZ2V0Om51bGx9KTtmdW5jdGlvbiBvZihhKXt2YXIgYj1hLmtleUNvZGU7XCJjaGFyQ29kZVwiaW4gYT8oYT1hLmNoYXJDb2RlLDA9PT1hJiYxMz09PWImJihhPTEzKSk6YT1iOzEwPT09YSYmKGE9MTMpO3JldHVybiAzMjw9YXx8MTM9PT1hP2E6MH1cbnZhciBwZj17RXNjOlwiRXNjYXBlXCIsU3BhY2ViYXI6XCIgXCIsTGVmdDpcIkFycm93TGVmdFwiLFVwOlwiQXJyb3dVcFwiLFJpZ2h0OlwiQXJyb3dSaWdodFwiLERvd246XCJBcnJvd0Rvd25cIixEZWw6XCJEZWxldGVcIixXaW46XCJPU1wiLE1lbnU6XCJDb250ZXh0TWVudVwiLEFwcHM6XCJDb250ZXh0TWVudVwiLFNjcm9sbDpcIlNjcm9sbExvY2tcIixNb3pQcmludGFibGVLZXk6XCJVbmlkZW50aWZpZWRcIn0scWY9ezg6XCJCYWNrc3BhY2VcIiw5OlwiVGFiXCIsMTI6XCJDbGVhclwiLDEzOlwiRW50ZXJcIiwxNjpcIlNoaWZ0XCIsMTc6XCJDb250cm9sXCIsMTg6XCJBbHRcIiwxOTpcIlBhdXNlXCIsMjA6XCJDYXBzTG9ja1wiLDI3OlwiRXNjYXBlXCIsMzI6XCIgXCIsMzM6XCJQYWdlVXBcIiwzNDpcIlBhZ2VEb3duXCIsMzU6XCJFbmRcIiwzNjpcIkhvbWVcIiwzNzpcIkFycm93TGVmdFwiLDM4OlwiQXJyb3dVcFwiLDM5OlwiQXJyb3dSaWdodFwiLDQwOlwiQXJyb3dEb3duXCIsNDU6XCJJbnNlcnRcIiw0NjpcIkRlbGV0ZVwiLDExMjpcIkYxXCIsMTEzOlwiRjJcIiwxMTQ6XCJGM1wiLDExNTpcIkY0XCIsXG4xMTY6XCJGNVwiLDExNzpcIkY2XCIsMTE4OlwiRjdcIiwxMTk6XCJGOFwiLDEyMDpcIkY5XCIsMTIxOlwiRjEwXCIsMTIyOlwiRjExXCIsMTIzOlwiRjEyXCIsMTQ0OlwiTnVtTG9ja1wiLDE0NTpcIlNjcm9sbExvY2tcIiwyMjQ6XCJNZXRhXCJ9LHJmPU5lLmV4dGVuZCh7a2V5OmZ1bmN0aW9uKGEpe2lmKGEua2V5KXt2YXIgYj1wZlthLmtleV18fGEua2V5O2lmKFwiVW5pZGVudGlmaWVkXCIhPT1iKXJldHVybiBifXJldHVyblwia2V5cHJlc3NcIj09PWEudHlwZT8oYT1vZihhKSwxMz09PWE/XCJFbnRlclwiOlN0cmluZy5mcm9tQ2hhckNvZGUoYSkpOlwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/cWZbYS5rZXlDb2RlXXx8XCJVbmlkZW50aWZpZWRcIjpcIlwifSxsb2NhdGlvbjpudWxsLGN0cmxLZXk6bnVsbCxzaGlmdEtleTpudWxsLGFsdEtleTpudWxsLG1ldGFLZXk6bnVsbCxyZXBlYXQ6bnVsbCxsb2NhbGU6bnVsbCxnZXRNb2RpZmllclN0YXRlOlFlLGNoYXJDb2RlOmZ1bmN0aW9uKGEpe3JldHVyblwia2V5cHJlc3NcIj09PVxuYS50eXBlP29mKGEpOjB9LGtleUNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlkb3duXCI9PT1hLnR5cGV8fFwia2V5dXBcIj09PWEudHlwZT9hLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oYSl7cmV0dXJuXCJrZXlwcmVzc1wiPT09YS50eXBlP29mKGEpOlwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/YS5rZXlDb2RlOjB9fSksc2Y9VmUuZXh0ZW5kKHtkYXRhVHJhbnNmZXI6bnVsbH0pLHRmPU5lLmV4dGVuZCh7dG91Y2hlczpudWxsLHRhcmdldFRvdWNoZXM6bnVsbCxjaGFuZ2VkVG91Y2hlczpudWxsLGFsdEtleTpudWxsLG1ldGFLZXk6bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxnZXRNb2RpZmllclN0YXRlOlFlfSksdWY9Ry5leHRlbmQoe3Byb3BlcnR5TmFtZTpudWxsLGVsYXBzZWRUaW1lOm51bGwscHNldWRvRWxlbWVudDpudWxsfSksdmY9VmUuZXh0ZW5kKHtkZWx0YVg6ZnVuY3Rpb24oYSl7cmV0dXJuXCJkZWx0YVhcImluIGE/YS5kZWx0YVg6XCJ3aGVlbERlbHRhWFwiaW5cbmE/LWEud2hlZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0aW9uKGEpe3JldHVyblwiZGVsdGFZXCJpbiBhP2EuZGVsdGFZOlwid2hlZWxEZWx0YVlcImluIGE/LWEud2hlZWxEZWx0YVk6XCJ3aGVlbERlbHRhXCJpbiBhPy1hLndoZWVsRGVsdGE6MH0sZGVsdGFaOm51bGwsZGVsdGFNb2RlOm51bGx9KSx3Zj17ZXZlbnRUeXBlczpXYyxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPVljLmdldChhKTtpZighZSlyZXR1cm4gbnVsbDtzd2l0Y2goYSl7Y2FzZSBcImtleXByZXNzXCI6aWYoMD09PW9mKGMpKXJldHVybiBudWxsO2Nhc2UgXCJrZXlkb3duXCI6Y2FzZSBcImtleXVwXCI6YT1yZjticmVhaztjYXNlIFwiYmx1clwiOmNhc2UgXCJmb2N1c1wiOmE9bmY7YnJlYWs7Y2FzZSBcImNsaWNrXCI6aWYoMj09PWMuYnV0dG9uKXJldHVybiBudWxsO2Nhc2UgXCJhdXhjbGlja1wiOmNhc2UgXCJkYmxjbGlja1wiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwibW91c2Vtb3ZlXCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwibW91c2VvdXRcIjpjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcImNvbnRleHRtZW51XCI6YT1cblZlO2JyZWFrO2Nhc2UgXCJkcmFnXCI6Y2FzZSBcImRyYWdlbmRcIjpjYXNlIFwiZHJhZ2VudGVyXCI6Y2FzZSBcImRyYWdleGl0XCI6Y2FzZSBcImRyYWdsZWF2ZVwiOmNhc2UgXCJkcmFnb3ZlclwiOmNhc2UgXCJkcmFnc3RhcnRcIjpjYXNlIFwiZHJvcFwiOmE9c2Y7YnJlYWs7Y2FzZSBcInRvdWNoY2FuY2VsXCI6Y2FzZSBcInRvdWNoZW5kXCI6Y2FzZSBcInRvdWNobW92ZVwiOmNhc2UgXCJ0b3VjaHN0YXJ0XCI6YT10ZjticmVhaztjYXNlIFhiOmNhc2UgWWI6Y2FzZSBaYjphPWxmO2JyZWFrO2Nhc2UgJGI6YT11ZjticmVhaztjYXNlIFwic2Nyb2xsXCI6YT1OZTticmVhaztjYXNlIFwid2hlZWxcIjphPXZmO2JyZWFrO2Nhc2UgXCJjb3B5XCI6Y2FzZSBcImN1dFwiOmNhc2UgXCJwYXN0ZVwiOmE9bWY7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJwb2ludGVyY2FuY2VsXCI6Y2FzZSBcInBvaW50ZXJkb3duXCI6Y2FzZSBcInBvaW50ZXJtb3ZlXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcnVwXCI6YT1cbldlO2JyZWFrO2RlZmF1bHQ6YT1HfWI9YS5nZXRQb29sZWQoZSxiLGMsZCk7WGQoYik7cmV0dXJuIGJ9fTtpZihwYSl0aHJvdyBFcnJvcih1KDEwMSkpO3BhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFwiUmVzcG9uZGVyRXZlbnRQbHVnaW4gU2ltcGxlRXZlbnRQbHVnaW4gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luIENoYW5nZUV2ZW50UGx1Z2luIFNlbGVjdEV2ZW50UGx1Z2luIEJlZm9yZUlucHV0RXZlbnRQbHVnaW5cIi5zcGxpdChcIiBcIikpO3JhKCk7dmFyIHhmPU5jO2xhPVFkO21hPXhmO25hPVBkO3hhKHtTaW1wbGVFdmVudFBsdWdpbjp3ZixFbnRlckxlYXZlRXZlbnRQbHVnaW46WWUsQ2hhbmdlRXZlbnRQbHVnaW46TWUsU2VsZWN0RXZlbnRQbHVnaW46a2YsQmVmb3JlSW5wdXRFdmVudFBsdWdpbjp2ZX0pO3ZhciB5Zj1bXSx6Zj0tMTtmdW5jdGlvbiBIKGEpezA+emZ8fChhLmN1cnJlbnQ9eWZbemZdLHlmW3pmXT1udWxsLHpmLS0pfVxuZnVuY3Rpb24gSShhLGIpe3pmKys7eWZbemZdPWEuY3VycmVudDthLmN1cnJlbnQ9Yn12YXIgQWY9e30sSj17Y3VycmVudDpBZn0sSz17Y3VycmVudDohMX0sQmY9QWY7ZnVuY3Rpb24gQ2YoYSxiKXt2YXIgYz1hLnR5cGUuY29udGV4dFR5cGVzO2lmKCFjKXJldHVybiBBZjt2YXIgZD1hLnN0YXRlTm9kZTtpZihkJiZkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT1iKXJldHVybiBkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBlPXt9LGY7Zm9yKGYgaW4gYyllW2ZdPWJbZl07ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWIsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1lKTtyZXR1cm4gZX1mdW5jdGlvbiBMKGEpe2E9YS5jaGlsZENvbnRleHRUeXBlcztyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWF9XG5mdW5jdGlvbiBEZigpe0goSyk7SChKKX1mdW5jdGlvbiBFZihhLGIsYyl7aWYoSi5jdXJyZW50IT09QWYpdGhyb3cgRXJyb3IodSgxNjgpKTtJKEosYik7SShLLGMpfWZ1bmN0aW9uIEZmKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTthPWIuY2hpbGRDb250ZXh0VHlwZXM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGQuZ2V0Q2hpbGRDb250ZXh0KXJldHVybiBjO2Q9ZC5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIGUgaW4gZClpZighKGUgaW4gYSkpdGhyb3cgRXJyb3IodSgxMDgscGIoYil8fFwiVW5rbm93blwiLGUpKTtyZXR1cm4gbih7fSxjLHt9LGQpfWZ1bmN0aW9uIEdmKGEpe2E9KGE9YS5zdGF0ZU5vZGUpJiZhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0fHxBZjtCZj1KLmN1cnJlbnQ7SShKLGEpO0koSyxLLmN1cnJlbnQpO3JldHVybiEwfVxuZnVuY3Rpb24gSGYoYSxiLGMpe3ZhciBkPWEuc3RhdGVOb2RlO2lmKCFkKXRocm93IEVycm9yKHUoMTY5KSk7Yz8oYT1GZihhLGIsQmYpLGQuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ9YSxIKEspLEgoSiksSShKLGEpKTpIKEspO0koSyxjKX1cbnZhciBJZj1yLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxKZj1yLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssS2Y9ci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxMZj1yLnVuc3RhYmxlX3JlcXVlc3RQYWludCxNZj1yLnVuc3RhYmxlX25vdyxOZj1yLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLE9mPXIudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksUGY9ci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxRZj1yLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFJmPXIudW5zdGFibGVfTG93UHJpb3JpdHksU2Y9ci51bnN0YWJsZV9JZGxlUHJpb3JpdHksVGY9e30sVWY9ci51bnN0YWJsZV9zaG91bGRZaWVsZCxWZj12b2lkIDAhPT1MZj9MZjpmdW5jdGlvbigpe30sV2Y9bnVsbCxYZj1udWxsLFlmPSExLFpmPU1mKCksJGY9MUU0PlpmP01mOmZ1bmN0aW9uKCl7cmV0dXJuIE1mKCktWmZ9O1xuZnVuY3Rpb24gYWcoKXtzd2l0Y2goTmYoKSl7Y2FzZSBPZjpyZXR1cm4gOTk7Y2FzZSBQZjpyZXR1cm4gOTg7Y2FzZSBRZjpyZXR1cm4gOTc7Y2FzZSBSZjpyZXR1cm4gOTY7Y2FzZSBTZjpyZXR1cm4gOTU7ZGVmYXVsdDp0aHJvdyBFcnJvcih1KDMzMikpO319ZnVuY3Rpb24gYmcoYSl7c3dpdGNoKGEpe2Nhc2UgOTk6cmV0dXJuIE9mO2Nhc2UgOTg6cmV0dXJuIFBmO2Nhc2UgOTc6cmV0dXJuIFFmO2Nhc2UgOTY6cmV0dXJuIFJmO2Nhc2UgOTU6cmV0dXJuIFNmO2RlZmF1bHQ6dGhyb3cgRXJyb3IodSgzMzIpKTt9fWZ1bmN0aW9uIGNnKGEsYil7YT1iZyhhKTtyZXR1cm4gSWYoYSxiKX1mdW5jdGlvbiBkZyhhLGIsYyl7YT1iZyhhKTtyZXR1cm4gSmYoYSxiLGMpfWZ1bmN0aW9uIGVnKGEpe251bGw9PT1XZj8oV2Y9W2FdLFhmPUpmKE9mLGZnKSk6V2YucHVzaChhKTtyZXR1cm4gVGZ9ZnVuY3Rpb24gZ2coKXtpZihudWxsIT09WGYpe3ZhciBhPVhmO1hmPW51bGw7S2YoYSl9ZmcoKX1cbmZ1bmN0aW9uIGZnKCl7aWYoIVlmJiZudWxsIT09V2Ype1lmPSEwO3ZhciBhPTA7dHJ5e3ZhciBiPVdmO2NnKDk5LGZ1bmN0aW9uKCl7Zm9yKDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9YlthXTtkbyBjPWMoITApO3doaWxlKG51bGwhPT1jKX19KTtXZj1udWxsfWNhdGNoKGMpe3Rocm93IG51bGwhPT1XZiYmKFdmPVdmLnNsaWNlKGErMSkpLEpmKE9mLGdnKSxjO31maW5hbGx5e1lmPSExfX19ZnVuY3Rpb24gaGcoYSxiLGMpe2MvPTEwO3JldHVybiAxMDczNzQxODIxLSgoKDEwNzM3NDE4MjEtYStiLzEwKS9jfDApKzEpKmN9ZnVuY3Rpb24gaWcoYSxiKXtpZihhJiZhLmRlZmF1bHRQcm9wcyl7Yj1uKHt9LGIpO2E9YS5kZWZhdWx0UHJvcHM7Zm9yKHZhciBjIGluIGEpdm9pZCAwPT09YltjXSYmKGJbY109YVtjXSl9cmV0dXJuIGJ9dmFyIGpnPXtjdXJyZW50Om51bGx9LGtnPW51bGwsbGc9bnVsbCxtZz1udWxsO2Z1bmN0aW9uIG5nKCl7bWc9bGc9a2c9bnVsbH1cbmZ1bmN0aW9uIG9nKGEpe3ZhciBiPWpnLmN1cnJlbnQ7SChqZyk7YS50eXBlLl9jb250ZXh0Ll9jdXJyZW50VmFsdWU9Yn1mdW5jdGlvbiBwZyhhLGIpe2Zvcig7bnVsbCE9PWE7KXt2YXIgYz1hLmFsdGVybmF0ZTtpZihhLmNoaWxkRXhwaXJhdGlvblRpbWU8YilhLmNoaWxkRXhwaXJhdGlvblRpbWU9YixudWxsIT09YyYmYy5jaGlsZEV4cGlyYXRpb25UaW1lPGImJihjLmNoaWxkRXhwaXJhdGlvblRpbWU9Yik7ZWxzZSBpZihudWxsIT09YyYmYy5jaGlsZEV4cGlyYXRpb25UaW1lPGIpYy5jaGlsZEV4cGlyYXRpb25UaW1lPWI7ZWxzZSBicmVhazthPWEucmV0dXJufX1mdW5jdGlvbiBxZyhhLGIpe2tnPWE7bWc9bGc9bnVsbDthPWEuZGVwZW5kZW5jaWVzO251bGwhPT1hJiZudWxsIT09YS5maXJzdENvbnRleHQmJihhLmV4cGlyYXRpb25UaW1lPj1iJiYocmc9ITApLGEuZmlyc3RDb250ZXh0PW51bGwpfVxuZnVuY3Rpb24gc2coYSxiKXtpZihtZyE9PWEmJiExIT09YiYmMCE9PWIpe2lmKFwibnVtYmVyXCIhPT10eXBlb2YgYnx8MTA3Mzc0MTgyMz09PWIpbWc9YSxiPTEwNzM3NDE4MjM7Yj17Y29udGV4dDphLG9ic2VydmVkQml0czpiLG5leHQ6bnVsbH07aWYobnVsbD09PWxnKXtpZihudWxsPT09a2cpdGhyb3cgRXJyb3IodSgzMDgpKTtsZz1iO2tnLmRlcGVuZGVuY2llcz17ZXhwaXJhdGlvblRpbWU6MCxmaXJzdENvbnRleHQ6YixyZXNwb25kZXJzOm51bGx9fWVsc2UgbGc9bGcubmV4dD1ifXJldHVybiBhLl9jdXJyZW50VmFsdWV9dmFyIHRnPSExO2Z1bmN0aW9uIHVnKGEpe2EudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTphLm1lbW9pemVkU3RhdGUsYmFzZVF1ZXVlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGx9LGVmZmVjdHM6bnVsbH19XG5mdW5jdGlvbiB2ZyhhLGIpe2E9YS51cGRhdGVRdWV1ZTtiLnVwZGF0ZVF1ZXVlPT09YSYmKGIudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTphLmJhc2VTdGF0ZSxiYXNlUXVldWU6YS5iYXNlUXVldWUsc2hhcmVkOmEuc2hhcmVkLGVmZmVjdHM6YS5lZmZlY3RzfSl9ZnVuY3Rpb24gd2coYSxiKXthPXtleHBpcmF0aW9uVGltZTphLHN1c3BlbnNlQ29uZmlnOmIsdGFnOjAscGF5bG9hZDpudWxsLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gYS5uZXh0PWF9ZnVuY3Rpb24geGcoYSxiKXthPWEudXBkYXRlUXVldWU7aWYobnVsbCE9PWEpe2E9YS5zaGFyZWQ7dmFyIGM9YS5wZW5kaW5nO251bGw9PT1jP2IubmV4dD1iOihiLm5leHQ9Yy5uZXh0LGMubmV4dD1iKTthLnBlbmRpbmc9Yn19XG5mdW5jdGlvbiB5ZyhhLGIpe3ZhciBjPWEuYWx0ZXJuYXRlO251bGwhPT1jJiZ2ZyhjLGEpO2E9YS51cGRhdGVRdWV1ZTtjPWEuYmFzZVF1ZXVlO251bGw9PT1jPyhhLmJhc2VRdWV1ZT1iLm5leHQ9YixiLm5leHQ9Yik6KGIubmV4dD1jLm5leHQsYy5uZXh0PWIpfVxuZnVuY3Rpb24gemcoYSxiLGMsZCl7dmFyIGU9YS51cGRhdGVRdWV1ZTt0Zz0hMTt2YXIgZj1lLmJhc2VRdWV1ZSxnPWUuc2hhcmVkLnBlbmRpbmc7aWYobnVsbCE9PWcpe2lmKG51bGwhPT1mKXt2YXIgaD1mLm5leHQ7Zi5uZXh0PWcubmV4dDtnLm5leHQ9aH1mPWc7ZS5zaGFyZWQucGVuZGluZz1udWxsO2g9YS5hbHRlcm5hdGU7bnVsbCE9PWgmJihoPWgudXBkYXRlUXVldWUsbnVsbCE9PWgmJihoLmJhc2VRdWV1ZT1nKSl9aWYobnVsbCE9PWYpe2g9Zi5uZXh0O3ZhciBrPWUuYmFzZVN0YXRlLGw9MCxtPW51bGwscD1udWxsLHg9bnVsbDtpZihudWxsIT09aCl7dmFyIHo9aDtkb3tnPXouZXhwaXJhdGlvblRpbWU7aWYoZzxkKXt2YXIgY2E9e2V4cGlyYXRpb25UaW1lOnouZXhwaXJhdGlvblRpbWUsc3VzcGVuc2VDb25maWc6ei5zdXNwZW5zZUNvbmZpZyx0YWc6ei50YWcscGF5bG9hZDp6LnBheWxvYWQsY2FsbGJhY2s6ei5jYWxsYmFjayxuZXh0Om51bGx9O251bGw9PT14PyhwPXg9XG5jYSxtPWspOng9eC5uZXh0PWNhO2c+bCYmKGw9Zyl9ZWxzZXtudWxsIT09eCYmKHg9eC5uZXh0PXtleHBpcmF0aW9uVGltZToxMDczNzQxODIzLHN1c3BlbnNlQ29uZmlnOnouc3VzcGVuc2VDb25maWcsdGFnOnoudGFnLHBheWxvYWQ6ei5wYXlsb2FkLGNhbGxiYWNrOnouY2FsbGJhY2ssbmV4dDpudWxsfSk7QWcoZyx6LnN1c3BlbnNlQ29uZmlnKTthOnt2YXIgRD1hLHQ9ejtnPWI7Y2E9Yztzd2l0Y2godC50YWcpe2Nhc2UgMTpEPXQucGF5bG9hZDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgRCl7az1ELmNhbGwoY2EsayxnKTticmVhayBhfWs9RDticmVhayBhO2Nhc2UgMzpELmVmZmVjdFRhZz1ELmVmZmVjdFRhZyYtNDA5N3w2NDtjYXNlIDA6RD10LnBheWxvYWQ7Zz1cImZ1bmN0aW9uXCI9PT10eXBlb2YgRD9ELmNhbGwoY2EsayxnKTpEO2lmKG51bGw9PT1nfHx2b2lkIDA9PT1nKWJyZWFrIGE7az1uKHt9LGssZyk7YnJlYWsgYTtjYXNlIDI6dGc9ITB9fW51bGwhPT16LmNhbGxiYWNrJiZcbihhLmVmZmVjdFRhZ3w9MzIsZz1lLmVmZmVjdHMsbnVsbD09PWc/ZS5lZmZlY3RzPVt6XTpnLnB1c2goeikpfXo9ei5uZXh0O2lmKG51bGw9PT16fHx6PT09aClpZihnPWUuc2hhcmVkLnBlbmRpbmcsbnVsbD09PWcpYnJlYWs7ZWxzZSB6PWYubmV4dD1nLm5leHQsZy5uZXh0PWgsZS5iYXNlUXVldWU9Zj1nLGUuc2hhcmVkLnBlbmRpbmc9bnVsbH13aGlsZSgxKX1udWxsPT09eD9tPWs6eC5uZXh0PXA7ZS5iYXNlU3RhdGU9bTtlLmJhc2VRdWV1ZT14O0JnKGwpO2EuZXhwaXJhdGlvblRpbWU9bDthLm1lbW9pemVkU3RhdGU9a319XG5mdW5jdGlvbiBDZyhhLGIsYyl7YT1iLmVmZmVjdHM7Yi5lZmZlY3RzPW51bGw7aWYobnVsbCE9PWEpZm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXSxlPWQuY2FsbGJhY2s7aWYobnVsbCE9PWUpe2QuY2FsbGJhY2s9bnVsbDtkPWU7ZT1jO2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBkKXRocm93IEVycm9yKHUoMTkxLGQpKTtkLmNhbGwoZSl9fX12YXIgRGc9V2EuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsRWc9KG5ldyBhYS5Db21wb25lbnQpLnJlZnM7ZnVuY3Rpb24gRmcoYSxiLGMsZCl7Yj1hLm1lbW9pemVkU3RhdGU7Yz1jKGQsYik7Yz1udWxsPT09Y3x8dm9pZCAwPT09Yz9iOm4oe30sYixjKTthLm1lbW9pemVkU3RhdGU9YzswPT09YS5leHBpcmF0aW9uVGltZSYmKGEudXBkYXRlUXVldWUuYmFzZVN0YXRlPWMpfVxudmFyIEpnPXtpc01vdW50ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5fcmVhY3RJbnRlcm5hbEZpYmVyKT9kYyhhKT09PWE6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihhLGIsYyl7YT1hLl9yZWFjdEludGVybmFsRmliZXI7dmFyIGQ9R2coKSxlPURnLnN1c3BlbnNlO2Q9SGcoZCxhLGUpO2U9d2coZCxlKTtlLnBheWxvYWQ9Yjt2b2lkIDAhPT1jJiZudWxsIT09YyYmKGUuY2FsbGJhY2s9Yyk7eGcoYSxlKTtJZyhhLGQpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGEsYixjKXthPWEuX3JlYWN0SW50ZXJuYWxGaWJlcjt2YXIgZD1HZygpLGU9RGcuc3VzcGVuc2U7ZD1IZyhkLGEsZSk7ZT13ZyhkLGUpO2UudGFnPTE7ZS5wYXlsb2FkPWI7dm9pZCAwIT09YyYmbnVsbCE9PWMmJihlLmNhbGxiYWNrPWMpO3hnKGEsZSk7SWcoYSxkKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGEsYil7YT1hLl9yZWFjdEludGVybmFsRmliZXI7dmFyIGM9R2coKSxkPURnLnN1c3BlbnNlO1xuYz1IZyhjLGEsZCk7ZD13ZyhjLGQpO2QudGFnPTI7dm9pZCAwIT09YiYmbnVsbCE9PWImJihkLmNhbGxiYWNrPWIpO3hnKGEsZCk7SWcoYSxjKX19O2Z1bmN0aW9uIEtnKGEsYixjLGQsZSxmLGcpe2E9YS5zdGF0ZU5vZGU7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGEuc2hvdWxkQ29tcG9uZW50VXBkYXRlP2Euc2hvdWxkQ29tcG9uZW50VXBkYXRlKGQsZixnKTpiLnByb3RvdHlwZSYmYi5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IWJmKGMsZCl8fCFiZihlLGYpOiEwfVxuZnVuY3Rpb24gTGcoYSxiLGMpe3ZhciBkPSExLGU9QWY7dmFyIGY9Yi5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mP2Y9c2coZik6KGU9TChiKT9CZjpKLmN1cnJlbnQsZD1iLmNvbnRleHRUeXBlcyxmPShkPW51bGwhPT1kJiZ2b2lkIDAhPT1kKT9DZihhLGUpOkFmKTtiPW5ldyBiKGMsZik7YS5tZW1vaXplZFN0YXRlPW51bGwhPT1iLnN0YXRlJiZ2b2lkIDAhPT1iLnN0YXRlP2Iuc3RhdGU6bnVsbDtiLnVwZGF0ZXI9Smc7YS5zdGF0ZU5vZGU9YjtiLl9yZWFjdEludGVybmFsRmliZXI9YTtkJiYoYT1hLnN0YXRlTm9kZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9ZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWYpO3JldHVybiBifVxuZnVuY3Rpb24gTWcoYSxiLGMsZCl7YT1iLnN0YXRlO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLGQpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGMsZCk7Yi5zdGF0ZSE9PWEmJkpnLmVucXVldWVSZXBsYWNlU3RhdGUoYixiLnN0YXRlLG51bGwpfVxuZnVuY3Rpb24gTmcoYSxiLGMsZCl7dmFyIGU9YS5zdGF0ZU5vZGU7ZS5wcm9wcz1jO2Uuc3RhdGU9YS5tZW1vaXplZFN0YXRlO2UucmVmcz1FZzt1ZyhhKTt2YXIgZj1iLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY/ZS5jb250ZXh0PXNnKGYpOihmPUwoYik/QmY6Si5jdXJyZW50LGUuY29udGV4dD1DZihhLGYpKTt6ZyhhLGMsZSxkKTtlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZTtmPWIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBmJiYoRmcoYSxiLGYsYyksZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGUpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc3x8XCJmdW5jdGlvblwiPT09dHlwZW9mIGUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLmNvbXBvbmVudFdpbGxNb3VudHx8XG4oYj1lLnN0YXRlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmNvbXBvbmVudFdpbGxNb3VudCYmZS5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSxiIT09ZS5zdGF0ZSYmSmcuZW5xdWV1ZVJlcGxhY2VTdGF0ZShlLGUuc3RhdGUsbnVsbCksemcoYSxjLGUsZCksZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGUpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmNvbXBvbmVudERpZE1vdW50JiYoYS5lZmZlY3RUYWd8PTQpfXZhciBPZz1BcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gUGcoYSxiLGMpe2E9Yy5yZWY7aWYobnVsbCE9PWEmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiZcIm9iamVjdFwiIT09dHlwZW9mIGEpe2lmKGMuX293bmVyKXtjPWMuX293bmVyO2lmKGMpe2lmKDEhPT1jLnRhZyl0aHJvdyBFcnJvcih1KDMwOSkpO3ZhciBkPWMuc3RhdGVOb2RlfWlmKCFkKXRocm93IEVycm9yKHUoMTQ3LGEpKTt2YXIgZT1cIlwiK2E7aWYobnVsbCE9PWImJm51bGwhPT1iLnJlZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGIucmVmJiZiLnJlZi5fc3RyaW5nUmVmPT09ZSlyZXR1cm4gYi5yZWY7Yj1mdW5jdGlvbihhKXt2YXIgYj1kLnJlZnM7Yj09PUVnJiYoYj1kLnJlZnM9e30pO251bGw9PT1hP2RlbGV0ZSBiW2VdOmJbZV09YX07Yi5fc3RyaW5nUmVmPWU7cmV0dXJuIGJ9aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKXRocm93IEVycm9yKHUoMjg0KSk7aWYoIWMuX293bmVyKXRocm93IEVycm9yKHUoMjkwLGEpKTt9cmV0dXJuIGF9XG5mdW5jdGlvbiBRZyhhLGIpe2lmKFwidGV4dGFyZWFcIiE9PWEudHlwZSl0aHJvdyBFcnJvcih1KDMxLFwiW29iamVjdCBPYmplY3RdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYik/XCJvYmplY3Qgd2l0aCBrZXlzIHtcIitPYmplY3Qua2V5cyhiKS5qb2luKFwiLCBcIikrXCJ9XCI6YixcIlwiKSk7fVxuZnVuY3Rpb24gUmcoYSl7ZnVuY3Rpb24gYihiLGMpe2lmKGEpe3ZhciBkPWIubGFzdEVmZmVjdDtudWxsIT09ZD8oZC5uZXh0RWZmZWN0PWMsYi5sYXN0RWZmZWN0PWMpOmIuZmlyc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0PWM7Yy5uZXh0RWZmZWN0PW51bGw7Yy5lZmZlY3RUYWc9OH19ZnVuY3Rpb24gYyhjLGQpe2lmKCFhKXJldHVybiBudWxsO2Zvcig7bnVsbCE9PWQ7KWIoYyxkKSxkPWQuc2libGluZztyZXR1cm4gbnVsbH1mdW5jdGlvbiBkKGEsYil7Zm9yKGE9bmV3IE1hcDtudWxsIT09YjspbnVsbCE9PWIua2V5P2Euc2V0KGIua2V5LGIpOmEuc2V0KGIuaW5kZXgsYiksYj1iLnNpYmxpbmc7cmV0dXJuIGF9ZnVuY3Rpb24gZShhLGIpe2E9U2coYSxiKTthLmluZGV4PTA7YS5zaWJsaW5nPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gZihiLGMsZCl7Yi5pbmRleD1kO2lmKCFhKXJldHVybiBjO2Q9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWQpcmV0dXJuIGQ9ZC5pbmRleCxkPGM/KGIuZWZmZWN0VGFnPVxuMixjKTpkO2IuZWZmZWN0VGFnPTI7cmV0dXJuIGN9ZnVuY3Rpb24gZyhiKXthJiZudWxsPT09Yi5hbHRlcm5hdGUmJihiLmVmZmVjdFRhZz0yKTtyZXR1cm4gYn1mdW5jdGlvbiBoKGEsYixjLGQpe2lmKG51bGw9PT1ifHw2IT09Yi50YWcpcmV0dXJuIGI9VGcoYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gayhhLGIsYyxkKXtpZihudWxsIT09YiYmYi5lbGVtZW50VHlwZT09PWMudHlwZSlyZXR1cm4gZD1lKGIsYy5wcm9wcyksZC5yZWY9UGcoYSxiLGMpLGQucmV0dXJuPWEsZDtkPVVnKGMudHlwZSxjLmtleSxjLnByb3BzLG51bGwsYS5tb2RlLGQpO2QucmVmPVBnKGEsYixjKTtkLnJldHVybj1hO3JldHVybiBkfWZ1bmN0aW9uIGwoYSxiLGMsZCl7aWYobnVsbD09PWJ8fDQhPT1iLnRhZ3x8Yi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PWMuY29udGFpbmVySW5mb3x8Yi5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT1cbmMuaW1wbGVtZW50YXRpb24pcmV0dXJuIGI9VmcoYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMuY2hpbGRyZW58fFtdKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIG0oYSxiLGMsZCxmKXtpZihudWxsPT09Ynx8NyE9PWIudGFnKXJldHVybiBiPVdnKGMsYS5tb2RlLGQsZiksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gcChhLGIsYyl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBifHxcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI9VGcoXCJcIitiLGEubW9kZSxjKSxiLnJldHVybj1hLGI7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBiJiZudWxsIT09Yil7c3dpdGNoKGIuJCR0eXBlb2Ype2Nhc2UgWmE6cmV0dXJuIGM9VWcoYi50eXBlLGIua2V5LGIucHJvcHMsbnVsbCxhLm1vZGUsYyksYy5yZWY9UGcoYSxudWxsLGIpLGMucmV0dXJuPWEsYztjYXNlICRhOnJldHVybiBiPVZnKGIsYS5tb2RlLGMpLGIucmV0dXJuPWEsYn1pZihPZyhiKXx8XG5uYihiKSlyZXR1cm4gYj1XZyhiLGEubW9kZSxjLG51bGwpLGIucmV0dXJuPWEsYjtRZyhhLGIpfXJldHVybiBudWxsfWZ1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGU9bnVsbCE9PWI/Yi5rZXk6bnVsbDtpZihcInN0cmluZ1wiPT09dHlwZW9mIGN8fFwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbnVsbCE9PWU/bnVsbDpoKGEsYixcIlwiK2MsZCk7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yyl7c3dpdGNoKGMuJCR0eXBlb2Ype2Nhc2UgWmE6cmV0dXJuIGMua2V5PT09ZT9jLnR5cGU9PT1hYj9tKGEsYixjLnByb3BzLmNoaWxkcmVuLGQsZSk6ayhhLGIsYyxkKTpudWxsO2Nhc2UgJGE6cmV0dXJuIGMua2V5PT09ZT9sKGEsYixjLGQpOm51bGx9aWYoT2coYyl8fG5iKGMpKXJldHVybiBudWxsIT09ZT9udWxsOm0oYSxiLGMsZCxudWxsKTtRZyhhLGMpfXJldHVybiBudWxsfWZ1bmN0aW9uIHooYSxiLGMsZCxlKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGR8fFwibnVtYmVyXCI9PT10eXBlb2YgZClyZXR1cm4gYT1cbmEuZ2V0KGMpfHxudWxsLGgoYixhLFwiXCIrZCxlKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGQmJm51bGwhPT1kKXtzd2l0Y2goZC4kJHR5cGVvZil7Y2FzZSBaYTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsZC50eXBlPT09YWI/bShiLGEsZC5wcm9wcy5jaGlsZHJlbixlLGQua2V5KTprKGIsYSxkLGUpO2Nhc2UgJGE6cmV0dXJuIGE9YS5nZXQobnVsbD09PWQua2V5P2M6ZC5rZXkpfHxudWxsLGwoYixhLGQsZSl9aWYoT2coZCl8fG5iKGQpKXJldHVybiBhPWEuZ2V0KGMpfHxudWxsLG0oYixhLGQsZSxudWxsKTtRZyhiLGQpfXJldHVybiBudWxsfWZ1bmN0aW9uIGNhKGUsZyxoLGspe2Zvcih2YXIgbD1udWxsLHQ9bnVsbCxtPWcseT1nPTAsQT1udWxsO251bGwhPT1tJiZ5PGgubGVuZ3RoO3krKyl7bS5pbmRleD55PyhBPW0sbT1udWxsKTpBPW0uc2libGluZzt2YXIgcT14KGUsbSxoW3ldLGspO2lmKG51bGw9PT1xKXtudWxsPT09bSYmKG09QSk7YnJlYWt9YSYmXG5tJiZudWxsPT09cS5hbHRlcm5hdGUmJmIoZSxtKTtnPWYocSxnLHkpO251bGw9PT10P2w9cTp0LnNpYmxpbmc9cTt0PXE7bT1BfWlmKHk9PT1oLmxlbmd0aClyZXR1cm4gYyhlLG0pLGw7aWYobnVsbD09PW0pe2Zvcig7eTxoLmxlbmd0aDt5KyspbT1wKGUsaFt5XSxrKSxudWxsIT09bSYmKGc9ZihtLGcseSksbnVsbD09PXQ/bD1tOnQuc2libGluZz1tLHQ9bSk7cmV0dXJuIGx9Zm9yKG09ZChlLG0pO3k8aC5sZW5ndGg7eSsrKUE9eihtLGUseSxoW3ldLGspLG51bGwhPT1BJiYoYSYmbnVsbCE9PUEuYWx0ZXJuYXRlJiZtLmRlbGV0ZShudWxsPT09QS5rZXk/eTpBLmtleSksZz1mKEEsZyx5KSxudWxsPT09dD9sPUE6dC5zaWJsaW5nPUEsdD1BKTthJiZtLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGIoZSxhKX0pO3JldHVybiBsfWZ1bmN0aW9uIEQoZSxnLGgsbCl7dmFyIGs9bmIoaCk7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGspdGhyb3cgRXJyb3IodSgxNTApKTtoPWsuY2FsbChoKTtcbmlmKG51bGw9PWgpdGhyb3cgRXJyb3IodSgxNTEpKTtmb3IodmFyIG09az1udWxsLHQ9Zyx5PWc9MCxBPW51bGwscT1oLm5leHQoKTtudWxsIT09dCYmIXEuZG9uZTt5KysscT1oLm5leHQoKSl7dC5pbmRleD55PyhBPXQsdD1udWxsKTpBPXQuc2libGluZzt2YXIgRD14KGUsdCxxLnZhbHVlLGwpO2lmKG51bGw9PT1EKXtudWxsPT09dCYmKHQ9QSk7YnJlYWt9YSYmdCYmbnVsbD09PUQuYWx0ZXJuYXRlJiZiKGUsdCk7Zz1mKEQsZyx5KTtudWxsPT09bT9rPUQ6bS5zaWJsaW5nPUQ7bT1EO3Q9QX1pZihxLmRvbmUpcmV0dXJuIGMoZSx0KSxrO2lmKG51bGw9PT10KXtmb3IoOyFxLmRvbmU7eSsrLHE9aC5uZXh0KCkpcT1wKGUscS52YWx1ZSxsKSxudWxsIT09cSYmKGc9ZihxLGcseSksbnVsbD09PW0/az1xOm0uc2libGluZz1xLG09cSk7cmV0dXJuIGt9Zm9yKHQ9ZChlLHQpOyFxLmRvbmU7eSsrLHE9aC5uZXh0KCkpcT16KHQsZSx5LHEudmFsdWUsbCksbnVsbCE9PXEmJihhJiZudWxsIT09XG5xLmFsdGVybmF0ZSYmdC5kZWxldGUobnVsbD09PXEua2V5P3k6cS5rZXkpLGc9ZihxLGcseSksbnVsbD09PW0/az1xOm0uc2libGluZz1xLG09cSk7YSYmdC5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBiKGUsYSl9KTtyZXR1cm4ga31yZXR1cm4gZnVuY3Rpb24oYSxkLGYsaCl7dmFyIGs9XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09ZiYmZi50eXBlPT09YWImJm51bGw9PT1mLmtleTtrJiYoZj1mLnByb3BzLmNoaWxkcmVuKTt2YXIgbD1cIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mO2lmKGwpc3dpdGNoKGYuJCR0eXBlb2Ype2Nhc2UgWmE6YTp7bD1mLmtleTtmb3Ioaz1kO251bGwhPT1rOyl7aWYoay5rZXk9PT1sKXtzd2l0Y2goay50YWcpe2Nhc2UgNzppZihmLnR5cGU9PT1hYil7YyhhLGsuc2libGluZyk7ZD1lKGssZi5wcm9wcy5jaGlsZHJlbik7ZC5yZXR1cm49YTthPWQ7YnJlYWsgYX1icmVhaztkZWZhdWx0OmlmKGsuZWxlbWVudFR5cGU9PT1mLnR5cGUpe2MoYSxcbmsuc2libGluZyk7ZD1lKGssZi5wcm9wcyk7ZC5yZWY9UGcoYSxrLGYpO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9fWMoYSxrKTticmVha31lbHNlIGIoYSxrKTtrPWsuc2libGluZ31mLnR5cGU9PT1hYj8oZD1XZyhmLnByb3BzLmNoaWxkcmVuLGEubW9kZSxoLGYua2V5KSxkLnJldHVybj1hLGE9ZCk6KGg9VWcoZi50eXBlLGYua2V5LGYucHJvcHMsbnVsbCxhLm1vZGUsaCksaC5yZWY9UGcoYSxkLGYpLGgucmV0dXJuPWEsYT1oKX1yZXR1cm4gZyhhKTtjYXNlICRhOmE6e2ZvcihrPWYua2V5O251bGwhPT1kOyl7aWYoZC5rZXk9PT1rKWlmKDQ9PT1kLnRhZyYmZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbz09PWYuY29udGFpbmVySW5mbyYmZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb249PT1mLmltcGxlbWVudGF0aW9uKXtjKGEsZC5zaWJsaW5nKTtkPWUoZCxmLmNoaWxkcmVufHxbXSk7ZC5yZXR1cm49YTthPWQ7YnJlYWsgYX1lbHNle2MoYSxkKTticmVha31lbHNlIGIoYSxkKTtkPVxuZC5zaWJsaW5nfWQ9VmcoZixhLm1vZGUsaCk7ZC5yZXR1cm49YTthPWR9cmV0dXJuIGcoYSl9aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBmfHxcIm51bWJlclwiPT09dHlwZW9mIGYpcmV0dXJuIGY9XCJcIitmLG51bGwhPT1kJiY2PT09ZC50YWc/KGMoYSxkLnNpYmxpbmcpLGQ9ZShkLGYpLGQucmV0dXJuPWEsYT1kKTooYyhhLGQpLGQ9VGcoZixhLm1vZGUsaCksZC5yZXR1cm49YSxhPWQpLGcoYSk7aWYoT2coZikpcmV0dXJuIGNhKGEsZCxmLGgpO2lmKG5iKGYpKXJldHVybiBEKGEsZCxmLGgpO2wmJlFnKGEsZik7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBmJiYhaylzd2l0Y2goYS50YWcpe2Nhc2UgMTpjYXNlIDA6dGhyb3cgYT1hLnR5cGUsRXJyb3IodSgxNTIsYS5kaXNwbGF5TmFtZXx8YS5uYW1lfHxcIkNvbXBvbmVudFwiKSk7fXJldHVybiBjKGEsZCl9fXZhciBYZz1SZyghMCksWWc9UmcoITEpLFpnPXt9LCRnPXtjdXJyZW50OlpnfSxhaD17Y3VycmVudDpaZ30sYmg9e2N1cnJlbnQ6Wmd9O1xuZnVuY3Rpb24gY2goYSl7aWYoYT09PVpnKXRocm93IEVycm9yKHUoMTc0KSk7cmV0dXJuIGF9ZnVuY3Rpb24gZGgoYSxiKXtJKGJoLGIpO0koYWgsYSk7SSgkZyxaZyk7YT1iLm5vZGVUeXBlO3N3aXRjaChhKXtjYXNlIDk6Y2FzZSAxMTpiPShiPWIuZG9jdW1lbnRFbGVtZW50KT9iLm5hbWVzcGFjZVVSSTpPYihudWxsLFwiXCIpO2JyZWFrO2RlZmF1bHQ6YT04PT09YT9iLnBhcmVudE5vZGU6YixiPWEubmFtZXNwYWNlVVJJfHxudWxsLGE9YS50YWdOYW1lLGI9T2IoYixhKX1IKCRnKTtJKCRnLGIpfWZ1bmN0aW9uIGVoKCl7SCgkZyk7SChhaCk7SChiaCl9ZnVuY3Rpb24gZmgoYSl7Y2goYmguY3VycmVudCk7dmFyIGI9Y2goJGcuY3VycmVudCk7dmFyIGM9T2IoYixhLnR5cGUpO2IhPT1jJiYoSShhaCxhKSxJKCRnLGMpKX1mdW5jdGlvbiBnaChhKXthaC5jdXJyZW50PT09YSYmKEgoJGcpLEgoYWgpKX12YXIgTT17Y3VycmVudDowfTtcbmZ1bmN0aW9uIGhoKGEpe2Zvcih2YXIgYj1hO251bGwhPT1iOyl7aWYoMTM9PT1iLnRhZyl7dmFyIGM9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1jJiYoYz1jLmRlaHlkcmF0ZWQsbnVsbD09PWN8fGMuZGF0YT09PUJkfHxjLmRhdGE9PT1DZCkpcmV0dXJuIGJ9ZWxzZSBpZigxOT09PWIudGFnJiZ2b2lkIDAhPT1iLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIpe2lmKDAhPT0oYi5lZmZlY3RUYWcmNjQpKXJldHVybiBifWVsc2UgaWYobnVsbCE9PWIuY2hpbGQpe2IuY2hpbGQucmV0dXJuPWI7Yj1iLmNoaWxkO2NvbnRpbnVlfWlmKGI9PT1hKWJyZWFrO2Zvcig7bnVsbD09PWIuc2libGluZzspe2lmKG51bGw9PT1iLnJldHVybnx8Yi5yZXR1cm49PT1hKXJldHVybiBudWxsO2I9Yi5yZXR1cm59Yi5zaWJsaW5nLnJldHVybj1iLnJldHVybjtiPWIuc2libGluZ31yZXR1cm4gbnVsbH1mdW5jdGlvbiBpaChhLGIpe3JldHVybntyZXNwb25kZXI6YSxwcm9wczpifX1cbnZhciBqaD1XYS5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLGtoPVdhLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLGxoPTAsTj1udWxsLE89bnVsbCxQPW51bGwsbWg9ITE7ZnVuY3Rpb24gUSgpe3Rocm93IEVycm9yKHUoMzIxKSk7fWZ1bmN0aW9uIG5oKGEsYil7aWYobnVsbD09PWIpcmV0dXJuITE7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aCYmYzxhLmxlbmd0aDtjKyspaWYoISRlKGFbY10sYltjXSkpcmV0dXJuITE7cmV0dXJuITB9XG5mdW5jdGlvbiBvaChhLGIsYyxkLGUsZil7bGg9ZjtOPWI7Yi5tZW1vaXplZFN0YXRlPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO2IuZXhwaXJhdGlvblRpbWU9MDtqaC5jdXJyZW50PW51bGw9PT1hfHxudWxsPT09YS5tZW1vaXplZFN0YXRlP3BoOnFoO2E9YyhkLGUpO2lmKGIuZXhwaXJhdGlvblRpbWU9PT1saCl7Zj0wO2Rve2IuZXhwaXJhdGlvblRpbWU9MDtpZighKDI1PmYpKXRocm93IEVycm9yKHUoMzAxKSk7Zis9MTtQPU89bnVsbDtiLnVwZGF0ZVF1ZXVlPW51bGw7amguY3VycmVudD1yaDthPWMoZCxlKX13aGlsZShiLmV4cGlyYXRpb25UaW1lPT09bGgpfWpoLmN1cnJlbnQ9c2g7Yj1udWxsIT09TyYmbnVsbCE9PU8ubmV4dDtsaD0wO1A9Tz1OPW51bGw7bWg9ITE7aWYoYil0aHJvdyBFcnJvcih1KDMwMCkpO3JldHVybiBhfVxuZnVuY3Rpb24gdGgoKXt2YXIgYT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtudWxsPT09UD9OLm1lbW9pemVkU3RhdGU9UD1hOlA9UC5uZXh0PWE7cmV0dXJuIFB9ZnVuY3Rpb24gdWgoKXtpZihudWxsPT09Tyl7dmFyIGE9Ti5hbHRlcm5hdGU7YT1udWxsIT09YT9hLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGE9Ty5uZXh0O3ZhciBiPW51bGw9PT1QP04ubWVtb2l6ZWRTdGF0ZTpQLm5leHQ7aWYobnVsbCE9PWIpUD1iLE89YTtlbHNle2lmKG51bGw9PT1hKXRocm93IEVycm9yKHUoMzEwKSk7Tz1hO2E9e21lbW9pemVkU3RhdGU6Ty5tZW1vaXplZFN0YXRlLGJhc2VTdGF0ZTpPLmJhc2VTdGF0ZSxiYXNlUXVldWU6Ty5iYXNlUXVldWUscXVldWU6Ty5xdWV1ZSxuZXh0Om51bGx9O251bGw9PT1QP04ubWVtb2l6ZWRTdGF0ZT1QPWE6UD1QLm5leHQ9YX1yZXR1cm4gUH1cbmZ1bmN0aW9uIHZoKGEsYil7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGI/YihhKTpifVxuZnVuY3Rpb24gd2goYSl7dmFyIGI9dWgoKSxjPWIucXVldWU7aWYobnVsbD09PWMpdGhyb3cgRXJyb3IodSgzMTEpKTtjLmxhc3RSZW5kZXJlZFJlZHVjZXI9YTt2YXIgZD1PLGU9ZC5iYXNlUXVldWUsZj1jLnBlbmRpbmc7aWYobnVsbCE9PWYpe2lmKG51bGwhPT1lKXt2YXIgZz1lLm5leHQ7ZS5uZXh0PWYubmV4dDtmLm5leHQ9Z31kLmJhc2VRdWV1ZT1lPWY7Yy5wZW5kaW5nPW51bGx9aWYobnVsbCE9PWUpe2U9ZS5uZXh0O2Q9ZC5iYXNlU3RhdGU7dmFyIGg9Zz1mPW51bGwsaz1lO2Rve3ZhciBsPWsuZXhwaXJhdGlvblRpbWU7aWYobDxsaCl7dmFyIG09e2V4cGlyYXRpb25UaW1lOmsuZXhwaXJhdGlvblRpbWUsc3VzcGVuc2VDb25maWc6ay5zdXNwZW5zZUNvbmZpZyxhY3Rpb246ay5hY3Rpb24sZWFnZXJSZWR1Y2VyOmsuZWFnZXJSZWR1Y2VyLGVhZ2VyU3RhdGU6ay5lYWdlclN0YXRlLG5leHQ6bnVsbH07bnVsbD09PWg/KGc9aD1tLGY9ZCk6aD1oLm5leHQ9bTtsPk4uZXhwaXJhdGlvblRpbWUmJlxuKE4uZXhwaXJhdGlvblRpbWU9bCxCZyhsKSl9ZWxzZSBudWxsIT09aCYmKGg9aC5uZXh0PXtleHBpcmF0aW9uVGltZToxMDczNzQxODIzLHN1c3BlbnNlQ29uZmlnOmsuc3VzcGVuc2VDb25maWcsYWN0aW9uOmsuYWN0aW9uLGVhZ2VyUmVkdWNlcjprLmVhZ2VyUmVkdWNlcixlYWdlclN0YXRlOmsuZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxBZyhsLGsuc3VzcGVuc2VDb25maWcpLGQ9ay5lYWdlclJlZHVjZXI9PT1hP2suZWFnZXJTdGF0ZTphKGQsay5hY3Rpb24pO2s9ay5uZXh0fXdoaWxlKG51bGwhPT1rJiZrIT09ZSk7bnVsbD09PWg/Zj1kOmgubmV4dD1nOyRlKGQsYi5tZW1vaXplZFN0YXRlKXx8KHJnPSEwKTtiLm1lbW9pemVkU3RhdGU9ZDtiLmJhc2VTdGF0ZT1mO2IuYmFzZVF1ZXVlPWg7Yy5sYXN0UmVuZGVyZWRTdGF0ZT1kfXJldHVybltiLm1lbW9pemVkU3RhdGUsYy5kaXNwYXRjaF19XG5mdW5jdGlvbiB4aChhKXt2YXIgYj11aCgpLGM9Yi5xdWV1ZTtpZihudWxsPT09Yyl0aHJvdyBFcnJvcih1KDMxMSkpO2MubGFzdFJlbmRlcmVkUmVkdWNlcj1hO3ZhciBkPWMuZGlzcGF0Y2gsZT1jLnBlbmRpbmcsZj1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWUpe2MucGVuZGluZz1udWxsO3ZhciBnPWU9ZS5uZXh0O2RvIGY9YShmLGcuYWN0aW9uKSxnPWcubmV4dDt3aGlsZShnIT09ZSk7JGUoZixiLm1lbW9pemVkU3RhdGUpfHwocmc9ITApO2IubWVtb2l6ZWRTdGF0ZT1mO251bGw9PT1iLmJhc2VRdWV1ZSYmKGIuYmFzZVN0YXRlPWYpO2MubGFzdFJlbmRlcmVkU3RhdGU9Zn1yZXR1cm5bZixkXX1cbmZ1bmN0aW9uIHloKGEpe3ZhciBiPXRoKCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGEmJihhPWEoKSk7Yi5tZW1vaXplZFN0YXRlPWIuYmFzZVN0YXRlPWE7YT1iLnF1ZXVlPXtwZW5kaW5nOm51bGwsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOnZoLGxhc3RSZW5kZXJlZFN0YXRlOmF9O2E9YS5kaXNwYXRjaD16aC5iaW5kKG51bGwsTixhKTtyZXR1cm5bYi5tZW1vaXplZFN0YXRlLGFdfWZ1bmN0aW9uIEFoKGEsYixjLGQpe2E9e3RhZzphLGNyZWF0ZTpiLGRlc3Ryb3k6YyxkZXBzOmQsbmV4dDpudWxsfTtiPU4udXBkYXRlUXVldWU7bnVsbD09PWI/KGI9e2xhc3RFZmZlY3Q6bnVsbH0sTi51cGRhdGVRdWV1ZT1iLGIubGFzdEVmZmVjdD1hLm5leHQ9YSk6KGM9Yi5sYXN0RWZmZWN0LG51bGw9PT1jP2IubGFzdEVmZmVjdD1hLm5leHQ9YTooZD1jLm5leHQsYy5uZXh0PWEsYS5uZXh0PWQsYi5sYXN0RWZmZWN0PWEpKTtyZXR1cm4gYX1cbmZ1bmN0aW9uIEJoKCl7cmV0dXJuIHVoKCkubWVtb2l6ZWRTdGF0ZX1mdW5jdGlvbiBDaChhLGIsYyxkKXt2YXIgZT10aCgpO04uZWZmZWN0VGFnfD1hO2UubWVtb2l6ZWRTdGF0ZT1BaCgxfGIsYyx2b2lkIDAsdm9pZCAwPT09ZD9udWxsOmQpfWZ1bmN0aW9uIERoKGEsYixjLGQpe3ZhciBlPXVoKCk7ZD12b2lkIDA9PT1kP251bGw6ZDt2YXIgZj12b2lkIDA7aWYobnVsbCE9PU8pe3ZhciBnPU8ubWVtb2l6ZWRTdGF0ZTtmPWcuZGVzdHJveTtpZihudWxsIT09ZCYmbmgoZCxnLmRlcHMpKXtBaChiLGMsZixkKTtyZXR1cm59fU4uZWZmZWN0VGFnfD1hO2UubWVtb2l6ZWRTdGF0ZT1BaCgxfGIsYyxmLGQpfWZ1bmN0aW9uIEVoKGEsYil7cmV0dXJuIENoKDUxNiw0LGEsYil9ZnVuY3Rpb24gRmgoYSxiKXtyZXR1cm4gRGgoNTE2LDQsYSxiKX1mdW5jdGlvbiBHaChhLGIpe3JldHVybiBEaCg0LDIsYSxiKX1cbmZ1bmN0aW9uIEhoKGEsYil7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGIpcmV0dXJuIGE9YSgpLGIoYSksZnVuY3Rpb24oKXtiKG51bGwpfTtpZihudWxsIT09YiYmdm9pZCAwIT09YilyZXR1cm4gYT1hKCksYi5jdXJyZW50PWEsZnVuY3Rpb24oKXtiLmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gSWgoYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBEaCg0LDIsSGguYmluZChudWxsLGIsYSksYyl9ZnVuY3Rpb24gSmgoKXt9ZnVuY3Rpb24gS2goYSxiKXt0aCgpLm1lbW9pemVkU3RhdGU9W2Esdm9pZCAwPT09Yj9udWxsOmJdO3JldHVybiBhfWZ1bmN0aW9uIExoKGEsYil7dmFyIGM9dWgoKTtiPXZvaWQgMD09PWI/bnVsbDpiO3ZhciBkPWMubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZCYmbnVsbCE9PWImJm5oKGIsZFsxXSkpcmV0dXJuIGRbMF07Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfVxuZnVuY3Rpb24gTWgoYSxiKXt2YXIgYz11aCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7dmFyIGQ9Yy5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1kJiZudWxsIT09YiYmbmgoYixkWzFdKSlyZXR1cm4gZFswXTthPWEoKTtjLm1lbW9pemVkU3RhdGU9W2EsYl07cmV0dXJuIGF9ZnVuY3Rpb24gTmgoYSxiLGMpe3ZhciBkPWFnKCk7Y2coOTg+ZD85ODpkLGZ1bmN0aW9uKCl7YSghMCl9KTtjZyg5NzxkPzk3OmQsZnVuY3Rpb24oKXt2YXIgZD1raC5zdXNwZW5zZTtraC5zdXNwZW5zZT12b2lkIDA9PT1iP251bGw6Yjt0cnl7YSghMSksYygpfWZpbmFsbHl7a2guc3VzcGVuc2U9ZH19KX1cbmZ1bmN0aW9uIHpoKGEsYixjKXt2YXIgZD1HZygpLGU9RGcuc3VzcGVuc2U7ZD1IZyhkLGEsZSk7ZT17ZXhwaXJhdGlvblRpbWU6ZCxzdXNwZW5zZUNvbmZpZzplLGFjdGlvbjpjLGVhZ2VyUmVkdWNlcjpudWxsLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O3ZhciBmPWIucGVuZGluZztudWxsPT09Zj9lLm5leHQ9ZTooZS5uZXh0PWYubmV4dCxmLm5leHQ9ZSk7Yi5wZW5kaW5nPWU7Zj1hLmFsdGVybmF0ZTtpZihhPT09Tnx8bnVsbCE9PWYmJmY9PT1OKW1oPSEwLGUuZXhwaXJhdGlvblRpbWU9bGgsTi5leHBpcmF0aW9uVGltZT1saDtlbHNle2lmKDA9PT1hLmV4cGlyYXRpb25UaW1lJiYobnVsbD09PWZ8fDA9PT1mLmV4cGlyYXRpb25UaW1lKSYmKGY9Yi5sYXN0UmVuZGVyZWRSZWR1Y2VyLG51bGwhPT1mKSl0cnl7dmFyIGc9Yi5sYXN0UmVuZGVyZWRTdGF0ZSxoPWYoZyxjKTtlLmVhZ2VyUmVkdWNlcj1mO2UuZWFnZXJTdGF0ZT1oO2lmKCRlKGgsZykpcmV0dXJufWNhdGNoKGspe31maW5hbGx5e31JZyhhLFxuZCl9fVxudmFyIHNoPXtyZWFkQ29udGV4dDpzZyx1c2VDYWxsYmFjazpRLHVzZUNvbnRleHQ6USx1c2VFZmZlY3Q6USx1c2VJbXBlcmF0aXZlSGFuZGxlOlEsdXNlTGF5b3V0RWZmZWN0OlEsdXNlTWVtbzpRLHVzZVJlZHVjZXI6USx1c2VSZWY6USx1c2VTdGF0ZTpRLHVzZURlYnVnVmFsdWU6USx1c2VSZXNwb25kZXI6USx1c2VEZWZlcnJlZFZhbHVlOlEsdXNlVHJhbnNpdGlvbjpRfSxwaD17cmVhZENvbnRleHQ6c2csdXNlQ2FsbGJhY2s6S2gsdXNlQ29udGV4dDpzZyx1c2VFZmZlY3Q6RWgsdXNlSW1wZXJhdGl2ZUhhbmRsZTpmdW5jdGlvbihhLGIsYyl7Yz1udWxsIT09YyYmdm9pZCAwIT09Yz9jLmNvbmNhdChbYV0pOm51bGw7cmV0dXJuIENoKDQsMixIaC5iaW5kKG51bGwsYixhKSxjKX0sdXNlTGF5b3V0RWZmZWN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIENoKDQsMixhLGIpfSx1c2VNZW1vOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGgoKTtiPXZvaWQgMD09PWI/bnVsbDpiO2E9YSgpO2MubWVtb2l6ZWRTdGF0ZT1bYSxcbmJdO3JldHVybiBhfSx1c2VSZWR1Y2VyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aCgpO2I9dm9pZCAwIT09Yz9jKGIpOmI7ZC5tZW1vaXplZFN0YXRlPWQuYmFzZVN0YXRlPWI7YT1kLnF1ZXVlPXtwZW5kaW5nOm51bGwsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOmEsbGFzdFJlbmRlcmVkU3RhdGU6Yn07YT1hLmRpc3BhdGNoPXpoLmJpbmQobnVsbCxOLGEpO3JldHVybltkLm1lbW9pemVkU3RhdGUsYV19LHVzZVJlZjpmdW5jdGlvbihhKXt2YXIgYj10aCgpO2E9e2N1cnJlbnQ6YX07cmV0dXJuIGIubWVtb2l6ZWRTdGF0ZT1hfSx1c2VTdGF0ZTp5aCx1c2VEZWJ1Z1ZhbHVlOkpoLHVzZVJlc3BvbmRlcjppaCx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9eWgoYSksZD1jWzBdLGU9Y1sxXTtFaChmdW5jdGlvbigpe3ZhciBjPWtoLnN1c3BlbnNlO2toLnN1c3BlbnNlPXZvaWQgMD09PWI/bnVsbDpiO3RyeXtlKGEpfWZpbmFsbHl7a2guc3VzcGVuc2U9XG5jfX0sW2EsYl0pO3JldHVybiBkfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKGEpe3ZhciBiPXloKCExKSxjPWJbMF07Yj1iWzFdO3JldHVybltLaChOaC5iaW5kKG51bGwsYixhKSxbYixhXSksY119fSxxaD17cmVhZENvbnRleHQ6c2csdXNlQ2FsbGJhY2s6TGgsdXNlQ29udGV4dDpzZyx1c2VFZmZlY3Q6RmgsdXNlSW1wZXJhdGl2ZUhhbmRsZTpJaCx1c2VMYXlvdXRFZmZlY3Q6R2gsdXNlTWVtbzpNaCx1c2VSZWR1Y2VyOndoLHVzZVJlZjpCaCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiB3aCh2aCl9LHVzZURlYnVnVmFsdWU6SmgsdXNlUmVzcG9uZGVyOmloLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz13aCh2aCksZD1jWzBdLGU9Y1sxXTtGaChmdW5jdGlvbigpe3ZhciBjPWtoLnN1c3BlbnNlO2toLnN1c3BlbnNlPXZvaWQgMD09PWI/bnVsbDpiO3RyeXtlKGEpfWZpbmFsbHl7a2guc3VzcGVuc2U9Y319LFthLGJdKTtyZXR1cm4gZH0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbihhKXt2YXIgYj1cbndoKHZoKSxjPWJbMF07Yj1iWzFdO3JldHVybltMaChOaC5iaW5kKG51bGwsYixhKSxbYixhXSksY119fSxyaD17cmVhZENvbnRleHQ6c2csdXNlQ2FsbGJhY2s6TGgsdXNlQ29udGV4dDpzZyx1c2VFZmZlY3Q6RmgsdXNlSW1wZXJhdGl2ZUhhbmRsZTpJaCx1c2VMYXlvdXRFZmZlY3Q6R2gsdXNlTWVtbzpNaCx1c2VSZWR1Y2VyOnhoLHVzZVJlZjpCaCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiB4aCh2aCl9LHVzZURlYnVnVmFsdWU6SmgsdXNlUmVzcG9uZGVyOmloLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz14aCh2aCksZD1jWzBdLGU9Y1sxXTtGaChmdW5jdGlvbigpe3ZhciBjPWtoLnN1c3BlbnNlO2toLnN1c3BlbnNlPXZvaWQgMD09PWI/bnVsbDpiO3RyeXtlKGEpfWZpbmFsbHl7a2guc3VzcGVuc2U9Y319LFthLGJdKTtyZXR1cm4gZH0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbihhKXt2YXIgYj14aCh2aCksYz1iWzBdO2I9YlsxXTtyZXR1cm5bTGgoTmguYmluZChudWxsLFxuYixhKSxbYixhXSksY119fSxPaD1udWxsLFBoPW51bGwsUWg9ITE7ZnVuY3Rpb24gUmgoYSxiKXt2YXIgYz1TaCg1LG51bGwsbnVsbCwwKTtjLmVsZW1lbnRUeXBlPVwiREVMRVRFRFwiO2MudHlwZT1cIkRFTEVURURcIjtjLnN0YXRlTm9kZT1iO2MucmV0dXJuPWE7Yy5lZmZlY3RUYWc9ODtudWxsIT09YS5sYXN0RWZmZWN0PyhhLmxhc3RFZmZlY3QubmV4dEVmZmVjdD1jLGEubGFzdEVmZmVjdD1jKTphLmZpcnN0RWZmZWN0PWEubGFzdEVmZmVjdD1jfVxuZnVuY3Rpb24gVGgoYSxiKXtzd2l0Y2goYS50YWcpe2Nhc2UgNTp2YXIgYz1hLnR5cGU7Yj0xIT09Yi5ub2RlVHlwZXx8Yy50b0xvd2VyQ2FzZSgpIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6YjtyZXR1cm4gbnVsbCE9PWI/KGEuc3RhdGVOb2RlPWIsITApOiExO2Nhc2UgNjpyZXR1cm4gYj1cIlwiPT09YS5wZW5kaW5nUHJvcHN8fDMhPT1iLm5vZGVUeXBlP251bGw6YixudWxsIT09Yj8oYS5zdGF0ZU5vZGU9YiwhMCk6ITE7Y2FzZSAxMzpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIFVoKGEpe2lmKFFoKXt2YXIgYj1QaDtpZihiKXt2YXIgYz1iO2lmKCFUaChhLGIpKXtiPUpkKGMubmV4dFNpYmxpbmcpO2lmKCFifHwhVGgoYSxiKSl7YS5lZmZlY3RUYWc9YS5lZmZlY3RUYWcmLTEwMjV8MjtRaD0hMTtPaD1hO3JldHVybn1SaChPaCxjKX1PaD1hO1BoPUpkKGIuZmlyc3RDaGlsZCl9ZWxzZSBhLmVmZmVjdFRhZz1hLmVmZmVjdFRhZyYtMTAyNXwyLFFoPSExLE9oPWF9fWZ1bmN0aW9uIFZoKGEpe2ZvcihhPWEucmV0dXJuO251bGwhPT1hJiY1IT09YS50YWcmJjMhPT1hLnRhZyYmMTMhPT1hLnRhZzspYT1hLnJldHVybjtPaD1hfVxuZnVuY3Rpb24gV2goYSl7aWYoYSE9PU9oKXJldHVybiExO2lmKCFRaClyZXR1cm4gVmgoYSksUWg9ITAsITE7dmFyIGI9YS50eXBlO2lmKDUhPT1hLnRhZ3x8XCJoZWFkXCIhPT1iJiZcImJvZHlcIiE9PWImJiFHZChiLGEubWVtb2l6ZWRQcm9wcykpZm9yKGI9UGg7YjspUmgoYSxiKSxiPUpkKGIubmV4dFNpYmxpbmcpO1ZoKGEpO2lmKDEzPT09YS50YWcpe2E9YS5tZW1vaXplZFN0YXRlO2E9bnVsbCE9PWE/YS5kZWh5ZHJhdGVkOm51bGw7aWYoIWEpdGhyb3cgRXJyb3IodSgzMTcpKTthOnthPWEubmV4dFNpYmxpbmc7Zm9yKGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihjPT09QWQpe2lmKDA9PT1iKXtQaD1KZChhLm5leHRTaWJsaW5nKTticmVhayBhfWItLX1lbHNlIGMhPT16ZCYmYyE9PUNkJiZjIT09QmR8fGIrK31hPWEubmV4dFNpYmxpbmd9UGg9bnVsbH19ZWxzZSBQaD1PaD9KZChhLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1cbmZ1bmN0aW9uIFhoKCl7UGg9T2g9bnVsbDtRaD0hMX12YXIgWWg9V2EuUmVhY3RDdXJyZW50T3duZXIscmc9ITE7ZnVuY3Rpb24gUihhLGIsYyxkKXtiLmNoaWxkPW51bGw9PT1hP1lnKGIsbnVsbCxjLGQpOlhnKGIsYS5jaGlsZCxjLGQpfWZ1bmN0aW9uIFpoKGEsYixjLGQsZSl7Yz1jLnJlbmRlcjt2YXIgZj1iLnJlZjtxZyhiLGUpO2Q9b2goYSxiLGMsZCxmLGUpO2lmKG51bGwhPT1hJiYhcmcpcmV0dXJuIGIudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZSxiLmVmZmVjdFRhZyY9LTUxNyxhLmV4cGlyYXRpb25UaW1lPD1lJiYoYS5leHBpcmF0aW9uVGltZT0wKSwkaChhLGIsZSk7Yi5lZmZlY3RUYWd8PTE7UihhLGIsZCxlKTtyZXR1cm4gYi5jaGlsZH1cbmZ1bmN0aW9uIGFpKGEsYixjLGQsZSxmKXtpZihudWxsPT09YSl7dmFyIGc9Yy50eXBlO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnJiYhYmkoZykmJnZvaWQgMD09PWcuZGVmYXVsdFByb3BzJiZudWxsPT09Yy5jb21wYXJlJiZ2b2lkIDA9PT1jLmRlZmF1bHRQcm9wcylyZXR1cm4gYi50YWc9MTUsYi50eXBlPWcsY2koYSxiLGcsZCxlLGYpO2E9VWcoYy50eXBlLG51bGwsZCxudWxsLGIubW9kZSxmKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9Zz1hLmNoaWxkO2lmKGU8ZiYmKGU9Zy5tZW1vaXplZFByb3BzLGM9Yy5jb21wYXJlLGM9bnVsbCE9PWM/YzpiZixjKGUsZCkmJmEucmVmPT09Yi5yZWYpKXJldHVybiAkaChhLGIsZik7Yi5lZmZlY3RUYWd8PTE7YT1TZyhnLGQpO2EucmVmPWIucmVmO2EucmV0dXJuPWI7cmV0dXJuIGIuY2hpbGQ9YX1cbmZ1bmN0aW9uIGNpKGEsYixjLGQsZSxmKXtyZXR1cm4gbnVsbCE9PWEmJmJmKGEubWVtb2l6ZWRQcm9wcyxkKSYmYS5yZWY9PT1iLnJlZiYmKHJnPSExLGU8Zik/KGIuZXhwaXJhdGlvblRpbWU9YS5leHBpcmF0aW9uVGltZSwkaChhLGIsZikpOmRpKGEsYixjLGQsZil9ZnVuY3Rpb24gZWkoYSxiKXt2YXIgYz1iLnJlZjtpZihudWxsPT09YSYmbnVsbCE9PWN8fG51bGwhPT1hJiZhLnJlZiE9PWMpYi5lZmZlY3RUYWd8PTEyOH1mdW5jdGlvbiBkaShhLGIsYyxkLGUpe3ZhciBmPUwoYyk/QmY6Si5jdXJyZW50O2Y9Q2YoYixmKTtxZyhiLGUpO2M9b2goYSxiLGMsZCxmLGUpO2lmKG51bGwhPT1hJiYhcmcpcmV0dXJuIGIudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZSxiLmVmZmVjdFRhZyY9LTUxNyxhLmV4cGlyYXRpb25UaW1lPD1lJiYoYS5leHBpcmF0aW9uVGltZT0wKSwkaChhLGIsZSk7Yi5lZmZlY3RUYWd8PTE7UihhLGIsYyxlKTtyZXR1cm4gYi5jaGlsZH1cbmZ1bmN0aW9uIGZpKGEsYixjLGQsZSl7aWYoTChjKSl7dmFyIGY9ITA7R2YoYil9ZWxzZSBmPSExO3FnKGIsZSk7aWYobnVsbD09PWIuc3RhdGVOb2RlKW51bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZWZmZWN0VGFnfD0yKSxMZyhiLGMsZCksTmcoYixjLGQsZSksZD0hMDtlbHNlIGlmKG51bGw9PT1hKXt2YXIgZz1iLnN0YXRlTm9kZSxoPWIubWVtb2l6ZWRQcm9wcztnLnByb3BzPWg7dmFyIGs9Zy5jb250ZXh0LGw9Yy5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGwmJm51bGwhPT1sP2w9c2cobCk6KGw9TChjKT9CZjpKLmN1cnJlbnQsbD1DZihiLGwpKTt2YXIgbT1jLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyxwPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBtfHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtwfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmXG5cImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzfHwoaCE9PWR8fGshPT1sKSYmTWcoYixnLGQsbCk7dGc9ITE7dmFyIHg9Yi5tZW1vaXplZFN0YXRlO2cuc3RhdGU9eDt6ZyhiLGQsZyxlKTtrPWIubWVtb2l6ZWRTdGF0ZTtoIT09ZHx8eCE9PWt8fEsuY3VycmVudHx8dGc/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBtJiYoRmcoYixjLG0sZCksaz1iLm1lbW9pemVkU3RhdGUpLChoPXRnfHxLZyhiLGMsaCxkLHgsayxsKSk/KHB8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudHx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudCYmZy5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksXCJmdW5jdGlvblwiPT09XG50eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZWZmZWN0VGFnfD00KSk6KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZE1vdW50JiYoYi5lZmZlY3RUYWd8PTQpLGIubWVtb2l6ZWRQcm9wcz1kLGIubWVtb2l6ZWRTdGF0ZT1rKSxnLnByb3BzPWQsZy5zdGF0ZT1rLGcuY29udGV4dD1sLGQ9aCk6KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZE1vdW50JiYoYi5lZmZlY3RUYWd8PTQpLGQ9ITEpfWVsc2UgZz1iLnN0YXRlTm9kZSx2ZyhhLGIpLGg9Yi5tZW1vaXplZFByb3BzLGcucHJvcHM9Yi50eXBlPT09Yi5lbGVtZW50VHlwZT9oOmlnKGIudHlwZSxoKSxrPWcuY29udGV4dCxsPWMuY29udGV4dFR5cGUsXCJvYmplY3RcIj09PXR5cGVvZiBsJiZudWxsIT09bD9sPXNnKGwpOihsPUwoYyk/QmY6Si5jdXJyZW50LGw9Q2YoYixsKSksbT1jLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywocD1cImZ1bmN0aW9uXCI9PT10eXBlb2YgbXx8XCJmdW5jdGlvblwiPT09XG50eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSl8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzfHwoaCE9PWR8fGshPT1sKSYmTWcoYixnLGQsbCksdGc9ITEsaz1iLm1lbW9pemVkU3RhdGUsZy5zdGF0ZT1rLHpnKGIsZCxnLGUpLHg9Yi5tZW1vaXplZFN0YXRlLGghPT1kfHxrIT09eHx8Sy5jdXJyZW50fHx0Zz8oXCJmdW5jdGlvblwiPT09dHlwZW9mIG0mJihGZyhiLGMsbSxkKSx4PWIubWVtb2l6ZWRTdGF0ZSksKG09dGd8fEtnKGIsYyxoLGQsayx4LGwpKT8ocHx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGV8fChcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnRXaWxsVXBkYXRlJiZnLmNvbXBvbmVudFdpbGxVcGRhdGUoZCxcbngsbCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJmcuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUoZCx4LGwpKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGUmJihiLmVmZmVjdFRhZ3w9NCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUmJihiLmVmZmVjdFRhZ3w9MjU2KSk6KFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmaz09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZWZmZWN0VGFnfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmaz09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZWZmZWN0VGFnfD0yNTYpLGIubWVtb2l6ZWRQcm9wcz1kLGIubWVtb2l6ZWRTdGF0ZT14KSxnLnByb3BzPWQsZy5zdGF0ZT14LGcuY29udGV4dD1sLGQ9bSk6XG4oXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlfHxoPT09YS5tZW1vaXplZFByb3BzJiZrPT09YS5tZW1vaXplZFN0YXRlfHwoYi5lZmZlY3RUYWd8PTQpLFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxoPT09YS5tZW1vaXplZFByb3BzJiZrPT09YS5tZW1vaXplZFN0YXRlfHwoYi5lZmZlY3RUYWd8PTI1NiksZD0hMSk7cmV0dXJuIGdpKGEsYixjLGQsZixlKX1cbmZ1bmN0aW9uIGdpKGEsYixjLGQsZSxmKXtlaShhLGIpO3ZhciBnPTAhPT0oYi5lZmZlY3RUYWcmNjQpO2lmKCFkJiYhZylyZXR1cm4gZSYmSGYoYixjLCExKSwkaChhLGIsZik7ZD1iLnN0YXRlTm9kZTtZaC5jdXJyZW50PWI7dmFyIGg9ZyYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGMuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yP251bGw6ZC5yZW5kZXIoKTtiLmVmZmVjdFRhZ3w9MTtudWxsIT09YSYmZz8oYi5jaGlsZD1YZyhiLGEuY2hpbGQsbnVsbCxmKSxiLmNoaWxkPVhnKGIsbnVsbCxoLGYpKTpSKGEsYixoLGYpO2IubWVtb2l6ZWRTdGF0ZT1kLnN0YXRlO2UmJkhmKGIsYywhMCk7cmV0dXJuIGIuY2hpbGR9ZnVuY3Rpb24gaGkoYSl7dmFyIGI9YS5zdGF0ZU5vZGU7Yi5wZW5kaW5nQ29udGV4dD9FZihhLGIucGVuZGluZ0NvbnRleHQsYi5wZW5kaW5nQ29udGV4dCE9PWIuY29udGV4dCk6Yi5jb250ZXh0JiZFZihhLGIuY29udGV4dCwhMSk7ZGgoYSxiLmNvbnRhaW5lckluZm8pfVxudmFyIGlpPXtkZWh5ZHJhdGVkOm51bGwscmV0cnlUaW1lOjB9O1xuZnVuY3Rpb24gamkoYSxiLGMpe3ZhciBkPWIubW9kZSxlPWIucGVuZGluZ1Byb3BzLGY9TS5jdXJyZW50LGc9ITEsaDsoaD0wIT09KGIuZWZmZWN0VGFnJjY0KSl8fChoPTAhPT0oZiYyKSYmKG51bGw9PT1hfHxudWxsIT09YS5tZW1vaXplZFN0YXRlKSk7aD8oZz0hMCxiLmVmZmVjdFRhZyY9LTY1KTpudWxsIT09YSYmbnVsbD09PWEubWVtb2l6ZWRTdGF0ZXx8dm9pZCAwPT09ZS5mYWxsYmFja3x8ITA9PT1lLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrfHwoZnw9MSk7SShNLGYmMSk7aWYobnVsbD09PWEpe3ZvaWQgMCE9PWUuZmFsbGJhY2smJlVoKGIpO2lmKGcpe2c9ZS5mYWxsYmFjaztlPVdnKG51bGwsZCwwLG51bGwpO2UucmV0dXJuPWI7aWYoMD09PShiLm1vZGUmMikpZm9yKGE9bnVsbCE9PWIubWVtb2l6ZWRTdGF0ZT9iLmNoaWxkLmNoaWxkOmIuY2hpbGQsZS5jaGlsZD1hO251bGwhPT1hOylhLnJldHVybj1lLGE9YS5zaWJsaW5nO2M9V2coZyxkLGMsbnVsbCk7Yy5yZXR1cm49XG5iO2Uuc2libGluZz1jO2IubWVtb2l6ZWRTdGF0ZT1paTtiLmNoaWxkPWU7cmV0dXJuIGN9ZD1lLmNoaWxkcmVuO2IubWVtb2l6ZWRTdGF0ZT1udWxsO3JldHVybiBiLmNoaWxkPVlnKGIsbnVsbCxkLGMpfWlmKG51bGwhPT1hLm1lbW9pemVkU3RhdGUpe2E9YS5jaGlsZDtkPWEuc2libGluZztpZihnKXtlPWUuZmFsbGJhY2s7Yz1TZyhhLGEucGVuZGluZ1Byb3BzKTtjLnJldHVybj1iO2lmKDA9PT0oYi5tb2RlJjIpJiYoZz1udWxsIT09Yi5tZW1vaXplZFN0YXRlP2IuY2hpbGQuY2hpbGQ6Yi5jaGlsZCxnIT09YS5jaGlsZCkpZm9yKGMuY2hpbGQ9ZztudWxsIT09ZzspZy5yZXR1cm49YyxnPWcuc2libGluZztkPVNnKGQsZSk7ZC5yZXR1cm49YjtjLnNpYmxpbmc9ZDtjLmNoaWxkRXhwaXJhdGlvblRpbWU9MDtiLm1lbW9pemVkU3RhdGU9aWk7Yi5jaGlsZD1jO3JldHVybiBkfWM9WGcoYixhLmNoaWxkLGUuY2hpbGRyZW4sYyk7Yi5tZW1vaXplZFN0YXRlPW51bGw7cmV0dXJuIGIuY2hpbGQ9XG5jfWE9YS5jaGlsZDtpZihnKXtnPWUuZmFsbGJhY2s7ZT1XZyhudWxsLGQsMCxudWxsKTtlLnJldHVybj1iO2UuY2hpbGQ9YTtudWxsIT09YSYmKGEucmV0dXJuPWUpO2lmKDA9PT0oYi5tb2RlJjIpKWZvcihhPW51bGwhPT1iLm1lbW9pemVkU3RhdGU/Yi5jaGlsZC5jaGlsZDpiLmNoaWxkLGUuY2hpbGQ9YTtudWxsIT09YTspYS5yZXR1cm49ZSxhPWEuc2libGluZztjPVdnKGcsZCxjLG51bGwpO2MucmV0dXJuPWI7ZS5zaWJsaW5nPWM7Yy5lZmZlY3RUYWd8PTI7ZS5jaGlsZEV4cGlyYXRpb25UaW1lPTA7Yi5tZW1vaXplZFN0YXRlPWlpO2IuY2hpbGQ9ZTtyZXR1cm4gY31iLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gYi5jaGlsZD1YZyhiLGEsZS5jaGlsZHJlbixjKX1cbmZ1bmN0aW9uIGtpKGEsYil7YS5leHBpcmF0aW9uVGltZTxiJiYoYS5leHBpcmF0aW9uVGltZT1iKTt2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09YyYmYy5leHBpcmF0aW9uVGltZTxiJiYoYy5leHBpcmF0aW9uVGltZT1iKTtwZyhhLnJldHVybixiKX1mdW5jdGlvbiBsaShhLGIsYyxkLGUsZil7dmFyIGc9YS5tZW1vaXplZFN0YXRlO251bGw9PT1nP2EubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6YixyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OmQsdGFpbDpjLHRhaWxFeHBpcmF0aW9uOjAsdGFpbE1vZGU6ZSxsYXN0RWZmZWN0OmZ9OihnLmlzQmFja3dhcmRzPWIsZy5yZW5kZXJpbmc9bnVsbCxnLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGcubGFzdD1kLGcudGFpbD1jLGcudGFpbEV4cGlyYXRpb249MCxnLnRhaWxNb2RlPWUsZy5sYXN0RWZmZWN0PWYpfVxuZnVuY3Rpb24gbWkoYSxiLGMpe3ZhciBkPWIucGVuZGluZ1Byb3BzLGU9ZC5yZXZlYWxPcmRlcixmPWQudGFpbDtSKGEsYixkLmNoaWxkcmVuLGMpO2Q9TS5jdXJyZW50O2lmKDAhPT0oZCYyKSlkPWQmMXwyLGIuZWZmZWN0VGFnfD02NDtlbHNle2lmKG51bGwhPT1hJiYwIT09KGEuZWZmZWN0VGFnJjY0KSlhOmZvcihhPWIuY2hpbGQ7bnVsbCE9PWE7KXtpZigxMz09PWEudGFnKW51bGwhPT1hLm1lbW9pemVkU3RhdGUmJmtpKGEsYyk7ZWxzZSBpZigxOT09PWEudGFnKWtpKGEsYyk7ZWxzZSBpZihudWxsIT09YS5jaGlsZCl7YS5jaGlsZC5yZXR1cm49YTthPWEuY2hpbGQ7Y29udGludWV9aWYoYT09PWIpYnJlYWsgYTtmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fGEucmV0dXJuPT09YilicmVhayBhO2E9YS5yZXR1cm59YS5zaWJsaW5nLnJldHVybj1hLnJldHVybjthPWEuc2libGluZ31kJj0xfUkoTSxkKTtpZigwPT09KGIubW9kZSYyKSliLm1lbW9pemVkU3RhdGU9XG5udWxsO2Vsc2Ugc3dpdGNoKGUpe2Nhc2UgXCJmb3J3YXJkc1wiOmM9Yi5jaGlsZDtmb3IoZT1udWxsO251bGwhPT1jOylhPWMuYWx0ZXJuYXRlLG51bGwhPT1hJiZudWxsPT09aGgoYSkmJihlPWMpLGM9Yy5zaWJsaW5nO2M9ZTtudWxsPT09Yz8oZT1iLmNoaWxkLGIuY2hpbGQ9bnVsbCk6KGU9Yy5zaWJsaW5nLGMuc2libGluZz1udWxsKTtsaShiLCExLGUsYyxmLGIubGFzdEVmZmVjdCk7YnJlYWs7Y2FzZSBcImJhY2t3YXJkc1wiOmM9bnVsbDtlPWIuY2hpbGQ7Zm9yKGIuY2hpbGQ9bnVsbDtudWxsIT09ZTspe2E9ZS5hbHRlcm5hdGU7aWYobnVsbCE9PWEmJm51bGw9PT1oaChhKSl7Yi5jaGlsZD1lO2JyZWFrfWE9ZS5zaWJsaW5nO2Uuc2libGluZz1jO2M9ZTtlPWF9bGkoYiwhMCxjLG51bGwsZixiLmxhc3RFZmZlY3QpO2JyZWFrO2Nhc2UgXCJ0b2dldGhlclwiOmxpKGIsITEsbnVsbCxudWxsLHZvaWQgMCxiLmxhc3RFZmZlY3QpO2JyZWFrO2RlZmF1bHQ6Yi5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiAkaChhLGIsYyl7bnVsbCE9PWEmJihiLmRlcGVuZGVuY2llcz1hLmRlcGVuZGVuY2llcyk7dmFyIGQ9Yi5leHBpcmF0aW9uVGltZTswIT09ZCYmQmcoZCk7aWYoYi5jaGlsZEV4cGlyYXRpb25UaW1lPGMpcmV0dXJuIG51bGw7aWYobnVsbCE9PWEmJmIuY2hpbGQhPT1hLmNoaWxkKXRocm93IEVycm9yKHUoMTUzKSk7aWYobnVsbCE9PWIuY2hpbGQpe2E9Yi5jaGlsZDtjPVNnKGEsYS5wZW5kaW5nUHJvcHMpO2IuY2hpbGQ9Yztmb3IoYy5yZXR1cm49YjtudWxsIT09YS5zaWJsaW5nOylhPWEuc2libGluZyxjPWMuc2libGluZz1TZyhhLGEucGVuZGluZ1Byb3BzKSxjLnJldHVybj1iO2Muc2libGluZz1udWxsfXJldHVybiBiLmNoaWxkfXZhciBuaSxvaSxwaSxxaTtcbm5pPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWIuY2hpbGQ7bnVsbCE9PWM7KXtpZig1PT09Yy50YWd8fDY9PT1jLnRhZylhLmFwcGVuZENoaWxkKGMuc3RhdGVOb2RlKTtlbHNlIGlmKDQhPT1jLnRhZyYmbnVsbCE9PWMuY2hpbGQpe2MuY2hpbGQucmV0dXJuPWM7Yz1jLmNoaWxkO2NvbnRpbnVlfWlmKGM9PT1iKWJyZWFrO2Zvcig7bnVsbD09PWMuc2libGluZzspe2lmKG51bGw9PT1jLnJldHVybnx8Yy5yZXR1cm49PT1iKXJldHVybjtjPWMucmV0dXJufWMuc2libGluZy5yZXR1cm49Yy5yZXR1cm47Yz1jLnNpYmxpbmd9fTtvaT1mdW5jdGlvbigpe307XG5waT1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWEubWVtb2l6ZWRQcm9wcztpZihmIT09ZCl7dmFyIGc9Yi5zdGF0ZU5vZGU7Y2goJGcuY3VycmVudCk7YT1udWxsO3N3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjpmPXpiKGcsZik7ZD16YihnLGQpO2E9W107YnJlYWs7Y2FzZSBcIm9wdGlvblwiOmY9R2IoZyxmKTtkPUdiKGcsZCk7YT1bXTticmVhaztjYXNlIFwic2VsZWN0XCI6Zj1uKHt9LGYse3ZhbHVlOnZvaWQgMH0pO2Q9bih7fSxkLHt2YWx1ZTp2b2lkIDB9KTthPVtdO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmY9SWIoZyxmKTtkPUliKGcsZCk7YT1bXTticmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBmLm9uQ2xpY2smJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLm9uQ2xpY2smJihnLm9uY2xpY2s9c2QpfW9kKGMsZCk7dmFyIGgsaztjPW51bGw7Zm9yKGggaW4gZilpZighZC5oYXNPd25Qcm9wZXJ0eShoKSYmZi5oYXNPd25Qcm9wZXJ0eShoKSYmbnVsbCE9ZltoXSlpZihcInN0eWxlXCI9PT1cbmgpZm9yKGsgaW4gZz1mW2hdLGcpZy5oYXNPd25Qcm9wZXJ0eShrKSYmKGN8fChjPXt9KSxjW2tdPVwiXCIpO2Vsc2VcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIhPT1oJiZcImNoaWxkcmVuXCIhPT1oJiZcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09aCYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWgmJlwiYXV0b0ZvY3VzXCIhPT1oJiYodmEuaGFzT3duUHJvcGVydHkoaCk/YXx8KGE9W10pOihhPWF8fFtdKS5wdXNoKGgsbnVsbCkpO2ZvcihoIGluIGQpe3ZhciBsPWRbaF07Zz1udWxsIT1mP2ZbaF06dm9pZCAwO2lmKGQuaGFzT3duUHJvcGVydHkoaCkmJmwhPT1nJiYobnVsbCE9bHx8bnVsbCE9ZykpaWYoXCJzdHlsZVwiPT09aClpZihnKXtmb3IoayBpbiBnKSFnLmhhc093blByb3BlcnR5KGspfHxsJiZsLmhhc093blByb3BlcnR5KGspfHwoY3x8KGM9e30pLGNba109XCJcIik7Zm9yKGsgaW4gbClsLmhhc093blByb3BlcnR5KGspJiZnW2tdIT09bFtrXSYmKGN8fChjPXt9KSxcbmNba109bFtrXSl9ZWxzZSBjfHwoYXx8KGE9W10pLGEucHVzaChoLGMpKSxjPWw7ZWxzZVwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWg/KGw9bD9sLl9faHRtbDp2b2lkIDAsZz1nP2cuX19odG1sOnZvaWQgMCxudWxsIT1sJiZnIT09bCYmKGE9YXx8W10pLnB1c2goaCxsKSk6XCJjaGlsZHJlblwiPT09aD9nPT09bHx8XCJzdHJpbmdcIiE9PXR5cGVvZiBsJiZcIm51bWJlclwiIT09dHlwZW9mIGx8fChhPWF8fFtdKS5wdXNoKGgsXCJcIitsKTpcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09aCYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWgmJih2YS5oYXNPd25Qcm9wZXJ0eShoKT8obnVsbCE9bCYmcmQoZSxoKSxhfHxnPT09bHx8KGE9W10pKTooYT1hfHxbXSkucHVzaChoLGwpKX1jJiYoYT1hfHxbXSkucHVzaChcInN0eWxlXCIsYyk7ZT1hO2lmKGIudXBkYXRlUXVldWU9ZSliLmVmZmVjdFRhZ3w9NH19O1xucWk9ZnVuY3Rpb24oYSxiLGMsZCl7YyE9PWQmJihiLmVmZmVjdFRhZ3w9NCl9O2Z1bmN0aW9uIHJpKGEsYil7c3dpdGNoKGEudGFpbE1vZGUpe2Nhc2UgXCJoaWRkZW5cIjpiPWEudGFpbDtmb3IodmFyIGM9bnVsbDtudWxsIT09YjspbnVsbCE9PWIuYWx0ZXJuYXRlJiYoYz1iKSxiPWIuc2libGluZztudWxsPT09Yz9hLnRhaWw9bnVsbDpjLnNpYmxpbmc9bnVsbDticmVhaztjYXNlIFwiY29sbGFwc2VkXCI6Yz1hLnRhaWw7Zm9yKHZhciBkPW51bGw7bnVsbCE9PWM7KW51bGwhPT1jLmFsdGVybmF0ZSYmKGQ9YyksYz1jLnNpYmxpbmc7bnVsbD09PWQ/Ynx8bnVsbD09PWEudGFpbD9hLnRhaWw9bnVsbDphLnRhaWwuc2libGluZz1udWxsOmQuc2libGluZz1udWxsfX1cbmZ1bmN0aW9uIHNpKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcztzd2l0Y2goYi50YWcpe2Nhc2UgMjpjYXNlIDE2OmNhc2UgMTU6Y2FzZSAwOmNhc2UgMTE6Y2FzZSA3OmNhc2UgODpjYXNlIDEyOmNhc2UgOTpjYXNlIDE0OnJldHVybiBudWxsO2Nhc2UgMTpyZXR1cm4gTChiLnR5cGUpJiZEZigpLG51bGw7Y2FzZSAzOnJldHVybiBlaCgpLEgoSyksSChKKSxjPWIuc3RhdGVOb2RlLGMucGVuZGluZ0NvbnRleHQmJihjLmNvbnRleHQ9Yy5wZW5kaW5nQ29udGV4dCxjLnBlbmRpbmdDb250ZXh0PW51bGwpLG51bGwhPT1hJiZudWxsIT09YS5jaGlsZHx8IVdoKGIpfHwoYi5lZmZlY3RUYWd8PTQpLG9pKGIpLG51bGw7Y2FzZSA1OmdoKGIpO2M9Y2goYmguY3VycmVudCk7dmFyIGU9Yi50eXBlO2lmKG51bGwhPT1hJiZudWxsIT1iLnN0YXRlTm9kZSlwaShhLGIsZSxkLGMpLGEucmVmIT09Yi5yZWYmJihiLmVmZmVjdFRhZ3w9MTI4KTtlbHNle2lmKCFkKXtpZihudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IodSgxNjYpKTtcbnJldHVybiBudWxsfWE9Y2goJGcuY3VycmVudCk7aWYoV2goYikpe2Q9Yi5zdGF0ZU5vZGU7ZT1iLnR5cGU7dmFyIGY9Yi5tZW1vaXplZFByb3BzO2RbTWRdPWI7ZFtOZF09Zjtzd2l0Y2goZSl7Y2FzZSBcImlmcmFtZVwiOmNhc2UgXCJvYmplY3RcIjpjYXNlIFwiZW1iZWRcIjpGKFwibG9hZFwiLGQpO2JyZWFrO2Nhc2UgXCJ2aWRlb1wiOmNhc2UgXCJhdWRpb1wiOmZvcihhPTA7YTxhYy5sZW5ndGg7YSsrKUYoYWNbYV0sZCk7YnJlYWs7Y2FzZSBcInNvdXJjZVwiOkYoXCJlcnJvclwiLGQpO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkYoXCJlcnJvclwiLGQpO0YoXCJsb2FkXCIsZCk7YnJlYWs7Y2FzZSBcImZvcm1cIjpGKFwicmVzZXRcIixkKTtGKFwic3VibWl0XCIsZCk7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpGKFwidG9nZ2xlXCIsZCk7YnJlYWs7Y2FzZSBcImlucHV0XCI6QWIoZCxmKTtGKFwiaW52YWxpZFwiLGQpO3JkKGMsXCJvbkNoYW5nZVwiKTticmVhaztjYXNlIFwic2VsZWN0XCI6ZC5fd3JhcHBlclN0YXRlPVxue3dhc011bHRpcGxlOiEhZi5tdWx0aXBsZX07RihcImludmFsaWRcIixkKTtyZChjLFwib25DaGFuZ2VcIik7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6SmIoZCxmKSxGKFwiaW52YWxpZFwiLGQpLHJkKGMsXCJvbkNoYW5nZVwiKX1vZChlLGYpO2E9bnVsbDtmb3IodmFyIGcgaW4gZilpZihmLmhhc093blByb3BlcnR5KGcpKXt2YXIgaD1mW2ddO1wiY2hpbGRyZW5cIj09PWc/XCJzdHJpbmdcIj09PXR5cGVvZiBoP2QudGV4dENvbnRlbnQhPT1oJiYoYT1bXCJjaGlsZHJlblwiLGhdKTpcIm51bWJlclwiPT09dHlwZW9mIGgmJmQudGV4dENvbnRlbnQhPT1cIlwiK2gmJihhPVtcImNoaWxkcmVuXCIsXCJcIitoXSk6dmEuaGFzT3duUHJvcGVydHkoZykmJm51bGwhPWgmJnJkKGMsZyl9c3dpdGNoKGUpe2Nhc2UgXCJpbnB1dFwiOnhiKGQpO0ViKGQsZiwhMCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6eGIoZCk7TGIoZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmNhc2UgXCJvcHRpb25cIjpicmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLm9uQ2xpY2smJlxuKGQub25jbGljaz1zZCl9Yz1hO2IudXBkYXRlUXVldWU9YztudWxsIT09YyYmKGIuZWZmZWN0VGFnfD00KX1lbHNle2c9OT09PWMubm9kZVR5cGU/YzpjLm93bmVyRG9jdW1lbnQ7YT09PXFkJiYoYT1OYihlKSk7YT09PXFkP1wic2NyaXB0XCI9PT1lPyhhPWcuY3JlYXRlRWxlbWVudChcImRpdlwiKSxhLmlubmVySFRNTD1cIjxzY3JpcHQ+XFx4M2Mvc2NyaXB0PlwiLGE9YS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpKTpcInN0cmluZ1wiPT09dHlwZW9mIGQuaXM/YT1nLmNyZWF0ZUVsZW1lbnQoZSx7aXM6ZC5pc30pOihhPWcuY3JlYXRlRWxlbWVudChlKSxcInNlbGVjdFwiPT09ZSYmKGc9YSxkLm11bHRpcGxlP2cubXVsdGlwbGU9ITA6ZC5zaXplJiYoZy5zaXplPWQuc2l6ZSkpKTphPWcuY3JlYXRlRWxlbWVudE5TKGEsZSk7YVtNZF09YjthW05kXT1kO25pKGEsYiwhMSwhMSk7Yi5zdGF0ZU5vZGU9YTtnPXBkKGUsZCk7c3dpdGNoKGUpe2Nhc2UgXCJpZnJhbWVcIjpjYXNlIFwib2JqZWN0XCI6Y2FzZSBcImVtYmVkXCI6RihcImxvYWRcIixcbmEpO2g9ZDticmVhaztjYXNlIFwidmlkZW9cIjpjYXNlIFwiYXVkaW9cIjpmb3IoaD0wO2g8YWMubGVuZ3RoO2grKylGKGFjW2hdLGEpO2g9ZDticmVhaztjYXNlIFwic291cmNlXCI6RihcImVycm9yXCIsYSk7aD1kO2JyZWFrO2Nhc2UgXCJpbWdcIjpjYXNlIFwiaW1hZ2VcIjpjYXNlIFwibGlua1wiOkYoXCJlcnJvclwiLGEpO0YoXCJsb2FkXCIsYSk7aD1kO2JyZWFrO2Nhc2UgXCJmb3JtXCI6RihcInJlc2V0XCIsYSk7RihcInN1Ym1pdFwiLGEpO2g9ZDticmVhaztjYXNlIFwiZGV0YWlsc1wiOkYoXCJ0b2dnbGVcIixhKTtoPWQ7YnJlYWs7Y2FzZSBcImlucHV0XCI6QWIoYSxkKTtoPXpiKGEsZCk7RihcImludmFsaWRcIixhKTtyZChjLFwib25DaGFuZ2VcIik7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOmg9R2IoYSxkKTticmVhaztjYXNlIFwic2VsZWN0XCI6YS5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIWQubXVsdGlwbGV9O2g9bih7fSxkLHt2YWx1ZTp2b2lkIDB9KTtGKFwiaW52YWxpZFwiLGEpO3JkKGMsXCJvbkNoYW5nZVwiKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpKYihhLFxuZCk7aD1JYihhLGQpO0YoXCJpbnZhbGlkXCIsYSk7cmQoYyxcIm9uQ2hhbmdlXCIpO2JyZWFrO2RlZmF1bHQ6aD1kfW9kKGUsaCk7dmFyIGs9aDtmb3IoZiBpbiBrKWlmKGsuaGFzT3duUHJvcGVydHkoZikpe3ZhciBsPWtbZl07XCJzdHlsZVwiPT09Zj9tZChhLGwpOlwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWY/KGw9bD9sLl9faHRtbDp2b2lkIDAsbnVsbCE9bCYmUWIoYSxsKSk6XCJjaGlsZHJlblwiPT09Zj9cInN0cmluZ1wiPT09dHlwZW9mIGw/KFwidGV4dGFyZWFcIiE9PWV8fFwiXCIhPT1sKSYmUmIoYSxsKTpcIm51bWJlclwiPT09dHlwZW9mIGwmJlJiKGEsXCJcIitsKTpcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09ZiYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWYmJlwiYXV0b0ZvY3VzXCIhPT1mJiYodmEuaGFzT3duUHJvcGVydHkoZik/bnVsbCE9bCYmcmQoYyxmKTpudWxsIT1sJiZYYShhLGYsbCxnKSl9c3dpdGNoKGUpe2Nhc2UgXCJpbnB1dFwiOnhiKGEpO0ViKGEsZCwhMSk7XG5icmVhaztjYXNlIFwidGV4dGFyZWFcIjp4YihhKTtMYihhKTticmVhaztjYXNlIFwib3B0aW9uXCI6bnVsbCE9ZC52YWx1ZSYmYS5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLFwiXCIrcmIoZC52YWx1ZSkpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjphLm11bHRpcGxlPSEhZC5tdWx0aXBsZTtjPWQudmFsdWU7bnVsbCE9Yz9IYihhLCEhZC5tdWx0aXBsZSxjLCExKTpudWxsIT1kLmRlZmF1bHRWYWx1ZSYmSGIoYSwhIWQubXVsdGlwbGUsZC5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6XCJmdW5jdGlvblwiPT09dHlwZW9mIGgub25DbGljayYmKGEub25jbGljaz1zZCl9RmQoZSxkKSYmKGIuZWZmZWN0VGFnfD00KX1udWxsIT09Yi5yZWYmJihiLmVmZmVjdFRhZ3w9MTI4KX1yZXR1cm4gbnVsbDtjYXNlIDY6aWYoYSYmbnVsbCE9Yi5zdGF0ZU5vZGUpcWkoYSxiLGEubWVtb2l6ZWRQcm9wcyxkKTtlbHNle2lmKFwic3RyaW5nXCIhPT10eXBlb2YgZCYmbnVsbD09PWIuc3RhdGVOb2RlKXRocm93IEVycm9yKHUoMTY2KSk7XG5jPWNoKGJoLmN1cnJlbnQpO2NoKCRnLmN1cnJlbnQpO1doKGIpPyhjPWIuc3RhdGVOb2RlLGQ9Yi5tZW1vaXplZFByb3BzLGNbTWRdPWIsYy5ub2RlVmFsdWUhPT1kJiYoYi5lZmZlY3RUYWd8PTQpKTooYz0oOT09PWMubm9kZVR5cGU/YzpjLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKGQpLGNbTWRdPWIsYi5zdGF0ZU5vZGU9Yyl9cmV0dXJuIG51bGw7Y2FzZSAxMzpIKE0pO2Q9Yi5tZW1vaXplZFN0YXRlO2lmKDAhPT0oYi5lZmZlY3RUYWcmNjQpKXJldHVybiBiLmV4cGlyYXRpb25UaW1lPWMsYjtjPW51bGwhPT1kO2Q9ITE7bnVsbD09PWE/dm9pZCAwIT09Yi5tZW1vaXplZFByb3BzLmZhbGxiYWNrJiZXaChiKTooZT1hLm1lbW9pemVkU3RhdGUsZD1udWxsIT09ZSxjfHxudWxsPT09ZXx8KGU9YS5jaGlsZC5zaWJsaW5nLG51bGwhPT1lJiYoZj1iLmZpcnN0RWZmZWN0LG51bGwhPT1mPyhiLmZpcnN0RWZmZWN0PWUsZS5uZXh0RWZmZWN0PWYpOihiLmZpcnN0RWZmZWN0PWIubGFzdEVmZmVjdD1cbmUsZS5uZXh0RWZmZWN0PW51bGwpLGUuZWZmZWN0VGFnPTgpKSk7aWYoYyYmIWQmJjAhPT0oYi5tb2RlJjIpKWlmKG51bGw9PT1hJiYhMCE9PWIubWVtb2l6ZWRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFja3x8MCE9PShNLmN1cnJlbnQmMSkpUz09PXRpJiYoUz11aSk7ZWxzZXtpZihTPT09dGl8fFM9PT11aSlTPXZpOzAhPT13aSYmbnVsbCE9PVQmJih4aShULFUpLHlpKFQsd2kpKX1pZihjfHxkKWIuZWZmZWN0VGFnfD00O3JldHVybiBudWxsO2Nhc2UgNDpyZXR1cm4gZWgoKSxvaShiKSxudWxsO2Nhc2UgMTA6cmV0dXJuIG9nKGIpLG51bGw7Y2FzZSAxNzpyZXR1cm4gTChiLnR5cGUpJiZEZigpLG51bGw7Y2FzZSAxOTpIKE0pO2Q9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGw9PT1kKXJldHVybiBudWxsO2U9MCE9PShiLmVmZmVjdFRhZyY2NCk7Zj1kLnJlbmRlcmluZztpZihudWxsPT09ZilpZihlKXJpKGQsITEpO2Vsc2V7aWYoUyE9PXRpfHxudWxsIT09YSYmMCE9PShhLmVmZmVjdFRhZyZcbjY0KSlmb3IoZj1iLmNoaWxkO251bGwhPT1mOyl7YT1oaChmKTtpZihudWxsIT09YSl7Yi5lZmZlY3RUYWd8PTY0O3JpKGQsITEpO2U9YS51cGRhdGVRdWV1ZTtudWxsIT09ZSYmKGIudXBkYXRlUXVldWU9ZSxiLmVmZmVjdFRhZ3w9NCk7bnVsbD09PWQubGFzdEVmZmVjdCYmKGIuZmlyc3RFZmZlY3Q9bnVsbCk7Yi5sYXN0RWZmZWN0PWQubGFzdEVmZmVjdDtmb3IoZD1iLmNoaWxkO251bGwhPT1kOyllPWQsZj1jLGUuZWZmZWN0VGFnJj0yLGUubmV4dEVmZmVjdD1udWxsLGUuZmlyc3RFZmZlY3Q9bnVsbCxlLmxhc3RFZmZlY3Q9bnVsbCxhPWUuYWx0ZXJuYXRlLG51bGw9PT1hPyhlLmNoaWxkRXhwaXJhdGlvblRpbWU9MCxlLmV4cGlyYXRpb25UaW1lPWYsZS5jaGlsZD1udWxsLGUubWVtb2l6ZWRQcm9wcz1udWxsLGUubWVtb2l6ZWRTdGF0ZT1udWxsLGUudXBkYXRlUXVldWU9bnVsbCxlLmRlcGVuZGVuY2llcz1udWxsKTooZS5jaGlsZEV4cGlyYXRpb25UaW1lPWEuY2hpbGRFeHBpcmF0aW9uVGltZSxcbmUuZXhwaXJhdGlvblRpbWU9YS5leHBpcmF0aW9uVGltZSxlLmNoaWxkPWEuY2hpbGQsZS5tZW1vaXplZFByb3BzPWEubWVtb2l6ZWRQcm9wcyxlLm1lbW9pemVkU3RhdGU9YS5tZW1vaXplZFN0YXRlLGUudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZSxmPWEuZGVwZW5kZW5jaWVzLGUuZGVwZW5kZW5jaWVzPW51bGw9PT1mP251bGw6e2V4cGlyYXRpb25UaW1lOmYuZXhwaXJhdGlvblRpbWUsZmlyc3RDb250ZXh0OmYuZmlyc3RDb250ZXh0LHJlc3BvbmRlcnM6Zi5yZXNwb25kZXJzfSksZD1kLnNpYmxpbmc7SShNLE0uY3VycmVudCYxfDIpO3JldHVybiBiLmNoaWxkfWY9Zi5zaWJsaW5nfX1lbHNle2lmKCFlKWlmKGE9aGgoZiksbnVsbCE9PWEpe2lmKGIuZWZmZWN0VGFnfD02NCxlPSEwLGM9YS51cGRhdGVRdWV1ZSxudWxsIT09YyYmKGIudXBkYXRlUXVldWU9YyxiLmVmZmVjdFRhZ3w9NCkscmkoZCwhMCksbnVsbD09PWQudGFpbCYmXCJoaWRkZW5cIj09PWQudGFpbE1vZGUmJiFmLmFsdGVybmF0ZSlyZXR1cm4gYj1cbmIubGFzdEVmZmVjdD1kLmxhc3RFZmZlY3QsbnVsbCE9PWImJihiLm5leHRFZmZlY3Q9bnVsbCksbnVsbH1lbHNlIDIqJGYoKS1kLnJlbmRlcmluZ1N0YXJ0VGltZT5kLnRhaWxFeHBpcmF0aW9uJiYxPGMmJihiLmVmZmVjdFRhZ3w9NjQsZT0hMCxyaShkLCExKSxiLmV4cGlyYXRpb25UaW1lPWIuY2hpbGRFeHBpcmF0aW9uVGltZT1jLTEpO2QuaXNCYWNrd2FyZHM/KGYuc2libGluZz1iLmNoaWxkLGIuY2hpbGQ9Zik6KGM9ZC5sYXN0LG51bGwhPT1jP2Muc2libGluZz1mOmIuY2hpbGQ9ZixkLmxhc3Q9Zil9cmV0dXJuIG51bGwhPT1kLnRhaWw/KDA9PT1kLnRhaWxFeHBpcmF0aW9uJiYoZC50YWlsRXhwaXJhdGlvbj0kZigpKzUwMCksYz1kLnRhaWwsZC5yZW5kZXJpbmc9YyxkLnRhaWw9Yy5zaWJsaW5nLGQubGFzdEVmZmVjdD1iLmxhc3RFZmZlY3QsZC5yZW5kZXJpbmdTdGFydFRpbWU9JGYoKSxjLnNpYmxpbmc9bnVsbCxiPU0uY3VycmVudCxJKE0sZT9iJjF8MjpiJjEpLGMpOm51bGx9dGhyb3cgRXJyb3IodSgxNTYsXG5iLnRhZykpO31mdW5jdGlvbiB6aShhKXtzd2l0Y2goYS50YWcpe2Nhc2UgMTpMKGEudHlwZSkmJkRmKCk7dmFyIGI9YS5lZmZlY3RUYWc7cmV0dXJuIGImNDA5Nj8oYS5lZmZlY3RUYWc9YiYtNDA5N3w2NCxhKTpudWxsO2Nhc2UgMzplaCgpO0goSyk7SChKKTtiPWEuZWZmZWN0VGFnO2lmKDAhPT0oYiY2NCkpdGhyb3cgRXJyb3IodSgyODUpKTthLmVmZmVjdFRhZz1iJi00MDk3fDY0O3JldHVybiBhO2Nhc2UgNTpyZXR1cm4gZ2goYSksbnVsbDtjYXNlIDEzOnJldHVybiBIKE0pLGI9YS5lZmZlY3RUYWcsYiY0MDk2PyhhLmVmZmVjdFRhZz1iJi00MDk3fDY0LGEpOm51bGw7Y2FzZSAxOTpyZXR1cm4gSChNKSxudWxsO2Nhc2UgNDpyZXR1cm4gZWgoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIG9nKGEpLG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gQWkoYSxiKXtyZXR1cm57dmFsdWU6YSxzb3VyY2U6YixzdGFjazpxYihiKX19XG52YXIgQmk9XCJmdW5jdGlvblwiPT09dHlwZW9mIFdlYWtTZXQ/V2Vha1NldDpTZXQ7ZnVuY3Rpb24gQ2koYSxiKXt2YXIgYz1iLnNvdXJjZSxkPWIuc3RhY2s7bnVsbD09PWQmJm51bGwhPT1jJiYoZD1xYihjKSk7bnVsbCE9PWMmJnBiKGMudHlwZSk7Yj1iLnZhbHVlO251bGwhPT1hJiYxPT09YS50YWcmJnBiKGEudHlwZSk7dHJ5e2NvbnNvbGUuZXJyb3IoYil9Y2F0Y2goZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGU7fSl9fWZ1bmN0aW9uIERpKGEsYil7dHJ5e2IucHJvcHM9YS5tZW1vaXplZFByb3BzLGIuc3RhdGU9YS5tZW1vaXplZFN0YXRlLGIuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChjKXtFaShhLGMpfX1mdW5jdGlvbiBGaShhKXt2YXIgYj1hLnJlZjtpZihudWxsIT09YilpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYil0cnl7YihudWxsKX1jYXRjaChjKXtFaShhLGMpfWVsc2UgYi5jdXJyZW50PW51bGx9XG5mdW5jdGlvbiBHaShhLGIpe3N3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjYXNlIDIyOnJldHVybjtjYXNlIDE6aWYoYi5lZmZlY3RUYWcmMjU2JiZudWxsIT09YSl7dmFyIGM9YS5tZW1vaXplZFByb3BzLGQ9YS5tZW1vaXplZFN0YXRlO2E9Yi5zdGF0ZU5vZGU7Yj1hLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGIuZWxlbWVudFR5cGU9PT1iLnR5cGU/YzppZyhiLnR5cGUsYyksZCk7YS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZT1ifXJldHVybjtjYXNlIDM6Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6Y2FzZSAxNzpyZXR1cm59dGhyb3cgRXJyb3IodSgxNjMpKTt9XG5mdW5jdGlvbiBIaShhLGIpe2I9Yi51cGRhdGVRdWV1ZTtiPW51bGwhPT1iP2IubGFzdEVmZmVjdDpudWxsO2lmKG51bGwhPT1iKXt2YXIgYz1iPWIubmV4dDtkb3tpZigoYy50YWcmYSk9PT1hKXt2YXIgZD1jLmRlc3Ryb3k7Yy5kZXN0cm95PXZvaWQgMDt2b2lkIDAhPT1kJiZkKCl9Yz1jLm5leHR9d2hpbGUoYyE9PWIpfX1mdW5jdGlvbiBJaShhLGIpe2I9Yi51cGRhdGVRdWV1ZTtiPW51bGwhPT1iP2IubGFzdEVmZmVjdDpudWxsO2lmKG51bGwhPT1iKXt2YXIgYz1iPWIubmV4dDtkb3tpZigoYy50YWcmYSk9PT1hKXt2YXIgZD1jLmNyZWF0ZTtjLmRlc3Ryb3k9ZCgpfWM9Yy5uZXh0fXdoaWxlKGMhPT1iKX19XG5mdW5jdGlvbiBKaShhLGIsYyl7c3dpdGNoKGMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmNhc2UgMjI6SWkoMyxjKTtyZXR1cm47Y2FzZSAxOmE9Yy5zdGF0ZU5vZGU7aWYoYy5lZmZlY3RUYWcmNClpZihudWxsPT09YilhLmNvbXBvbmVudERpZE1vdW50KCk7ZWxzZXt2YXIgZD1jLmVsZW1lbnRUeXBlPT09Yy50eXBlP2IubWVtb2l6ZWRQcm9wczppZyhjLnR5cGUsYi5tZW1vaXplZFByb3BzKTthLmNvbXBvbmVudERpZFVwZGF0ZShkLGIubWVtb2l6ZWRTdGF0ZSxhLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKX1iPWMudXBkYXRlUXVldWU7bnVsbCE9PWImJkNnKGMsYixhKTtyZXR1cm47Y2FzZSAzOmI9Yy51cGRhdGVRdWV1ZTtpZihudWxsIT09Yil7YT1udWxsO2lmKG51bGwhPT1jLmNoaWxkKXN3aXRjaChjLmNoaWxkLnRhZyl7Y2FzZSA1OmE9Yy5jaGlsZC5zdGF0ZU5vZGU7YnJlYWs7Y2FzZSAxOmE9Yy5jaGlsZC5zdGF0ZU5vZGV9Q2coYyxiLGEpfXJldHVybjtcbmNhc2UgNTphPWMuc3RhdGVOb2RlO251bGw9PT1iJiZjLmVmZmVjdFRhZyY0JiZGZChjLnR5cGUsYy5tZW1vaXplZFByb3BzKSYmYS5mb2N1cygpO3JldHVybjtjYXNlIDY6cmV0dXJuO2Nhc2UgNDpyZXR1cm47Y2FzZSAxMjpyZXR1cm47Y2FzZSAxMzpudWxsPT09Yy5tZW1vaXplZFN0YXRlJiYoYz1jLmFsdGVybmF0ZSxudWxsIT09YyYmKGM9Yy5tZW1vaXplZFN0YXRlLG51bGwhPT1jJiYoYz1jLmRlaHlkcmF0ZWQsbnVsbCE9PWMmJlZjKGMpKSkpO3JldHVybjtjYXNlIDE5OmNhc2UgMTc6Y2FzZSAyMDpjYXNlIDIxOnJldHVybn10aHJvdyBFcnJvcih1KDE2MykpO31cbmZ1bmN0aW9uIEtpKGEsYixjKXtcImZ1bmN0aW9uXCI9PT10eXBlb2YgTGkmJkxpKGIpO3N3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmNhc2UgMjI6YT1iLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1hJiYoYT1hLmxhc3RFZmZlY3QsbnVsbCE9PWEpKXt2YXIgZD1hLm5leHQ7Y2coOTc8Yz85NzpjLGZ1bmN0aW9uKCl7dmFyIGE9ZDtkb3t2YXIgYz1hLmRlc3Ryb3k7aWYodm9pZCAwIT09Yyl7dmFyIGc9Yjt0cnl7YygpfWNhdGNoKGgpe0VpKGcsaCl9fWE9YS5uZXh0fXdoaWxlKGEhPT1kKX0pfWJyZWFrO2Nhc2UgMTpGaShiKTtjPWIuc3RhdGVOb2RlO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBjLmNvbXBvbmVudFdpbGxVbm1vdW50JiZEaShiLGMpO2JyZWFrO2Nhc2UgNTpGaShiKTticmVhaztjYXNlIDQ6TWkoYSxiLGMpfX1cbmZ1bmN0aW9uIE5pKGEpe3ZhciBiPWEuYWx0ZXJuYXRlO2EucmV0dXJuPW51bGw7YS5jaGlsZD1udWxsO2EubWVtb2l6ZWRTdGF0ZT1udWxsO2EudXBkYXRlUXVldWU9bnVsbDthLmRlcGVuZGVuY2llcz1udWxsO2EuYWx0ZXJuYXRlPW51bGw7YS5maXJzdEVmZmVjdD1udWxsO2EubGFzdEVmZmVjdD1udWxsO2EucGVuZGluZ1Byb3BzPW51bGw7YS5tZW1vaXplZFByb3BzPW51bGw7YS5zdGF0ZU5vZGU9bnVsbDtudWxsIT09YiYmTmkoYil9ZnVuY3Rpb24gT2koYSl7cmV0dXJuIDU9PT1hLnRhZ3x8Mz09PWEudGFnfHw0PT09YS50YWd9XG5mdW5jdGlvbiBQaShhKXthOntmb3IodmFyIGI9YS5yZXR1cm47bnVsbCE9PWI7KXtpZihPaShiKSl7dmFyIGM9YjticmVhayBhfWI9Yi5yZXR1cm59dGhyb3cgRXJyb3IodSgxNjApKTt9Yj1jLnN0YXRlTm9kZTtzd2l0Y2goYy50YWcpe2Nhc2UgNTp2YXIgZD0hMTticmVhaztjYXNlIDM6Yj1iLmNvbnRhaW5lckluZm87ZD0hMDticmVhaztjYXNlIDQ6Yj1iLmNvbnRhaW5lckluZm87ZD0hMDticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHUoMTYxKSk7fWMuZWZmZWN0VGFnJjE2JiYoUmIoYixcIlwiKSxjLmVmZmVjdFRhZyY9LTE3KTthOmI6Zm9yKGM9YTs7KXtmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fE9pKGMucmV0dXJuKSl7Yz1udWxsO2JyZWFrIGF9Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2ZvcihjPWMuc2libGluZzs1IT09Yy50YWcmJjYhPT1jLnRhZyYmMTghPT1jLnRhZzspe2lmKGMuZWZmZWN0VGFnJjIpY29udGludWUgYjtcbmlmKG51bGw9PT1jLmNoaWxkfHw0PT09Yy50YWcpY29udGludWUgYjtlbHNlIGMuY2hpbGQucmV0dXJuPWMsYz1jLmNoaWxkfWlmKCEoYy5lZmZlY3RUYWcmMikpe2M9Yy5zdGF0ZU5vZGU7YnJlYWsgYX19ZD9RaShhLGMsYik6UmkoYSxjLGIpfVxuZnVuY3Rpb24gUWkoYSxiLGMpe3ZhciBkPWEudGFnLGU9NT09PWR8fDY9PT1kO2lmKGUpYT1lP2Euc3RhdGVOb2RlOmEuc3RhdGVOb2RlLmluc3RhbmNlLGI/OD09PWMubm9kZVR5cGU/Yy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLGIpOmMuaW5zZXJ0QmVmb3JlKGEsYik6KDg9PT1jLm5vZGVUeXBlPyhiPWMucGFyZW50Tm9kZSxiLmluc2VydEJlZm9yZShhLGMpKTooYj1jLGIuYXBwZW5kQ2hpbGQoYSkpLGM9Yy5fcmVhY3RSb290Q29udGFpbmVyLG51bGwhPT1jJiZ2b2lkIDAhPT1jfHxudWxsIT09Yi5vbmNsaWNrfHwoYi5vbmNsaWNrPXNkKSk7ZWxzZSBpZig0IT09ZCYmKGE9YS5jaGlsZCxudWxsIT09YSkpZm9yKFFpKGEsYixjKSxhPWEuc2libGluZztudWxsIT09YTspUWkoYSxiLGMpLGE9YS5zaWJsaW5nfVxuZnVuY3Rpb24gUmkoYSxiLGMpe3ZhciBkPWEudGFnLGU9NT09PWR8fDY9PT1kO2lmKGUpYT1lP2Euc3RhdGVOb2RlOmEuc3RhdGVOb2RlLmluc3RhbmNlLGI/Yy5pbnNlcnRCZWZvcmUoYSxiKTpjLmFwcGVuZENoaWxkKGEpO2Vsc2UgaWYoNCE9PWQmJihhPWEuY2hpbGQsbnVsbCE9PWEpKWZvcihSaShhLGIsYyksYT1hLnNpYmxpbmc7bnVsbCE9PWE7KVJpKGEsYixjKSxhPWEuc2libGluZ31cbmZ1bmN0aW9uIE1pKGEsYixjKXtmb3IodmFyIGQ9YixlPSExLGYsZzs7KXtpZighZSl7ZT1kLnJldHVybjthOmZvcig7Oyl7aWYobnVsbD09PWUpdGhyb3cgRXJyb3IodSgxNjApKTtmPWUuc3RhdGVOb2RlO3N3aXRjaChlLnRhZyl7Y2FzZSA1Omc9ITE7YnJlYWsgYTtjYXNlIDM6Zj1mLmNvbnRhaW5lckluZm87Zz0hMDticmVhayBhO2Nhc2UgNDpmPWYuY29udGFpbmVySW5mbztnPSEwO2JyZWFrIGF9ZT1lLnJldHVybn1lPSEwfWlmKDU9PT1kLnRhZ3x8Nj09PWQudGFnKXthOmZvcih2YXIgaD1hLGs9ZCxsPWMsbT1rOzspaWYoS2koaCxtLGwpLG51bGwhPT1tLmNoaWxkJiY0IT09bS50YWcpbS5jaGlsZC5yZXR1cm49bSxtPW0uY2hpbGQ7ZWxzZXtpZihtPT09aylicmVhayBhO2Zvcig7bnVsbD09PW0uc2libGluZzspe2lmKG51bGw9PT1tLnJldHVybnx8bS5yZXR1cm49PT1rKWJyZWFrIGE7bT1tLnJldHVybn1tLnNpYmxpbmcucmV0dXJuPW0ucmV0dXJuO209bS5zaWJsaW5nfWc/KGg9XG5mLGs9ZC5zdGF0ZU5vZGUsOD09PWgubm9kZVR5cGU/aC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspOmgucmVtb3ZlQ2hpbGQoaykpOmYucmVtb3ZlQ2hpbGQoZC5zdGF0ZU5vZGUpfWVsc2UgaWYoND09PWQudGFnKXtpZihudWxsIT09ZC5jaGlsZCl7Zj1kLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2c9ITA7ZC5jaGlsZC5yZXR1cm49ZDtkPWQuY2hpbGQ7Y29udGludWV9fWVsc2UgaWYoS2koYSxkLGMpLG51bGwhPT1kLmNoaWxkKXtkLmNoaWxkLnJldHVybj1kO2Q9ZC5jaGlsZDtjb250aW51ZX1pZihkPT09YilicmVhaztmb3IoO251bGw9PT1kLnNpYmxpbmc7KXtpZihudWxsPT09ZC5yZXR1cm58fGQucmV0dXJuPT09YilyZXR1cm47ZD1kLnJldHVybjs0PT09ZC50YWcmJihlPSExKX1kLnNpYmxpbmcucmV0dXJuPWQucmV0dXJuO2Q9ZC5zaWJsaW5nfX1cbmZ1bmN0aW9uIFNpKGEsYil7c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6Y2FzZSAyMjpIaSgzLGIpO3JldHVybjtjYXNlIDE6cmV0dXJuO2Nhc2UgNTp2YXIgYz1iLnN0YXRlTm9kZTtpZihudWxsIT1jKXt2YXIgZD1iLm1lbW9pemVkUHJvcHMsZT1udWxsIT09YT9hLm1lbW9pemVkUHJvcHM6ZDthPWIudHlwZTt2YXIgZj1iLnVwZGF0ZVF1ZXVlO2IudXBkYXRlUXVldWU9bnVsbDtpZihudWxsIT09Zil7Y1tOZF09ZDtcImlucHV0XCI9PT1hJiZcInJhZGlvXCI9PT1kLnR5cGUmJm51bGwhPWQubmFtZSYmQmIoYyxkKTtwZChhLGUpO2I9cGQoYSxkKTtmb3IoZT0wO2U8Zi5sZW5ndGg7ZSs9Mil7dmFyIGc9ZltlXSxoPWZbZSsxXTtcInN0eWxlXCI9PT1nP21kKGMsaCk6XCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09Zz9RYihjLGgpOlwiY2hpbGRyZW5cIj09PWc/UmIoYyxoKTpYYShjLGcsaCxiKX1zd2l0Y2goYSl7Y2FzZSBcImlucHV0XCI6Q2IoYyxkKTticmVhaztcbmNhc2UgXCJ0ZXh0YXJlYVwiOktiKGMsZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmI9Yy5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlLGMuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZT0hIWQubXVsdGlwbGUsYT1kLnZhbHVlLG51bGwhPWE/SGIoYywhIWQubXVsdGlwbGUsYSwhMSk6YiE9PSEhZC5tdWx0aXBsZSYmKG51bGwhPWQuZGVmYXVsdFZhbHVlP0hiKGMsISFkLm11bHRpcGxlLGQuZGVmYXVsdFZhbHVlLCEwKTpIYihjLCEhZC5tdWx0aXBsZSxkLm11bHRpcGxlP1tdOlwiXCIsITEpKX19fXJldHVybjtjYXNlIDY6aWYobnVsbD09PWIuc3RhdGVOb2RlKXRocm93IEVycm9yKHUoMTYyKSk7Yi5zdGF0ZU5vZGUubm9kZVZhbHVlPWIubWVtb2l6ZWRQcm9wcztyZXR1cm47Y2FzZSAzOmI9Yi5zdGF0ZU5vZGU7Yi5oeWRyYXRlJiYoYi5oeWRyYXRlPSExLFZjKGIuY29udGFpbmVySW5mbykpO3JldHVybjtjYXNlIDEyOnJldHVybjtjYXNlIDEzOmM9YjtudWxsPT09Yi5tZW1vaXplZFN0YXRlP1xuZD0hMTooZD0hMCxjPWIuY2hpbGQsVGk9JGYoKSk7aWYobnVsbCE9PWMpYTpmb3IoYT1jOzspe2lmKDU9PT1hLnRhZylmPWEuc3RhdGVOb2RlLGQ/KGY9Zi5zdHlsZSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5zZXRQcm9wZXJ0eT9mLnNldFByb3BlcnR5KFwiZGlzcGxheVwiLFwibm9uZVwiLFwiaW1wb3J0YW50XCIpOmYuZGlzcGxheT1cIm5vbmVcIik6KGY9YS5zdGF0ZU5vZGUsZT1hLm1lbW9pemVkUHJvcHMuc3R5bGUsZT12b2lkIDAhPT1lJiZudWxsIT09ZSYmZS5oYXNPd25Qcm9wZXJ0eShcImRpc3BsYXlcIik/ZS5kaXNwbGF5Om51bGwsZi5zdHlsZS5kaXNwbGF5PWxkKFwiZGlzcGxheVwiLGUpKTtlbHNlIGlmKDY9PT1hLnRhZylhLnN0YXRlTm9kZS5ub2RlVmFsdWU9ZD9cIlwiOmEubWVtb2l6ZWRQcm9wcztlbHNlIGlmKDEzPT09YS50YWcmJm51bGwhPT1hLm1lbW9pemVkU3RhdGUmJm51bGw9PT1hLm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCl7Zj1hLmNoaWxkLnNpYmxpbmc7Zi5yZXR1cm49YTthPVxuZjtjb250aW51ZX1lbHNlIGlmKG51bGwhPT1hLmNoaWxkKXthLmNoaWxkLnJldHVybj1hO2E9YS5jaGlsZDtjb250aW51ZX1pZihhPT09YylicmVhaztmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fGEucmV0dXJuPT09YylicmVhayBhO2E9YS5yZXR1cm59YS5zaWJsaW5nLnJldHVybj1hLnJldHVybjthPWEuc2libGluZ31VaShiKTtyZXR1cm47Y2FzZSAxOTpVaShiKTtyZXR1cm47Y2FzZSAxNzpyZXR1cm59dGhyb3cgRXJyb3IodSgxNjMpKTt9ZnVuY3Rpb24gVWkoYSl7dmFyIGI9YS51cGRhdGVRdWV1ZTtpZihudWxsIT09Yil7YS51cGRhdGVRdWV1ZT1udWxsO3ZhciBjPWEuc3RhdGVOb2RlO251bGw9PT1jJiYoYz1hLnN0YXRlTm9kZT1uZXcgQmkpO2IuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZD1WaS5iaW5kKG51bGwsYSxiKTtjLmhhcyhiKXx8KGMuYWRkKGIpLGIudGhlbihkLGQpKX0pfX1cbnZhciBXaT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgV2Vha01hcD9XZWFrTWFwOk1hcDtmdW5jdGlvbiBYaShhLGIsYyl7Yz13ZyhjLG51bGwpO2MudGFnPTM7Yy5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciBkPWIudmFsdWU7Yy5jYWxsYmFjaz1mdW5jdGlvbigpe1lpfHwoWWk9ITAsWmk9ZCk7Q2koYSxiKX07cmV0dXJuIGN9XG5mdW5jdGlvbiAkaShhLGIsYyl7Yz13ZyhjLG51bGwpO2MudGFnPTM7dmFyIGQ9YS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZCl7dmFyIGU9Yi52YWx1ZTtjLnBheWxvYWQ9ZnVuY3Rpb24oKXtDaShhLGIpO3JldHVybiBkKGUpfX12YXIgZj1hLnN0YXRlTm9kZTtudWxsIT09ZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGYuY29tcG9uZW50RGlkQ2F0Y2gmJihjLmNhbGxiYWNrPWZ1bmN0aW9uKCl7XCJmdW5jdGlvblwiIT09dHlwZW9mIGQmJihudWxsPT09YWo/YWo9bmV3IFNldChbdGhpc10pOmFqLmFkZCh0aGlzKSxDaShhLGIpKTt2YXIgYz1iLnN0YWNrO3RoaXMuY29tcG9uZW50RGlkQ2F0Y2goYi52YWx1ZSx7Y29tcG9uZW50U3RhY2s6bnVsbCE9PWM/YzpcIlwifSl9KTtyZXR1cm4gY31cbnZhciBiaj1NYXRoLmNlaWwsY2o9V2EuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixkaj1XYS5SZWFjdEN1cnJlbnRPd25lcixWPTAsZWo9OCxmaj0xNixnaj0zMix0aT0wLGhqPTEsaWo9Mix1aT0zLHZpPTQsamo9NSxXPVYsVD1udWxsLFg9bnVsbCxVPTAsUz10aSxraj1udWxsLGxqPTEwNzM3NDE4MjMsbWo9MTA3Mzc0MTgyMyxuaj1udWxsLHdpPTAsb2o9ITEsVGk9MCxwaj01MDAsWT1udWxsLFlpPSExLFppPW51bGwsYWo9bnVsbCxxaj0hMSxyaj1udWxsLHNqPTkwLHRqPW51bGwsdWo9MCx2aj1udWxsLHdqPTA7ZnVuY3Rpb24gR2coKXtyZXR1cm4oVyYoZmp8Z2opKSE9PVY/MTA3Mzc0MTgyMS0oJGYoKS8xMHwwKTowIT09d2o/d2o6d2o9MTA3Mzc0MTgyMS0oJGYoKS8xMHwwKX1cbmZ1bmN0aW9uIEhnKGEsYixjKXtiPWIubW9kZTtpZigwPT09KGImMikpcmV0dXJuIDEwNzM3NDE4MjM7dmFyIGQ9YWcoKTtpZigwPT09KGImNCkpcmV0dXJuIDk5PT09ZD8xMDczNzQxODIzOjEwNzM3NDE4MjI7aWYoKFcmZmopIT09VilyZXR1cm4gVTtpZihudWxsIT09YylhPWhnKGEsYy50aW1lb3V0TXN8MHx8NUUzLDI1MCk7ZWxzZSBzd2l0Y2goZCl7Y2FzZSA5OTphPTEwNzM3NDE4MjM7YnJlYWs7Y2FzZSA5ODphPWhnKGEsMTUwLDEwMCk7YnJlYWs7Y2FzZSA5NzpjYXNlIDk2OmE9aGcoYSw1RTMsMjUwKTticmVhaztjYXNlIDk1OmE9MjticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHUoMzI2KSk7fW51bGwhPT1UJiZhPT09VSYmLS1hO3JldHVybiBhfVxuZnVuY3Rpb24gSWcoYSxiKXtpZig1MDx1ail0aHJvdyB1aj0wLHZqPW51bGwsRXJyb3IodSgxODUpKTthPXhqKGEsYik7aWYobnVsbCE9PWEpe3ZhciBjPWFnKCk7MTA3Mzc0MTgyMz09PWI/KFcmZWopIT09ViYmKFcmKGZqfGdqKSk9PT1WP3lqKGEpOihaKGEpLFc9PT1WJiZnZygpKTpaKGEpOyhXJjQpPT09Vnx8OTghPT1jJiY5OSE9PWN8fChudWxsPT09dGo/dGo9bmV3IE1hcChbW2EsYl1dKTooYz10ai5nZXQoYSksKHZvaWQgMD09PWN8fGM+YikmJnRqLnNldChhLGIpKSl9fVxuZnVuY3Rpb24geGooYSxiKXthLmV4cGlyYXRpb25UaW1lPGImJihhLmV4cGlyYXRpb25UaW1lPWIpO3ZhciBjPWEuYWx0ZXJuYXRlO251bGwhPT1jJiZjLmV4cGlyYXRpb25UaW1lPGImJihjLmV4cGlyYXRpb25UaW1lPWIpO3ZhciBkPWEucmV0dXJuLGU9bnVsbDtpZihudWxsPT09ZCYmMz09PWEudGFnKWU9YS5zdGF0ZU5vZGU7ZWxzZSBmb3IoO251bGwhPT1kOyl7Yz1kLmFsdGVybmF0ZTtkLmNoaWxkRXhwaXJhdGlvblRpbWU8YiYmKGQuY2hpbGRFeHBpcmF0aW9uVGltZT1iKTtudWxsIT09YyYmYy5jaGlsZEV4cGlyYXRpb25UaW1lPGImJihjLmNoaWxkRXhwaXJhdGlvblRpbWU9Yik7aWYobnVsbD09PWQucmV0dXJuJiYzPT09ZC50YWcpe2U9ZC5zdGF0ZU5vZGU7YnJlYWt9ZD1kLnJldHVybn1udWxsIT09ZSYmKFQ9PT1lJiYoQmcoYiksUz09PXZpJiZ4aShlLFUpKSx5aShlLGIpKTtyZXR1cm4gZX1cbmZ1bmN0aW9uIHpqKGEpe3ZhciBiPWEubGFzdEV4cGlyZWRUaW1lO2lmKDAhPT1iKXJldHVybiBiO2I9YS5maXJzdFBlbmRpbmdUaW1lO2lmKCFBaihhLGIpKXJldHVybiBiO3ZhciBjPWEubGFzdFBpbmdlZFRpbWU7YT1hLm5leHRLbm93blBlbmRpbmdMZXZlbDthPWM+YT9jOmE7cmV0dXJuIDI+PWEmJmIhPT1hPzA6YX1cbmZ1bmN0aW9uIFooYSl7aWYoMCE9PWEubGFzdEV4cGlyZWRUaW1lKWEuY2FsbGJhY2tFeHBpcmF0aW9uVGltZT0xMDczNzQxODIzLGEuY2FsbGJhY2tQcmlvcml0eT05OSxhLmNhbGxiYWNrTm9kZT1lZyh5ai5iaW5kKG51bGwsYSkpO2Vsc2V7dmFyIGI9emooYSksYz1hLmNhbGxiYWNrTm9kZTtpZigwPT09YiludWxsIT09YyYmKGEuY2FsbGJhY2tOb2RlPW51bGwsYS5jYWxsYmFja0V4cGlyYXRpb25UaW1lPTAsYS5jYWxsYmFja1ByaW9yaXR5PTkwKTtlbHNle3ZhciBkPUdnKCk7MTA3Mzc0MTgyMz09PWI/ZD05OToxPT09Ynx8Mj09PWI/ZD05NTooZD0xMCooMTA3Mzc0MTgyMS1iKS0xMCooMTA3Mzc0MTgyMS1kKSxkPTA+PWQ/OTk6MjUwPj1kPzk4OjUyNTA+PWQ/OTc6OTUpO2lmKG51bGwhPT1jKXt2YXIgZT1hLmNhbGxiYWNrUHJpb3JpdHk7aWYoYS5jYWxsYmFja0V4cGlyYXRpb25UaW1lPT09YiYmZT49ZClyZXR1cm47YyE9PVRmJiZLZihjKX1hLmNhbGxiYWNrRXhwaXJhdGlvblRpbWU9XG5iO2EuY2FsbGJhY2tQcmlvcml0eT1kO2I9MTA3Mzc0MTgyMz09PWI/ZWcoeWouYmluZChudWxsLGEpKTpkZyhkLEJqLmJpbmQobnVsbCxhKSx7dGltZW91dDoxMCooMTA3Mzc0MTgyMS1iKS0kZigpfSk7YS5jYWxsYmFja05vZGU9Yn19fVxuZnVuY3Rpb24gQmooYSxiKXt3aj0wO2lmKGIpcmV0dXJuIGI9R2coKSxDaihhLGIpLFooYSksbnVsbDt2YXIgYz16aihhKTtpZigwIT09Yyl7Yj1hLmNhbGxiYWNrTm9kZTtpZigoVyYoZmp8Z2opKSE9PVYpdGhyb3cgRXJyb3IodSgzMjcpKTtEaigpO2E9PT1UJiZjPT09VXx8RWooYSxjKTtpZihudWxsIT09WCl7dmFyIGQ9VztXfD1majt2YXIgZT1GaigpO2RvIHRyeXtHaigpO2JyZWFrfWNhdGNoKGgpe0hqKGEsaCl9d2hpbGUoMSk7bmcoKTtXPWQ7Y2ouY3VycmVudD1lO2lmKFM9PT1oail0aHJvdyBiPWtqLEVqKGEsYykseGkoYSxjKSxaKGEpLGI7aWYobnVsbD09PVgpc3dpdGNoKGU9YS5maW5pc2hlZFdvcms9YS5jdXJyZW50LmFsdGVybmF0ZSxhLmZpbmlzaGVkRXhwaXJhdGlvblRpbWU9YyxkPVMsVD1udWxsLGQpe2Nhc2UgdGk6Y2FzZSBoajp0aHJvdyBFcnJvcih1KDM0NSkpO2Nhc2UgaWo6Q2ooYSwyPGM/MjpjKTticmVhaztjYXNlIHVpOnhpKGEsYyk7ZD1hLmxhc3RTdXNwZW5kZWRUaW1lO1xuYz09PWQmJihhLm5leHRLbm93blBlbmRpbmdMZXZlbD1JaihlKSk7aWYoMTA3Mzc0MTgyMz09PWxqJiYoZT1UaStwai0kZigpLDEwPGUpKXtpZihvail7dmFyIGY9YS5sYXN0UGluZ2VkVGltZTtpZigwPT09Znx8Zj49Yyl7YS5sYXN0UGluZ2VkVGltZT1jO0VqKGEsYyk7YnJlYWt9fWY9emooYSk7aWYoMCE9PWYmJmYhPT1jKWJyZWFrO2lmKDAhPT1kJiZkIT09Yyl7YS5sYXN0UGluZ2VkVGltZT1kO2JyZWFrfWEudGltZW91dEhhbmRsZT1IZChKai5iaW5kKG51bGwsYSksZSk7YnJlYWt9SmooYSk7YnJlYWs7Y2FzZSB2aTp4aShhLGMpO2Q9YS5sYXN0U3VzcGVuZGVkVGltZTtjPT09ZCYmKGEubmV4dEtub3duUGVuZGluZ0xldmVsPUlqKGUpKTtpZihvaiYmKGU9YS5sYXN0UGluZ2VkVGltZSwwPT09ZXx8ZT49Yykpe2EubGFzdFBpbmdlZFRpbWU9YztFaihhLGMpO2JyZWFrfWU9emooYSk7aWYoMCE9PWUmJmUhPT1jKWJyZWFrO2lmKDAhPT1kJiZkIT09Yyl7YS5sYXN0UGluZ2VkVGltZT1cbmQ7YnJlYWt9MTA3Mzc0MTgyMyE9PW1qP2Q9MTAqKDEwNzM3NDE4MjEtbWopLSRmKCk6MTA3Mzc0MTgyMz09PWxqP2Q9MDooZD0xMCooMTA3Mzc0MTgyMS1saiktNUUzLGU9JGYoKSxjPTEwKigxMDczNzQxODIxLWMpLWUsZD1lLWQsMD5kJiYoZD0wKSxkPSgxMjA+ZD8xMjA6NDgwPmQ/NDgwOjEwODA+ZD8xMDgwOjE5MjA+ZD8xOTIwOjNFMz5kPzNFMzo0MzIwPmQ/NDMyMDoxOTYwKmJqKGQvMTk2MCkpLWQsYzxkJiYoZD1jKSk7aWYoMTA8ZCl7YS50aW1lb3V0SGFuZGxlPUhkKEpqLmJpbmQobnVsbCxhKSxkKTticmVha31KaihhKTticmVhaztjYXNlIGpqOmlmKDEwNzM3NDE4MjMhPT1saiYmbnVsbCE9PW5qKXtmPWxqO3ZhciBnPW5qO2Q9Zy5idXN5TWluRHVyYXRpb25Nc3wwOzA+PWQ/ZD0wOihlPWcuYnVzeURlbGF5TXN8MCxmPSRmKCktKDEwKigxMDczNzQxODIxLWYpLShnLnRpbWVvdXRNc3wwfHw1RTMpKSxkPWY8PWU/MDplK2QtZik7aWYoMTA8ZCl7eGkoYSxjKTthLnRpbWVvdXRIYW5kbGU9XG5IZChKai5iaW5kKG51bGwsYSksZCk7YnJlYWt9fUpqKGEpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IodSgzMjkpKTt9WihhKTtpZihhLmNhbGxiYWNrTm9kZT09PWIpcmV0dXJuIEJqLmJpbmQobnVsbCxhKX19cmV0dXJuIG51bGx9XG5mdW5jdGlvbiB5aihhKXt2YXIgYj1hLmxhc3RFeHBpcmVkVGltZTtiPTAhPT1iP2I6MTA3Mzc0MTgyMztpZigoVyYoZmp8Z2opKSE9PVYpdGhyb3cgRXJyb3IodSgzMjcpKTtEaigpO2E9PT1UJiZiPT09VXx8RWooYSxiKTtpZihudWxsIT09WCl7dmFyIGM9VztXfD1majt2YXIgZD1GaigpO2RvIHRyeXtLaigpO2JyZWFrfWNhdGNoKGUpe0hqKGEsZSl9d2hpbGUoMSk7bmcoKTtXPWM7Y2ouY3VycmVudD1kO2lmKFM9PT1oail0aHJvdyBjPWtqLEVqKGEsYikseGkoYSxiKSxaKGEpLGM7aWYobnVsbCE9PVgpdGhyb3cgRXJyb3IodSgyNjEpKTthLmZpbmlzaGVkV29yaz1hLmN1cnJlbnQuYWx0ZXJuYXRlO2EuZmluaXNoZWRFeHBpcmF0aW9uVGltZT1iO1Q9bnVsbDtKaihhKTtaKGEpfXJldHVybiBudWxsfWZ1bmN0aW9uIExqKCl7aWYobnVsbCE9PXRqKXt2YXIgYT10ajt0aj1udWxsO2EuZm9yRWFjaChmdW5jdGlvbihhLGMpe0NqKGMsYSk7WihjKX0pO2dnKCl9fVxuZnVuY3Rpb24gTWooYSxiKXt2YXIgYz1XO1d8PTE7dHJ5e3JldHVybiBhKGIpfWZpbmFsbHl7Vz1jLFc9PT1WJiZnZygpfX1mdW5jdGlvbiBOaihhLGIpe3ZhciBjPVc7VyY9LTI7V3w9ZWo7dHJ5e3JldHVybiBhKGIpfWZpbmFsbHl7Vz1jLFc9PT1WJiZnZygpfX1cbmZ1bmN0aW9uIEVqKGEsYil7YS5maW5pc2hlZFdvcms9bnVsbDthLmZpbmlzaGVkRXhwaXJhdGlvblRpbWU9MDt2YXIgYz1hLnRpbWVvdXRIYW5kbGU7LTEhPT1jJiYoYS50aW1lb3V0SGFuZGxlPS0xLElkKGMpKTtpZihudWxsIT09WClmb3IoYz1YLnJldHVybjtudWxsIT09Yzspe3ZhciBkPWM7c3dpdGNoKGQudGFnKXtjYXNlIDE6ZD1kLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7bnVsbCE9PWQmJnZvaWQgMCE9PWQmJkRmKCk7YnJlYWs7Y2FzZSAzOmVoKCk7SChLKTtIKEopO2JyZWFrO2Nhc2UgNTpnaChkKTticmVhaztjYXNlIDQ6ZWgoKTticmVhaztjYXNlIDEzOkgoTSk7YnJlYWs7Y2FzZSAxOTpIKE0pO2JyZWFrO2Nhc2UgMTA6b2coZCl9Yz1jLnJldHVybn1UPWE7WD1TZyhhLmN1cnJlbnQsbnVsbCk7VT1iO1M9dGk7a2o9bnVsbDttaj1saj0xMDczNzQxODIzO25qPW51bGw7d2k9MDtvaj0hMX1cbmZ1bmN0aW9uIEhqKGEsYil7ZG97dHJ5e25nKCk7amguY3VycmVudD1zaDtpZihtaClmb3IodmFyIGM9Ti5tZW1vaXplZFN0YXRlO251bGwhPT1jOyl7dmFyIGQ9Yy5xdWV1ZTtudWxsIT09ZCYmKGQucGVuZGluZz1udWxsKTtjPWMubmV4dH1saD0wO1A9Tz1OPW51bGw7bWg9ITE7aWYobnVsbD09PVh8fG51bGw9PT1YLnJldHVybilyZXR1cm4gUz1oaixraj1iLFg9bnVsbDthOnt2YXIgZT1hLGY9WC5yZXR1cm4sZz1YLGg9YjtiPVU7Zy5lZmZlY3RUYWd8PTIwNDg7Zy5maXJzdEVmZmVjdD1nLmxhc3RFZmZlY3Q9bnVsbDtpZihudWxsIT09aCYmXCJvYmplY3RcIj09PXR5cGVvZiBoJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgaC50aGVuKXt2YXIgaz1oO2lmKDA9PT0oZy5tb2RlJjIpKXt2YXIgbD1nLmFsdGVybmF0ZTtsPyhnLnVwZGF0ZVF1ZXVlPWwudXBkYXRlUXVldWUsZy5tZW1vaXplZFN0YXRlPWwubWVtb2l6ZWRTdGF0ZSxnLmV4cGlyYXRpb25UaW1lPWwuZXhwaXJhdGlvblRpbWUpOihnLnVwZGF0ZVF1ZXVlPVxubnVsbCxnLm1lbW9pemVkU3RhdGU9bnVsbCl9dmFyIG09MCE9PShNLmN1cnJlbnQmMSkscD1mO2Rve3ZhciB4O2lmKHg9MTM9PT1wLnRhZyl7dmFyIHo9cC5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT16KXg9bnVsbCE9PXouZGVoeWRyYXRlZD8hMDohMTtlbHNle3ZhciBjYT1wLm1lbW9pemVkUHJvcHM7eD12b2lkIDA9PT1jYS5mYWxsYmFjaz8hMTohMCE9PWNhLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrPyEwOm0/ITE6ITB9fWlmKHgpe3ZhciBEPXAudXBkYXRlUXVldWU7aWYobnVsbD09PUQpe3ZhciB0PW5ldyBTZXQ7dC5hZGQoayk7cC51cGRhdGVRdWV1ZT10fWVsc2UgRC5hZGQoayk7aWYoMD09PShwLm1vZGUmMikpe3AuZWZmZWN0VGFnfD02NDtnLmVmZmVjdFRhZyY9LTI5ODE7aWYoMT09PWcudGFnKWlmKG51bGw9PT1nLmFsdGVybmF0ZSlnLnRhZz0xNztlbHNle3ZhciB5PXdnKDEwNzM3NDE4MjMsbnVsbCk7eS50YWc9Mjt4ZyhnLHkpfWcuZXhwaXJhdGlvblRpbWU9MTA3Mzc0MTgyMztcbmJyZWFrIGF9aD12b2lkIDA7Zz1iO3ZhciBBPWUucGluZ0NhY2hlO251bGw9PT1BPyhBPWUucGluZ0NhY2hlPW5ldyBXaSxoPW5ldyBTZXQsQS5zZXQoayxoKSk6KGg9QS5nZXQoayksdm9pZCAwPT09aCYmKGg9bmV3IFNldCxBLnNldChrLGgpKSk7aWYoIWguaGFzKGcpKXtoLmFkZChnKTt2YXIgcT1Pai5iaW5kKG51bGwsZSxrLGcpO2sudGhlbihxLHEpfXAuZWZmZWN0VGFnfD00MDk2O3AuZXhwaXJhdGlvblRpbWU9YjticmVhayBhfXA9cC5yZXR1cm59d2hpbGUobnVsbCE9PXApO2g9RXJyb3IoKHBiKGcudHlwZSl8fFwiQSBSZWFjdCBjb21wb25lbnRcIikrXCIgc3VzcGVuZGVkIHdoaWxlIHJlbmRlcmluZywgYnV0IG5vIGZhbGxiYWNrIFVJIHdhcyBzcGVjaWZpZWQuXFxuXFxuQWRkIGEgPFN1c3BlbnNlIGZhbGxiYWNrPS4uLj4gY29tcG9uZW50IGhpZ2hlciBpbiB0aGUgdHJlZSB0byBwcm92aWRlIGEgbG9hZGluZyBpbmRpY2F0b3Igb3IgcGxhY2Vob2xkZXIgdG8gZGlzcGxheS5cIitxYihnKSl9UyE9PVxuamomJihTPWlqKTtoPUFpKGgsZyk7cD1mO2Rve3N3aXRjaChwLnRhZyl7Y2FzZSAzOms9aDtwLmVmZmVjdFRhZ3w9NDA5NjtwLmV4cGlyYXRpb25UaW1lPWI7dmFyIEI9WGkocCxrLGIpO3lnKHAsQik7YnJlYWsgYTtjYXNlIDE6az1oO3ZhciB3PXAudHlwZSx1Yj1wLnN0YXRlTm9kZTtpZigwPT09KHAuZWZmZWN0VGFnJjY0KSYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiB3LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8bnVsbCE9PXViJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgdWIuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09YWp8fCFhai5oYXModWIpKSkpe3AuZWZmZWN0VGFnfD00MDk2O3AuZXhwaXJhdGlvblRpbWU9Yjt2YXIgdmI9JGkocCxrLGIpO3lnKHAsdmIpO2JyZWFrIGF9fXA9cC5yZXR1cm59d2hpbGUobnVsbCE9PXApfVg9UGooWCl9Y2F0Y2goWGMpe2I9WGM7Y29udGludWV9YnJlYWt9d2hpbGUoMSl9XG5mdW5jdGlvbiBGaigpe3ZhciBhPWNqLmN1cnJlbnQ7Y2ouY3VycmVudD1zaDtyZXR1cm4gbnVsbD09PWE/c2g6YX1mdW5jdGlvbiBBZyhhLGIpe2E8bGomJjI8YSYmKGxqPWEpO251bGwhPT1iJiZhPG1qJiYyPGEmJihtaj1hLG5qPWIpfWZ1bmN0aW9uIEJnKGEpe2E+d2kmJih3aT1hKX1mdW5jdGlvbiBLaigpe2Zvcig7bnVsbCE9PVg7KVg9UWooWCl9ZnVuY3Rpb24gR2ooKXtmb3IoO251bGwhPT1YJiYhVWYoKTspWD1RaihYKX1mdW5jdGlvbiBRaihhKXt2YXIgYj1SaihhLmFsdGVybmF0ZSxhLFUpO2EubWVtb2l6ZWRQcm9wcz1hLnBlbmRpbmdQcm9wcztudWxsPT09YiYmKGI9UGooYSkpO2RqLmN1cnJlbnQ9bnVsbDtyZXR1cm4gYn1cbmZ1bmN0aW9uIFBqKGEpe1g9YTtkb3t2YXIgYj1YLmFsdGVybmF0ZTthPVgucmV0dXJuO2lmKDA9PT0oWC5lZmZlY3RUYWcmMjA0OCkpe2I9c2koYixYLFUpO2lmKDE9PT1VfHwxIT09WC5jaGlsZEV4cGlyYXRpb25UaW1lKXtmb3IodmFyIGM9MCxkPVguY2hpbGQ7bnVsbCE9PWQ7KXt2YXIgZT1kLmV4cGlyYXRpb25UaW1lLGY9ZC5jaGlsZEV4cGlyYXRpb25UaW1lO2U+YyYmKGM9ZSk7Zj5jJiYoYz1mKTtkPWQuc2libGluZ31YLmNoaWxkRXhwaXJhdGlvblRpbWU9Y31pZihudWxsIT09YilyZXR1cm4gYjtudWxsIT09YSYmMD09PShhLmVmZmVjdFRhZyYyMDQ4KSYmKG51bGw9PT1hLmZpcnN0RWZmZWN0JiYoYS5maXJzdEVmZmVjdD1YLmZpcnN0RWZmZWN0KSxudWxsIT09WC5sYXN0RWZmZWN0JiYobnVsbCE9PWEubGFzdEVmZmVjdCYmKGEubGFzdEVmZmVjdC5uZXh0RWZmZWN0PVguZmlyc3RFZmZlY3QpLGEubGFzdEVmZmVjdD1YLmxhc3RFZmZlY3QpLDE8WC5lZmZlY3RUYWcmJihudWxsIT09XG5hLmxhc3RFZmZlY3Q/YS5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9WDphLmZpcnN0RWZmZWN0PVgsYS5sYXN0RWZmZWN0PVgpKX1lbHNle2I9emkoWCk7aWYobnVsbCE9PWIpcmV0dXJuIGIuZWZmZWN0VGFnJj0yMDQ3LGI7bnVsbCE9PWEmJihhLmZpcnN0RWZmZWN0PWEubGFzdEVmZmVjdD1udWxsLGEuZWZmZWN0VGFnfD0yMDQ4KX1iPVguc2libGluZztpZihudWxsIT09YilyZXR1cm4gYjtYPWF9d2hpbGUobnVsbCE9PVgpO1M9PT10aSYmKFM9amopO3JldHVybiBudWxsfWZ1bmN0aW9uIElqKGEpe3ZhciBiPWEuZXhwaXJhdGlvblRpbWU7YT1hLmNoaWxkRXhwaXJhdGlvblRpbWU7cmV0dXJuIGI+YT9iOmF9ZnVuY3Rpb24gSmooYSl7dmFyIGI9YWcoKTtjZyg5OSxTai5iaW5kKG51bGwsYSxiKSk7cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBTaihhLGIpe2RvIERqKCk7d2hpbGUobnVsbCE9PXJqKTtpZigoVyYoZmp8Z2opKSE9PVYpdGhyb3cgRXJyb3IodSgzMjcpKTt2YXIgYz1hLmZpbmlzaGVkV29yayxkPWEuZmluaXNoZWRFeHBpcmF0aW9uVGltZTtpZihudWxsPT09YylyZXR1cm4gbnVsbDthLmZpbmlzaGVkV29yaz1udWxsO2EuZmluaXNoZWRFeHBpcmF0aW9uVGltZT0wO2lmKGM9PT1hLmN1cnJlbnQpdGhyb3cgRXJyb3IodSgxNzcpKTthLmNhbGxiYWNrTm9kZT1udWxsO2EuY2FsbGJhY2tFeHBpcmF0aW9uVGltZT0wO2EuY2FsbGJhY2tQcmlvcml0eT05MDthLm5leHRLbm93blBlbmRpbmdMZXZlbD0wO3ZhciBlPUlqKGMpO2EuZmlyc3RQZW5kaW5nVGltZT1lO2Q8PWEubGFzdFN1c3BlbmRlZFRpbWU/YS5maXJzdFN1c3BlbmRlZFRpbWU9YS5sYXN0U3VzcGVuZGVkVGltZT1hLm5leHRLbm93blBlbmRpbmdMZXZlbD0wOmQ8PWEuZmlyc3RTdXNwZW5kZWRUaW1lJiYoYS5maXJzdFN1c3BlbmRlZFRpbWU9XG5kLTEpO2Q8PWEubGFzdFBpbmdlZFRpbWUmJihhLmxhc3RQaW5nZWRUaW1lPTApO2Q8PWEubGFzdEV4cGlyZWRUaW1lJiYoYS5sYXN0RXhwaXJlZFRpbWU9MCk7YT09PVQmJihYPVQ9bnVsbCxVPTApOzE8Yy5lZmZlY3RUYWc/bnVsbCE9PWMubGFzdEVmZmVjdD8oYy5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YyxlPWMuZmlyc3RFZmZlY3QpOmU9YzplPWMuZmlyc3RFZmZlY3Q7aWYobnVsbCE9PWUpe3ZhciBmPVc7V3w9Z2o7ZGouY3VycmVudD1udWxsO0RkPWZkO3ZhciBnPXhkKCk7aWYoeWQoZykpe2lmKFwic2VsZWN0aW9uU3RhcnRcImluIGcpdmFyIGg9e3N0YXJ0Omcuc2VsZWN0aW9uU3RhcnQsZW5kOmcuc2VsZWN0aW9uRW5kfTtlbHNlIGE6e2g9KGg9Zy5vd25lckRvY3VtZW50KSYmaC5kZWZhdWx0Vmlld3x8d2luZG93O3ZhciBrPWguZ2V0U2VsZWN0aW9uJiZoLmdldFNlbGVjdGlvbigpO2lmKGsmJjAhPT1rLnJhbmdlQ291bnQpe2g9ay5hbmNob3JOb2RlO3ZhciBsPWsuYW5jaG9yT2Zmc2V0LFxubT1rLmZvY3VzTm9kZTtrPWsuZm9jdXNPZmZzZXQ7dHJ5e2gubm9kZVR5cGUsbS5ub2RlVHlwZX1jYXRjaCh3Yil7aD1udWxsO2JyZWFrIGF9dmFyIHA9MCx4PS0xLHo9LTEsY2E9MCxEPTAsdD1nLHk9bnVsbDtiOmZvcig7Oyl7Zm9yKHZhciBBOzspe3QhPT1ofHwwIT09bCYmMyE9PXQubm9kZVR5cGV8fCh4PXArbCk7dCE9PW18fDAhPT1rJiYzIT09dC5ub2RlVHlwZXx8KHo9cCtrKTszPT09dC5ub2RlVHlwZSYmKHArPXQubm9kZVZhbHVlLmxlbmd0aCk7aWYobnVsbD09PShBPXQuZmlyc3RDaGlsZCkpYnJlYWs7eT10O3Q9QX1mb3IoOzspe2lmKHQ9PT1nKWJyZWFrIGI7eT09PWgmJisrY2E9PT1sJiYoeD1wKTt5PT09bSYmKytEPT09ayYmKHo9cCk7aWYobnVsbCE9PShBPXQubmV4dFNpYmxpbmcpKWJyZWFrO3Q9eTt5PXQucGFyZW50Tm9kZX10PUF9aD0tMT09PXh8fC0xPT09ej9udWxsOntzdGFydDp4LGVuZDp6fX1lbHNlIGg9bnVsbH1oPWh8fHtzdGFydDowLGVuZDowfX1lbHNlIGg9XG5udWxsO0VkPXthY3RpdmVFbGVtZW50RGV0YWNoZWQ6bnVsbCxmb2N1c2VkRWxlbTpnLHNlbGVjdGlvblJhbmdlOmh9O2ZkPSExO1k9ZTtkbyB0cnl7VGooKX1jYXRjaCh3Yil7aWYobnVsbD09PVkpdGhyb3cgRXJyb3IodSgzMzApKTtFaShZLHdiKTtZPVkubmV4dEVmZmVjdH13aGlsZShudWxsIT09WSk7WT1lO2RvIHRyeXtmb3IoZz1hLGg9YjtudWxsIT09WTspe3ZhciBxPVkuZWZmZWN0VGFnO3EmMTYmJlJiKFkuc3RhdGVOb2RlLFwiXCIpO2lmKHEmMTI4KXt2YXIgQj1ZLmFsdGVybmF0ZTtpZihudWxsIT09Qil7dmFyIHc9Qi5yZWY7bnVsbCE9PXcmJihcImZ1bmN0aW9uXCI9PT10eXBlb2Ygdz93KG51bGwpOncuY3VycmVudD1udWxsKX19c3dpdGNoKHEmMTAzOCl7Y2FzZSAyOlBpKFkpO1kuZWZmZWN0VGFnJj0tMzticmVhaztjYXNlIDY6UGkoWSk7WS5lZmZlY3RUYWcmPS0zO1NpKFkuYWx0ZXJuYXRlLFkpO2JyZWFrO2Nhc2UgMTAyNDpZLmVmZmVjdFRhZyY9LTEwMjU7YnJlYWs7Y2FzZSAxMDI4OlkuZWZmZWN0VGFnJj1cbi0xMDI1O1NpKFkuYWx0ZXJuYXRlLFkpO2JyZWFrO2Nhc2UgNDpTaShZLmFsdGVybmF0ZSxZKTticmVhaztjYXNlIDg6bD1ZLE1pKGcsbCxoKSxOaShsKX1ZPVkubmV4dEVmZmVjdH19Y2F0Y2god2Ipe2lmKG51bGw9PT1ZKXRocm93IEVycm9yKHUoMzMwKSk7RWkoWSx3Yik7WT1ZLm5leHRFZmZlY3R9d2hpbGUobnVsbCE9PVkpO3c9RWQ7Qj14ZCgpO3E9dy5mb2N1c2VkRWxlbTtoPXcuc2VsZWN0aW9uUmFuZ2U7aWYoQiE9PXEmJnEmJnEub3duZXJEb2N1bWVudCYmd2QocS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxxKSl7bnVsbCE9PWgmJnlkKHEpJiYoQj1oLnN0YXJ0LHc9aC5lbmQsdm9pZCAwPT09dyYmKHc9QiksXCJzZWxlY3Rpb25TdGFydFwiaW4gcT8ocS5zZWxlY3Rpb25TdGFydD1CLHEuc2VsZWN0aW9uRW5kPU1hdGgubWluKHcscS52YWx1ZS5sZW5ndGgpKToodz0oQj1xLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmQi5kZWZhdWx0Vmlld3x8d2luZG93LHcuZ2V0U2VsZWN0aW9uJiZcbih3PXcuZ2V0U2VsZWN0aW9uKCksbD1xLnRleHRDb250ZW50Lmxlbmd0aCxnPU1hdGgubWluKGguc3RhcnQsbCksaD12b2lkIDA9PT1oLmVuZD9nOk1hdGgubWluKGguZW5kLGwpLCF3LmV4dGVuZCYmZz5oJiYobD1oLGg9ZyxnPWwpLGw9dmQocSxnKSxtPXZkKHEsaCksbCYmbSYmKDEhPT13LnJhbmdlQ291bnR8fHcuYW5jaG9yTm9kZSE9PWwubm9kZXx8dy5hbmNob3JPZmZzZXQhPT1sLm9mZnNldHx8dy5mb2N1c05vZGUhPT1tLm5vZGV8fHcuZm9jdXNPZmZzZXQhPT1tLm9mZnNldCkmJihCPUIuY3JlYXRlUmFuZ2UoKSxCLnNldFN0YXJ0KGwubm9kZSxsLm9mZnNldCksdy5yZW1vdmVBbGxSYW5nZXMoKSxnPmg/KHcuYWRkUmFuZ2UoQiksdy5leHRlbmQobS5ub2RlLG0ub2Zmc2V0KSk6KEIuc2V0RW5kKG0ubm9kZSxtLm9mZnNldCksdy5hZGRSYW5nZShCKSkpKSkpO0I9W107Zm9yKHc9cTt3PXcucGFyZW50Tm9kZTspMT09PXcubm9kZVR5cGUmJkIucHVzaCh7ZWxlbWVudDp3LGxlZnQ6dy5zY3JvbGxMZWZ0LFxudG9wOncuc2Nyb2xsVG9wfSk7XCJmdW5jdGlvblwiPT09dHlwZW9mIHEuZm9jdXMmJnEuZm9jdXMoKTtmb3IocT0wO3E8Qi5sZW5ndGg7cSsrKXc9QltxXSx3LmVsZW1lbnQuc2Nyb2xsTGVmdD13LmxlZnQsdy5lbGVtZW50LnNjcm9sbFRvcD13LnRvcH1mZD0hIURkO0VkPURkPW51bGw7YS5jdXJyZW50PWM7WT1lO2RvIHRyeXtmb3IocT1hO251bGwhPT1ZOyl7dmFyIHViPVkuZWZmZWN0VGFnO3ViJjM2JiZKaShxLFkuYWx0ZXJuYXRlLFkpO2lmKHViJjEyOCl7Qj12b2lkIDA7dmFyIHZiPVkucmVmO2lmKG51bGwhPT12Yil7dmFyIFhjPVkuc3RhdGVOb2RlO3N3aXRjaChZLnRhZyl7Y2FzZSA1OkI9WGM7YnJlYWs7ZGVmYXVsdDpCPVhjfVwiZnVuY3Rpb25cIj09PXR5cGVvZiB2Yj92YihCKTp2Yi5jdXJyZW50PUJ9fVk9WS5uZXh0RWZmZWN0fX1jYXRjaCh3Yil7aWYobnVsbD09PVkpdGhyb3cgRXJyb3IodSgzMzApKTtFaShZLHdiKTtZPVkubmV4dEVmZmVjdH13aGlsZShudWxsIT09WSk7WT1cbm51bGw7VmYoKTtXPWZ9ZWxzZSBhLmN1cnJlbnQ9YztpZihxailxaj0hMSxyaj1hLHNqPWI7ZWxzZSBmb3IoWT1lO251bGwhPT1ZOyliPVkubmV4dEVmZmVjdCxZLm5leHRFZmZlY3Q9bnVsbCxZPWI7Yj1hLmZpcnN0UGVuZGluZ1RpbWU7MD09PWImJihhaj1udWxsKTsxMDczNzQxODIzPT09Yj9hPT09dmo/dWorKzoodWo9MCx2aj1hKTp1aj0wO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBVaiYmVWooYy5zdGF0ZU5vZGUsZCk7WihhKTtpZihZaSl0aHJvdyBZaT0hMSxhPVppLFppPW51bGwsYTtpZigoVyZlaikhPT1WKXJldHVybiBudWxsO2dnKCk7cmV0dXJuIG51bGx9ZnVuY3Rpb24gVGooKXtmb3IoO251bGwhPT1ZOyl7dmFyIGE9WS5lZmZlY3RUYWc7MCE9PShhJjI1NikmJkdpKFkuYWx0ZXJuYXRlLFkpOzA9PT0oYSY1MTIpfHxxanx8KHFqPSEwLGRnKDk3LGZ1bmN0aW9uKCl7RGooKTtyZXR1cm4gbnVsbH0pKTtZPVkubmV4dEVmZmVjdH19XG5mdW5jdGlvbiBEaigpe2lmKDkwIT09c2ope3ZhciBhPTk3PHNqPzk3OnNqO3NqPTkwO3JldHVybiBjZyhhLFZqKX19ZnVuY3Rpb24gVmooKXtpZihudWxsPT09cmopcmV0dXJuITE7dmFyIGE9cmo7cmo9bnVsbDtpZigoVyYoZmp8Z2opKSE9PVYpdGhyb3cgRXJyb3IodSgzMzEpKTt2YXIgYj1XO1d8PWdqO2ZvcihhPWEuY3VycmVudC5maXJzdEVmZmVjdDtudWxsIT09YTspe3RyeXt2YXIgYz1hO2lmKDAhPT0oYy5lZmZlY3RUYWcmNTEyKSlzd2l0Y2goYy50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6Y2FzZSAyMjpIaSg1LGMpLElpKDUsYyl9fWNhdGNoKGQpe2lmKG51bGw9PT1hKXRocm93IEVycm9yKHUoMzMwKSk7RWkoYSxkKX1jPWEubmV4dEVmZmVjdDthLm5leHRFZmZlY3Q9bnVsbDthPWN9Vz1iO2dnKCk7cmV0dXJuITB9XG5mdW5jdGlvbiBXaihhLGIsYyl7Yj1BaShjLGIpO2I9WGkoYSxiLDEwNzM3NDE4MjMpO3hnKGEsYik7YT14aihhLDEwNzM3NDE4MjMpO251bGwhPT1hJiZaKGEpfWZ1bmN0aW9uIEVpKGEsYil7aWYoMz09PWEudGFnKVdqKGEsYSxiKTtlbHNlIGZvcih2YXIgYz1hLnJldHVybjtudWxsIT09Yzspe2lmKDM9PT1jLnRhZyl7V2ooYyxhLGIpO2JyZWFrfWVsc2UgaWYoMT09PWMudGFnKXt2YXIgZD1jLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09YWp8fCFhai5oYXMoZCkpKXthPUFpKGIsYSk7YT0kaShjLGEsMTA3Mzc0MTgyMyk7eGcoYyxhKTtjPXhqKGMsMTA3Mzc0MTgyMyk7bnVsbCE9PWMmJlooYyk7YnJlYWt9fWM9Yy5yZXR1cm59fVxuZnVuY3Rpb24gT2ooYSxiLGMpe3ZhciBkPWEucGluZ0NhY2hlO251bGwhPT1kJiZkLmRlbGV0ZShiKTtUPT09YSYmVT09PWM/Uz09PXZpfHxTPT09dWkmJjEwNzM3NDE4MjM9PT1saiYmJGYoKS1UaTxwaj9FaihhLFUpOm9qPSEwOkFqKGEsYykmJihiPWEubGFzdFBpbmdlZFRpbWUsMCE9PWImJmI8Y3x8KGEubGFzdFBpbmdlZFRpbWU9YyxaKGEpKSl9ZnVuY3Rpb24gVmkoYSxiKXt2YXIgYz1hLnN0YXRlTm9kZTtudWxsIT09YyYmYy5kZWxldGUoYik7Yj0wOzA9PT1iJiYoYj1HZygpLGI9SGcoYixhLG51bGwpKTthPXhqKGEsYik7bnVsbCE9PWEmJlooYSl9dmFyIFJqO1xuUmo9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWIuZXhwaXJhdGlvblRpbWU7aWYobnVsbCE9PWEpe3ZhciBlPWIucGVuZGluZ1Byb3BzO2lmKGEubWVtb2l6ZWRQcm9wcyE9PWV8fEsuY3VycmVudClyZz0hMDtlbHNle2lmKGQ8Yyl7cmc9ITE7c3dpdGNoKGIudGFnKXtjYXNlIDM6aGkoYik7WGgoKTticmVhaztjYXNlIDU6ZmgoYik7aWYoYi5tb2RlJjQmJjEhPT1jJiZlLmhpZGRlbilyZXR1cm4gYi5leHBpcmF0aW9uVGltZT1iLmNoaWxkRXhwaXJhdGlvblRpbWU9MSxudWxsO2JyZWFrO2Nhc2UgMTpMKGIudHlwZSkmJkdmKGIpO2JyZWFrO2Nhc2UgNDpkaChiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6ZD1iLm1lbW9pemVkUHJvcHMudmFsdWU7ZT1iLnR5cGUuX2NvbnRleHQ7SShqZyxlLl9jdXJyZW50VmFsdWUpO2UuX2N1cnJlbnRWYWx1ZT1kO2JyZWFrO2Nhc2UgMTM6aWYobnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSl7ZD1iLmNoaWxkLmNoaWxkRXhwaXJhdGlvblRpbWU7XG5pZigwIT09ZCYmZD49YylyZXR1cm4gamkoYSxiLGMpO0koTSxNLmN1cnJlbnQmMSk7Yj0kaChhLGIsYyk7cmV0dXJuIG51bGwhPT1iP2Iuc2libGluZzpudWxsfUkoTSxNLmN1cnJlbnQmMSk7YnJlYWs7Y2FzZSAxOTpkPWIuY2hpbGRFeHBpcmF0aW9uVGltZT49YztpZigwIT09KGEuZWZmZWN0VGFnJjY0KSl7aWYoZClyZXR1cm4gbWkoYSxiLGMpO2IuZWZmZWN0VGFnfD02NH1lPWIubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZSYmKGUucmVuZGVyaW5nPW51bGwsZS50YWlsPW51bGwpO0koTSxNLmN1cnJlbnQpO2lmKCFkKXJldHVybiBudWxsfXJldHVybiAkaChhLGIsYyl9cmc9ITF9fWVsc2Ugcmc9ITE7Yi5leHBpcmF0aW9uVGltZT0wO3N3aXRjaChiLnRhZyl7Y2FzZSAyOmQ9Yi50eXBlO251bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZWZmZWN0VGFnfD0yKTthPWIucGVuZGluZ1Byb3BzO2U9Q2YoYixKLmN1cnJlbnQpO3FnKGIsYyk7ZT1vaChudWxsLFxuYixkLGEsZSxjKTtiLmVmZmVjdFRhZ3w9MTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGUmJm51bGwhPT1lJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5yZW5kZXImJnZvaWQgMD09PWUuJCR0eXBlb2Ype2IudGFnPTE7Yi5tZW1vaXplZFN0YXRlPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO2lmKEwoZCkpe3ZhciBmPSEwO0dmKGIpfWVsc2UgZj0hMTtiLm1lbW9pemVkU3RhdGU9bnVsbCE9PWUuc3RhdGUmJnZvaWQgMCE9PWUuc3RhdGU/ZS5zdGF0ZTpudWxsO3VnKGIpO3ZhciBnPWQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBnJiZGZyhiLGQsZyxhKTtlLnVwZGF0ZXI9Smc7Yi5zdGF0ZU5vZGU9ZTtlLl9yZWFjdEludGVybmFsRmliZXI9YjtOZyhiLGQsYSxjKTtiPWdpKG51bGwsYixkLCEwLGYsYyl9ZWxzZSBiLnRhZz0wLFIobnVsbCxiLGUsYyksYj1iLmNoaWxkO3JldHVybiBiO2Nhc2UgMTY6YTp7ZT1iLmVsZW1lbnRUeXBlO251bGwhPT1hJiYoYS5hbHRlcm5hdGU9XG5udWxsLGIuYWx0ZXJuYXRlPW51bGwsYi5lZmZlY3RUYWd8PTIpO2E9Yi5wZW5kaW5nUHJvcHM7b2IoZSk7aWYoMSE9PWUuX3N0YXR1cyl0aHJvdyBlLl9yZXN1bHQ7ZT1lLl9yZXN1bHQ7Yi50eXBlPWU7Zj1iLnRhZz1YaihlKTthPWlnKGUsYSk7c3dpdGNoKGYpe2Nhc2UgMDpiPWRpKG51bGwsYixlLGEsYyk7YnJlYWsgYTtjYXNlIDE6Yj1maShudWxsLGIsZSxhLGMpO2JyZWFrIGE7Y2FzZSAxMTpiPVpoKG51bGwsYixlLGEsYyk7YnJlYWsgYTtjYXNlIDE0OmI9YWkobnVsbCxiLGUsaWcoZS50eXBlLGEpLGQsYyk7YnJlYWsgYX10aHJvdyBFcnJvcih1KDMwNixlLFwiXCIpKTt9cmV0dXJuIGI7Y2FzZSAwOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTppZyhkLGUpLGRpKGEsYixkLGUsYyk7Y2FzZSAxOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTppZyhkLGUpLGZpKGEsYixkLGUsYyk7XG5jYXNlIDM6aGkoYik7ZD1iLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT1hfHxudWxsPT09ZCl0aHJvdyBFcnJvcih1KDI4MikpO2Q9Yi5wZW5kaW5nUHJvcHM7ZT1iLm1lbW9pemVkU3RhdGU7ZT1udWxsIT09ZT9lLmVsZW1lbnQ6bnVsbDt2ZyhhLGIpO3pnKGIsZCxudWxsLGMpO2Q9Yi5tZW1vaXplZFN0YXRlLmVsZW1lbnQ7aWYoZD09PWUpWGgoKSxiPSRoKGEsYixjKTtlbHNle2lmKGU9Yi5zdGF0ZU5vZGUuaHlkcmF0ZSlQaD1KZChiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLmZpcnN0Q2hpbGQpLE9oPWIsZT1RaD0hMDtpZihlKWZvcihjPVlnKGIsbnVsbCxkLGMpLGIuY2hpbGQ9YztjOyljLmVmZmVjdFRhZz1jLmVmZmVjdFRhZyYtM3wxMDI0LGM9Yy5zaWJsaW5nO2Vsc2UgUihhLGIsZCxjKSxYaCgpO2I9Yi5jaGlsZH1yZXR1cm4gYjtjYXNlIDU6cmV0dXJuIGZoKGIpLG51bGw9PT1hJiZVaChiKSxkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGY9bnVsbCE9PWE/YS5tZW1vaXplZFByb3BzOlxubnVsbCxnPWUuY2hpbGRyZW4sR2QoZCxlKT9nPW51bGw6bnVsbCE9PWYmJkdkKGQsZikmJihiLmVmZmVjdFRhZ3w9MTYpLGVpKGEsYiksYi5tb2RlJjQmJjEhPT1jJiZlLmhpZGRlbj8oYi5leHBpcmF0aW9uVGltZT1iLmNoaWxkRXhwaXJhdGlvblRpbWU9MSxiPW51bGwpOihSKGEsYixnLGMpLGI9Yi5jaGlsZCksYjtjYXNlIDY6cmV0dXJuIG51bGw9PT1hJiZVaChiKSxudWxsO2Nhc2UgMTM6cmV0dXJuIGppKGEsYixjKTtjYXNlIDQ6cmV0dXJuIGRoKGIsYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksZD1iLnBlbmRpbmdQcm9wcyxudWxsPT09YT9iLmNoaWxkPVhnKGIsbnVsbCxkLGMpOlIoYSxiLGQsYyksYi5jaGlsZDtjYXNlIDExOnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTppZyhkLGUpLFpoKGEsYixkLGUsYyk7Y2FzZSA3OnJldHVybiBSKGEsYixiLnBlbmRpbmdQcm9wcyxjKSxiLmNoaWxkO2Nhc2UgODpyZXR1cm4gUihhLFxuYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixjKSxiLmNoaWxkO2Nhc2UgMTI6cmV0dXJuIFIoYSxiLGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGMpLGIuY2hpbGQ7Y2FzZSAxMDphOntkPWIudHlwZS5fY29udGV4dDtlPWIucGVuZGluZ1Byb3BzO2c9Yi5tZW1vaXplZFByb3BzO2Y9ZS52YWx1ZTt2YXIgaD1iLnR5cGUuX2NvbnRleHQ7SShqZyxoLl9jdXJyZW50VmFsdWUpO2guX2N1cnJlbnRWYWx1ZT1mO2lmKG51bGwhPT1nKWlmKGg9Zy52YWx1ZSxmPSRlKGgsZik/MDooXCJmdW5jdGlvblwiPT09dHlwZW9mIGQuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzP2QuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzKGgsZik6MTA3Mzc0MTgyMyl8MCwwPT09Zil7aWYoZy5jaGlsZHJlbj09PWUuY2hpbGRyZW4mJiFLLmN1cnJlbnQpe2I9JGgoYSxiLGMpO2JyZWFrIGF9fWVsc2UgZm9yKGg9Yi5jaGlsZCxudWxsIT09aCYmKGgucmV0dXJuPWIpO251bGwhPT1oOyl7dmFyIGs9aC5kZXBlbmRlbmNpZXM7aWYobnVsbCE9PVxuayl7Zz1oLmNoaWxkO2Zvcih2YXIgbD1rLmZpcnN0Q29udGV4dDtudWxsIT09bDspe2lmKGwuY29udGV4dD09PWQmJjAhPT0obC5vYnNlcnZlZEJpdHMmZikpezE9PT1oLnRhZyYmKGw9d2coYyxudWxsKSxsLnRhZz0yLHhnKGgsbCkpO2guZXhwaXJhdGlvblRpbWU8YyYmKGguZXhwaXJhdGlvblRpbWU9Yyk7bD1oLmFsdGVybmF0ZTtudWxsIT09bCYmbC5leHBpcmF0aW9uVGltZTxjJiYobC5leHBpcmF0aW9uVGltZT1jKTtwZyhoLnJldHVybixjKTtrLmV4cGlyYXRpb25UaW1lPGMmJihrLmV4cGlyYXRpb25UaW1lPWMpO2JyZWFrfWw9bC5uZXh0fX1lbHNlIGc9MTA9PT1oLnRhZz9oLnR5cGU9PT1iLnR5cGU/bnVsbDpoLmNoaWxkOmguY2hpbGQ7aWYobnVsbCE9PWcpZy5yZXR1cm49aDtlbHNlIGZvcihnPWg7bnVsbCE9PWc7KXtpZihnPT09Yil7Zz1udWxsO2JyZWFrfWg9Zy5zaWJsaW5nO2lmKG51bGwhPT1oKXtoLnJldHVybj1nLnJldHVybjtnPWg7YnJlYWt9Zz1nLnJldHVybn1oPVxuZ31SKGEsYixlLmNoaWxkcmVuLGMpO2I9Yi5jaGlsZH1yZXR1cm4gYjtjYXNlIDk6cmV0dXJuIGU9Yi50eXBlLGY9Yi5wZW5kaW5nUHJvcHMsZD1mLmNoaWxkcmVuLHFnKGIsYyksZT1zZyhlLGYudW5zdGFibGVfb2JzZXJ2ZWRCaXRzKSxkPWQoZSksYi5lZmZlY3RUYWd8PTEsUihhLGIsZCxjKSxiLmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIGU9Yi50eXBlLGY9aWcoZSxiLnBlbmRpbmdQcm9wcyksZj1pZyhlLnR5cGUsZiksYWkoYSxiLGUsZixkLGMpO2Nhc2UgMTU6cmV0dXJuIGNpKGEsYixiLnR5cGUsYi5wZW5kaW5nUHJvcHMsZCxjKTtjYXNlIDE3OnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTppZyhkLGUpLG51bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZWZmZWN0VGFnfD0yKSxiLnRhZz0xLEwoZCk/KGE9ITAsR2YoYikpOmE9ITEscWcoYixjKSxMZyhiLGQsZSksTmcoYixkLGUsYyksZ2kobnVsbCxcbmIsZCwhMCxhLGMpO2Nhc2UgMTk6cmV0dXJuIG1pKGEsYixjKX10aHJvdyBFcnJvcih1KDE1NixiLnRhZykpO307dmFyIFVqPW51bGwsTGk9bnVsbDtmdW5jdGlvbiBZaihhKXtpZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXylyZXR1cm4hMTt2YXIgYj1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoYi5pc0Rpc2FibGVkfHwhYi5zdXBwb3J0c0ZpYmVyKXJldHVybiEwO3RyeXt2YXIgYz1iLmluamVjdChhKTtVaj1mdW5jdGlvbihhKXt0cnl7Yi5vbkNvbW1pdEZpYmVyUm9vdChjLGEsdm9pZCAwLDY0PT09KGEuY3VycmVudC5lZmZlY3RUYWcmNjQpKX1jYXRjaChlKXt9fTtMaT1mdW5jdGlvbihhKXt0cnl7Yi5vbkNvbW1pdEZpYmVyVW5tb3VudChjLGEpfWNhdGNoKGUpe319fWNhdGNoKGQpe31yZXR1cm4hMH1cbmZ1bmN0aW9uIFpqKGEsYixjLGQpe3RoaXMudGFnPWE7dGhpcy5rZXk9Yzt0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsO3RoaXMuaW5kZXg9MDt0aGlzLnJlZj1udWxsO3RoaXMucGVuZGluZ1Byb3BzPWI7dGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGw7dGhpcy5tb2RlPWQ7dGhpcy5lZmZlY3RUYWc9MDt0aGlzLmxhc3RFZmZlY3Q9dGhpcy5maXJzdEVmZmVjdD10aGlzLm5leHRFZmZlY3Q9bnVsbDt0aGlzLmNoaWxkRXhwaXJhdGlvblRpbWU9dGhpcy5leHBpcmF0aW9uVGltZT0wO3RoaXMuYWx0ZXJuYXRlPW51bGx9ZnVuY3Rpb24gU2goYSxiLGMsZCl7cmV0dXJuIG5ldyBaaihhLGIsYyxkKX1cbmZ1bmN0aW9uIGJpKGEpe2E9YS5wcm90b3R5cGU7cmV0dXJuISghYXx8IWEuaXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gWGooYSl7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIGJpKGEpPzE6MDtpZih2b2lkIDAhPT1hJiZudWxsIT09YSl7YT1hLiQkdHlwZW9mO2lmKGE9PT1nYilyZXR1cm4gMTE7aWYoYT09PWpiKXJldHVybiAxNH1yZXR1cm4gMn1cbmZ1bmN0aW9uIFNnKGEsYil7dmFyIGM9YS5hbHRlcm5hdGU7bnVsbD09PWM/KGM9U2goYS50YWcsYixhLmtleSxhLm1vZGUpLGMuZWxlbWVudFR5cGU9YS5lbGVtZW50VHlwZSxjLnR5cGU9YS50eXBlLGMuc3RhdGVOb2RlPWEuc3RhdGVOb2RlLGMuYWx0ZXJuYXRlPWEsYS5hbHRlcm5hdGU9Yyk6KGMucGVuZGluZ1Byb3BzPWIsYy5lZmZlY3RUYWc9MCxjLm5leHRFZmZlY3Q9bnVsbCxjLmZpcnN0RWZmZWN0PW51bGwsYy5sYXN0RWZmZWN0PW51bGwpO2MuY2hpbGRFeHBpcmF0aW9uVGltZT1hLmNoaWxkRXhwaXJhdGlvblRpbWU7Yy5leHBpcmF0aW9uVGltZT1hLmV4cGlyYXRpb25UaW1lO2MuY2hpbGQ9YS5jaGlsZDtjLm1lbW9pemVkUHJvcHM9YS5tZW1vaXplZFByb3BzO2MubWVtb2l6ZWRTdGF0ZT1hLm1lbW9pemVkU3RhdGU7Yy51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlO2I9YS5kZXBlbmRlbmNpZXM7Yy5kZXBlbmRlbmNpZXM9bnVsbD09PWI/bnVsbDp7ZXhwaXJhdGlvblRpbWU6Yi5leHBpcmF0aW9uVGltZSxcbmZpcnN0Q29udGV4dDpiLmZpcnN0Q29udGV4dCxyZXNwb25kZXJzOmIucmVzcG9uZGVyc307Yy5zaWJsaW5nPWEuc2libGluZztjLmluZGV4PWEuaW5kZXg7Yy5yZWY9YS5yZWY7cmV0dXJuIGN9XG5mdW5jdGlvbiBVZyhhLGIsYyxkLGUsZil7dmFyIGc9MjtkPWE7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpYmkoYSkmJihnPTEpO2Vsc2UgaWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKWc9NTtlbHNlIGE6c3dpdGNoKGEpe2Nhc2UgYWI6cmV0dXJuIFdnKGMuY2hpbGRyZW4sZSxmLGIpO2Nhc2UgZmI6Zz04O2V8PTc7YnJlYWs7Y2FzZSBiYjpnPTg7ZXw9MTticmVhaztjYXNlIGNiOnJldHVybiBhPVNoKDEyLGMsYixlfDgpLGEuZWxlbWVudFR5cGU9Y2IsYS50eXBlPWNiLGEuZXhwaXJhdGlvblRpbWU9ZixhO2Nhc2UgaGI6cmV0dXJuIGE9U2goMTMsYyxiLGUpLGEudHlwZT1oYixhLmVsZW1lbnRUeXBlPWhiLGEuZXhwaXJhdGlvblRpbWU9ZixhO2Nhc2UgaWI6cmV0dXJuIGE9U2goMTksYyxiLGUpLGEuZWxlbWVudFR5cGU9aWIsYS5leHBpcmF0aW9uVGltZT1mLGE7ZGVmYXVsdDppZihcIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hKXN3aXRjaChhLiQkdHlwZW9mKXtjYXNlIGRiOmc9XG4xMDticmVhayBhO2Nhc2UgZWI6Zz05O2JyZWFrIGE7Y2FzZSBnYjpnPTExO2JyZWFrIGE7Y2FzZSBqYjpnPTE0O2JyZWFrIGE7Y2FzZSBrYjpnPTE2O2Q9bnVsbDticmVhayBhO2Nhc2UgbGI6Zz0yMjticmVhayBhfXRocm93IEVycm9yKHUoMTMwLG51bGw9PWE/YTp0eXBlb2YgYSxcIlwiKSk7fWI9U2goZyxjLGIsZSk7Yi5lbGVtZW50VHlwZT1hO2IudHlwZT1kO2IuZXhwaXJhdGlvblRpbWU9ZjtyZXR1cm4gYn1mdW5jdGlvbiBXZyhhLGIsYyxkKXthPVNoKDcsYSxkLGIpO2EuZXhwaXJhdGlvblRpbWU9YztyZXR1cm4gYX1mdW5jdGlvbiBUZyhhLGIsYyl7YT1TaCg2LGEsbnVsbCxiKTthLmV4cGlyYXRpb25UaW1lPWM7cmV0dXJuIGF9XG5mdW5jdGlvbiBWZyhhLGIsYyl7Yj1TaCg0LG51bGwhPT1hLmNoaWxkcmVuP2EuY2hpbGRyZW46W10sYS5rZXksYik7Yi5leHBpcmF0aW9uVGltZT1jO2Iuc3RhdGVOb2RlPXtjb250YWluZXJJbmZvOmEuY29udGFpbmVySW5mbyxwZW5kaW5nQ2hpbGRyZW46bnVsbCxpbXBsZW1lbnRhdGlvbjphLmltcGxlbWVudGF0aW9ufTtyZXR1cm4gYn1cbmZ1bmN0aW9uIGFrKGEsYixjKXt0aGlzLnRhZz1iO3RoaXMuY3VycmVudD1udWxsO3RoaXMuY29udGFpbmVySW5mbz1hO3RoaXMucGluZ0NhY2hlPXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGw7dGhpcy5maW5pc2hlZEV4cGlyYXRpb25UaW1lPTA7dGhpcy5maW5pc2hlZFdvcms9bnVsbDt0aGlzLnRpbWVvdXRIYW5kbGU9LTE7dGhpcy5wZW5kaW5nQ29udGV4dD10aGlzLmNvbnRleHQ9bnVsbDt0aGlzLmh5ZHJhdGU9Yzt0aGlzLmNhbGxiYWNrTm9kZT1udWxsO3RoaXMuY2FsbGJhY2tQcmlvcml0eT05MDt0aGlzLmxhc3RFeHBpcmVkVGltZT10aGlzLmxhc3RQaW5nZWRUaW1lPXRoaXMubmV4dEtub3duUGVuZGluZ0xldmVsPXRoaXMubGFzdFN1c3BlbmRlZFRpbWU9dGhpcy5maXJzdFN1c3BlbmRlZFRpbWU9dGhpcy5maXJzdFBlbmRpbmdUaW1lPTB9XG5mdW5jdGlvbiBBaihhLGIpe3ZhciBjPWEuZmlyc3RTdXNwZW5kZWRUaW1lO2E9YS5sYXN0U3VzcGVuZGVkVGltZTtyZXR1cm4gMCE9PWMmJmM+PWImJmE8PWJ9ZnVuY3Rpb24geGkoYSxiKXt2YXIgYz1hLmZpcnN0U3VzcGVuZGVkVGltZSxkPWEubGFzdFN1c3BlbmRlZFRpbWU7YzxiJiYoYS5maXJzdFN1c3BlbmRlZFRpbWU9Yik7aWYoZD5ifHwwPT09YylhLmxhc3RTdXNwZW5kZWRUaW1lPWI7Yjw9YS5sYXN0UGluZ2VkVGltZSYmKGEubGFzdFBpbmdlZFRpbWU9MCk7Yjw9YS5sYXN0RXhwaXJlZFRpbWUmJihhLmxhc3RFeHBpcmVkVGltZT0wKX1cbmZ1bmN0aW9uIHlpKGEsYil7Yj5hLmZpcnN0UGVuZGluZ1RpbWUmJihhLmZpcnN0UGVuZGluZ1RpbWU9Yik7dmFyIGM9YS5maXJzdFN1c3BlbmRlZFRpbWU7MCE9PWMmJihiPj1jP2EuZmlyc3RTdXNwZW5kZWRUaW1lPWEubGFzdFN1c3BlbmRlZFRpbWU9YS5uZXh0S25vd25QZW5kaW5nTGV2ZWw9MDpiPj1hLmxhc3RTdXNwZW5kZWRUaW1lJiYoYS5sYXN0U3VzcGVuZGVkVGltZT1iKzEpLGI+YS5uZXh0S25vd25QZW5kaW5nTGV2ZWwmJihhLm5leHRLbm93blBlbmRpbmdMZXZlbD1iKSl9ZnVuY3Rpb24gQ2ooYSxiKXt2YXIgYz1hLmxhc3RFeHBpcmVkVGltZTtpZigwPT09Y3x8Yz5iKWEubGFzdEV4cGlyZWRUaW1lPWJ9XG5mdW5jdGlvbiBiayhhLGIsYyxkKXt2YXIgZT1iLmN1cnJlbnQsZj1HZygpLGc9RGcuc3VzcGVuc2U7Zj1IZyhmLGUsZyk7YTppZihjKXtjPWMuX3JlYWN0SW50ZXJuYWxGaWJlcjtiOntpZihkYyhjKSE9PWN8fDEhPT1jLnRhZyl0aHJvdyBFcnJvcih1KDE3MCkpO3ZhciBoPWM7ZG97c3dpdGNoKGgudGFnKXtjYXNlIDM6aD1oLnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGI7Y2FzZSAxOmlmKEwoaC50eXBlKSl7aD1oLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDticmVhayBifX1oPWgucmV0dXJufXdoaWxlKG51bGwhPT1oKTt0aHJvdyBFcnJvcih1KDE3MSkpO31pZigxPT09Yy50YWcpe3ZhciBrPWMudHlwZTtpZihMKGspKXtjPUZmKGMsayxoKTticmVhayBhfX1jPWh9ZWxzZSBjPUFmO251bGw9PT1iLmNvbnRleHQ/Yi5jb250ZXh0PWM6Yi5wZW5kaW5nQ29udGV4dD1jO2I9d2coZixnKTtiLnBheWxvYWQ9e2VsZW1lbnQ6YX07ZD12b2lkIDA9PT1cbmQ/bnVsbDpkO251bGwhPT1kJiYoYi5jYWxsYmFjaz1kKTt4ZyhlLGIpO0lnKGUsZik7cmV0dXJuIGZ9ZnVuY3Rpb24gY2soYSl7YT1hLmN1cnJlbnQ7aWYoIWEuY2hpbGQpcmV0dXJuIG51bGw7c3dpdGNoKGEuY2hpbGQudGFnKXtjYXNlIDU6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlO2RlZmF1bHQ6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlfX1mdW5jdGlvbiBkayhhLGIpe2E9YS5tZW1vaXplZFN0YXRlO251bGwhPT1hJiZudWxsIT09YS5kZWh5ZHJhdGVkJiZhLnJldHJ5VGltZTxiJiYoYS5yZXRyeVRpbWU9Yil9ZnVuY3Rpb24gZWsoYSxiKXtkayhhLGIpOyhhPWEuYWx0ZXJuYXRlKSYmZGsoYSxiKX1cbmZ1bmN0aW9uIGZrKGEsYixjKXtjPW51bGwhPWMmJiEwPT09Yy5oeWRyYXRlO3ZhciBkPW5ldyBhayhhLGIsYyksZT1TaCgzLG51bGwsbnVsbCwyPT09Yj83OjE9PT1iPzM6MCk7ZC5jdXJyZW50PWU7ZS5zdGF0ZU5vZGU9ZDt1ZyhlKTthW09kXT1kLmN1cnJlbnQ7YyYmMCE9PWImJkpjKGEsOT09PWEubm9kZVR5cGU/YTphLm93bmVyRG9jdW1lbnQpO3RoaXMuX2ludGVybmFsUm9vdD1kfWZrLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oYSl7YmsoYSx0aGlzLl9pbnRlcm5hbFJvb3QsbnVsbCxudWxsKX07ZmsucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9pbnRlcm5hbFJvb3QsYj1hLmNvbnRhaW5lckluZm87YmsobnVsbCxhLG51bGwsZnVuY3Rpb24oKXtiW09kXT1udWxsfSl9O1xuZnVuY3Rpb24gZ2soYSl7cmV0dXJuISghYXx8MSE9PWEubm9kZVR5cGUmJjkhPT1hLm5vZGVUeXBlJiYxMSE9PWEubm9kZVR5cGUmJig4IT09YS5ub2RlVHlwZXx8XCIgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgXCIhPT1hLm5vZGVWYWx1ZSkpfWZ1bmN0aW9uIGhrKGEsYil7Ynx8KGI9YT85PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLmZpcnN0Q2hpbGQ6bnVsbCxiPSEoIWJ8fDEhPT1iLm5vZGVUeXBlfHwhYi5oYXNBdHRyaWJ1dGUoXCJkYXRhLXJlYWN0cm9vdFwiKSkpO2lmKCFiKWZvcih2YXIgYztjPWEubGFzdENoaWxkOylhLnJlbW92ZUNoaWxkKGMpO3JldHVybiBuZXcgZmsoYSwwLGI/e2h5ZHJhdGU6ITB9OnZvaWQgMCl9XG5mdW5jdGlvbiBpayhhLGIsYyxkLGUpe3ZhciBmPWMuX3JlYWN0Um9vdENvbnRhaW5lcjtpZihmKXt2YXIgZz1mLl9pbnRlcm5hbFJvb3Q7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGUpe3ZhciBoPWU7ZT1mdW5jdGlvbigpe3ZhciBhPWNrKGcpO2guY2FsbChhKX19YmsoYixnLGEsZSl9ZWxzZXtmPWMuX3JlYWN0Um9vdENvbnRhaW5lcj1oayhjLGQpO2c9Zi5faW50ZXJuYWxSb290O2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlKXt2YXIgaz1lO2U9ZnVuY3Rpb24oKXt2YXIgYT1jayhnKTtrLmNhbGwoYSl9fU5qKGZ1bmN0aW9uKCl7YmsoYixnLGEsZSl9KX1yZXR1cm4gY2soZyl9ZnVuY3Rpb24gamsoYSxiLGMpe3ZhciBkPTM8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpudWxsO3JldHVybnskJHR5cGVvZjokYSxrZXk6bnVsbD09ZD9udWxsOlwiXCIrZCxjaGlsZHJlbjphLGNvbnRhaW5lckluZm86YixpbXBsZW1lbnRhdGlvbjpjfX1cbndjPWZ1bmN0aW9uKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPWhnKEdnKCksMTUwLDEwMCk7SWcoYSxiKTtlayhhLGIpfX07eGM9ZnVuY3Rpb24oYSl7MTM9PT1hLnRhZyYmKElnKGEsMyksZWsoYSwzKSl9O3ljPWZ1bmN0aW9uKGEpe2lmKDEzPT09YS50YWcpe3ZhciBiPUdnKCk7Yj1IZyhiLGEsbnVsbCk7SWcoYSxiKTtlayhhLGIpfX07XG56YT1mdW5jdGlvbihhLGIsYyl7c3dpdGNoKGIpe2Nhc2UgXCJpbnB1dFwiOkNiKGEsYyk7Yj1jLm5hbWU7aWYoXCJyYWRpb1wiPT09Yy50eXBlJiZudWxsIT1iKXtmb3IoYz1hO2MucGFyZW50Tm9kZTspYz1jLnBhcmVudE5vZGU7Yz1jLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFtuYW1lPVwiK0pTT04uc3RyaW5naWZ5KFwiXCIrYikrJ11bdHlwZT1cInJhZGlvXCJdJyk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTtpZihkIT09YSYmZC5mb3JtPT09YS5mb3JtKXt2YXIgZT1RZChkKTtpZighZSl0aHJvdyBFcnJvcih1KDkwKSk7eWIoZCk7Q2IoZCxlKX19fWJyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOktiKGEsYyk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmI9Yy52YWx1ZSxudWxsIT1iJiZIYihhLCEhYy5tdWx0aXBsZSxiLCExKX19O0ZhPU1qO1xuR2E9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1XO1d8PTQ7dHJ5e3JldHVybiBjZyg5OCxhLmJpbmQobnVsbCxiLGMsZCxlKSl9ZmluYWxseXtXPWYsVz09PVYmJmdnKCl9fTtIYT1mdW5jdGlvbigpeyhXJigxfGZqfGdqKSk9PT1WJiYoTGooKSxEaigpKX07SWE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1XO1d8PTI7dHJ5e3JldHVybiBhKGIpfWZpbmFsbHl7Vz1jLFc9PT1WJiZnZygpfX07ZnVuY3Rpb24ga2soYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtpZighZ2soYikpdGhyb3cgRXJyb3IodSgyMDApKTtyZXR1cm4gamsoYSxiLG51bGwsYyl9dmFyIGxrPXtFdmVudHM6W05jLFBkLFFkLHhhLHRhLFhkLGZ1bmN0aW9uKGEpe2pjKGEsV2QpfSxEYSxFYSxpZCxtYyxEaix7Y3VycmVudDohMX1dfTtcbihmdW5jdGlvbihhKXt2YXIgYj1hLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO3JldHVybiBZaihuKHt9LGEse292ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6V2EuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihhKXthPWhjKGEpO3JldHVybiBudWxsPT09YT9udWxsOmEuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpmdW5jdGlvbihhKXtyZXR1cm4gYj9iKGEpOm51bGx9LGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDpudWxsLHNjaGVkdWxlUmVmcmVzaDpudWxsLHNjaGVkdWxlUm9vdDpudWxsLHNldFJlZnJlc2hIYW5kbGVyOm51bGwsZ2V0Q3VycmVudEZpYmVyOm51bGx9KSl9KSh7ZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6dGMsYnVuZGxlVHlwZTowLHZlcnNpb246XCIxNi4xMy4xXCIsXG5yZW5kZXJlclBhY2thZ2VOYW1lOlwicmVhY3QtZG9tXCJ9KTtleHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPWxrO2V4cG9ydHMuY3JlYXRlUG9ydGFsPWtrO2V4cG9ydHMuZmluZERPTU5vZGU9ZnVuY3Rpb24oYSl7aWYobnVsbD09YSlyZXR1cm4gbnVsbDtpZigxPT09YS5ub2RlVHlwZSlyZXR1cm4gYTt2YXIgYj1hLl9yZWFjdEludGVybmFsRmliZXI7aWYodm9pZCAwPT09Yil7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEucmVuZGVyKXRocm93IEVycm9yKHUoMTg4KSk7dGhyb3cgRXJyb3IodSgyNjgsT2JqZWN0LmtleXMoYSkpKTt9YT1oYyhiKTthPW51bGw9PT1hP251bGw6YS5zdGF0ZU5vZGU7cmV0dXJuIGF9O1xuZXhwb3J0cy5mbHVzaFN5bmM9ZnVuY3Rpb24oYSxiKXtpZigoVyYoZmp8Z2opKSE9PVYpdGhyb3cgRXJyb3IodSgxODcpKTt2YXIgYz1XO1d8PTE7dHJ5e3JldHVybiBjZyg5OSxhLmJpbmQobnVsbCxiKSl9ZmluYWxseXtXPWMsZ2coKX19O2V4cG9ydHMuaHlkcmF0ZT1mdW5jdGlvbihhLGIsYyl7aWYoIWdrKGIpKXRocm93IEVycm9yKHUoMjAwKSk7cmV0dXJuIGlrKG51bGwsYSxiLCEwLGMpfTtleHBvcnRzLnJlbmRlcj1mdW5jdGlvbihhLGIsYyl7aWYoIWdrKGIpKXRocm93IEVycm9yKHUoMjAwKSk7cmV0dXJuIGlrKG51bGwsYSxiLCExLGMpfTtcbmV4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZT1mdW5jdGlvbihhKXtpZighZ2soYSkpdGhyb3cgRXJyb3IodSg0MCkpO3JldHVybiBhLl9yZWFjdFJvb3RDb250YWluZXI/KE5qKGZ1bmN0aW9uKCl7aWsobnVsbCxudWxsLGEsITEsZnVuY3Rpb24oKXthLl9yZWFjdFJvb3RDb250YWluZXI9bnVsbDthW09kXT1udWxsfSl9KSwhMCk6ITF9O2V4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM9TWo7ZXhwb3J0cy51bnN0YWJsZV9jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4ga2soYSxiLDI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsKX07XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFnayhjKSl0aHJvdyBFcnJvcih1KDIwMCkpO2lmKG51bGw9PWF8fHZvaWQgMD09PWEuX3JlYWN0SW50ZXJuYWxGaWJlcil0aHJvdyBFcnJvcih1KDM4KSk7cmV0dXJuIGlrKGEsYixjLCExLGQpfTtleHBvcnRzLnZlcnNpb249XCIxNi4xMy4xXCI7XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///23\\n')},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nif (true) {\\n module.exports = __webpack_require__(25);\\n} else {}\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzPzk1YjYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsSUFBSSxJQUFxQztBQUN6QyxtQkFBbUIsbUJBQU8sQ0FBQyxFQUFtQztBQUM5RCxDQUFDLE1BQU0sRUFFTiIsImZpbGUiOiIyNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///24\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval('/** @license React v0.19.1\\n * scheduler.production.min.js\\n *\\n * Copyright (c) Facebook, Inc. and its affiliates.\\n *\\n * This source code is licensed under the MIT license found in the\\n * LICENSE file in the root directory of this source tree.\\n */\\n\\nvar f,g,h,k,l;\\nif(\"undefined\"===typeof window||\"function\"!==typeof MessageChannel){var p=null,q=null,t=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(t,0),b;}},u=Date.now();exports.unstable_now=function(){return Date.now()-u};f=function(a){null!==p?setTimeout(f,0,a):(p=a,setTimeout(t,0))};g=function(a,b){q=setTimeout(a,b)};h=function(){clearTimeout(q)};k=function(){return!1};l=exports.unstable_forceFrameRate=function(){}}else{var w=window.performance,x=window.Date,\\ny=window.setTimeout,z=window.clearTimeout;if(\"undefined\"!==typeof console){var A=window.cancelAnimationFrame;\"function\"!==typeof window.requestAnimationFrame&&console.error(\"This browser doesn\\'t support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\");\"function\"!==typeof A&&console.error(\"This browser doesn\\'t support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\")}if(\"object\"===\\ntypeof w&&\"function\"===typeof w.now)exports.unstable_now=function(){return w.now()};else{var B=x.now();exports.unstable_now=function(){return x.now()-B}}var C=!1,D=null,E=-1,F=5,G=0;k=function(){return exports.unstable_now()>=G};l=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported\"):F=0<a?Math.floor(1E3/a):5};var H=new MessageChannel,I=H.port2;H.port1.onmessage=\\nfunction(){if(null!==D){var a=exports.unstable_now();G=a+F;try{D(!0,a)?I.postMessage(null):(C=!1,D=null)}catch(b){throw I.postMessage(null),b;}}else C=!1};f=function(a){D=a;C||(C=!0,I.postMessage(null))};g=function(a,b){E=y(function(){a(exports.unstable_now())},b)};h=function(){z(E);E=-1}}function J(a,b){var c=a.length;a.push(b);a:for(;;){var d=c-1>>>1,e=a[d];if(void 0!==e&&0<K(e,b))a[d]=b,a[c]=e,c=d;else break a}}function L(a){a=a[0];return void 0===a?null:a}\\nfunction M(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var m=2*(d+1)-1,n=a[m],v=m+1,r=a[v];if(void 0!==n&&0>K(n,c))void 0!==r&&0>K(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>K(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function K(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var N=[],O=[],P=1,Q=null,R=3,S=!1,T=!1,U=!1;\\nfunction V(a){for(var b=L(O);null!==b;){if(null===b.callback)M(O);else if(b.startTime<=a)M(O),b.sortIndex=b.expirationTime,J(N,b);else break;b=L(O)}}function W(a){U=!1;V(a);if(!T)if(null!==L(N))T=!0,f(X);else{var b=L(O);null!==b&&g(W,b.startTime-a)}}\\nfunction X(a,b){T=!1;U&&(U=!1,h());S=!0;var c=R;try{V(b);for(Q=L(N);null!==Q&&(!(Q.expirationTime>b)||a&&!k());){var d=Q.callback;if(null!==d){Q.callback=null;R=Q.priorityLevel;var e=d(Q.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?Q.callback=e:Q===L(N)&&M(N);V(b)}else M(N);Q=L(N)}if(null!==Q)var m=!0;else{var n=L(O);null!==n&&g(W,n.startTime-b);m=!1}return m}finally{Q=null,R=c,S=!1}}\\nfunction Y(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var Z=l;exports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){T||S||(T=!0,f(X))};\\nexports.unstable_getCurrentPriorityLevel=function(){return R};exports.unstable_getFirstCallbackNode=function(){return L(N)};exports.unstable_next=function(a){switch(R){case 1:case 2:case 3:var b=3;break;default:b=R}var c=R;R=b;try{return a()}finally{R=c}};exports.unstable_pauseExecution=function(){};exports.unstable_requestPaint=Z;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=R;R=a;try{return b()}finally{R=c}};\\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();if(\"object\"===typeof c&&null!==c){var e=c.delay;e=\"number\"===typeof e&&0<e?d+e:d;c=\"number\"===typeof c.timeout?c.timeout:Y(a)}else c=Y(a),e=d;c=e+c;a={id:P++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,J(O,a),null===L(N)&&a===L(O)&&(U?h():U=!0,g(W,e-d))):(a.sortIndex=c,J(N,a),T||S||(T=!0,f(X)));return a};\\nexports.unstable_shouldYield=function(){var a=exports.unstable_now();V(a);var b=L(N);return b!==Q&&null!==Q&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<Q.expirationTime||k()};exports.unstable_wrapCallback=function(a){var b=R;return function(){var c=R;R=b;try{return a.apply(this,arguments)}finally{R=c}}};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanM/ZjgxOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhO0FBQ2Isb0VBQW9FLCtCQUErQixnQkFBZ0IsNkJBQTZCLFFBQVEsT0FBTyxTQUFTLDBCQUEwQixjQUFjLGdDQUFnQyxxQkFBcUIsY0FBYyxrREFBa0QsZ0JBQWdCLG1CQUFtQixhQUFhLGlCQUFpQixhQUFhLFVBQVUsK0NBQStDLEtBQUs7QUFDamQsMENBQTBDLGlDQUFpQyxrQ0FBa0MsMk1BQTJNLCtLQUErSztBQUN2ZSxvRUFBb0UsZ0JBQWdCLEtBQUssY0FBYyxnQ0FBZ0Msa0JBQWtCLDZCQUE2QixhQUFhLGtDQUFrQyxlQUFlLDRDQUE0Qyx3S0FBd0ssbUNBQW1DO0FBQzNlLFdBQVcsYUFBYSw2QkFBNkIsTUFBTSxJQUFJLDBDQUEwQyxTQUFTLDhCQUE4QixXQUFXLGNBQWMsSUFBSSwrQkFBK0IsZ0JBQWdCLGVBQWUsMEJBQTBCLEtBQUssYUFBYSxLQUFLLE1BQU0sZ0JBQWdCLGVBQWUsVUFBVSxRQUFRLEVBQUUscUJBQXFCLDBDQUEwQyxjQUFjLGNBQWMsT0FBTztBQUN2YixjQUFjLFdBQVcsZUFBZSxjQUFjLFVBQVUsT0FBTyx5QkFBeUIsSUFBSSxFQUFFLG9DQUFvQyxxRkFBcUYsK0NBQStDLGNBQWMsU0FBUyxZQUFZLGdCQUFnQiw4QkFBOEIseUJBQXlCO0FBQ3hYLGNBQWMsZUFBZSxTQUFTLEVBQUUsMEJBQTBCLGdFQUFnRSxXQUFXLFFBQVEsY0FBYyxLQUFLLEtBQUssK0JBQStCLEtBQUssV0FBVztBQUM1TixnQkFBZ0IsS0FBSyxjQUFjLEtBQUssUUFBUSxJQUFJLEtBQUssV0FBVywyQ0FBMkMsRUFBRSxpQkFBaUIsYUFBYSxnQkFBZ0Isa0JBQWtCLDZCQUE2Qix5QkFBeUIsa0RBQWtELEtBQUssVUFBVSxPQUFPLHFCQUFxQixLQUFLLFdBQVcsNkJBQTZCLEtBQUssU0FBUyxRQUFRO0FBQ3ZZLGNBQWMsVUFBVSxnQkFBZ0Isa0JBQWtCLHlCQUF5QixrQkFBa0Isb0JBQW9CLFFBQVEsZ0NBQWdDLHFDQUFxQywrQkFBK0Isa0NBQWtDLGdDQUFnQyx3Q0FBd0MsNENBQTRDLGlCQUFpQiw4Q0FBOEM7QUFDMWIsb0RBQW9ELFVBQVUsaURBQWlELGFBQWEsa0NBQWtDLFVBQVUsNkJBQTZCLE1BQU0sWUFBWSxRQUFRLElBQUksSUFBSSxXQUFXLFFBQVEsTUFBTSw2Q0FBNkMsZ0NBQWdDLCtDQUErQyxVQUFVLHlDQUF5QyxZQUFZLFFBQVEsSUFBSSxJQUFJLFdBQVcsUUFBUTtBQUM5ZCxrREFBa0QsNkJBQTZCLGtDQUFrQyxjQUFjLGlDQUFpQyw2Q0FBNkMsZ0JBQWdCLE1BQU0sR0FBRyw2RUFBNkUsaUhBQWlIO0FBQ3BhLHdDQUF3Qyw2QkFBNkIsS0FBSyxXQUFXLDZHQUE2RywwQ0FBMEMsUUFBUSxrQkFBa0IsUUFBUSxJQUFJLElBQUksK0JBQStCLFFBQVEiLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGxpY2Vuc2UgUmVhY3QgdjAuMTkuMVxuICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO3ZhciBmLGcsaCxrLGw7XG5pZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvd3x8XCJmdW5jdGlvblwiIT09dHlwZW9mIE1lc3NhZ2VDaGFubmVsKXt2YXIgcD1udWxsLHE9bnVsbCx0PWZ1bmN0aW9uKCl7aWYobnVsbCE9PXApdHJ5e3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7cCghMCxhKTtwPW51bGx9Y2F0Y2goYil7dGhyb3cgc2V0VGltZW91dCh0LDApLGI7fX0sdT1EYXRlLm5vdygpO2V4cG9ydHMudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCktdX07Zj1mdW5jdGlvbihhKXtudWxsIT09cD9zZXRUaW1lb3V0KGYsMCxhKToocD1hLHNldFRpbWVvdXQodCwwKSl9O2c9ZnVuY3Rpb24oYSxiKXtxPXNldFRpbWVvdXQoYSxiKX07aD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChxKX07az1mdW5jdGlvbigpe3JldHVybiExfTtsPWV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oKXt9fWVsc2V7dmFyIHc9d2luZG93LnBlcmZvcm1hbmNlLHg9d2luZG93LkRhdGUsXG55PXdpbmRvdy5zZXRUaW1lb3V0LHo9d2luZG93LmNsZWFyVGltZW91dDtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIGNvbnNvbGUpe3ZhciBBPXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZTtcImZ1bmN0aW9uXCIhPT10eXBlb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSYmY29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhIHBvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL2ZiLm1lL3JlYWN0LXBvbHlmaWxsc1wiKTtcImZ1bmN0aW9uXCIhPT10eXBlb2YgQSYmY29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgY2FuY2VsQW5pbWF0aW9uRnJhbWUuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgcG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vZmIubWUvcmVhY3QtcG9seWZpbGxzXCIpfWlmKFwib2JqZWN0XCI9PT1cbnR5cGVvZiB3JiZcImZ1bmN0aW9uXCI9PT10eXBlb2Ygdy5ub3cpZXhwb3J0cy51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gdy5ub3coKX07ZWxzZXt2YXIgQj14Lm5vdygpO2V4cG9ydHMudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHgubm93KCktQn19dmFyIEM9ITEsRD1udWxsLEU9LTEsRj01LEc9MDtrPWZ1bmN0aW9uKCl7cmV0dXJuIGV4cG9ydHMudW5zdGFibGVfbm93KCk+PUd9O2w9ZnVuY3Rpb24oKXt9O2V4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oYSl7MD5hfHwxMjU8YT9jb25zb2xlLmVycm9yKFwiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWVyYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCB1bnN1cHBvcnRlZFwiKTpGPTA8YT9NYXRoLmZsb29yKDFFMy9hKTo1fTt2YXIgSD1uZXcgTWVzc2FnZUNoYW5uZWwsST1ILnBvcnQyO0gucG9ydDEub25tZXNzYWdlPVxuZnVuY3Rpb24oKXtpZihudWxsIT09RCl7dmFyIGE9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtHPWErRjt0cnl7RCghMCxhKT9JLnBvc3RNZXNzYWdlKG51bGwpOihDPSExLEQ9bnVsbCl9Y2F0Y2goYil7dGhyb3cgSS5wb3N0TWVzc2FnZShudWxsKSxiO319ZWxzZSBDPSExfTtmPWZ1bmN0aW9uKGEpe0Q9YTtDfHwoQz0hMCxJLnBvc3RNZXNzYWdlKG51bGwpKX07Zz1mdW5jdGlvbihhLGIpe0U9eShmdW5jdGlvbigpe2EoZXhwb3J0cy51bnN0YWJsZV9ub3coKSl9LGIpfTtoPWZ1bmN0aW9uKCl7eihFKTtFPS0xfX1mdW5jdGlvbiBKKGEsYil7dmFyIGM9YS5sZW5ndGg7YS5wdXNoKGIpO2E6Zm9yKDs7KXt2YXIgZD1jLTE+Pj4xLGU9YVtkXTtpZih2b2lkIDAhPT1lJiYwPEsoZSxiKSlhW2RdPWIsYVtjXT1lLGM9ZDtlbHNlIGJyZWFrIGF9fWZ1bmN0aW9uIEwoYSl7YT1hWzBdO3JldHVybiB2b2lkIDA9PT1hP251bGw6YX1cbmZ1bmN0aW9uIE0oYSl7dmFyIGI9YVswXTtpZih2b2lkIDAhPT1iKXt2YXIgYz1hLnBvcCgpO2lmKGMhPT1iKXthWzBdPWM7YTpmb3IodmFyIGQ9MCxlPWEubGVuZ3RoO2Q8ZTspe3ZhciBtPTIqKGQrMSktMSxuPWFbbV0sdj1tKzEscj1hW3ZdO2lmKHZvaWQgMCE9PW4mJjA+SyhuLGMpKXZvaWQgMCE9PXImJjA+SyhyLG4pPyhhW2RdPXIsYVt2XT1jLGQ9dik6KGFbZF09bixhW21dPWMsZD1tKTtlbHNlIGlmKHZvaWQgMCE9PXImJjA+SyhyLGMpKWFbZF09cixhW3ZdPWMsZD12O2Vsc2UgYnJlYWsgYX19cmV0dXJuIGJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gSyhhLGIpe3ZhciBjPWEuc29ydEluZGV4LWIuc29ydEluZGV4O3JldHVybiAwIT09Yz9jOmEuaWQtYi5pZH12YXIgTj1bXSxPPVtdLFA9MSxRPW51bGwsUj0zLFM9ITEsVD0hMSxVPSExO1xuZnVuY3Rpb24gVihhKXtmb3IodmFyIGI9TChPKTtudWxsIT09Yjspe2lmKG51bGw9PT1iLmNhbGxiYWNrKU0oTyk7ZWxzZSBpZihiLnN0YXJ0VGltZTw9YSlNKE8pLGIuc29ydEluZGV4PWIuZXhwaXJhdGlvblRpbWUsSihOLGIpO2Vsc2UgYnJlYWs7Yj1MKE8pfX1mdW5jdGlvbiBXKGEpe1U9ITE7VihhKTtpZighVClpZihudWxsIT09TChOKSlUPSEwLGYoWCk7ZWxzZXt2YXIgYj1MKE8pO251bGwhPT1iJiZnKFcsYi5zdGFydFRpbWUtYSl9fVxuZnVuY3Rpb24gWChhLGIpe1Q9ITE7VSYmKFU9ITEsaCgpKTtTPSEwO3ZhciBjPVI7dHJ5e1YoYik7Zm9yKFE9TChOKTtudWxsIT09USYmKCEoUS5leHBpcmF0aW9uVGltZT5iKXx8YSYmIWsoKSk7KXt2YXIgZD1RLmNhbGxiYWNrO2lmKG51bGwhPT1kKXtRLmNhbGxiYWNrPW51bGw7Uj1RLnByaW9yaXR5TGV2ZWw7dmFyIGU9ZChRLmV4cGlyYXRpb25UaW1lPD1iKTtiPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGU/US5jYWxsYmFjaz1lOlE9PT1MKE4pJiZNKE4pO1YoYil9ZWxzZSBNKE4pO1E9TChOKX1pZihudWxsIT09USl2YXIgbT0hMDtlbHNle3ZhciBuPUwoTyk7bnVsbCE9PW4mJmcoVyxuLnN0YXJ0VGltZS1iKTttPSExfXJldHVybiBtfWZpbmFsbHl7UT1udWxsLFI9YyxTPSExfX1cbmZ1bmN0aW9uIFkoYSl7c3dpdGNoKGEpe2Nhc2UgMTpyZXR1cm4tMTtjYXNlIDI6cmV0dXJuIDI1MDtjYXNlIDU6cmV0dXJuIDEwNzM3NDE4MjM7Y2FzZSA0OnJldHVybiAxRTQ7ZGVmYXVsdDpyZXR1cm4gNUUzfX12YXIgWj1sO2V4cG9ydHMudW5zdGFibGVfSWRsZVByaW9yaXR5PTU7ZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eT0xO2V4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHk9NDtleHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5PTM7ZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmc9bnVsbDtleHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5PTI7ZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihhKXthLmNhbGxiYWNrPW51bGx9O2V4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb249ZnVuY3Rpb24oKXtUfHxTfHwoVD0hMCxmKFgpKX07XG5leHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIFJ9O2V4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gTChOKX07ZXhwb3J0cy51bnN0YWJsZV9uZXh0PWZ1bmN0aW9uKGEpe3N3aXRjaChSKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgYj0zO2JyZWFrO2RlZmF1bHQ6Yj1SfXZhciBjPVI7Uj1iO3RyeXtyZXR1cm4gYSgpfWZpbmFsbHl7Uj1jfX07ZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbj1mdW5jdGlvbigpe307ZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9WjtleHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihhLGIpe3N3aXRjaChhKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6YT0zfXZhciBjPVI7Uj1hO3RyeXtyZXR1cm4gYigpfWZpbmFsbHl7Uj1jfX07XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWV4cG9ydHMudW5zdGFibGVfbm93KCk7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yyl7dmFyIGU9Yy5kZWxheTtlPVwibnVtYmVyXCI9PT10eXBlb2YgZSYmMDxlP2QrZTpkO2M9XCJudW1iZXJcIj09PXR5cGVvZiBjLnRpbWVvdXQ/Yy50aW1lb3V0OlkoYSl9ZWxzZSBjPVkoYSksZT1kO2M9ZStjO2E9e2lkOlArKyxjYWxsYmFjazpiLHByaW9yaXR5TGV2ZWw6YSxzdGFydFRpbWU6ZSxleHBpcmF0aW9uVGltZTpjLHNvcnRJbmRleDotMX07ZT5kPyhhLnNvcnRJbmRleD1lLEooTyxhKSxudWxsPT09TChOKSYmYT09PUwoTykmJihVP2goKTpVPSEwLGcoVyxlLWQpKSk6KGEuc29ydEluZGV4PWMsSihOLGEpLFR8fFN8fChUPSEwLGYoWCkpKTtyZXR1cm4gYX07XG5leHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkPWZ1bmN0aW9uKCl7dmFyIGE9ZXhwb3J0cy51bnN0YWJsZV9ub3coKTtWKGEpO3ZhciBiPUwoTik7cmV0dXJuIGIhPT1RJiZudWxsIT09USYmbnVsbCE9PWImJm51bGwhPT1iLmNhbGxiYWNrJiZiLnN0YXJ0VGltZTw9YSYmYi5leHBpcmF0aW9uVGltZTxRLmV4cGlyYXRpb25UaW1lfHxrKCl9O2V4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPVI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9UjtSPWI7dHJ5e3JldHVybiBhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e1I9Y319fTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///25\\n')},function(module,exports,__webpack_require__){eval(\"/**\\n * Copyright (c) 2013-present, Facebook, Inc.\\n *\\n * This source code is licensed under the MIT license found in the\\n * LICENSE file in the root directory of this source tree.\\n */\\n\\nif (false) { var throwOnDirectAccess, ReactIs; } else {\\n // By explicitly using `prop-types` you are opting into new production behavior.\\n // http://fb.me/prop-types-in-prod\\n module.exports = __webpack_require__(27)();\\n}\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcz82ZTBmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLEtBQXFDLEVBQUUscUNBTzFDO0FBQ0Q7QUFDQTtBQUNBLG1CQUFtQixtQkFBTyxDQUFDLEVBQTRCO0FBQ3ZEIiwiZmlsZSI6IjI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///26\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"/**\\n * Copyright (c) 2013-present, Facebook, Inc.\\n *\\n * This source code is licensed under the MIT license found in the\\n * LICENSE file in the root directory of this source tree.\\n */\\n\\n\\n\\nvar ReactPropTypesSecret = __webpack_require__(28);\\n\\nfunction emptyFunction() {}\\nfunction emptyFunctionWithReset() {}\\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\\n\\nmodule.exports = function() {\\n function shim(props, propName, componentName, location, propFullName, secret) {\\n if (secret === ReactPropTypesSecret) {\\n // It is still safe when called from React.\\n return;\\n }\\n var err = new Error(\\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\\n 'Use PropTypes.checkPropTypes() to call them. ' +\\n 'Read more at http://fb.me/use-check-prop-types'\\n );\\n err.name = 'Invariant Violation';\\n throw err;\\n };\\n shim.isRequired = shim;\\n function getShim() {\\n return shim;\\n };\\n // Important!\\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\\n var ReactPropTypes = {\\n array: shim,\\n bool: shim,\\n func: shim,\\n number: shim,\\n object: shim,\\n string: shim,\\n symbol: shim,\\n\\n any: shim,\\n arrayOf: getShim,\\n element: shim,\\n elementType: shim,\\n instanceOf: getShim,\\n node: shim,\\n objectOf: getShim,\\n oneOf: getShim,\\n oneOfType: getShim,\\n shape: getShim,\\n exact: getShim,\\n\\n checkPropTypes: emptyFunctionWithReset,\\n resetWarningCache: emptyFunction\\n };\\n\\n ReactPropTypes.PropTypes = ReactPropTypes;\\n\\n return ReactPropTypes;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanM/YWE4NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsMkJBQTJCLG1CQUFPLENBQUMsRUFBNEI7O0FBRS9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjI3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb24oKSB7fVxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbldpdGhSZXNldCgpIHt9XG5lbXB0eUZ1bmN0aW9uV2l0aFJlc2V0LnJlc2V0V2FybmluZ0NhY2hlID0gZW1wdHlGdW5jdGlvbjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gc2hpbShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIGlmIChzZWNyZXQgPT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAvLyBJdCBpcyBzdGlsbCBzYWZlIHdoZW4gY2FsbGVkIGZyb20gUmVhY3QuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAnVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICApO1xuICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIHRocm93IGVycjtcbiAgfTtcbiAgc2hpbS5pc1JlcXVpcmVkID0gc2hpbTtcbiAgZnVuY3Rpb24gZ2V0U2hpbSgpIHtcbiAgICByZXR1cm4gc2hpbTtcbiAgfTtcbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBzaGltLFxuICAgIGJvb2w6IHNoaW0sXG4gICAgZnVuYzogc2hpbSxcbiAgICBudW1iZXI6IHNoaW0sXG4gICAgb2JqZWN0OiBzaGltLFxuICAgIHN0cmluZzogc2hpbSxcbiAgICBzeW1ib2w6IHNoaW0sXG5cbiAgICBhbnk6IHNoaW0sXG4gICAgYXJyYXlPZjogZ2V0U2hpbSxcbiAgICBlbGVtZW50OiBzaGltLFxuICAgIGVsZW1lbnRUeXBlOiBzaGltLFxuICAgIGluc3RhbmNlT2Y6IGdldFNoaW0sXG4gICAgbm9kZTogc2hpbSxcbiAgICBvYmplY3RPZjogZ2V0U2hpbSxcbiAgICBvbmVPZjogZ2V0U2hpbSxcbiAgICBvbmVPZlR5cGU6IGdldFNoaW0sXG4gICAgc2hhcGU6IGdldFNoaW0sXG4gICAgZXhhY3Q6IGdldFNoaW0sXG5cbiAgICBjaGVja1Byb3BUeXBlczogZW1wdHlGdW5jdGlvbldpdGhSZXNldCxcbiAgICByZXNldFdhcm5pbmdDYWNoZTogZW1wdHlGdW5jdGlvblxuICB9O1xuXG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///27\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"/**\\n * Copyright (c) 2013-present, Facebook, Inc.\\n *\\n * This source code is licensed under the MIT license found in the\\n * LICENSE file in the root directory of this source tree.\\n */\\n\\n\\n\\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\\n\\nmodule.exports = ReactPropTypesSecret;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanM/MTkyMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7O0FBRUEiLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///28\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval('/** @license React v16.13.1\\n * react-is.production.min.js\\n *\\n * Copyright (c) Facebook, Inc. and its affiliates.\\n *\\n * This source code is licensed under the MIT license found in the\\n * LICENSE file in the root directory of this source tree.\\n */\\n\\nvar b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzPzVlM2QiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTtBQUNiO0FBQ0EsY0FBYyxrQ0FBa0MsaUJBQWlCLFVBQVUsMEJBQTBCLG1EQUFtRCxrQ0FBa0MsNENBQTRDLGtCQUFrQixrQkFBa0IsY0FBYyxnQkFBZ0Isb0JBQW9CLHlCQUF5QiwwQkFBMEIsMEJBQTBCLGtCQUFrQixxQkFBcUIsbUJBQW1CLGVBQWUsZUFBZTtBQUNqZSxtQkFBbUIscUJBQXFCLG1CQUFtQixnQ0FBZ0MsdUJBQXVCLDJCQUEyQixzQ0FBc0MsaUJBQWlCLHNDQUFzQyxpQkFBaUIsOEJBQThCLHFEQUFxRCxpQ0FBaUMsaUJBQWlCLCtCQUErQixpQkFBaUIsMkJBQTJCO0FBQzNjLDJCQUEyQixpQkFBaUIsNkJBQTZCLGlCQUFpQiwrQkFBK0IsaUJBQWlCLGlDQUFpQyxpQkFBaUIsK0JBQStCO0FBQzNOLHVDQUF1Qyw2UUFBNlEiLCJmaWxlIjoiMjkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO3ZhciBiPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3IsYz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpOjYwMTAzLGQ9Yj9TeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpOjYwMTA2LGU9Yj9TeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIik6NjAxMDcsZj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTo2MDEwOCxnPWI/U3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpOjYwMTE0LGg9Yj9TeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIik6NjAxMDksaz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpOjYwMTEwLGw9Yj9TeW1ib2wuZm9yKFwicmVhY3QuYXN5bmNfbW9kZVwiKTo2MDExMSxtPWI/U3ltYm9sLmZvcihcInJlYWN0LmNvbmN1cnJlbnRfbW9kZVwiKTo2MDExMSxuPWI/U3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpOjYwMTEyLHA9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIik6NjAxMTMscT1iP1xuU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIik6NjAxMjAscj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpOjYwMTE1LHQ9Yj9TeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKTo2MDExNix2PWI/U3ltYm9sLmZvcihcInJlYWN0LmJsb2NrXCIpOjYwMTIxLHc9Yj9TeW1ib2wuZm9yKFwicmVhY3QuZnVuZGFtZW50YWxcIik6NjAxMTcseD1iP1N5bWJvbC5mb3IoXCJyZWFjdC5yZXNwb25kZXJcIik6NjAxMTgseT1iP1N5bWJvbC5mb3IoXCJyZWFjdC5zY29wZVwiKTo2MDExOTtcbmZ1bmN0aW9uIHooYSl7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSl7dmFyIHU9YS4kJHR5cGVvZjtzd2l0Y2godSl7Y2FzZSBjOnN3aXRjaChhPWEudHlwZSxhKXtjYXNlIGw6Y2FzZSBtOmNhc2UgZTpjYXNlIGc6Y2FzZSBmOmNhc2UgcDpyZXR1cm4gYTtkZWZhdWx0OnN3aXRjaChhPWEmJmEuJCR0eXBlb2YsYSl7Y2FzZSBrOmNhc2UgbjpjYXNlIHQ6Y2FzZSByOmNhc2UgaDpyZXR1cm4gYTtkZWZhdWx0OnJldHVybiB1fX1jYXNlIGQ6cmV0dXJuIHV9fX1mdW5jdGlvbiBBKGEpe3JldHVybiB6KGEpPT09bX1leHBvcnRzLkFzeW5jTW9kZT1sO2V4cG9ydHMuQ29uY3VycmVudE1vZGU9bTtleHBvcnRzLkNvbnRleHRDb25zdW1lcj1rO2V4cG9ydHMuQ29udGV4dFByb3ZpZGVyPWg7ZXhwb3J0cy5FbGVtZW50PWM7ZXhwb3J0cy5Gb3J3YXJkUmVmPW47ZXhwb3J0cy5GcmFnbWVudD1lO2V4cG9ydHMuTGF6eT10O2V4cG9ydHMuTWVtbz1yO2V4cG9ydHMuUG9ydGFsPWQ7XG5leHBvcnRzLlByb2ZpbGVyPWc7ZXhwb3J0cy5TdHJpY3RNb2RlPWY7ZXhwb3J0cy5TdXNwZW5zZT1wO2V4cG9ydHMuaXNBc3luY01vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIEEoYSl8fHooYSk9PT1sfTtleHBvcnRzLmlzQ29uY3VycmVudE1vZGU9QTtleHBvcnRzLmlzQ29udGV4dENvbnN1bWVyPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09a307ZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlcj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWh9O2V4cG9ydHMuaXNFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJmEuJCR0eXBlb2Y9PT1jfTtleHBvcnRzLmlzRm9yd2FyZFJlZj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PW59O2V4cG9ydHMuaXNGcmFnbWVudD1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWV9O2V4cG9ydHMuaXNMYXp5PWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09dH07XG5leHBvcnRzLmlzTWVtbz1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PXJ9O2V4cG9ydHMuaXNQb3J0YWw9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1kfTtleHBvcnRzLmlzUHJvZmlsZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1nfTtleHBvcnRzLmlzU3RyaWN0TW9kZT1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWZ9O2V4cG9ydHMuaXNTdXNwZW5zZT1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PXB9O1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGU9ZnVuY3Rpb24oYSl7cmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBhfHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgYXx8YT09PWV8fGE9PT1tfHxhPT09Z3x8YT09PWZ8fGE9PT1wfHxhPT09cXx8XCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmKGEuJCR0eXBlb2Y9PT10fHxhLiQkdHlwZW9mPT09cnx8YS4kJHR5cGVvZj09PWh8fGEuJCR0eXBlb2Y9PT1rfHxhLiQkdHlwZW9mPT09bnx8YS4kJHR5cGVvZj09PXd8fGEuJCR0eXBlb2Y9PT14fHxhLiQkdHlwZW9mPT09eXx8YS4kJHR5cGVvZj09PXYpfTtleHBvcnRzLnR5cGVPZj16O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///29\\n')},function(module,exports){eval('module.exports = function(originalModule) {\\n\\tif (!originalModule.webpackPolyfill) {\\n\\t\\tvar module = Object.create(originalModule);\\n\\t\\t// module.parent = undefined by default\\n\\t\\tif (!module.children) module.children = [];\\n\\t\\tObject.defineProperty(module, \"loaded\", {\\n\\t\\t\\tenumerable: true,\\n\\t\\t\\tget: function() {\\n\\t\\t\\t\\treturn module.l;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tObject.defineProperty(module, \"id\", {\\n\\t\\t\\tenumerable: true,\\n\\t\\t\\tget: function() {\\n\\t\\t\\t\\treturn module.i;\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tObject.defineProperty(module, \"exports\", {\\n\\t\\t\\tenumerable: true\\n\\t\\t});\\n\\t\\tmodule.webpackPolyfill = 1;\\n\\t}\\n\\treturn module;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vaGFybW9ueS1tb2R1bGUuanM/NDllMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9yaWdpbmFsTW9kdWxlKSB7XG5cdGlmICghb3JpZ2luYWxNb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0dmFyIG1vZHVsZSA9IE9iamVjdC5jcmVhdGUob3JpZ2luYWxNb2R1bGUpO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImV4cG9ydHNcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///30\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nconst rawInitialState = {\\n data: null,\\n sweepStatus: null,\\n selectedDataPoint: null,\\n training: true,\\n testing: true,\\n newError: true,\\n strictImitation: true,\\n error: null,\\n loading: false\\n};\\nconst initialState = window[\"WIDGET_STATE\"] || rawInitialState;\\nfunction rootReducer(state = initialState, action) {\\n switch (action.type) {\\n case \"TOGGLE_TRAINING\":\\n return Object.assign({}, state, { training: !state.training });\\n case \"TOGGLE_TESTING\":\\n return Object.assign({}, state, { testing: !state.testing });\\n case \"TOGGLE_NEW_ERROR\":\\n return Object.assign({}, state, { newError: !state.newError });\\n case \"TOGGLE_STRICT_IMITATION\":\\n return Object.assign({}, state, { strictImitation: !state.strictImitation });\\n case \"SELECT_DATA_POINT\":\\n return Object.assign({}, state, { selectedDataPoint: action.dataPoint });\\n case \"REQUEST_TRAINING_AND_TESTING_DATA\":\\n return Object.assign({}, state, { loading: true });\\n case \"REQUEST_TRAINING_AND_TESTING_DATA_SUCCEEDED\":\\n return Object.assign({}, state, { data: action.data, loading: false, error: null });\\n case \"REQUEST_TRAINING_AND_TESTING_DATA_FAILED\":\\n console.log(\"Error: \", action.error);\\n return Object.assign({}, state, { error: \"Failed to load training and testing data\", loading: false });\\n case \"REQUEST_MODEL_EVALUATION_DATA\":\\n return Object.assign({}, state, { loading: true });\\n case \"REQUEST_MODEL_EVALUATION_DATA_SUCCEEDED\":\\n return Object.assign({}, state, { selectedDataPoint: action.evaluationData, loading: false });\\n case \"REQUEST_MODEL_EVALUATION_DATA_FAILED\":\\n console.log(\"Error: \", action.error);\\n return Object.assign({}, state, { error: \"Failed to load evaluation data\", loading: false });\\n case \"REQUEST_SWEEP_STATUS_SUCCEEDED\":\\n return Object.assign({}, state, { sweepStatus: action.sweepStatus });\\n case \"REQUEST_SWEEP_STATUS_FAILED\":\\n console.log(\"Error: \", action.error);\\n return Object.assign({}, state, { error: \"Failed to get sweep status\" });\\n default:\\n return state;\\n }\\n}\\nexports.default = rootReducer;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvcmVkdWNlcnMudHM/ODMxMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE1BQU0sZUFBZSxHQUFHO0lBQ3JCLElBQUksRUFBRSxJQUFJO0lBQ1YsV0FBVyxFQUFFLElBQUk7SUFDakIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixRQUFRLEVBQUUsSUFBSTtJQUNkLE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLElBQUk7SUFDZCxlQUFlLEVBQUUsSUFBSTtJQUNyQixLQUFLLEVBQUUsSUFBSTtJQUNYLE9BQU8sRUFBRSxLQUFLO0NBQ2hCO0FBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLGVBQWUsQ0FBQztBQUUvRCxTQUFTLFdBQVcsQ0FBQyxLQUFLLEdBQUcsWUFBWSxFQUFFLE1BQU07SUFDN0MsUUFBTyxNQUFNLENBQUMsSUFBSSxFQUFFO1FBQ2hCLEtBQUssaUJBQWlCO1lBQ3BCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUM7UUFFL0QsS0FBSyxnQkFBZ0I7WUFDbkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUU3RCxLQUFLLGtCQUFrQjtZQUNyQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDO1FBRS9ELEtBQUsseUJBQXlCO1lBQzVCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUMsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBQyxDQUFDLENBQUM7UUFFN0UsS0FBSyxtQkFBbUI7WUFDdEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQztRQUV6RSxLQUFLLG1DQUFtQztZQUN0QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBRW5ELEtBQUssNkNBQTZDO1lBQ2hELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUVwRixLQUFLLDBDQUEwQztZQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsMENBQTBDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7UUFFdkcsS0FBSywrQkFBK0I7WUFDbEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUVuRCxLQUFLLHlDQUF5QztZQUM1QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7UUFFOUYsS0FBSyxzQ0FBc0M7WUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLGdDQUFnQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBRTdGLEtBQUssZ0NBQWdDO1lBQ25DLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUMsQ0FBQyxDQUFDO1FBRXJFLEtBQUssNkJBQTZCO1lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSw0QkFBNEIsRUFBQyxDQUFDLENBQUM7UUFFekU7WUFDSSxPQUFPLEtBQUs7S0FDbkI7QUFDTCxDQUFDO0FBRUQsa0JBQWUsV0FBVyxDQUFDIiwiZmlsZSI6IjMxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcmF3SW5pdGlhbFN0YXRlID0ge1xuICAgZGF0YTogbnVsbCxcbiAgIHN3ZWVwU3RhdHVzOiBudWxsLFxuICAgc2VsZWN0ZWREYXRhUG9pbnQ6IG51bGwsXG4gICB0cmFpbmluZzogdHJ1ZSxcbiAgIHRlc3Rpbmc6IHRydWUsXG4gICBuZXdFcnJvcjogdHJ1ZSxcbiAgIHN0cmljdEltaXRhdGlvbjogdHJ1ZSxcbiAgIGVycm9yOiBudWxsLFxuICAgbG9hZGluZzogZmFsc2Vcbn1cblxuY29uc3QgaW5pdGlhbFN0YXRlID0gd2luZG93W1wiV0lER0VUX1NUQVRFXCJdIHx8IHJhd0luaXRpYWxTdGF0ZTtcblxuZnVuY3Rpb24gcm9vdFJlZHVjZXIoc3RhdGUgPSBpbml0aWFsU3RhdGUsIGFjdGlvbikge1xuICAgIHN3aXRjaChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlIFwiVE9HR0xFX1RSQUlOSU5HXCI6XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7dHJhaW5pbmc6ICFzdGF0ZS50cmFpbmluZ30pO1xuXG4gICAgICAgIGNhc2UgXCJUT0dHTEVfVEVTVElOR1wiOlxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge3Rlc3Rpbmc6ICFzdGF0ZS50ZXN0aW5nfSk7XG5cbiAgICAgICAgY2FzZSBcIlRPR0dMRV9ORVdfRVJST1JcIjpcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtuZXdFcnJvcjogIXN0YXRlLm5ld0Vycm9yfSk7XG5cbiAgICAgICAgY2FzZSBcIlRPR0dMRV9TVFJJQ1RfSU1JVEFUSU9OXCI6XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7c3RyaWN0SW1pdGF0aW9uOiAhc3RhdGUuc3RyaWN0SW1pdGF0aW9ufSk7XG5cbiAgICAgICAgY2FzZSBcIlNFTEVDVF9EQVRBX1BPSU5UXCI6XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7c2VsZWN0ZWREYXRhUG9pbnQ6IGFjdGlvbi5kYXRhUG9pbnR9KTtcblxuICAgICAgICBjYXNlIFwiUkVRVUVTVF9UUkFJTklOR19BTkRfVEVTVElOR19EQVRBXCI6XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7bG9hZGluZzogdHJ1ZX0pO1xuXG4gICAgICAgIGNhc2UgXCJSRVFVRVNUX1RSQUlOSU5HX0FORF9URVNUSU5HX0RBVEFfU1VDQ0VFREVEXCI6XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7ZGF0YTogYWN0aW9uLmRhdGEsIGxvYWRpbmc6IGZhbHNlLCBlcnJvcjogbnVsbH0pO1xuXG4gICAgICAgIGNhc2UgXCJSRVFVRVNUX1RSQUlOSU5HX0FORF9URVNUSU5HX0RBVEFfRkFJTEVEXCI6XG4gICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvcjogXCIsIGFjdGlvbi5lcnJvcik7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7ZXJyb3I6IFwiRmFpbGVkIHRvIGxvYWQgdHJhaW5pbmcgYW5kIHRlc3RpbmcgZGF0YVwiLCBsb2FkaW5nOiBmYWxzZX0pO1xuXG4gICAgICAgIGNhc2UgXCJSRVFVRVNUX01PREVMX0VWQUxVQVRJT05fREFUQVwiOlxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge2xvYWRpbmc6IHRydWV9KTtcblxuICAgICAgICBjYXNlIFwiUkVRVUVTVF9NT0RFTF9FVkFMVUFUSU9OX0RBVEFfU1VDQ0VFREVEXCI6XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7c2VsZWN0ZWREYXRhUG9pbnQ6IGFjdGlvbi5ldmFsdWF0aW9uRGF0YSwgbG9hZGluZzogZmFsc2V9KTtcblxuICAgICAgICBjYXNlIFwiUkVRVUVTVF9NT0RFTF9FVkFMVUFUSU9OX0RBVEFfRkFJTEVEXCI6XG4gICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvcjogXCIsIGFjdGlvbi5lcnJvcik7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7ZXJyb3I6IFwiRmFpbGVkIHRvIGxvYWQgZXZhbHVhdGlvbiBkYXRhXCIsIGxvYWRpbmc6IGZhbHNlfSk7XG5cbiAgICAgICAgY2FzZSBcIlJFUVVFU1RfU1dFRVBfU1RBVFVTX1NVQ0NFRURFRFwiOlxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge3N3ZWVwU3RhdHVzOiBhY3Rpb24uc3dlZXBTdGF0dXN9KTtcblxuICAgICAgICBjYXNlIFwiUkVRVUVTVF9TV0VFUF9TVEFUVVNfRkFJTEVEXCI6XG4gICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvcjogXCIsIGFjdGlvbi5lcnJvcik7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7ZXJyb3I6IFwiRmFpbGVkIHRvIGdldCBzd2VlcCBzdGF0dXNcIn0pO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJvb3RSZWR1Y2VyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///31\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('\\nvar __importDefault = (this && this.__importDefault) || function (mod) {\\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\\n};\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nconst react_1 = __importDefault(__webpack_require__(0));\\nconst PerformanceCompatibility_tsx_1 = __importDefault(__webpack_require__(33));\\nconst IntersectionBetweenModelErrors_tsx_1 = __importDefault(__webpack_require__(34));\\nconst IncompatiblePointDistribution_tsx_1 = __importDefault(__webpack_require__(35));\\nconst RawValues_tsx_1 = __importDefault(__webpack_require__(36));\\nconst ErrorInstancesTable_tsx_1 = __importDefault(__webpack_require__(37));\\nconst DataSelector_tsx_1 = __importDefault(__webpack_require__(38));\\nconst SweepManager_tsx_1 = __importDefault(__webpack_require__(39));\\nconst redux_1 = __webpack_require__(2);\\nconst react_redux_1 = __webpack_require__(18);\\nconst actions_ts_1 = __webpack_require__(40);\\nfunction Container({ data, sweepStatus, selectedDataPoint, training, testing, newError, strictImitation, error, loading, toggleTraining, toggleTesting, toggleNewError, toggleStrictImitation, selectDataPoint, getTrainingAndTestingData, getModelEvaluationData, getSweepStatus, startSweep }) {\\n if (loading) {\\n return (react_1.default.createElement(\"div\", null, \"Loading...\"));\\n }\\n else if (error != null) {\\n return (react_1.default.createElement(\"div\", null, \"Error loading data\"));\\n }\\n else if (error == null && data == null) {\\n getTrainingAndTestingData();\\n return (react_1.default.createElement(\"div\", null, \"Loading...\"));\\n }\\n else if (error == null && data.length == 0 && sweepStatus == null) {\\n return (react_1.default.createElement(\"div\", { className: \"container\" },\\n react_1.default.createElement(\"div\", { className: \"row\" },\\n react_1.default.createElement(SweepManager_tsx_1.default, { sweepStatus: sweepStatus, getSweepStatus: getSweepStatus, startSweep: startSweep, getTrainingAndTestingData: getTrainingAndTestingData }))));\\n }\\n return (react_1.default.createElement(\"div\", { className: \"container\" },\\n react_1.default.createElement(\"div\", { className: \"row\" },\\n react_1.default.createElement(SweepManager_tsx_1.default, { sweepStatus: sweepStatus, getSweepStatus: getSweepStatus, startSweep: startSweep, getTrainingAndTestingData: getTrainingAndTestingData })),\\n react_1.default.createElement(\"div\", { className: \"row\" },\\n react_1.default.createElement(DataSelector_tsx_1.default, { toggleTraining: toggleTraining, toggleTesting: toggleTesting, toggleNewError: toggleNewError, toggleStrictImitation: toggleStrictImitation })),\\n react_1.default.createElement(\"div\", { className: \"row\" },\\n (selectedDataPoint != null) ? (react_1.default.createElement(\"div\", null,\\n \"lambda_c: \",\\n selectedDataPoint.lambda_c)) : (react_1.default.createElement(\"div\", null)),\\n react_1.default.createElement(PerformanceCompatibility_tsx_1.default, { data: data, training: training, testing: testing, newError: newError, strictImitation: strictImitation, compatibilityScoreType: \"btc\", selectDataPoint: selectDataPoint, getModelEvaluationData: getModelEvaluationData }),\\n react_1.default.createElement(PerformanceCompatibility_tsx_1.default, { data: data, training: training, testing: testing, newError: newError, strictImitation: strictImitation, compatibilityScoreType: \"bec\", selectDataPoint: selectDataPoint, getModelEvaluationData: getModelEvaluationData })),\\n react_1.default.createElement(\"div\", { className: \"row\" },\\n react_1.default.createElement(IntersectionBetweenModelErrors_tsx_1.default, { selectedDataPoint: selectedDataPoint }),\\n react_1.default.createElement(IncompatiblePointDistribution_tsx_1.default, { selectedDataPoint: selectedDataPoint })),\\n react_1.default.createElement(\"div\", { className: \"row\" },\\n react_1.default.createElement(RawValues_tsx_1.default, { data: data })),\\n react_1.default.createElement(\"div\", { className: \"row\" },\\n react_1.default.createElement(ErrorInstancesTable_tsx_1.default, { data: data }))));\\n}\\nfunction mapStateToProps(state) {\\n return {\\n data: state.data,\\n sweepStatus: state.sweepStatus,\\n selectedDataPoint: state.selectedDataPoint,\\n training: state.training,\\n testing: state.testing,\\n newError: state.newError,\\n strictImitation: state.strictImitation,\\n error: state.error,\\n loading: state.loading\\n };\\n}\\nfunction mapDispatchToProps(dispatch) {\\n return redux_1.bindActionCreators({\\n toggleTraining: actions_ts_1.toggleTraining,\\n toggleTesting: actions_ts_1.toggleTesting,\\n toggleNewError: actions_ts_1.toggleNewError,\\n toggleStrictImitation: actions_ts_1.toggleStrictImitation,\\n selectDataPoint: actions_ts_1.selectDataPoint,\\n getTrainingAndTestingData: actions_ts_1.getTrainingAndTestingData,\\n getModelEvaluationData: actions_ts_1.getModelEvaluationData,\\n getSweepStatus: actions_ts_1.getSweepStatus,\\n startSweep: actions_ts_1.startSweep\\n }, dispatch);\\n}\\nconst MainContainer = react_redux_1.connect(mapStateToProps, mapDispatchToProps)(Container);\\nexports.default = MainContainer;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvTWFpbkNvbnRhaW5lci50c3g/ZTFkMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdEQUEwQjtBQUUxQixnRkFBc0U7QUFDdEUsc0ZBQWtGO0FBQ2xGLHFGQUFnRjtBQUNoRixpRUFBd0M7QUFDeEMsMkVBQTREO0FBQzVELG9FQUE2QztBQUM3QyxvRUFBOEM7QUFDOUMsdUNBQTJDO0FBQzNDLDhDQUFzQztBQUN0Qyw2Q0FVc0I7QUFHdEIsU0FBUyxTQUFTLENBQUMsRUFDakIsSUFBSSxFQUNKLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsUUFBUSxFQUNSLE9BQU8sRUFDUCxRQUFRLEVBQ1IsZUFBZSxFQUNmLEtBQUssRUFDTCxPQUFPLEVBQ1AsY0FBYyxFQUNkLGFBQWEsRUFDYixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLGNBQWMsRUFDZCxVQUFVLEVBQUM7SUFFVCxJQUFJLE9BQU8sRUFBRTtRQUNYLE9BQU8sQ0FDTCx3REFBcUIsQ0FDdEIsQ0FBQztLQUNIO1NBQU0sSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ3hCLE9BQU8sQ0FDTCxnRUFBNkIsQ0FDOUIsQ0FBQztLQUNIO1NBQU0sSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDeEMseUJBQXlCLEVBQUUsQ0FBQztRQUM1QixPQUFPLENBQ0wsd0RBQXFCLENBQ3RCLENBQUM7S0FDSDtTQUFNLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1FBQ25FLE9BQU8sQ0FDTCx1Q0FBSyxTQUFTLEVBQUMsV0FBVztZQUN0Qix1Q0FBSyxTQUFTLEVBQUMsS0FBSztnQkFDbEIsOEJBQUMsMEJBQVksSUFDWCxXQUFXLEVBQUUsV0FBVyxFQUN4QixjQUFjLEVBQUUsY0FB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YyxFQUFFLDJCQUFjO1FBQzlCLFVBQVUsRUFBRSx1QkFBVTtLQUN2QixFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2QsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLHFCQUFPLENBQUMsZUFBZSxFQUFFLGtCQUFrQixDQUFDLENBQUMsU0FBUyxDQUFDO0FBRTdFLGtCQUFlLGFBQWEsQ0FBQyIsImZpbGUiOiIzMi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgUGVyZm9ybWFuY2VDb21wYXRpYmlsaXR5IGZyb20gXCIuL1BlcmZvcm1hbmNlQ29tcGF0aWJpbGl0eS50c3hcIjtcbmltcG9ydCBJbnRlcnNlY3Rpb25CZXR3ZWVuTW9kZWxFcnJvcnMgZnJvbSBcIi4vSW50ZXJzZWN0aW9uQmV0d2Vlbk1vZGVsRXJyb3JzLnRzeFwiO1xuaW1wb3J0IEluY29tcGF0aWJsZVBvaW50RGlzdHJpYnV0aW9uIGZyb20gXCIuL0luY29tcGF0aWJsZVBvaW50RGlzdHJpYnV0aW9uLnRzeFwiO1xuaW1wb3J0IFJhd1ZhbHVlcyBmcm9tIFwiLi9SYXdWYWx1ZXMudHN4XCI7XG5pbXBvcnQgRXJyb3JJbnN0YW5jZXNUYWJsZSBmcm9tIFwiLi9FcnJvckluc3RhbmNlc1RhYmxlLnRzeFwiO1xuaW1wb3J0IERhdGFTZWxlY3RvciBmcm9tIFwiLi9EYXRhU2VsZWN0b3IudHN4XCJcbmltcG9ydCBTd2VlcE1hbmFnZXIgZnJvbSBcIi4vU3dlZXBNYW5hZ2VyLnRzeFwiO1xuaW1wb3J0IHsgYmluZEFjdGlvbkNyZWF0b3JzIH0gZnJvbSBcInJlZHV4XCI7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtcbiAgdG9nZ2xlVHJhaW5pbmcsXG4gIHRvZ2dsZVRlc3RpbmcsXG4gIHRvZ2dsZU5ld0Vycm9yLFxuICB0b2dnbGVTdHJpY3RJbWl0YXRpb24sXG4gIHNlbGVjdERhdGFQb2ludCxcbiAgZ2V0VHJhaW5pbmdBbmRUZXN0aW5nRGF0YSxcbiAgZ2V0TW9kZWxFdmFsdWF0aW9uRGF0YSxcbiAgZ2V0U3dlZXBTdGF0dXMsXG4gIHN0YXJ0U3dlZXBcbn0gZnJvbSAnLi9hY3Rpb25zLnRzJztcblxuXG5mdW5jdGlvbiBDb250YWluZXIoe1xuICBkYXRhLFxuICBzd2VlcFN0YXR1cyxcbiAgc2VsZWN0ZWREYXRhUG9pbnQsXG4gIHRyYWluaW5nLFxuICB0ZXN0aW5nLFxuICBuZXdFcnJvcixcbiAgc3RyaWN0SW1pdGF0aW9uLFxuICBlcnJvcixcbiAgbG9hZGluZyxcbiAgdG9nZ2xlVHJhaW5pbmcsXG4gIHRvZ2dsZVRlc3RpbmcsXG4gIHRvZ2dsZU5ld0Vycm9yLFxuICB0b2dnbGVTdHJpY3RJbWl0YXRpb24sXG4gIHNlbGVjdERhdGFQb2ludCxcbiAgZ2V0VHJhaW5pbmdBbmRUZXN0aW5nRGF0YSxcbiAgZ2V0TW9kZWxFdmFsdWF0aW9uRGF0YSxcbiAgZ2V0U3dlZXBTdGF0dXMsXG4gIHN0YXJ0U3dlZXB9KSB7XG5cbiAgICBpZiAobG9hZGluZykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZXJyb3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5FcnJvciBsb2FkaW5nIGRhdGE8L2Rpdj5cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChlcnJvciA9PSBudWxsICYmIGRhdGEgPT0gbnVsbCkge1xuICAgICAgZ2V0VHJhaW5pbmdBbmRUZXN0aW5nRGF0YSgpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZXJyb3IgPT0gbnVsbCAmJiBkYXRhLmxlbmd0aCA9PSAwICYmIHN3ZWVwU3RhdHVzID09IG51bGwpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgICAgICA8U3dlZXBNYW5hZ2VyXG4gICAgICAgICAgICAgICAgc3dlZXBTdGF0dXM9e3N3ZWVwU3RhdHVzfVxuICAgICAgICAgICAgICAgIGdldFN3ZWVwU3RhdHVzPXtnZXRTd2VlcFN0YXR1c31cbiAgICAgICAgICAgICAgICBzdGFydFN3ZWVwPXtzdGFydFN3ZWVwfVxuICAgICAgICAgICAgICAgIGdldFRyYWluaW5nQW5kVGVzdGluZ0RhdGE9e2dldFRyYWluaW5nQW5kVGVzdGluZ0RhdGF9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgICAgIDxTd2VlcE1hbmFnZXJcbiAgICAgICAgICAgICAgICBzd2VlcFN0YXR1cz17c3dlZXBTdGF0dXN9XG4gICAgICAgICAgICAgICAgZ2V0U3dlZXBTdGF0dXM9e2dldFN3ZWVwU3RhdHVzfVxuICAgICAgICAgICAgICAgIHN0YXJ0U3dlZXA9e3N0YXJ0U3dlZXB9XG4gICAgICAgICAgICAgICAgZ2V0VHJhaW5pbmdBbmRUZXN0aW5nRGF0YT17Z2V0VHJhaW5pbmdBbmRUZXN0aW5nRGF0YX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgICAgPERhdGFTZWxlY3RvclxuICAgICAgICAgICAgICB0b2dnbGVUcmFpbmluZz17dG9nZ2xlVHJhaW5pbmd9XG4gICAgICAgICAgICAgIHRvZ2dsZVRlc3Rpbmc9e3RvZ2dsZVRlc3Rpbmd9XG4gICAgICAgICAgICAgIHRvZ2dsZU5ld0Vycm9yPXt0b2dnbGVOZXdFcnJvcn1cbiAgICAgICAgICAgICAgdG9nZ2xlU3RyaWN0SW1pdGF0aW9uPXt0b2dnbGVTdHJpY3RJbWl0YXRpb259XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgICB7KHNlbGVjdGVkRGF0YVBvaW50ICE9IG51bGwpPyAoPGRpdj5sYW1iZGFfYzoge3NlbGVjdGVkRGF0YVBvaW50LmxhbWJkYV9jfTwvZGl2Pik6ICg8ZGl2IC8+KX1cbiAgICAgICAgICAgIDxQZXJmb3JtYW5jZUNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgZGF0YT17ZGF0YX1cbiAgICAgICAgICAgICAgdHJhaW5pbmc9e3RyYWluaW5nfVxuICAgICAgICAgICAgICB0ZXN0aW5nPXt0ZXN0aW5nfVxuICAgICAgICAgICAgICBuZXdFcnJvcj17bmV3RXJyb3J9XG4gICAgICAgICAgICAgIHN0cmljdEltaXRhdGlvbj17c3RyaWN0SW1pdGF0aW9ufVxuICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5U2NvcmVUeXBlPVwiYnRjXCJcbiAgICAgICAgICAgICAgc2VsZWN0RGF0YVBvaW50PXtzZWxlY3REYXRhUG9pbnR9XG4gICAgICAgICAgICAgIGdldE1vZGVsRXZhbHVhdGlvbkRhdGE9e2dldE1vZGVsRXZhbHVhdGlvbkRhdGF9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPFBlcmZvcm1hbmNlQ29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICBkYXRhPXtkYXRhfVxuICAgICAgICAgICAgICB0cmFpbmluZz17dHJhaW5pbmd9XG4gICAgICAgICAgICAgIHRlc3Rpbmc9e3Rlc3Rpbmd9XG4gICAgICAgICAgICAgIG5ld0Vycm9yPXtuZXdFcnJvcn1cbiAgICAgICAgICAgICAgc3RyaWN0SW1pdGF0aW9uPXtzdHJpY3RJbWl0YXRpb259XG4gICAgICAgICAgICAgIGNvbXBhdGliaWxpdHlTY29yZVR5cGU9XCJiZWNcIlxuICAgICAgICAgICAgICBzZWxlY3REYXRhUG9pbnQ9e3NlbGVjdERhdGFQb2ludH1cbiAgICAgICAgICAgICAgZ2V0TW9kZWxFdmFsdWF0aW9uRGF0YT17Z2V0TW9kZWxFdmFsdWF0aW9uRGF0YX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICAgIDxJbnRlcnNlY3Rpb25CZXR3ZWVuTW9kZWxFcnJvcnMgc2VsZWN0ZWREYXRhUG9pbnQ9e3NlbGVjdGVkRGF0YVBvaW50fSAvPlxuICAgICAgICAgICAgPEluY29tcGF0aWJsZVBvaW50RGlzdHJpYnV0aW9uIHNlbGVjdGVkRGF0YVBvaW50PXtzZWxlY3RlZERhdGFQb2ludH0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvd1wiPlxuICAgICAgICAgICAgPFJhd1ZhbHVlcyBkYXRhPXtkYXRhfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm93XCI+XG4gICAgICAgICAgICA8RXJyb3JJbnN0YW5jZXNUYWJsZSBkYXRhPXtkYXRhfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzIChzdGF0ZSkge1xuICByZXR1cm4ge1xuICAgIGRhdGE6IHN0YXRlLmRhdGEsXG4gICAgc3dlZXBTdGF0dXM6IHN0YXRlLnN3ZWVwU3RhdHVzLFxuICAgIHNlbGVjdGVkRGF0YVBvaW50OiBzdGF0ZS5zZWxlY3RlZERhdGFQb2ludCxcbiAgICB0cmFpbmluZzogc3RhdGUudHJhaW5pbmcsXG4gICAgdGVzdGluZzogc3RhdGUudGVzdGluZyxcbiAgICBuZXdFcnJvcjogc3RhdGUubmV3RXJyb3IsXG4gICAgc3RyaWN0SW1pdGF0aW9uOiBzdGF0ZS5zdHJpY3RJbWl0YXRpb24sXG4gICAgZXJyb3I6IHN0YXRlLmVycm9yLFxuICAgIGxvYWRpbmc6IHN0YXRlLmxvYWRpbmdcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWFwRGlzcGF0Y2hUb1Byb3BzIChkaXNwYXRjaCkge1xuICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3JzKHtcbiAgICB0b2dnbGVUcmFpbmluZzogdG9nZ2xlVHJhaW5pbmcsXG4gICAgdG9nZ2xlVGVzdGluZzogdG9nZ2xlVGVzdGluZyxcbiAgICB0b2dnbGVOZXdFcnJvcjogdG9nZ2xlTmV3RXJyb3IsXG4gICAgdG9nZ2xlU3RyaWN0SW1pdGF0aW9uOiB0b2dnbGVTdHJpY3RJbWl0YXRpb24sXG4gICAgc2VsZWN0RGF0YVBvaW50OiBzZWxlY3REYXRhUG9pbnQsXG4gICAgZ2V0VHJhaW5pbmdBbmRUZXN0aW5nRGF0YTogZ2V0VHJhaW5pbmdBbmRUZXN0aW5nRGF0YSxcbiAgICBnZXRNb2RlbEV2YWx1YXRpb25EYXRhOiBnZXRNb2RlbEV2YWx1YXRpb25EYXRhLFxuICAgIGdldFN3ZWVwU3RhdHVzOiBnZXRTd2VlcFN0YXR1cyxcbiAgICBzdGFydFN3ZWVwOiBzdGFydFN3ZWVwXG4gIH0sIGRpc3BhdGNoKTtcbiB9XG5cbmNvbnN0IE1haW5Db250YWluZXIgPSBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShDb250YWluZXIpXG5cbmV4cG9ydCBkZWZhdWx0IE1haW5Db250YWluZXI7XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///32\\n')},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\\n}) : (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n o[k2] = m[k];\\n}));\\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\\n Object.defineProperty(o, \\\"default\\\", { enumerable: true, value: v });\\n}) : function(o, v) {\\n o[\\\"default\\\"] = v;\\n});\\nvar __importStar = (this && this.__importStar) || function (mod) {\\n if (mod && mod.__esModule) return mod;\\n var result = {};\\n if (mod != null) for (var k in mod) if (k !== \\\"default\\\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\\n __setModuleDefault(result, mod);\\n return result;\\n};\\nObject.defineProperty(exports, \\\"__esModule\\\", { value: true });\\nconst react_1 = __importStar(__webpack_require__(0));\\nconst d3 = __importStar(__webpack_require__(4));\\nclass PerformanceCompatibility extends react_1.Component {\\n constructor(props) {\\n super(props);\\n this.state = {\\n data: this.props.data,\\n testing: this.props.testing,\\n training: this.props.training,\\n newError: this.props.newError,\\n strictImitation: this.props.strictImitation\\n };\\n this.node = react_1.default.createRef();\\n this.createPVCPlot = this.createPVCPlot.bind(this);\\n }\\n componentDidMount() {\\n this.createPVCPlot();\\n }\\n componentWillReceiveProps(nextProps) {\\n this.setState({\\n data: nextProps.data,\\n testing: nextProps.testing,\\n training: nextProps.training,\\n newError: nextProps.newError,\\n strictImitation: nextProps.strictImitation\\n });\\n }\\n componentDidUpdate() {\\n this.createPVCPlot();\\n }\\n createPVCPlot() {\\n var _this = this;\\n var body = d3.select(this.node.current);\\n var data = this.state.data;\\n var margin = { top: 15, right: 15, bottom: 50, left: 55 };\\n var h = 250 - margin.top - margin.bottom;\\n var w = 250 - margin.left - margin.right;\\n var formatPercent = d3.format('.3f');\\n var colorMap = {\\n \\\"training\\\": {\\n \\\"new-error\\\": \\\"rgba(170, 170, 255, 0.8)\\\",\\n \\\"strict-imitation\\\": \\\"rgba(113, 113, 255, 0.8)\\\"\\n },\\n \\\"testing\\\": {\\n \\\"new-error\\\": \\\"rgba(206, 160, 205, 0.8)\\\",\\n \\\"strict-imitation\\\": \\\"rgba(226, 75, 158, 0.8)\\\"\\n }\\n };\\n var allDataPoints = [];\\n if (_this.state.training && _this.state.newError) {\\n allDataPoints = allDataPoints.concat(data.filter(d => (d[\\\"training\\\"] && d[\\\"new-error\\\"])));\\n }\\n if (_this.state.training && _this.state.strictImitation) {\\n allDataPoints = allDataPoints.concat(data.filter(d => (d[\\\"training\\\"] && d[\\\"strict-imitation\\\"])));\\n }\\n if (_this.state.testing && _this.state.newError) {\\n allDataPoints = allDataPoints.concat(data.filter(d => (d[\\\"testing\\\"] && d[\\\"new-error\\\"])));\\n }\\n if (_this.state.testing && _this.state.strictImitation) {\\n allDataPoints = allDataPoints.concat(data.filter(d => (d[\\\"testing\\\"] && d[\\\"strict-imitation\\\"])));\\n }\\n // var xScale = d3.scaleLinear()\\n // .domain([\\n // d3.min([0,d3.min(data,function (d) { return d[_this.props.compatibilityScoreType] })]),\\n // d3.max([0,d3.max(data,function (d) { return d[_this.props.compatibilityScoreType] })])\\n // ])\\n // .range([0,w])\\n // var yScale = d3.scaleLinear()\\n // .domain([\\n // d3.min([0,d3.min(data,function (d) { return d['performance'] })]),\\n // d3.max([0,d3.max(data,function (d) { return d['performance'] })])\\n // ])\\n // .range([h,0])\\n var xScale = d3.scaleLinear()\\n .domain([\\n d3.min(allDataPoints, function (d) { return d[_this.props.compatibilityScoreType]; }),\\n d3.max(allDataPoints, function (d) { return d[_this.props.compatibilityScoreType]; })\\n ])\\n .range([0, w]);\\n var yScale = d3.scaleLinear()\\n .domain([\\n d3.min(allDataPoints, function (d) { return d['performance']; }),\\n d3.max(allDataPoints, function (d) { return d['performance']; })\\n ])\\n .range([h, 0]);\\n // SVG\\n d3.select(`#${this.props.compatibilityScoreType}`).remove();\\n var svg = body.append('svg')\\n .attr('id', this.props.compatibilityScoreType)\\n .attr('height', h + margin.top + margin.bottom)\\n .attr('width', w + margin.left + margin.right)\\n .append('g')\\n .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');\\n // X-axis\\n var xAxis = d3.axisBottom()\\n .scale(xScale)\\n .tickFormat(formatPercent)\\n .ticks(5);\\n // Y-axis\\n var yAxis = d3.axisLeft()\\n .scale(yScale)\\n .tickFormat(formatPercent)\\n .ticks(5);\\n // X-axis\\n svg.append('g')\\n .attr('class', 'axis')\\n .attr('id', 'xAxis')\\n .attr('transform', 'translate(0,' + h + ')')\\n .call(xAxis)\\n .append('text')\\n .attr('id', 'xAxisLabel')\\n .attr('y', 25)\\n .attr('x', w / 2)\\n .attr('dy', '.71em')\\n .style('text-anchor', 'end')\\n .text(this.props.compatibilityScoreType.toUpperCase())\\n .attr(\\\"font-family\\\", \\\"sans-serif\\\")\\n .attr(\\\"font-size\\\", \\\"20px\\\")\\n .attr(\\\"fill\\\", \\\"black\\\");\\n // Y-axis\\n svg.append('g')\\n .attr('class', 'axis')\\n .attr('id', 'yAxis')\\n .call(yAxis)\\n .append('text')\\n .attr('id', 'yAxisLabel')\\n .attr('transform', 'rotate(-90)')\\n .attr('x', -h / 2)\\n .attr('y', -50)\\n .attr('dy', '.71em')\\n .style('text-anchor', 'end')\\n .text('Performance')\\n .attr(\\\"font-family\\\", \\\"sans-serif\\\")\\n .attr(\\\"font-size\\\", \\\"20px\\\")\\n .attr(\\\"fill\\\", \\\"black\\\");\\n function drawCircles() {\\n // var allDataPoints = [];\\n // if (_this.state.training && _this.state.newError) {\\n // allDataPoints = allDataPoints.concat(data.filter(d => (d[\\\"training\\\"] && d[\\\"new-error\\\"])));\\n // }\\n // if (_this.state.training && _this.state.strictImitation) {\\n // allDataPoints = allDataPoints.concat(data.filter(d => (d[\\\"training\\\"] && d[\\\"strict-imitation\\\"])));\\n // }\\n // if (_this.state.testing && _this.state.newError) {\\n // allDataPoints = allDataPoints.concat(data.filter(d => (d[\\\"testing\\\"] && d[\\\"new-error\\\"])));\\n // }\\n // if (_this.state.testing && _this.state.strictImitation) {\\n // allDataPoints = allDataPoints.concat(data.filter(d => (d[\\\"testing\\\"] && d[\\\"strict-imitation\\\"])));\\n // }\\n var circles = svg.selectAll('circle')\\n .data(allDataPoints)\\n .enter()\\n .append('circle')\\n .attr('cx', function (d) { return xScale(d[_this.props.compatibilityScoreType]); })\\n .attr('cy', function (d) { return yScale(d['performance']); })\\n .attr('r', '4')\\n .attr('stroke', 'black')\\n .attr('stroke-width', 1)\\n .attr('fill', function (d, i) {\\n if (d[\\\"training\\\"] && d[\\\"new-error\\\"]) {\\n return colorMap[\\\"training\\\"][\\\"new-error\\\"];\\n }\\n else if (d[\\\"training\\\"] && d[\\\"strict-imitation\\\"]) {\\n return colorMap[\\\"training\\\"][\\\"strict-imitation\\\"];\\n }\\n else if (d[\\\"testing\\\"] && d[\\\"new-error\\\"]) {\\n return colorMap[\\\"testing\\\"][\\\"new-error\\\"];\\n }\\n else if (d[\\\"testing\\\"] && d[\\\"strict-imitation\\\"]) {\\n return colorMap[\\\"testing\\\"][\\\"strict-imitation\\\"];\\n }\\n })\\n .on('mouseover', function (d) {\\n d3.select(this)\\n .transition()\\n .duration(500)\\n .attr('r', 8)\\n .attr('stroke-width', 3);\\n })\\n .on('mouseout', function () {\\n d3.select(this)\\n .transition()\\n .duration(500)\\n .attr('r', 4)\\n .attr('stroke-width', 1);\\n })\\n .on('click', (d, i) => { _this.props.getModelEvaluationData(d[\\\"datapoint_index\\\"]); });\\n }\\n drawCircles();\\n }\\n render() {\\n return (react_1.default.createElement(\\\"div\\\", { className: \\\"plot\\\", ref: this.node }));\\n }\\n}\\nexports.default = PerformanceCompatibility;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvUGVyZm9ybWFuY2VDb21wYXRpYmlsaXR5LnRzeD84N2IxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUF5QztBQUV6QyxnREFBeUI7QUFzQnpCLE1BQU0sd0JBQXlCLFNBQVEsaUJBQXVFO0lBQzVHLFlBQVksS0FBSztRQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxLQUFLLEdBQUc7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQ3JCLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtZQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO1lBQzdCLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWU7U0FDNUMsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBSyxDQUFDLFNBQVMsRUFBa0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFJRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELHlCQUF5QixDQUFDLFNBQVM7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNaLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtZQUNwQixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87WUFDMUIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO1lBQzVCLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixlQUFlLEVBQUUsU0FBUyxDQUFDLGVBQWU7U0FDM0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJ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QUFDO2lCQUNELEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDO2dCQUMxQixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztxQkFDWixVQUFVLEVBQUU7cUJBQ1osUUFBUSxDQUFDLEdBQUcsQ0FBQztxQkFDYixJQUFJLENBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztxQkFDWCxJQUFJLENBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQztpQkFDRCxFQUFFLENBQUMsVUFBVSxFQUFFO2dCQUNkLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO3FCQUNaLFVBQVUsRUFBRTtxQkFDWixRQUFRLENBQUMsR0FBRyxDQUFDO3FCQUNiLElBQUksQ0FBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO3FCQUNYLElBQUksQ0FBQyxjQUFjLEVBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDO2lCQUNELEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRSxLQUFLLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUVELFdBQVcsRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxDQUNMLHVDQUFLLFNBQVMsRUFBQyxNQUFNLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUksQ0FDekMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUNELGtCQUFlLHdCQUF3QixDQUFDIiwiZmlsZSI6IjMzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xuXG5cbnR5cGUgUGVyZm9ybWFuY2VDb21wYXRpYmlsaXR5U3RhdGUgPSB7XG4gIGRhdGE6IGFueSxcbiAgdGVzdGluZzogYm9vbGVhbixcbiAgdHJhaW5pbmc6IGJvb2xlYW4sXG4gIG5ld0Vycm9yOiBib29sZWFuLFxuICBzdHJpY3RJbWl0YXRpb246IGJvb2xlYW5cbn1cblxudHlwZSBQZXJmb3JtYW5jZUNvbXBhdGliaWxpdHlQcm9wcyA9IHtcbiAgZGF0YTogYW55LFxuICB0ZXN0aW5nOiBib29sZWFuLFxuICB0cmFpbmluZzogYm9vbGVhbixcbiAgbmV3RXJyb3I6IGJvb2xlYW4sXG4gIHN0cmljdEltaXRhdGlvbjogYm9vbGVhbixcbiAgY29tcGF0aWJpbGl0eVNjb3JlVHlwZTogc3RyaW5nLFxuICBzZWxlY3REYXRhUG9pbnQ6IChkOiBhbnkpID0+IHZvaWQsXG4gIGdldE1vZGVsRXZhbHVhdGlvbkRhdGE6IChldmFsdWF0aW9uSWQ6IG51bWJlcikgPT4gdm9pZFxufVxuXG5jbGFzcyBQZXJmb3JtYW5jZUNvbXBhdGliaWxpdHkgZXh0ZW5kcyBDb21wb25lbnQ8UGVyZm9ybWFuY2VDb21wYXRpYmlsaXR5UHJvcHMsIFBlcmZvcm1hbmNlQ29tcGF0aWJpbGl0eVN0YXRlPiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGRhdGE6IHRoaXMucHJvcHMuZGF0YSxcbiAgICAgIHRlc3Rpbmc6IHRoaXMucHJvcHMudGVzdGluZyxcbiAgICAgIHRyYWluaW5nOiB0aGlzLnByb3BzLnRyYWluaW5nLFxuICAgICAgbmV3RXJyb3I6IHRoaXMucHJvcHMubmV3RXJyb3IsXG4gICAgICBzdHJpY3RJbWl0YXRpb246IHRoaXMucHJvcHMuc3RyaWN0SW1pdGF0aW9uXG4gICAgfTtcblxuICAgIHRoaXMubm9kZSA9IFJlYWN0LmNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgICB0aGlzLmNyZWF0ZVBWQ1Bsb3QgPSB0aGlzLmNyZWF0ZVBWQ1Bsb3QuYmluZCh0aGlzKTtcbiAgfVxuXG4gIG5vZGU6IFJlYWN0LlJlZk9iamVjdDxIVE1MRGl2RWxlbWVudD5cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLmNyZWF0ZVBWQ1Bsb3QoKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkYXRhOiBuZXh0UHJvcHMuZGF0YSxcbiAgICAgIHRlc3Rpbmc6IG5leHRQcm9wcy50ZXN0aW5nLFxuICAgICAgdHJhaW5pbmc6IG5leHRQcm9wcy50cmFpbmluZyxcbiAgICAgIG5ld0Vycm9yOiBuZXh0UHJvcHMubmV3RXJyb3IsXG4gICAgICBzdHJpY3RJbWl0YXRpb246IG5leHRQcm9wcy5zdHJpY3RJbWl0YXRpb25cbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB0aGlzLmNyZWF0ZVBWQ1Bsb3QoKTtcbiAgfVxuXG4gIGNyZWF0ZVBWQ1Bsb3QoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgYm9keSA9IGQzLnNlbGVjdCh0aGlzLm5vZGUuY3VycmVudCk7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnN0YXRlLmRhdGE7XG5cbiAgICB2YXIgbWFyZ2luID0geyB0b3A6IDE1LCByaWdodDogMTUsIGJvdHRvbTogNTAsIGxlZnQ6IDU1IH1cbiAgICB2YXIgaCA9IDI1MCAtIG1hcmdpbi50b3AgLSBtYXJnaW4uYm90dG9tXG4gICAgdmFyIHcgPSAyNTAgLSBtYXJnaW4ubGVmdCAtIG1hcmdpbi5yaWdodFxuXG4gICAgdmFyIGZvcm1hdFBlcmNlbnQgPSBkMy5mb3JtYXQoJy4zZicpO1xuICAgIHZhciBjb2xvck1hcCA9IHtcbiAgICAgIFwidHJhaW5pbmdcIjoge1xuICAgICAgICBcIm5ldy1lcnJvclwiOiBcInJnYmEoMTcwLCAxNzAsIDI1NSwgMC44KVwiLFxuICAgICAgICBcInN0cmljdC1pbWl0YXRpb25cIjogXCJyZ2JhKDExMywgMTEzLCAyNTUsIDAuOClcIlxuICAgICAgfSxcbiAgICAgIFwidGVzdGluZ1wiOiB7XG4gICAgICAgIFwibmV3LWVycm9yXCI6IFwicmdiYSgyMDYsIDE2MCwgMjA1LCAwLjgpXCIsXG4gICAgICAgIFwic3RyaWN0LWltaXRhdGlvblwiOiBcInJnYmEoMjI2LCA3NSwgMTU4LCAwLjgpXCJcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGFsbERhdGFQb2ludHMgPSBbXTtcbiAgICBpZiAoX3RoaXMuc3RhdGUudHJhaW5pbmcgJiYgX3RoaXMuc3RhdGUubmV3RXJyb3IpIHtcbiAgICAgIGFsbERhdGFQb2ludHMgPSBhbGxEYXRhUG9pbnRzLmNvbmNhdChkYXRhLmZpbHRlcihkID0+IChkW1widHJhaW5pbmdcIl0gJiYgZFtcIm5ldy1lcnJvclwiXSkpKTtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMuc3RhdGUudHJhaW5pbmcgJiYgX3RoaXMuc3RhdGUuc3RyaWN0SW1pdGF0aW9uKSB7XG4gICAgICBhbGxEYXRhUG9pbnRzID0gYWxsRGF0YVBvaW50cy5jb25jYXQoZGF0YS5maWx0ZXIoZCA9PiAoZFtcInRyYWluaW5nXCJdICYmIGRbXCJzdHJpY3QtaW1pdGF0aW9uXCJdKSkpO1xuICAgIH1cblxuICAgIGlmIChfdGhpcy5zdGF0ZS50ZXN0aW5nICYmIF90aGlzLnN0YXRlLm5ld0Vycm9yKSB7XG4gICAgICBhbGxEYXRhUG9pbnRzID0gYWxsRGF0YVBvaW50cy5jb25jYXQoZGF0YS5maWx0ZXIoZCA9PiAoZFtcInRlc3RpbmdcIl0gJiYgZFtcIm5ldy1lcnJvclwiXSkpKTtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMuc3RhdGUudGVzdGluZyAmJiBfdGhpcy5zdGF0ZS5zdHJpY3RJbWl0YXRpb24pIHtcbiAgICAgIGFsbERhdGFQb2ludHMgPSBhbGxEYXRhUG9pbnRzLmNvbmNhdChkYXRhLmZpbHRlcihkID0+IChkW1widGVzdGluZ1wiXSAmJiBkW1wic3RyaWN0LWltaXRhdGlvblwiXSkpKTtcbiAgICB9XG5cbiAgICAvLyB2YXIgeFNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgIC8vICAgLmRvbWFpbihbXG4gICAgLy8gICAgIGQzLm1pbihbMCxkMy5taW4oZGF0YSxmdW5jdGlvbiAoZCkgeyByZXR1cm4gZFtfdGhpcy5wcm9wcy5jb21wYXRpYmlsaXR5U2NvcmVUeXBlXSB9KV0pLFxuICAgIC8vICAgICBkMy5tYXgoWzAsZDMubWF4KGRhdGEsZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGRbX3RoaXMucHJvcHMuY29tcGF0aWJpbGl0eVNjb3JlVHlwZV0gfSldKVxuICAgIC8vICAgICBdKVxuICAgIC8vICAgLnJhbmdlKFswLHddKVxuICAgIC8vIHZhciB5U2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAgLy8gICAuZG9tYWluKFtcbiAgICAvLyAgICAgZDMubWluKFswLGQzLm1pbihkYXRhLGZ1bmN0aW9uIChkKSB7IHJldHVybiBkWydwZXJmb3JtYW5jZSddIH0pXSksXG4gICAgLy8gICAgIGQzLm1heChbMCxkMy5tYXgoZGF0YSxmdW5jdGlvbiAoZCkgeyByZXR1cm4gZFsncGVyZm9ybWFuY2UnXSB9KV0pXG4gICAgLy8gICAgIF0pXG4gICAgLy8gICAucmFuZ2UoW2gsMF0pXG5cbiAgICB2YXIgeFNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbXG4gICAgICAgIGQzLm1pbihhbGxEYXRhUG9pbnRzLGZ1bmN0aW9uIChkKSB7IHJldHVybiBkW190aGlzLnByb3BzLmNvbXBhdGliaWxpdHlTY29yZVR5cGVdIH0pLFxuICAgICAgICBkMy5tYXgoYWxsRGF0YVBvaW50cyxmdW5jdGlvbiAoZCkgeyByZXR1cm4gZFtfdGhpcy5wcm9wcy5jb21wYXRpYmlsaXR5U2NvcmVUeXBlXSB9KVxuICAgICAgICBdKVxuICAgICAgLnJhbmdlKFswLHddKVxuICAgIHZhciB5U2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFtcbiAgICAgICAgZDMubWluKGFsbERhdGFQb2ludHMsZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGRbJ3BlcmZvcm1hbmNlJ10gfSksXG4gICAgICAgIGQzLm1heChhbGxEYXRhUG9pbnRzLGZ1bmN0aW9uIChkKSB7IHJldHVybiBkWydwZXJmb3JtYW5jZSddIH0pXG4gICAgICAgIF0pXG4gICAgICAucmFuZ2UoW2gsMF0pXG5cbiAgICAvLyBTVkdcbiAgICBkMy5zZWxlY3QoYCMke3RoaXMucHJvcHMuY29tcGF0aWJpbGl0eVNjb3JlVHlwZX1gKS5yZW1vdmUoKTtcbiAgICB2YXIgc3ZnID0gYm9keS5hcHBlbmQoJ3N2ZycpXG4gICAgICAgIC5hdHRyKCdpZCcsIHRoaXMucHJvcHMuY29tcGF0aWJpbGl0eVNjb3JlVHlwZSlcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsaCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tKVxuICAgICAgICAuYXR0cignd2lkdGgnLHcgKyBtYXJnaW4ubGVmdCArIG1hcmdpbi5yaWdodClcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywndHJhbnNsYXRlKCcgKyBtYXJnaW4ubGVmdCArICcsJyArIG1hcmdpbi50b3AgKyAnKScpXG4gICAgLy8gWC1heGlzXG4gICAgdmFyIHhBeGlzID0gZDMuYXhpc0JvdHRvbSgpXG4gICAgICAuc2NhbGUoeFNjYWxlKVxuICAgICAgLnRpY2tGb3JtYXQoZm9ybWF0UGVyY2VudClcbiAgICAgIC50aWNrcyg1KTtcblxuICAgIC8vIFktYXhpc1xuICAgIHZhciB5QXhpcyA9IGQzLmF4aXNMZWZ0KClcbiAgICAgIC5zY2FsZSh5U2NhbGUpXG4gICAgICAudGlja0Zvcm1hdChmb3JtYXRQZXJjZW50KVxuICAgICAgLnRpY2tzKDUpO1xuXG4gICAgLy8gWC1heGlzXG4gICAgc3ZnLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsJ2F4aXMnKVxuICAgICAgICAuYXR0cignaWQnLCd4QXhpcycpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsJyArIGggKyAnKScpXG4gICAgICAgIC5jYWxsKHhBeGlzKVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCdpZCcsJ3hBeGlzTGFiZWwnKVxuICAgICAgICAuYXR0cigneScsIDI1KVxuICAgICAgICAuYXR0cigneCcsdy8yKVxuICAgICAgICAuYXR0cignZHknLCcuNzFlbScpXG4gICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCdlbmQnKVxuICAgICAgICAudGV4dCh0aGlzLnByb3BzLmNvbXBhdGliaWxpdHlTY29yZVR5cGUudG9VcHBlckNhc2UoKSlcbiAgICAgICAgLmF0dHIoXCJmb250LWZhbWlseVwiLCBcInNhbnMtc2VyaWZcIilcbiAgICAgICAgLmF0dHIoXCJmb250LXNpemVcIiwgXCIyMHB4XCIpXG4gICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcImJsYWNrXCIpO1xuXG4gICAgLy8gWS1heGlzXG4gICAgc3ZnLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsJ2F4aXMnKVxuICAgICAgICAuYXR0cignaWQnLCd5QXhpcycpXG4gICAgICAgIC5jYWxsKHlBeGlzKVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCdpZCcsICd5QXhpc0xhYmVsJylcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsJ3JvdGF0ZSgtOTApJylcbiAgICAgICAgLmF0dHIoJ3gnLC1oLzIpXG4gICAgICAgIC5hdHRyKCd5JywtNTApXG4gICAgICAgIC5hdHRyKCdkeScsJy43MWVtJylcbiAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsJ2VuZCcpXG4gICAgICAgIC50ZXh0KCdQZXJmb3JtYW5jZScpXG4gICAgICAgIC5hdHRyKFwiZm9udC1mYW1pbHlcIiwgXCJzYW5zLXNlcmlmXCIpXG4gICAgICAgIC5hdHRyKFwiZm9udC1zaXplXCIsIFwiMjBweFwiKVxuICAgICAgICAuYXR0cihcImZpbGxcIiwgXCJibGFja1wiKTtcblxuICAgIGZ1bmN0aW9uIGRyYXdDaXJjbGVzKCkge1xuICAgICAgLy8gdmFyIGFsbERhdGFQb2ludHMgPSBbXTtcbiAgICAgIC8vIGlmIChfdGhpcy5zdGF0ZS50cmFpbmluZyAmJiBfdGhpcy5zdGF0ZS5uZXdFcnJvcikge1xuICAgICAgLy8gICBhbGxEYXRhUG9pbnRzID0gYWxsRGF0YVBvaW50cy5jb25jYXQoZGF0YS5maWx0ZXIoZCA9PiAoZFtcInRyYWluaW5nXCJdICYmIGRbXCJuZXctZXJyb3JcIl0pKSk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIGlmIChfdGhpcy5zdGF0ZS50cmFpbmluZyAmJiBfdGhpcy5zdGF0ZS5zdHJpY3RJbWl0YXRpb24pIHtcbiAgICAgIC8vICAgYWxsRGF0YVBvaW50cyA9IGFsbERhdGFQb2ludHMuY29uY2F0KGRhdGEuZmlsdGVyKGQgPT4gKGRbXCJ0cmFpbmluZ1wiXSAmJiBkW1wic3RyaWN0LWltaXRhdGlvblwiXSkpKTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gaWYgKF90aGlzLnN0YXRlLnRlc3RpbmcgJiYgX3RoaXMuc3RhdGUubmV3RXJyb3IpIHtcbiAgICAgIC8vICAgYWxsRGF0YVBvaW50cyA9IGFsbERhdGFQb2ludHMuY29uY2F0KGRhdGEuZmlsdGVyKGQgPT4gKGRbXCJ0ZXN0aW5nXCJdICYmIGRbXCJuZXctZXJyb3JcIl0pKSk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIGlmIChfdGhpcy5zdGF0ZS50ZXN0aW5nICYmIF90aGlzLnN0YXRlLnN0cmljdEltaXRhdGlvbikge1xuICAgICAgLy8gICBhbGxEYXRhUG9pbnRzID0gYWxsRGF0YVBvaW50cy5jb25jYXQoZGF0YS5maWx0ZXIoZCA9PiAoZFtcInRlc3RpbmdcIl0gJiYgZFtcInN0cmljdC1pbWl0YXRpb25cIl0pKSk7XG4gICAgICAvLyB9XG5cbiAgICAgIHZhciBjaXJjbGVzID0gc3ZnLnNlbGVjdEFsbCgnY2lyY2xlJylcbiAgICAgICAgICAuZGF0YShhbGxEYXRhUG9pbnRzKVxuICAgICAgICAgIC5lbnRlcigpXG4gICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgLmF0dHIoJ2N4JyxmdW5jdGlvbiAoZCkgeyByZXR1cm4geFNjYWxlKGRbX3RoaXMucHJvcHMuY29tcGF0aWJpbGl0eVNjb3JlVHlwZV0pIH0pXG4gICAgICAgICAgLmF0dHIoJ2N5JyxmdW5jdGlvbiAoZCkgeyByZXR1cm4geVNjYWxlKGRbJ3BlcmZvcm1hbmNlJ10pIH0pXG4gICAgICAgICAgLmF0dHIoJ3InLCc0JylcbiAgICAgICAgICAuYXR0cignc3Ryb2tlJywnYmxhY2snKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLDEpXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLGZ1bmN0aW9uIChkLGkpIHtcbiAgICAgICAgICAgIGlmIChkW1widHJhaW5pbmdcIl0gJiYgZFtcIm5ldy1lcnJvclwiXSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29sb3JNYXBbXCJ0cmFpbmluZ1wiXVtcIm5ldy1lcnJvclwiXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZFtcInRyYWluaW5nXCJdICYmIGRbXCJzdHJpY3QtaW1pdGF0aW9uXCJdKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb2xvck1hcFtcInRyYWluaW5nXCJdW1wic3RyaWN0LWltaXRhdGlvblwiXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZFtcInRlc3RpbmdcIl0gJiYgZFtcIm5ldy1lcnJvclwiXSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29sb3JNYXBbXCJ0ZXN0aW5nXCJdW1wibmV3LWVycm9yXCJdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkW1widGVzdGluZ1wiXSAmJiBkW1wic3RyaWN0LWltaXRhdGlvblwiXSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29sb3JNYXBbXCJ0ZXN0aW5nXCJdW1wic3RyaWN0LWltaXRhdGlvblwiXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKVxuICAgICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAgIC5kdXJhdGlvbig1MDApXG4gICAgICAgICAgICAgIC5hdHRyKCdyJyw4KVxuICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywzKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2VvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkMy5zZWxlY3QodGhpcylcbiAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAuZHVyYXRpb24oNTAwKVxuICAgICAgICAgICAgICAuYXR0cigncicsNClcbiAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsMSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ2NsaWNrJywgKGQsIGkpID0+IHtfdGhpcy5wcm9wcy5nZXRNb2RlbEV2YWx1YXRpb25EYXRhKGRbXCJkYXRhcG9pbnRfaW5kZXhcIl0pO30pO1xuICAgIH1cblxuICAgIGRyYXdDaXJjbGVzKCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicGxvdFwiIHJlZj17dGhpcy5ub2RlfSAvPlxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFBlcmZvcm1hbmNlQ29tcGF0aWJpbGl0eTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///33\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval('\\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\\n}) : (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n o[k2] = m[k];\\n}));\\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\\n}) : function(o, v) {\\n o[\"default\"] = v;\\n});\\nvar __importStar = (this && this.__importStar) || function (mod) {\\n if (mod && mod.__esModule) return mod;\\n var result = {};\\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\\n __setModuleDefault(result, mod);\\n return result;\\n};\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nconst react_1 = __importStar(__webpack_require__(0));\\nconst d3 = __importStar(__webpack_require__(4));\\nclass IntersectionBetweenModelErrors extends react_1.Component {\\n constructor(props) {\\n super(props);\\n this.state = {\\n selectedDataPoint: this.props.selectedDataPoint\\n };\\n this.node = react_1.default.createRef();\\n this.createVennDiagramPlot = this.createVennDiagramPlot.bind(this);\\n }\\n componentDidMount() {\\n this.createVennDiagramPlot();\\n }\\n componentWillReceiveProps(nextProps) {\\n this.setState({\\n selectedDataPoint: nextProps.selectedDataPoint\\n });\\n }\\n componentDidUpdate() {\\n this.createVennDiagramPlot();\\n }\\n createVennDiagramPlot() {\\n var _this = this;\\n var body = d3.select(this.node.current);\\n var margin = { top: 15, right: 15, bottom: 50, left: 55 };\\n var h = 250 - margin.top - margin.bottom;\\n var w = 250 - margin.left - margin.right;\\n // SVG\\n d3.select(\"#venndiagram\").remove();\\n var svg = body.append(\\'svg\\')\\n .attr(\\'id\\', \"venndiagram\")\\n .attr(\\'height\\', h + margin.top + margin.bottom)\\n .attr(\\'width\\', w + margin.left + margin.right)\\n .append(\\'g\\')\\n .attr(\\'transform\\', `translate(0,${margin.top + 15})`);\\n svg.append(\\'text\\')\\n .attr(\\'id\\', \\'xAxisLabel\\')\\n .attr(\\'y\\', -20)\\n .attr(\\'x\\', 200)\\n .attr(\\'dy\\', \\'.71em\\')\\n .style(\\'text-anchor\\', \\'end\\')\\n .text(\"Intersection Between Model Errors\")\\n .attr(\"font-family\", \"sans-serif\")\\n .attr(\"font-size\", \"10px\")\\n .attr(\"fill\", \"black\");\\n svg.append(\"rect\")\\n .attr(\"x\", 0)\\n .attr(\"y\", 0)\\n .attr(\"width\", w + margin.left + margin.right)\\n .attr(\"height\", h)\\n .attr(\"fill\", \"rgba(255, 255, 255, 0.8)\")\\n .attr(\"stroke\", \"black\")\\n .attr(\"stroke-width\", 0.5);\\n if (this.state.selectedDataPoint != null) {\\n //var selectedDataPoint = this.state.selectedDataPoint;\\n var errorPartition = this.state.selectedDataPoint.models_error_overlap;\\n var a = errorPartition[0];\\n var b = errorPartition[1];\\n var ab = errorPartition[2];\\n let Ra;\\n let Rb;\\n let Aab;\\n let x = 1;\\n if (a >= b) {\\n x = (50 * 50 * 3.14) / a;\\n Ra = 50;\\n Rb = Math.sqrt(b * x / 3.14);\\n Aab = ab * x;\\n }\\n else {\\n x = (50 * 50 * 3.14) / b;\\n Rb = 50;\\n Ra = Math.sqrt(a * x / 3.14);\\n Aab = ab * x;\\n }\\n let d = (Ra + Rb) / 1.5;\\n if (ab == a || ab == b) {\\n d = Math.abs(Ra - Rb) / 1.5;\\n }\\n else if (ab == 0) {\\n d = Ra + Rb + 10;\\n }\\n var circleRad = 50;\\n var xCenter = w / 4 + margin.left;\\n var yCenter = h / 2;\\n svg.append(\"circle\")\\n .attr(\"r\", Ra)\\n .attr(\\'transform\\', \"translate(\" +\\n xCenter + \",\" +\\n yCenter + \")\")\\n .attr(\"fill\", \"rgba(170, 170, 255, 0.8)\");\\n var xCenter2 = xCenter + d;\\n svg.append(\"circle\")\\n .attr(\"r\", Rb)\\n .attr(\\'transform\\', \"translate(\" +\\n xCenter2 + \",\" +\\n yCenter + \")\")\\n .attr(\"fill\", \"rgba(206, 160, 205, 0.8)\");\\n }\\n }\\n render() {\\n return (react_1.default.createElement(\"div\", { className: \"plot\", ref: this.node }));\\n }\\n}\\nexports.default = IntersectionBetweenModelErrors;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvSW50ZXJzZWN0aW9uQmV0d2Vlbk1vZGVsRXJyb3JzLnRzeD8yNmU3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUF5QztBQUV6QyxnREFBeUI7QUFXekIsTUFBTSw4QkFBK0IsU0FBUSxpQkFBbUY7SUFDOUgsWUFBWSxLQUFLO1FBQ2YsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLGlCQUFpQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCO1NBQ2hELENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxHQUFHLGVBQUssQ0FBQyxTQUFTLEVBQWtCLENBQUM7UUFDOUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUlELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxTQUFTO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixpQkFBaUIsRUFBRSxTQUFTLENBQUMsaUJBQWlCO1NBQy9DLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhDLElBQUksTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtRQUN6RCxJ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SSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7aUJBQ2IsSUFBSSxDQUFDLFdBQVcsRUFDYixZQUFZO2dCQUNaLFFBQVEsR0FBRyxHQUFHO2dCQUNkLE9BQU8sR0FBRyxHQUFHLENBQUM7aUJBQ2pCLElBQUksQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztTQUMvQztJQUVILENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxDQUNMLHVDQUFLLFNBQVMsRUFBQyxNQUFNLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUksQ0FDekMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUNELGtCQUFlLDhCQUE4QixDQUFDIiwiZmlsZSI6IjM0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xuXG5cbnR5cGUgSW50ZXJzZWN0aW9uQmV0d2Vlbk1vZGVsRXJyb3JzU3RhdGUgPSB7XG4gIHNlbGVjdGVkRGF0YVBvaW50OiBhbnlcbn1cblxudHlwZSBJbnRlcnNlY3Rpb25CZXR3ZWVuTW9kZWxFcnJvcnNQcm9wcyA9IHtcbiAgc2VsZWN0ZWREYXRhUG9pbnQ6IGFueVxufVxuXG5jbGFzcyBJbnRlcnNlY3Rpb25CZXR3ZWVuTW9kZWxFcnJvcnMgZXh0ZW5kcyBDb21wb25lbnQ8SW50ZXJzZWN0aW9uQmV0d2Vlbk1vZGVsRXJyb3JzUHJvcHMsIEludGVyc2VjdGlvbkJldHdlZW5Nb2RlbEVycm9yc1N0YXRlPiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHNlbGVjdGVkRGF0YVBvaW50OiB0aGlzLnByb3BzLnNlbGVjdGVkRGF0YVBvaW50XG4gICAgfTtcblxuICAgIHRoaXMubm9kZSA9IFJlYWN0LmNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgICB0aGlzLmNyZWF0ZVZlbm5EaWFncmFtUGxvdCA9IHRoaXMuY3JlYXRlVmVubkRpYWdyYW1QbG90LmJpbmQodGhpcyk7XG4gIH1cblxuICBub2RlOiBSZWFjdC5SZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQ+XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5jcmVhdGVWZW5uRGlhZ3JhbVBsb3QoKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZERhdGFQb2ludDogbmV4dFByb3BzLnNlbGVjdGVkRGF0YVBvaW50XG4gICAgfSk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgdGhpcy5jcmVhdGVWZW5uRGlhZ3JhbVBsb3QoKTtcbiAgfVxuXG4gIGNyZWF0ZVZlbm5EaWFncmFtUGxvdCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBib2R5ID0gZDMuc2VsZWN0KHRoaXMubm9kZS5jdXJyZW50KTtcblxuICAgIHZhciBtYXJnaW4gPSB7IHRvcDogMTUsIHJpZ2h0OiAxNSwgYm90dG9tOiA1MCwgbGVmdDogNTUgfVxuICAgIHZhciBoID0gMjUwIC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b21cbiAgICB2YXIgdyA9IDI1MCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0XG5cbiAgICAvLyBTVkdcbiAgICBkMy5zZWxlY3QoXCIjdmVubmRpYWdyYW1cIikucmVtb3ZlKCk7XG4gICAgdmFyIHN2ZyA9IGJvZHkuYXBwZW5kKCdzdmcnKVxuICAgICAgICAuYXR0cignaWQnLCBcInZlbm5kaWFncmFtXCIpXG4gICAgICAgIC5hdHRyKCdoZWlnaHQnLGggKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSlcbiAgICAgICAgLmF0dHIoJ3dpZHRoJyx3ICsgbWFyZ2luLmxlZnQgKyBtYXJnaW4ucmlnaHQpXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsYHRyYW5zbGF0ZSgwLCR7bWFyZ2luLnRvcCArIDE1fSlgKVxuXG4gICAgc3ZnLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignaWQnLCd4QXhpc0xhYmVsJylcbiAgICAgIC5hdHRyKCd5JywgLTIwKVxuICAgICAgLmF0dHIoJ3gnLCAyMDApXG4gICAgICAuYXR0cignZHknLCcuNzFlbScpXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywnZW5kJylcbiAgICAgIC50ZXh0KFwiSW50ZXJzZWN0aW9uIEJldHdlZW4gTW9kZWwgRXJyb3JzXCIpXG4gICAgICAuYXR0cihcImZvbnQtZmFtaWx5XCIsIFwic2Fucy1zZXJpZlwiKVxuICAgICAgLmF0dHIoXCJmb250LXNpemVcIiwgXCIxMHB4XCIpXG4gICAgICAuYXR0cihcImZpbGxcIiwgXCJibGFja1wiKTtcblxuICAgIHN2Zy5hcHBlbmQoXCJyZWN0XCIpXG4gICAgICAuYXR0cihcInhcIiwgMClcbiAgICAgIC5hdHRyKFwieVwiLCAwKVxuICAgICAgLmF0dHIoXCJ3aWR0aFwiLCB3ICsgbWFyZ2luLmxlZnQgKyBtYXJnaW4ucmlnaHQpXG4gICAgICAuYXR0cihcImhlaWdodFwiLCBoKVxuICAgICAgLmF0dHIoXCJmaWxsXCIsIFwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpXCIpXG4gICAgICAuYXR0cihcInN0cm9rZVwiLCBcImJsYWNrXCIpXG4gICAgICAuYXR0cihcInN0cm9rZS13aWR0aFwiLCAwLjUpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuc2VsZWN0ZWREYXRhUG9pbnQgIT0gbnVsbCkge1xuICAgICAgLy92YXIgc2VsZWN0ZWREYXRhUG9pbnQgPSB0aGlzLnN0YXRlLnNlbGVjdGVkRGF0YVBvaW50O1xuICAgICAgdmFyIGVycm9yUGFydGl0aW9uID0gdGhpcy5zdGF0ZS5zZWxlY3RlZERhdGFQb2ludC5tb2RlbHNfZXJyb3Jfb3ZlcmxhcDtcbiAgICAgIHZhciBhID0gZXJyb3JQYXJ0aXRpb25bMF07XG4gICAgICB2YXIgYiA9IGVycm9yUGFydGl0aW9uWzFdO1xuICAgICAgdmFyIGFiID0gZXJyb3JQYXJ0aXRpb25bMl07XG5cbiAgICAgIGxldCBSYTtcbiAgICAgIGxldCBSYjtcbiAgICAgIGxldCBBYWI7XG4gICAgICBsZXQgeCA9IDE7XG4gICAgICBpZiAoYSA+PSBiKSB7XG4gICAgICAgIHggPSAoNTAgKiA1MCAqIDMuMTQpIC8gYTtcbiAgICAgICAgUmEgPSA1MDtcbiAgICAgICAgUmIgPSBNYXRoLnNxcnQoYiAqIHggLyAzLjE0KTtcbiAgICAgICAgQWFiID0gYWIgKiB4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeCA9ICg1MCAqIDUwICogMy4xNCkgLyBiO1xuICAgICAgICBSYiA9IDUwO1xuICAgICAgICBSYSA9IE1hdGguc3FydChhICogeCAvIDMuMTQpO1xuICAgICAgICBBYWIgPSBhYiAqIHg7XG4gICAgICB9XG5cbiAgICAgIGxldCBkID0gKFJhICsgUmIpIC8gMS41O1xuICAgICAgaWYgKGFiID09IGEgfHwgYWIgPT0gYikge1xuICAgICAgICBkID0gTWF0aC5hYnMoUmEgLSBSYikgLyAxLjU7XG4gICAgICB9IGVsc2UgaWYgKGFiID09IDApIHtcbiAgICAgICAgZCA9IFJhICsgUmIgKyAxMDtcbiAgICAgIH1cblxuICAgICAgdmFyIGNpcmNsZVJhZCA9IDUwO1xuICAgICAgdmFyIHhDZW50ZXIgPSB3LzQgKyBtYXJnaW4ubGVmdDtcbiAgICAgIHZhciB5Q2VudGVyID0gaC8yXG4gICAgICBzdmcuYXBwZW5kKFwiY2lyY2xlXCIpXG4gICAgICAgICAgLmF0dHIoXCJyXCIsIFJhKVxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgICBcInRyYW5zbGF0ZShcIiArXG4gICAgICAgICAgICAgIHhDZW50ZXIgKyBcIixcIiArXG4gICAgICAgICAgICAgIHlDZW50ZXIgKyBcIilcIilcbiAgICAgICAgICAuYXR0cihcImZpbGxcIiwgXCJyZ2JhKDE3MCwgMTcwLCAyNTUsIDAuOClcIik7XG5cbiAgICAgIHZhciB4Q2VudGVyMiA9IHhDZW50ZXIgKyBkO1xuICAgICAgc3ZnLmFwcGVuZChcImNpcmNsZVwiKVxuICAgICAgICAgIC5hdHRyKFwiclwiLCBSYilcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJyxcbiAgICAgICAgICAgICAgXCJ0cmFuc2xhdGUoXCIgK1xuICAgICAgICAgICAgICB4Q2VudGVyMiArIFwiLFwiICtcbiAgICAgICAgICAgICAgeUNlbnRlciArIFwiKVwiKVxuICAgICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcInJnYmEoMjA2LCAxNjAsIDIwNSwgMC44KVwiKTtcbiAgICB9XG5cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJwbG90XCIgcmVmPXt0aGlzLm5vZGV9IC8+XG4gICAgKTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgSW50ZXJzZWN0aW9uQmV0d2Vlbk1vZGVsRXJyb3JzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///34\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('\\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\\n}) : (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n o[k2] = m[k];\\n}));\\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\\n}) : function(o, v) {\\n o[\"default\"] = v;\\n});\\nvar __importStar = (this && this.__importStar) || function (mod) {\\n if (mod && mod.__esModule) return mod;\\n var result = {};\\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\\n __setModuleDefault(result, mod);\\n return result;\\n};\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nconst react_1 = __importStar(__webpack_require__(0));\\nconst d3 = __importStar(__webpack_require__(4));\\nclass IncompatiblePointDistribution extends react_1.Component {\\n constructor(props) {\\n super(props);\\n this.state = {\\n selectedDataPoint: this.props.selectedDataPoint\\n };\\n this.node = react_1.default.createRef();\\n this.createDistributionBarChart = this.createDistributionBarChart.bind(this);\\n }\\n componentDidMount() {\\n this.createDistributionBarChart();\\n }\\n componentWillReceiveProps(nextProps) {\\n this.setState({\\n selectedDataPoint: nextProps.selectedDataPoint\\n });\\n }\\n componentDidUpdate() {\\n this.createDistributionBarChart();\\n }\\n createDistributionBarChart() {\\n var _this = this;\\n var body = d3.select(this.node.current);\\n var margin = { top: 15, right: 15, bottom: 50, left: 55 };\\n var h = 250 - margin.top - margin.bottom;\\n var w = 250 - margin.left - margin.right;\\n // SVG\\n d3.select(\"#incompatiblepointdistribution\").remove();\\n var svg = body.append(\\'svg\\')\\n .attr(\\'id\\', \"incompatiblepointdistribution\")\\n .attr(\\'height\\', h + margin.top + margin.bottom)\\n .attr(\\'width\\', w + margin.left + margin.right);\\n svg.append(\"text\")\\n .attr(\"x\", margin.left + 20)\\n .attr(\"y\", 15)\\n .attr(\"font-size\", \"10px\")\\n .text(\"Distribution of Incompatible Points\");\\n if (this.props.selectedDataPoint != null) {\\n var dataRows = this.props.selectedDataPoint.h2_error_fraction_by_class;\\n var xScale = d3.scaleBand().range([0, w]).padding(0.4), yScale = d3.scaleLinear().range([h, 0]);\\n var g = svg.append(\"g\")\\n .attr(\"transform\", \"translate(\" + 55 + \",\" + 30 + \")\");\\n xScale.domain(dataRows.map(function (d) { return d.class; }));\\n yScale.domain([0, 100]);\\n g.append(\"g\")\\n .attr(\"transform\", \"translate(0,\" + h + \")\")\\n .call(d3.axisBottom(xScale))\\n .append(\"text\")\\n .attr(\"y\", 30)\\n .attr(\"x\", (w + margin.left) / 2)\\n .attr(\"text-anchor\", \"end\")\\n .attr(\"fill\", \"black\")\\n .text(\"Classes\");\\n g.append(\"g\")\\n .call(d3.axisLeft(yScale).tickFormat(function (d) {\\n return d;\\n })\\n .ticks(10))\\n .append(\"text\")\\n .attr(\"transform\", \"rotate(-90)\")\\n .attr(\"y\", 6)\\n .attr(\"dy\", \"-5.1em\")\\n .attr(\"text-anchor\", \"end\")\\n .attr(\"fill\", \"black\")\\n .text(\"Percentage of Incompatible Points\");\\n g.selectAll(\".bar\")\\n .data(dataRows)\\n .enter().append(\"rect\")\\n .attr(\"class\", \"bar\")\\n .attr(\"x\", function (d) { return xScale(d.class); })\\n .attr(\"y\", function (d) { return yScale(d.incompatibleFraction * 100); })\\n .attr(\"width\", xScale.bandwidth())\\n .attr(\"height\", function (d) { return h - yScale(d.incompatibleFraction * 100); });\\n }\\n }\\n render() {\\n return (react_1.default.createElement(\"div\", { className: \"plot\", ref: this.node }));\\n }\\n}\\nexports.default = IncompatiblePointDistribution;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvSW5jb21wYXRpYmxlUG9pbnREaXN0cmlidXRpb24udHN4P2I5YmQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQXlDO0FBRXpDLGdEQUF5QjtBQVd6QixNQUFNLDZCQUE4QixTQUFRLGlCQUFpRjtJQUMzSCxZQUFZLEtBQUs7UUFDZixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUMsS0FBSyxHQUFHO1lBQ1gsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUI7U0FDaEQsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBSyxDQUFDLFNBQVMsRUFBa0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBSUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELHlCQUF5QixDQUFDLFNBQVM7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNaLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxpQkFBaUI7U0FDL0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsMEJBQTBCO1FBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEMsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1FBQ3pELElB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QUFDRCxrQkFBZSw2QkFBNkIsQ0FBQyIsImZpbGUiOiIzNS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcblxuXG50eXBlIEluY29tcGF0aWJsZVBvaW50RGlzdHJpYnV0aW9uU3RhdGUgPSB7XG4gIHNlbGVjdGVkRGF0YVBvaW50OiBhbnlcbn1cblxudHlwZSBJbmNvbXBhdGlibGVQb2ludERpc3RyaWJ1dGlvblByb3BzID0ge1xuICBzZWxlY3RlZERhdGFQb2ludDogYW55XG59XG5cbmNsYXNzIEluY29tcGF0aWJsZVBvaW50RGlzdHJpYnV0aW9uIGV4dGVuZHMgQ29tcG9uZW50PEluY29tcGF0aWJsZVBvaW50RGlzdHJpYnV0aW9uUHJvcHMsIEluY29tcGF0aWJsZVBvaW50RGlzdHJpYnV0aW9uU3RhdGU+IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgc2VsZWN0ZWREYXRhUG9pbnQ6IHRoaXMucHJvcHMuc2VsZWN0ZWREYXRhUG9pbnRcbiAgICB9O1xuXG4gICAgdGhpcy5ub2RlID0gUmVhY3QuY3JlYXRlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuICAgIHRoaXMuY3JlYXRlRGlzdHJpYnV0aW9uQmFyQ2hhcnQgPSB0aGlzLmNyZWF0ZURpc3RyaWJ1dGlvbkJhckNoYXJ0LmJpbmQodGhpcyk7XG4gIH1cblxuICBub2RlOiBSZWFjdC5SZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQ+XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5jcmVhdGVEaXN0cmlidXRpb25CYXJDaGFydCgpO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRGF0YVBvaW50OiBuZXh0UHJvcHMuc2VsZWN0ZWREYXRhUG9pbnRcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB0aGlzLmNyZWF0ZURpc3RyaWJ1dGlvbkJhckNoYXJ0KCk7XG4gIH1cblxuICBjcmVhdGVEaXN0cmlidXRpb25CYXJDaGFydCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBib2R5ID0gZDMuc2VsZWN0KHRoaXMubm9kZS5jdXJyZW50KTtcblxuICAgIHZhciBtYXJnaW4gPSB7IHRvcDogMTUsIHJpZ2h0OiAxNSwgYm90dG9tOiA1MCwgbGVmdDogNTUgfVxuICAgIHZhciBoID0gMjUwIC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b21cbiAgICB2YXIgdyA9IDI1MCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0XG5cbiAgICAvLyBTVkdcbiAgICBkMy5zZWxlY3QoXCIjaW5jb21wYXRpYmxlcG9pbnRkaXN0cmlidXRpb25cIikucmVtb3ZlKCk7XG4gICAgdmFyIHN2ZyA9IGJvZHkuYXBwZW5kKCdzdmcnKVxuICAgICAgICAuYXR0cignaWQnLCBcImluY29tcGF0aWJsZXBvaW50ZGlzdHJpYnV0aW9uXCIpXG4gICAgICAgIC5hdHRyKCdoZWlnaHQnLGggKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSlcbiAgICAgICAgLmF0dHIoJ3dpZHRoJyx3ICsgbWFyZ2luLmxlZnQgKyBtYXJnaW4ucmlnaHQpO1xuXG4gICAgc3ZnLmFwcGVuZChcInRleHRcIilcbiAgICAgICAuYXR0cihcInhcIiwgbWFyZ2luLmxlZnQgKyAyMClcbiAgICAgICAuYXR0cihcInlcIiwgMTUpXG4gICAgICAgLmF0dHIoXCJmb250LXNpemVcIiwgXCIxMHB4XCIpXG4gICAgICAgLnRleHQoXCJEaXN0cmlidXRpb24gb2YgSW5jb21wYXRpYmxlIFBvaW50c1wiKVxuXG4gICAgaWYgKHRoaXMucHJvcHMuc2VsZWN0ZWREYXRhUG9pbnQgIT0gbnVsbCkge1xuICAgICAgdmFyIGRhdGFSb3dzID0gdGhpcy5wcm9wcy5zZWxlY3RlZERhdGFQb2ludC5oMl9lcnJvcl9mcmFjdGlvbl9ieV9jbGFzcztcblxuICAgICAgdmFyIHhTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLnJhbmdlKFswLCB3XSkucGFkZGluZygwLjQpLFxuICAgICAgICAgIHlTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCkucmFuZ2UoW2gsIDBdKTtcblxuICAgICAgdmFyIGcgPSBzdmcuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAgICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIDU1ICsgXCIsXCIgKyAzMCArIFwiKVwiKTtcblxuICAgICAgICB4U2NhbGUuZG9tYWluKGRhdGFSb3dzLm1hcChmdW5jdGlvbihkKSB7IHJldHVybiBkLmNsYXNzOyB9KSk7XG4gICAgICAgIHlTY2FsZS5kb21haW4oWzAsIDEwMF0pO1xuXG4gICAgICAgIGcuYXBwZW5kKFwiZ1wiKVxuICAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoMCxcIiArIGggKyBcIilcIilcbiAgICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeFNjYWxlKSlcbiAgICAgICAgIC5hcHBlbmQoXCJ0ZXh0XCIpXG4gICAgICAgICAuYXR0cihcInlcIiwgMzApXG4gICAgICAgICAuYXR0cihcInhcIiwgKHcgKyBtYXJnaW4ubGVmdCkvMilcbiAgICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJlbmRcIilcbiAgICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcImJsYWNrXCIpXG4gICAgICAgICAudGV4dChcIkNsYXNzZXNcIik7XG5cbiAgICAgICAgZy5hcHBlbmQoXCJnXCIpXG4gICAgICAgICAuY2FsbChkMy5heGlzTGVmdCh5U2NhbGUpLnRpY2tGb3JtYXQoZnVuY3Rpb24oZCl7XG4gICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgICB9KVxuICAgICAgICAgLnRpY2tzKDEwKSlcbiAgICAgICAgIC5hcHBlbmQoXCJ0ZXh0XCIpXG4gICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBcInJvdGF0ZSgtOTApXCIpXG4gICAgICAgICAuYXR0cihcInlcIiwgNilcbiAgICAgICAgIC5hdHRyKFwiZHlcIiwgXCItNS4xZW1cIilcbiAgICAgICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJlbmRcIilcbiAgICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcImJsYWNrXCIpXG4gICAgICAgICAudGV4dChcIlBlcmNlbnRhZ2Ugb2YgSW5jb21wYXRpYmxlIFBvaW50c1wiKTtcblxuICAgICAgICBnLnNlbGVjdEFsbChcIi5iYXJcIilcbiAgICAgICAgIC5kYXRhKGRhdGFSb3dzKVxuICAgICAgICAgLmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKVxuICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImJhclwiKVxuICAgICAgICAgLmF0dHIoXCJ4XCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHhTY2FsZShkLmNsYXNzKTsgfSlcbiAgICAgICAgIC5hdHRyKFwieVwiLCBmdW5jdGlvbihkKSB7IHJldHVybiB5U2NhbGUoZC5pbmNvbXBhdGlibGVGcmFjdGlvbiAqIDEwMCk7IH0pXG4gICAgICAgICAuYXR0cihcIndpZHRoXCIsIHhTY2FsZS5iYW5kd2lkdGgoKSlcbiAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGggLSB5U2NhbGUoZC5pbmNvbXBhdGlibGVGcmFjdGlvbiAqIDEwMCk7IH0pO1xuICAgICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInBsb3RcIiByZWY9e3RoaXMubm9kZX0gLz5cbiAgICApO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBJbmNvbXBhdGlibGVQb2ludERpc3RyaWJ1dGlvbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///35\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('\\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\\n}) : (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n o[k2] = m[k];\\n}));\\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\\n}) : function(o, v) {\\n o[\"default\"] = v;\\n});\\nvar __importStar = (this && this.__importStar) || function (mod) {\\n if (mod && mod.__esModule) return mod;\\n var result = {};\\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\\n __setModuleDefault(result, mod);\\n return result;\\n};\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nconst react_1 = __importStar(__webpack_require__(0));\\nclass RawValues extends react_1.Component {\\n constructor(props) {\\n super(props);\\n this.state = {\\n data: this.props.data\\n };\\n }\\n componentWillReceiveProps(nextProps) {\\n this.setState({\\n data: nextProps.data\\n });\\n }\\n render() {\\n return (react_1.default.createElement(\"div\", { className: \"table\" }, \"Raw Values Table goes here\"));\\n }\\n}\\nexports.default = RawValues;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvUmF3VmFsdWVzLnRzeD9kODQ1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUF5QztBQWF6QyxNQUFNLFNBQVUsU0FBUSxpQkFBeUM7SUFDL0QsWUFBWSxLQUFLO1FBQ2YsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7U0FDdEIsQ0FBQztJQUNKLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxTQUFTO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLENBQ0wsdUNBQUssU0FBUyxFQUFDLE9BQU8saUNBRWhCLENBQ1AsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUNELGtCQUFlLFNBQVMsQ0FBQyIsImZpbGUiOiIzNi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcblxuXG50eXBlIFJhd1ZhbHVlc1N0YXRlID0ge1xuICBkYXRhOiBhbnlcbn1cblxudHlwZSBSYXdWYWx1ZXNQcm9wcyA9IHtcbiAgZGF0YTogYW55XG59XG5cbmNsYXNzIFJhd1ZhbHVlcyBleHRlbmRzIENvbXBvbmVudDxSYXdWYWx1ZXNQcm9wcywgUmF3VmFsdWVzU3RhdGU+IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZGF0YTogdGhpcy5wcm9wcy5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkYXRhOiBuZXh0UHJvcHMuZGF0YVxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRhYmxlXCI+XG4gICAgICAgIFJhdyBWYWx1ZXMgVGFibGUgZ29lcyBoZXJlXG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBSYXdWYWx1ZXM7XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///36\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('\\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\\n}) : (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n o[k2] = m[k];\\n}));\\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\\n}) : function(o, v) {\\n o[\"default\"] = v;\\n});\\nvar __importStar = (this && this.__importStar) || function (mod) {\\n if (mod && mod.__esModule) return mod;\\n var result = {};\\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\\n __setModuleDefault(result, mod);\\n return result;\\n};\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nconst react_1 = __importStar(__webpack_require__(0));\\nclass ErrorInstancesTable extends react_1.Component {\\n constructor(props) {\\n super(props);\\n this.state = {\\n data: this.props.data\\n };\\n }\\n componentWillReceiveProps(nextProps) {\\n this.setState({\\n data: nextProps.data\\n });\\n }\\n render() {\\n return (react_1.default.createElement(\"div\", { className: \"table\" }, \"Error Instances Table goes here\"));\\n }\\n}\\nexports.default = ErrorInstancesTable;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvRXJyb3JJbnN0YW5jZXNUYWJsZS50c3g/YWZhZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBeUM7QUFhekMsTUFBTSxtQkFBb0IsU0FBUSxpQkFBNkQ7SUFDN0YsWUFBWSxLQUFLO1FBQ2YsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7U0FDdEIsQ0FBQztJQUNKLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxTQUFTO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLENBQ0wsdUNBQUssU0FBUyxFQUFDLE9BQU8sc0NBRWhCLENBQ1AsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUNELGtCQUFlLG1CQUFtQixDQUFDIiwiZmlsZSI6IjM3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xuXG5cbnR5cGUgRXJyb3JJbnN0YW5jZXNUYWJsZVN0YXRlID0ge1xuICBkYXRhOiBhbnlcbn1cblxudHlwZSBFcnJvckluc3RhbmNlc1RhYmxlUHJvcHMgPSB7XG4gIGRhdGE6IGFueVxufVxuXG5jbGFzcyBFcnJvckluc3RhbmNlc1RhYmxlIGV4dGVuZHMgQ29tcG9uZW50PEVycm9ySW5zdGFuY2VzVGFibGVQcm9wcywgRXJyb3JJbnN0YW5jZXNUYWJsZVN0YXRlPiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGRhdGE6IHRoaXMucHJvcHMuZGF0YVxuICAgIH07XG4gIH1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGF0YTogbmV4dFByb3BzLmRhdGFcbiAgICB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0YWJsZVwiPlxuICAgICAgICBFcnJvciBJbnN0YW5jZXMgVGFibGUgZ29lcyBoZXJlXG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBFcnJvckluc3RhbmNlc1RhYmxlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///37\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('\\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\\n}) : (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n o[k2] = m[k];\\n}));\\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\\n}) : function(o, v) {\\n o[\"default\"] = v;\\n});\\nvar __importStar = (this && this.__importStar) || function (mod) {\\n if (mod && mod.__esModule) return mod;\\n var result = {};\\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\\n __setModuleDefault(result, mod);\\n return result;\\n};\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nconst react_1 = __importStar(__webpack_require__(0));\\nclass DataSelector extends react_1.Component {\\n constructor(props) {\\n super(props);\\n this.state = {\\n training: true,\\n testing: true,\\n newError: true,\\n strictImitation: true\\n };\\n this.selectTraining = this.selectTraining.bind(this);\\n this.selectTesting = this.selectTesting.bind(this);\\n this.selectNewError = this.selectNewError.bind(this);\\n this.selectStrictImitation = this.selectStrictImitation.bind(this);\\n }\\n selectTraining(evt) {\\n this.setState({\\n training: !this.state.training\\n });\\n this.props.toggleTraining();\\n }\\n selectTesting(evt) {\\n this.setState({\\n testing: !this.state.testing\\n });\\n this.props.toggleTesting();\\n }\\n selectNewError(evt) {\\n this.setState({\\n newError: !this.state.newError\\n });\\n this.props.toggleNewError();\\n }\\n selectStrictImitation(evt) {\\n this.setState({\\n strictImitation: !this.state.strictImitation\\n });\\n this.props.toggleStrictImitation();\\n }\\n render() {\\n return (react_1.default.createElement(\"div\", { className: \"data-selector\" },\\n react_1.default.createElement(\"div\", { className: \"control-group\" },\\n react_1.default.createElement(\"div\", { className: \"control-subgroup\" },\\n react_1.default.createElement(\"input\", { className: \"control\", type: \"checkbox\", name: \"training\", value: \"training\", checked: this.state.training, onClick: this.selectTraining }),\\n react_1.default.createElement(\"div\", { className: \"control\" }, \"Training\")),\\n react_1.default.createElement(\"div\", { className: \"control-subgroup\" },\\n react_1.default.createElement(\"input\", { className: \"control\", type: \"checkbox\", name: \"testing\", value: \"testing\", checked: this.state.testing, onClick: this.selectTesting }),\\n react_1.default.createElement(\"div\", { className: \"control\" }, \"Testing\"))),\\n react_1.default.createElement(\"div\", { className: \"control-group\" },\\n react_1.default.createElement(\"div\", { className: \"control-subgroup\" },\\n react_1.default.createElement(\"input\", { className: \"control\", type: \"checkbox\", name: \"training\", value: \"training\", checked: this.state.newError, onClick: this.selectNewError }),\\n react_1.default.createElement(\"div\", { className: \"control\" }, \"New-Error\")),\\n react_1.default.createElement(\"div\", { className: \"control-subgroup\" },\\n react_1.default.createElement(\"input\", { className: \"control\", type: \"checkbox\", name: \"testing\", value: \"testing\", checked: this.state.strictImitation, onClick: this.selectStrictImitation }),\\n react_1.default.createElement(\"div\", { className: \"control\" }, \"Strict-Imitation\")))));\\n }\\n}\\nexports.default = DataSelector;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvRGF0YVNlbGVjdG9yLnRzeD9iOTQzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUF5QztBQW1CekMsTUFBTSxZQUFhLFNBQVEsaUJBQStDO0lBQ3hFLFlBQVksS0FBSztRQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxLQUFLLEdBQUc7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUSxFQUFFLElBQUk7WUFDZCxlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFHO1FBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQUc7UUFDZixJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ1osT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1NBQzdCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFHO1FBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQscUJBQXFCLENBQUMsR0FBRztRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ1osZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO1NBQzdDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sQ0FDTCx1Q0FBSyxTQUFTLEVBQUMsZUFBZTtZQUM1Qix1Q0FBSyxTQUFTLEVBQUMsZUFBZTtnQkFDNUIsdUNBQUssU0FBUyxFQUFDLGtCQUFrQjtvQkFDL0IseUNBQU8sU0FBUyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUMsVUFBVSxFQUFDLElBQUksRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDLFVBQVUsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUk7b0JBQzFJLHVDQUFLLFNBQVMsRUFBQyxTQUFTLGVBQWUsQ0FDbkM7Z0JBQ04sdUNBQUssU0FBUyxFQUFDLGtCQUFrQjtvQkFDL0IseUNBQU8sU0FBUyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUMsVUFBVSxFQUFDLElBQUksRUFBQyxTQUFTLEVBQUMsS0FBSyxFQUFDLFNBQVMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEdBQUk7b0JBQ3RJLHVDQUFLLFNBQVMsRUFBQyxTQUFTLGNBQWMsQ0FDbEMsQ0FDRjtZQUNOLHVDQUFLLFNBQVMsRUFBQyxlQUFlO2dCQUM1Qix1Q0FBSyxTQUFTLEVBQUMsa0JBQWtCO29CQUMvQix5Q0FBTyxTQUFTLEVBQUMsU0FBUyxFQUFDLElBQUksRUFBQyxVQUFVLEVBQUMsSUFBSSxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUMsVUFBVSxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBSTtvQkFDMUksdUNBQUssU0FBUyxFQUFDLFNBQVMsZ0JBQWdCLENBQ3BDO2dCQUNOLHVDQUFLLFNBQVMsRUFBQyxrQkFBa0I7b0JBQy9CLHlDQUFPLFNBQVMsRUFBQyxTQUFTLEVBQUMsSUFBSSxFQUFDLFVBQVUsRUFBQyxJQUFJLEVBQUMsU0FBUyxFQUFDLEtBQUssRUFBQyxTQUFTLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMscUJBQXFCLEdBQUk7b0JBQ3RKLHVDQUFLLFNBQVMsRUFBQyxTQUFTLHVCQUF1QixDQUMzQyxDQUNGLENBQ0YsQ0FDUCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBQ0Qsa0JBQWUsWUFBWSxDQUFDIiwiZmlsZSI6IjM4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xuXG5cbnR5cGUgRGF0YVNlbGVjdG9yU3RhdGUgPSB7XG4gIHRyYWluaW5nOiBib29sZWFuLFxuICB0ZXN0aW5nOiBib29sZWFuLFxuICBuZXdFcnJvcjogYm9vbGVhbixcbiAgc3RyaWN0SW1pdGF0aW9uOiBib29sZWFuXG59XG5cbnR5cGUgRGF0YVNlbGVjdG9yUHJvcHMgPSB7XG4gIHRvZ2dsZVRyYWluaW5nOiAoKSA9PiB2b2lkLFxuICB0b2dnbGVUZXN0aW5nOiAoKSA9PiB2b2lkLFxuICB0b2dnbGVOZXdFcnJvcjogKCkgPT4gdm9pZCxcbiAgdG9nZ2xlU3RyaWN0SW1pdGF0aW9uOiAoKSA9PiB2b2lkXG59XG5cbmNsYXNzIERhdGFTZWxlY3RvciBleHRlbmRzIENvbXBvbmVudDxEYXRhU2VsZWN0b3JQcm9wcywgRGF0YVNlbGVjdG9yU3RhdGU+IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgdHJhaW5pbmc6IHRydWUsXG4gICAgICB0ZXN0aW5nOiB0cnVlLFxuICAgICAgbmV3RXJyb3I6IHRydWUsXG4gICAgICBzdHJpY3RJbWl0YXRpb246IHRydWVcbiAgICB9O1xuXG4gICAgdGhpcy5zZWxlY3RUcmFpbmluZyA9IHRoaXMuc2VsZWN0VHJhaW5pbmcuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNlbGVjdFRlc3RpbmcgPSB0aGlzLnNlbGVjdFRlc3RpbmcuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNlbGVjdE5ld0Vycm9yID0gdGhpcy5zZWxlY3ROZXdFcnJvci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2VsZWN0U3RyaWN0SW1pdGF0aW9uID0gdGhpcy5zZWxlY3RTdHJpY3RJbWl0YXRpb24uYmluZCh0aGlzKTtcbiAgfVxuXG4gIHNlbGVjdFRyYWluaW5nKGV2dCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgdHJhaW5pbmc6ICF0aGlzLnN0YXRlLnRyYWluaW5nXG4gICAgfSk7XG4gICAgdGhpcy5wcm9wcy50b2dnbGVUcmFpbmluZygpO1xuICB9XG5cbiAgc2VsZWN0VGVzdGluZyhldnQpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHRlc3Rpbmc6ICF0aGlzLnN0YXRlLnRlc3RpbmdcbiAgICB9KTtcbiAgICB0aGlzLnByb3BzLnRvZ2dsZVRlc3RpbmcoKTtcbiAgfVxuXG4gIHNlbGVjdE5ld0Vycm9yKGV2dCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbmV3RXJyb3I6ICF0aGlzLnN0YXRlLm5ld0Vycm9yXG4gICAgfSk7XG4gICAgdGhpcy5wcm9wcy50b2dnbGVOZXdFcnJvcigpO1xuICB9XG5cbiAgc2VsZWN0U3RyaWN0SW1pdGF0aW9uKGV2dCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3RyaWN0SW1pdGF0aW9uOiAhdGhpcy5zdGF0ZS5zdHJpY3RJbWl0YXRpb25cbiAgICB9KTtcbiAgICB0aGlzLnByb3BzLnRvZ2dsZVN0cmljdEltaXRhdGlvbigpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRhdGEtc2VsZWN0b3JcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250cm9sLWdyb3VwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250cm9sLXN1Ymdyb3VwXCI+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwiY29udHJvbFwiIHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJ0cmFpbmluZ1wiIHZhbHVlPVwidHJhaW5pbmdcIiBjaGVja2VkPXt0aGlzLnN0YXRlLnRyYWluaW5nfSBvbkNsaWNrPXt0aGlzLnNlbGVjdFRyYWluaW5nfSAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250cm9sXCI+VHJhaW5pbmc8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbnRyb2wtc3ViZ3JvdXBcIj5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJjb250cm9sXCIgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInRlc3RpbmdcIiB2YWx1ZT1cInRlc3RpbmdcIiBjaGVja2VkPXt0aGlzLnN0YXRlLnRlc3Rpbmd9IG9uQ2xpY2s9e3RoaXMuc2VsZWN0VGVzdGluZ30gLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbFwiPlRlc3Rpbmc8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbC1ncm91cFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbC1zdWJncm91cFwiPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImNvbnRyb2xcIiB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwidHJhaW5pbmdcIiB2YWx1ZT1cInRyYWluaW5nXCIgY2hlY2tlZD17dGhpcy5zdGF0ZS5uZXdFcnJvcn0gb25DbGljaz17dGhpcy5zZWxlY3ROZXdFcnJvcn0gLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbFwiPk5ldy1FcnJvcjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbC1zdWJncm91cFwiPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT1cImNvbnRyb2xcIiB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwidGVzdGluZ1wiIHZhbHVlPVwidGVzdGluZ1wiIGNoZWNrZWQ9e3RoaXMuc3RhdGUuc3RyaWN0SW1pdGF0aW9ufSBvbkNsaWNrPXt0aGlzLnNlbGVjdFN0cmljdEltaXRhdGlvbn0gLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udHJvbFwiPlN0cmljdC1JbWl0YXRpb248L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBEYXRhU2VsZWN0b3I7XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///38\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('\\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\\n}) : (function(o, m, k, k2) {\\n if (k2 === undefined) k2 = k;\\n o[k2] = m[k];\\n}));\\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\\n}) : function(o, v) {\\n o[\"default\"] = v;\\n});\\nvar __importStar = (this && this.__importStar) || function (mod) {\\n if (mod && mod.__esModule) return mod;\\n var result = {};\\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\\n __setModuleDefault(result, mod);\\n return result;\\n};\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nconst react_1 = __importStar(__webpack_require__(0));\\nclass SweepManager extends react_1.Component {\\n constructor(props) {\\n super(props);\\n this.timeoutVar = null;\\n this.state = {\\n sweepStatus: this.props.sweepStatus\\n };\\n this.pollSweepStatus = this.pollSweepStatus.bind(this);\\n this.startSweep = this.startSweep.bind(this);\\n }\\n componentWillReceiveProps(nextProps) {\\n this.setState({\\n sweepStatus: nextProps.sweepStatus\\n });\\n }\\n componentWillUnmount() {\\n if (this.timeoutVar != null) {\\n clearTimeout(this.timeoutVar);\\n }\\n }\\n pollSweepStatus() {\\n this.props.getSweepStatus();\\n if (this.timeoutVar != null) {\\n clearTimeout(this.timeoutVar);\\n this.timeoutVar = null;\\n }\\n this.timeoutVar = setTimeout(this.pollSweepStatus, 5000);\\n }\\n startSweep(evt) {\\n this.props.startSweep();\\n this.pollSweepStatus();\\n }\\n render() {\\n if (this.state.sweepStatus == null || !this.state.sweepStatus.running) {\\n if (this.timeoutVar != null && this.state.sweepStatus.percent_complete == 1.0) {\\n clearTimeout(this.timeoutVar);\\n this.timeoutVar = null;\\n this.props.getTrainingAndTestingData();\\n }\\n return (react_1.default.createElement(\"div\", { className: \"table\" },\\n react_1.default.createElement(\"a\", { href: \"#\", onClick: this.startSweep }, \"Start Sweep\")));\\n }\\n return (react_1.default.createElement(\"div\", { className: \"table\" },\\n \"Sweep in progress\",\\n react_1.default.createElement(\"div\", null,\\n Math.floor(this.state.sweepStatus.percent_complete * 100),\\n \" % complete\")));\\n }\\n}\\nexports.default = SweepManager;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvU3dlZXBNYW5hZ2VyLnRzeD9kNzM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUF5QztBQWdCekMsTUFBTSxZQUFhLFNBQVEsaUJBQStDO0lBQ3hFLFlBQVksS0FBSztRQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQVVmLGVBQVUsR0FBUSxJQUFJO1FBUnBCLElBQUksQ0FBQyxLQUFLLEdBQUc7WUFDWCxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO1NBQ3BDLENBQUM7UUFFRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUlELHlCQUF5QixDQUFDLFNBQVM7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNaLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVztTQUNuQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDM0IsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMvQjtJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFO1lBQzNCLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDeEI7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxVQUFVLENBQUMsR0FBRztRQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNO1FBRUosSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUU7WUFDckUsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsSUFBSSxHQUFHLEVBQUU7Z0JBQzdFLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLENBQUM7YUFDeEM7WUFFRCxPQUFPLENBQ0wsdUNBQUssU0FBUyxFQUFDLE9BQU87Z0JBQ3BCLHFDQUFHLElBQUksRUFBQyxHQUFHLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLGtCQUFpQixDQUNqRCxDQUNQLENBQUM7U0FDSDtRQUVELE9BQU8sQ0FDTCx1Q0FBSyxTQUFTLEVBQUMsT0FBTzs7WUFFcEI7Z0JBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7OEJBQ3JELENBQ0YsQ0FDUCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBQ0Qsa0JBQWUsWUFBWSxDQUFDIiwiZmlsZSI6IjM5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xuXG5cbnR5cGUgU3dlZXBNYW5hZ2VyU3RhdGUgPSB7XG4gIHN3ZWVwU3RhdHVzOiBhbnlcbn1cblxudHlwZSBTd2VlcE1hbmFnZXJQcm9wcyA9IHtcbiAgc3dlZXBTdGF0dXM6IGFueSxcbiAgZ2V0U3dlZXBTdGF0dXM6ICgpID0+IHZvaWQsXG4gIHN0YXJ0U3dlZXA6ICgpID0+IHZvaWQsXG4gIGdldFRyYWluaW5nQW5kVGVzdGluZ0RhdGE6ICgpID0+IHZvaWRcbn1cblxuY2xhc3MgU3dlZXBNYW5hZ2VyIGV4dGVuZHMgQ29tcG9uZW50PFN3ZWVwTWFuYWdlclByb3BzLCBTd2VlcE1hbmFnZXJTdGF0ZT4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBzd2VlcFN0YXR1czogdGhpcy5wcm9wcy5zd2VlcFN0YXR1c1xuICAgIH07XG5cbiAgICB0aGlzLnBvbGxTd2VlcFN0YXR1cyA9IHRoaXMucG9sbFN3ZWVwU3RhdHVzLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zdGFydFN3ZWVwID0gdGhpcy5zdGFydFN3ZWVwLmJpbmQodGhpcyk7XG4gIH1cblxuICB0aW1lb3V0VmFyOiBhbnkgPSBudWxsXG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN3ZWVwU3RhdHVzOiBuZXh0UHJvcHMuc3dlZXBTdGF0dXNcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICh0aGlzLnRpbWVvdXRWYXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFZhcik7XG4gICAgfVxuICB9XG5cbiAgcG9sbFN3ZWVwU3RhdHVzKCkge1xuICAgIHRoaXMucHJvcHMuZ2V0U3dlZXBTdGF0dXMoKTtcbiAgICBpZiAodGhpcy50aW1lb3V0VmFyICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRWYXIpO1xuICAgICAgdGhpcy50aW1lb3V0VmFyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy50aW1lb3V0VmFyID0gc2V0VGltZW91dCh0aGlzLnBvbGxTd2VlcFN0YXR1cywgNTAwMCk7XG4gIH1cblxuICBzdGFydFN3ZWVwKGV2dCkge1xuICAgIHRoaXMucHJvcHMuc3RhcnRTd2VlcCgpO1xuICAgIHRoaXMucG9sbFN3ZWVwU3RhdHVzKCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5zd2VlcFN0YXR1cyA9PSBudWxsIHx8ICF0aGlzLnN0YXRlLnN3ZWVwU3RhdHVzLnJ1bm5pbmcpIHtcbiAgICAgIGlmICh0aGlzLnRpbWVvdXRWYXIgIT0gbnVsbCAmJiB0aGlzLnN0YXRlLnN3ZWVwU3RhdHVzLnBlcmNlbnRfY29tcGxldGUgPT0gMS4wKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRWYXIpO1xuICAgICAgICB0aGlzLnRpbWVvdXRWYXIgPSBudWxsO1xuICAgICAgICB0aGlzLnByb3BzLmdldFRyYWluaW5nQW5kVGVzdGluZ0RhdGEoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0YWJsZVwiPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgb25DbGljaz17dGhpcy5zdGFydFN3ZWVwfT5TdGFydCBTd2VlcDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRhYmxlXCI+XG4gICAgICAgIFN3ZWVwIGluIHByb2dyZXNzXG4gICAgICAgIDxkaXY+XG4gICAgICAgICB7TWF0aC5mbG9vcih0aGlzLnN0YXRlLnN3ZWVwU3RhdHVzLnBlcmNlbnRfY29tcGxldGUgKiAxMDApfSAlIGNvbXBsZXRlXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgU3dlZXBNYW5hZ2VyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///39\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nexports.startSweep = exports.getSweepStatus = exports.getModelEvaluationData = exports.getTrainingAndTestingData = exports.selectDataPoint = exports.toggleStrictImitation = exports.toggleNewError = exports.toggleTesting = exports.toggleTraining = void 0;\\nconst api_ts_1 = __webpack_require__(41);\\nfunction toggleTraining() {\\n return {\\n type: \"TOGGLE_TRAINING\"\\n };\\n}\\nexports.toggleTraining = toggleTraining;\\nfunction toggleTesting() {\\n return {\\n type: \"TOGGLE_TESTING\"\\n };\\n}\\nexports.toggleTesting = toggleTesting;\\nfunction toggleNewError() {\\n return {\\n type: \"TOGGLE_NEW_ERROR\"\\n };\\n}\\nexports.toggleNewError = toggleNewError;\\nfunction toggleStrictImitation() {\\n return {\\n type: \"TOGGLE_STRICT_IMITATION\"\\n };\\n}\\nexports.toggleStrictImitation = toggleStrictImitation;\\nfunction selectDataPoint(dataPoint) {\\n return {\\n type: \"SELECT_DATA_POINT\",\\n dataPoint: dataPoint\\n };\\n}\\nexports.selectDataPoint = selectDataPoint;\\nfunction requestTrainingAndTestingData() {\\n return {\\n type: \"REQUEST_TRAINING_AND_TESTING_DATA\"\\n };\\n}\\nfunction requestTrainingAndTestingDataSucceeded(data) {\\n return {\\n type: \"REQUEST_TRAINING_AND_TESTING_DATA_SUCCEEDED\",\\n data: data\\n };\\n}\\nfunction requestTrainingAndTestingDataFailed(error) {\\n return {\\n type: \"REQUEST_TRAINING_AND_TESTING_DATA_FAILED\",\\n error: error\\n };\\n}\\nfunction getTrainingAndTestingData() {\\n return function (dispatch) {\\n dispatch(requestTrainingAndTestingData);\\n api_ts_1.makeGetCall(\"api/v1/sweep_summary\")\\n .then(response => { dispatch(requestTrainingAndTestingDataSucceeded(response.data)); })\\n .catch(error => dispatch(requestTrainingAndTestingDataFailed(error)));\\n };\\n}\\nexports.getTrainingAndTestingData = getTrainingAndTestingData;\\nfunction requestModelEvaluationData() {\\n return {\\n type: \"REQUEST_MODEL_EVALUATION_DATA\"\\n };\\n}\\nfunction requestModelEvaluationDataSucceeded(evaluationData) {\\n return {\\n type: \"REQUEST_MODEL_EVALUATION_DATA_SUCCEEDED\",\\n evaluationData: evaluationData\\n };\\n}\\nfunction requestModelEvaluationDataFailed(error) {\\n return {\\n type: \"REQUEST_MODELEVALUATION_DATA_FAILED\",\\n error: error\\n };\\n}\\nfunction getModelEvaluationData(evaluationId) {\\n return function (dispatch) {\\n dispatch(requestModelEvaluationData);\\n api_ts_1.makeGetCall(`api/v1/evaluation_data/${evaluationId}`)\\n .then(response => { dispatch(requestModelEvaluationDataSucceeded(response.data)); })\\n .catch(error => dispatch(requestModelEvaluationDataFailed(error)));\\n };\\n}\\nexports.getModelEvaluationData = getModelEvaluationData;\\nfunction requestSweepStatusSucceeded(sweepStatus) {\\n return {\\n type: \"REQUEST_SWEEP_STATUS_SUCCEEDED\",\\n sweepStatus: sweepStatus\\n };\\n}\\nfunction requestSweepStatusFailed(error) {\\n return {\\n type: \"REQUEST_SWEEP_STATUS_FAILED\",\\n error: error\\n };\\n}\\nfunction getSweepStatus() {\\n return function (dispatch) {\\n api_ts_1.makeGetCall(\"api/v1/sweep_status\")\\n .then(response => { dispatch(requestSweepStatusSucceeded(response.data)); })\\n .catch(error => dispatch(requestSweepStatusFailed(error)));\\n };\\n}\\nexports.getSweepStatus = getSweepStatus;\\nfunction startSweep() {\\n return function (dispatch) {\\n dispatch(getSweepStatus());\\n api_ts_1.makePostCall(\"api/v1/start_sweep\", {});\\n };\\n}\\nexports.startSweep = startSweep;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvYWN0aW9ucy50cz81YjJlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFxRDtBQUdyRCxTQUFTLGNBQWM7SUFDckIsT0FBTztRQUNMLElBQUksRUFBRSxpQkFBaUI7S0FDeEI7QUFDSCxDQUFDO0FBbUhDLHdDQUFjO0FBakhoQixTQUFTLGFBQWE7SUFDcEIsT0FBTztRQUNMLElBQUksRUFBRSxnQkFBZ0I7S0FDdkI7QUFDSCxDQUFDO0FBOEdDLHNDQUFhO0FBNUdmLFNBQVMsY0FBYztJQUNyQixPQUFPO1FBQ0wsSUFBSSxFQUFFLGtCQUFrQjtLQUN6QjtBQUNILENBQUM7QUF5R0Msd0NBQWM7QUF2R2hCLFNBQVMscUJBQXFCO0lBQzVCLE9BQU87UUFDTCxJQUFJLEVBQUUseUJBQXlCO0tBQ2hDO0FBQ0gsQ0FBQztBQW9HQyxzREFBcUI7QUFsR3ZCLFNBQVMsZUFBZSxDQUFDLFNBQVM7SUFDaEMsT0FBTztRQUNMLElBQUksRUFBRSxtQkFBbUI7UUFDekIsU0FBUyxFQUFFLFNBQVM7S0FDckI7QUFDSCxDQUFDO0FBOEZDLDBDQUFlO0FBNUZqQixTQUFTLDZCQUE2QjtJQUNwQyxPQUFPO1FBQ0wsSUFBSSxFQUFFLG1DQUFtQztLQUMxQztBQUNILENBQUM7QUFFRCxTQUFTLHNDQUFzQyxDQUFDLElBQUk7SUFDbEQsT0FBTztRQUNMLElBQUksRUFBRSw2Q0FBNkM7UUFDbkQsSUFBSSxFQUFFLElBQUk7S0FDWDtBQUNILENBQUM7QUFFRCxTQUFTLG1DQUFtQyxDQUFDLEtBQUs7SUFDaEQsT0FBTztRQUNMLElBQUksRUFBRSwwQ0FBMEM7UUFDaEQsS0FBSyxFQUFFLEtBQUs7S0FDYjtBQUNILENBQUM7QUFFRCxTQUFTLHlCQUF5QjtJQUM5QixPQUFPLFVBQVMsUUFBUTtRQUNwQixRQUFRLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUN4QyxvQkFBVyxDQUFDLHNCQUFzQixDQUFDO2FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFFLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBQyxDQUFDO2FBQ25GLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztBQUNMLENBQUM7QUFrRUMsOERBQXlCO0FBaEUzQixTQUFTLDBCQUEwQjtJQUNqQyxPQUFPO1FBQ0wsSUFBSSxFQUFFLCtCQUErQjtLQUN0QztBQUNILENBQUM7QUFFRCxTQUFTLG1DQUFtQyxDQUFDLGNBQWM7SUFDekQsT0FBTztRQUNMLElBQUksRUFBRSx5Q0FBeUM7UUFDL0MsY0FBYyxFQUFFLGNBQWM7S0FDL0I7QUFDSCxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FBQyxLQUFLO0lBQzdDLE9BQU87UUFDTCxJQUFJLEVBQUUscUNBQXFDO1FBQzNDLEtBQUssRUFBRSxLQUFLO0tBQ2I7QUFDSCxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxZQUFZO0lBQ3hDLE9BQU8sVUFBUyxRQUFRO1FBQ3BCLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3JDLG9CQUFXLENBQUMsMEJBQTBCLFlBQVksRUFBRSxDQUFDO2FBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFFLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBQyxDQUFDO2FBQ2hGLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztBQUNMLENBQUM7QUFzQ0Msd0RBQXNCO0FBcEN4QixTQUFTLDJCQUEyQixDQUFDLFdBQVc7SUFDOUMsT0FBTztRQUNMLElBQUksRUFBRSxnQ0FBZ0M7UUFDdEMsV0FBVyxFQUFFLFdBQVc7S0FDekI7QUFDSCxDQUFDO0FBRUQsU0FBUyx3QkFBd0IsQ0FBQyxLQUFLO0lBQ3JDLE9BQU87UUFDTCxJQUFJLEVBQUUsNkJBQTZCO1FBQ25DLEtBQUssRUFBRSxLQUFLO0tBQ2I7QUFDSCxDQUFDO0FBRUQsU0FBUyxjQUFjO0lBQ25CLE9BQU8sVUFBUyxRQUFRO1FBQ3BCLG9CQUFXLENBQUMscUJBQXFCLENBQUM7YUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUUsUUFBUSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFDLENBQUM7YUFDeEUsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0FBQ0wsQ0FBQztBQWlCQyx3Q0FBYztBQWZoQixTQUFTLFVBQVU7SUFDZixPQUFPLFVBQVMsUUFBUTtRQUNwQixRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUMzQixxQkFBWSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7QUFDTCxDQUFDO0FBV0MsZ0NBQVUiLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlR2V0Q2FsbCwgbWFrZVBvc3RDYWxsIH0gZnJvbSBcIi4vYXBpLnRzXCI7XG5cblxuZnVuY3Rpb24gdG9nZ2xlVHJhaW5pbmcoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUT0dHTEVfVFJBSU5JTkdcIlxuICB9XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZVRlc3RpbmcoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUT0dHTEVfVEVTVElOR1wiXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9nZ2xlTmV3RXJyb3IoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUT0dHTEVfTkVXX0VSUk9SXCJcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2dnbGVTdHJpY3RJbWl0YXRpb24oKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJUT0dHTEVfU1RSSUNUX0lNSVRBVElPTlwiXG4gIH1cbn1cblxuZnVuY3Rpb24gc2VsZWN0RGF0YVBvaW50KGRhdGFQb2ludCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiU0VMRUNUX0RBVEFfUE9JTlRcIixcbiAgICBkYXRhUG9pbnQ6IGRhdGFQb2ludFxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RUcmFpbmluZ0FuZFRlc3RpbmdEYXRhKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiUkVRVUVTVF9UUkFJTklOR19BTkRfVEVTVElOR19EQVRBXCJcbiAgfVxufVxuXG5mdW5jdGlvbiByZXF1ZXN0VHJhaW5pbmdBbmRUZXN0aW5nRGF0YVN1Y2NlZWRlZChkYXRhKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJSRVFVRVNUX1RSQUlOSU5HX0FORF9URVNUSU5HX0RBVEFfU1VDQ0VFREVEXCIsXG4gICAgZGF0YTogZGF0YVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RUcmFpbmluZ0FuZFRlc3RpbmdEYXRhRmFpbGVkKGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJSRVFVRVNUX1RSQUlOSU5HX0FORF9URVNUSU5HX0RBVEFfRkFJTEVEXCIsXG4gICAgZXJyb3I6IGVycm9yXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHJhaW5pbmdBbmRUZXN0aW5nRGF0YSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZGlzcGF0Y2gpIHtcbiAgICAgICAgZGlzcGF0Y2gocmVxdWVzdFRyYWluaW5nQW5kVGVzdGluZ0RhdGEpO1xuICAgICAgICBtYWtlR2V0Q2FsbChcImFwaS92MS9zd2VlcF9zdW1tYXJ5XCIpXG4gICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge2Rpc3BhdGNoKHJlcXVlc3RUcmFpbmluZ0FuZFRlc3RpbmdEYXRhU3VjY2VlZGVkKHJlc3BvbnNlLmRhdGEpKX0pXG4gICAgICAgICAgLmNhdGNoKGVycm9yID0+IGRpc3BhdGNoKHJlcXVlc3RUcmFpbmluZ0FuZFRlc3RpbmdEYXRhRmFpbGVkKGVycm9yKSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdE1vZGVsRXZhbHVhdGlvbkRhdGEoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJSRVFVRVNUX01PREVMX0VWQUxVQVRJT05fREFUQVwiXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdE1vZGVsRXZhbHVhdGlvbkRhdGFTdWNjZWVkZWQoZXZhbHVhdGlvbkRhdGEpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlJFUVVFU1RfTU9ERUxfRVZBTFVBVElPTl9EQVRBX1NVQ0NFRURFRFwiLFxuICAgIGV2YWx1YXRpb25EYXRhOiBldmFsdWF0aW9uRGF0YVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RNb2RlbEV2YWx1YXRpb25EYXRhRmFpbGVkKGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJSRVFVRVNUX01PREVMRVZBTFVBVElPTl9EQVRBX0ZBSUxFRFwiLFxuICAgIGVycm9yOiBlcnJvclxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vZGVsRXZhbHVhdGlvbkRhdGEoZXZhbHVhdGlvbklkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGRpc3BhdGNoKSB7XG4gICAgICAgIGRpc3BhdGNoKHJlcXVlc3RNb2RlbEV2YWx1YXRpb25EYXRhKTtcbiAgICAgICAgbWFrZUdldENhbGwoYGFwaS92MS9ldmFsdWF0aW9uX2RhdGEvJHtldmFsdWF0aW9uSWR9YClcbiAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7ZGlzcGF0Y2gocmVxdWVzdE1vZGVsRXZhbHVhdGlvbkRhdGFTdWNjZWVkZWQocmVzcG9uc2UuZGF0YSkpfSlcbiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gZGlzcGF0Y2gocmVxdWVzdE1vZGVsRXZhbHVhdGlvbkRhdGFGYWlsZWQoZXJyb3IpKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZXF1ZXN0U3dlZXBTdGF0dXNTdWNjZWVkZWQoc3dlZXBTdGF0dXMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIlJFUVVFU1RfU1dFRVBfU1RBVFVTX1NVQ0NFRURFRFwiLFxuICAgIHN3ZWVwU3RhdHVzOiBzd2VlcFN0YXR1c1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RTd2VlcFN0YXR1c0ZhaWxlZChlcnJvcikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiUkVRVUVTVF9TV0VFUF9TVEFUVVNfRkFJTEVEXCIsXG4gICAgZXJyb3I6IGVycm9yXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3dlZXBTdGF0dXMoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGRpc3BhdGNoKSB7XG4gICAgICAgIG1ha2VHZXRDYWxsKFwiYXBpL3YxL3N3ZWVwX3N0YXR1c1wiKVxuICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtkaXNwYXRjaChyZXF1ZXN0U3dlZXBTdGF0dXNTdWNjZWVkZWQocmVzcG9uc2UuZGF0YSkpfSlcbiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gZGlzcGF0Y2gocmVxdWVzdFN3ZWVwU3RhdHVzRmFpbGVkKGVycm9yKSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRTd2VlcCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZGlzcGF0Y2gpIHtcbiAgICAgICAgZGlzcGF0Y2goZ2V0U3dlZXBTdGF0dXMoKSk7XG4gICAgICAgIG1ha2VQb3N0Q2FsbChcImFwaS92MS9zdGFydF9zd2VlcFwiLCB7fSk7XG4gICAgfVxufVxuXG5leHBvcnQge1xuICB0b2dnbGVUcmFpbmluZyxcbiAgdG9nZ2xlVGVzdGluZyxcbiAgdG9nZ2xlTmV3RXJyb3IsXG4gIHRvZ2dsZVN0cmljdEltaXRhdGlvbixcbiAgc2VsZWN0RGF0YVBvaW50LFxuICBnZXRUcmFpbmluZ0FuZFRlc3RpbmdEYXRhLFxuICBnZXRNb2RlbEV2YWx1YXRpb25EYXRhLFxuICBnZXRTd2VlcFN0YXR1cyxcbiAgc3RhcnRTd2VlcFxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///40\\n')},function(module,exports,__webpack_require__){\"use strict\";eval('\\nvar __importDefault = (this && this.__importDefault) || function (mod) {\\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\\n};\\nObject.defineProperty(exports, \"__esModule\", { value: true });\\nexports.makePostCall = exports.makeGetCall = void 0;\\nconst axios_1 = __importDefault(__webpack_require__(42));\\nvar apiServiceEnvironment = window[\"API_SERVICE_ENVIRONMENT\"];\\nvar apiBaseUrl = \"\";\\nif (apiServiceEnvironment.environment_type == \"local\") {\\n apiBaseUrl = `${window.location.protocol}//${window.location.hostname}:${apiServiceEnvironment.port}`;\\n}\\nelse if (apiServiceEnvironment.environment_type == \"azureml\") {\\n apiBaseUrl = apiServiceEnvironment.base_url;\\n}\\nelse if (apiServiceEnvironment.environment_type == \"databricks\") {\\n apiBaseUrl = apiServiceEnvironment.base_url;\\n}\\nelse {\\n apiBaseUrl = `${window.location.protocol}//${window.location.hostname}:${apiServiceEnvironment.port}`;\\n}\\nfunction makeGetCall(endpoint) {\\n return axios_1.default.get(`${apiBaseUrl}/${endpoint}`);\\n}\\nexports.makeGetCall = makeGetCall;\\nfunction makePostCall(endpoint, payload) {\\n return axios_1.default.post(`${apiBaseUrl}/${endpoint}`, payload);\\n}\\nexports.makePostCall = makePostCall;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi93aWRnZXQvYXBpLnRzPzcyYWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEseURBQTBCO0FBRzFCLElBQUkscUJBQXFCLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDO0FBQzdELElBQUksVUFBVSxHQUFHLEVBQUU7QUFFbkIsSUFBSSxxQkFBcUIsQ0FBQyxnQkFBZ0IsSUFBSSxPQUFPLEVBQUU7SUFDckQsVUFBVSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUM7Q0FDdkc7S0FBTSxJQUFJLHFCQUFxQixDQUFDLGdCQUFnQixJQUFJLFNBQVMsRUFBRTtJQUM5RCxVQUFVLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDO0NBQzdDO0tBQU0sSUFBSSxxQkFBcUIsQ0FBQyxnQkFBZ0IsSUFBSSxZQUFZLEVBQUU7SUFDakUsVUFBVSxHQUFHLHFCQUFxQixDQUFDLFFBQVEsQ0FBQztDQUM3QztLQUFNO0lBQ0wsVUFBVSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUM7Q0FDdkc7QUFHRCxTQUFTLFdBQVcsQ0FBQyxRQUFnQjtJQUNuQyxPQUFPLGVBQUssQ0FBQyxHQUFHLENBQU0sR0FBRyxVQUFVLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBT0Msa0NBQVc7QUFMYixTQUFTLFlBQVksQ0FBQyxRQUFnQixFQUFFLE9BQVk7SUFDbEQsT0FBTyxlQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxJQUFJLFFBQVEsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFJQyxvQ0FBWSIsImZpbGUiOiI0MS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cblxudmFyIGFwaVNlcnZpY2VFbnZpcm9ubWVudCA9IHdpbmRvd1tcIkFQSV9TRVJWSUNFX0VOVklST05NRU5UXCJdXG52YXIgYXBpQmFzZVVybCA9IFwiXCJcblxuaWYgKGFwaVNlcnZpY2VFbnZpcm9ubWVudC5lbnZpcm9ubWVudF90eXBlID09IFwibG9jYWxcIikge1xuICBhcGlCYXNlVXJsID0gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt3aW5kb3cubG9jYXRpb24uaG9zdG5hbWV9OiR7YXBpU2VydmljZUVudmlyb25tZW50LnBvcnR9YDtcbn0gZWxzZSBpZiAoYXBpU2VydmljZUVudmlyb25tZW50LmVudmlyb25tZW50X3R5cGUgPT0gXCJhenVyZW1sXCIpIHtcbiAgYXBpQmFzZVVybCA9IGFwaVNlcnZpY2VFbnZpcm9ubWVudC5iYXNlX3VybDtcbn0gZWxzZSBpZiAoYXBpU2VydmljZUVudmlyb25tZW50LmVudmlyb25tZW50X3R5cGUgPT0gXCJkYXRhYnJpY2tzXCIpIHtcbiAgYXBpQmFzZVVybCA9IGFwaVNlcnZpY2VFbnZpcm9ubWVudC5iYXNlX3VybDtcbn0gZWxzZSB7XG4gIGFwaUJhc2VVcmwgPSBgJHt3aW5kb3cubG9jYXRpb24ucHJvdG9jb2x9Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZX06JHthcGlTZXJ2aWNlRW52aXJvbm1lbnQucG9ydH1gO1xufVxuXG5cbmZ1bmN0aW9uIG1ha2VHZXRDYWxsKGVuZHBvaW50OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGF4aW9zLmdldDxhbnk+KGAke2FwaUJhc2VVcmx9LyR7ZW5kcG9pbnR9YCk7XG59XG5cbmZ1bmN0aW9uIG1ha2VQb3N0Q2FsbChlbmRwb2ludDogc3RyaW5nLCBwYXlsb2FkOiBhbnkpIHtcbiAgcmV0dXJuIGF4aW9zLnBvc3QoYCR7YXBpQmFzZVVybH0vJHtlbmRwb2ludH1gLCBwYXlsb2FkKTtcbn1cblxuZXhwb3J0IHtcbiAgbWFrZUdldENhbGwsXG4gIG1ha2VQb3N0Q2FsbFxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///41\\n')},function(module,exports,__webpack_require__){eval(\"module.exports = __webpack_require__(43);//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanM/NDQ2YiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFhIiwiZmlsZSI6IjQyLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9heGlvcycpOyJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///42\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\nvar bind = __webpack_require__(10);\\nvar Axios = __webpack_require__(44);\\nvar mergeConfig = __webpack_require__(16);\\nvar defaults = __webpack_require__(13);\\n\\n/**\\n * Create an instance of Axios\\n *\\n * @param {Object} defaultConfig The default config for the instance\\n * @return {Axios} A new instance of Axios\\n */\\nfunction createInstance(defaultConfig) {\\n var context = new Axios(defaultConfig);\\n var instance = bind(Axios.prototype.request, context);\\n\\n // Copy axios.prototype to instance\\n utils.extend(instance, Axios.prototype, context);\\n\\n // Copy context to instance\\n utils.extend(instance, context);\\n\\n return instance;\\n}\\n\\n// Create the default instance to be exported\\nvar axios = createInstance(defaults);\\n\\n// Expose Axios class to allow class inheritance\\naxios.Axios = Axios;\\n\\n// Factory for creating new instances\\naxios.create = function create(instanceConfig) {\\n return createInstance(mergeConfig(axios.defaults, instanceConfig));\\n};\\n\\n// Expose Cancel & CancelToken\\naxios.Cancel = __webpack_require__(17);\\naxios.CancelToken = __webpack_require__(58);\\naxios.isCancel = __webpack_require__(12);\\n\\n// Expose all/spread\\naxios.all = function all(promises) {\\n return Promise.all(promises);\\n};\\naxios.spread = __webpack_require__(59);\\n\\nmodule.exports = axios;\\n\\n// Allow use of default import syntax in TypeScript\\nmodule.exports.default = axios;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzP2FlY2EiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLENBQVM7QUFDN0IsV0FBVyxtQkFBTyxDQUFDLEVBQWdCO0FBQ25DLFlBQVksbUJBQU8sQ0FBQyxFQUFjO0FBQ2xDLGtCQUFrQixtQkFBTyxDQUFDLEVBQW9CO0FBQzlDLGVBQWUsbUJBQU8sQ0FBQyxFQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxNQUFNO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsbUJBQU8sQ0FBQyxFQUFpQjtBQUN4QyxvQkFBb0IsbUJBQU8sQ0FBQyxFQUFzQjtBQUNsRCxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFtQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG1CQUFPLENBQUMsRUFBa0I7O0FBRXpDOztBQUVBO0FBQ0EiLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBBeGlvcyA9IHJlcXVpcmUoJy4vY29yZS9BeGlvcycpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9jb3JlL21lcmdlQ29uZmlnJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShkZWZhdWx0Q29uZmlnKSB7XG4gIHZhciBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICB2YXIgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCk7XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbnZhciBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzKTtcblxuLy8gRXhwb3NlIEF4aW9zIGNsYXNzIHRvIGFsbG93IGNsYXNzIGluaGVyaXRhbmNlXG5heGlvcy5BeGlvcyA9IEF4aW9zO1xuXG4vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzXG5heGlvcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGF4aW9zLmRlZmF1bHRzLCBpbnN0YW5jZUNvbmZpZykpO1xufTtcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWwgPSByZXF1aXJlKCcuL2NhbmNlbC9DYW5jZWwnKTtcbmF4aW9zLkNhbmNlbFRva2VuID0gcmVxdWlyZSgnLi9jYW5jZWwvQ2FuY2VsVG9rZW4nKTtcbmF4aW9zLmlzQ2FuY2VsID0gcmVxdWlyZSgnLi9jYW5jZWwvaXNDYW5jZWwnKTtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcbmF4aW9zLnNwcmVhZCA9IHJlcXVpcmUoJy4vaGVscGVycy9zcHJlYWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBheGlvcztcblxuLy8gQWxsb3cgdXNlIG9mIGRlZmF1bHQgaW1wb3J0IHN5bnRheCBpbiBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gYXhpb3M7XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///43\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\nvar buildURL = __webpack_require__(11);\\nvar InterceptorManager = __webpack_require__(45);\\nvar dispatchRequest = __webpack_require__(46);\\nvar mergeConfig = __webpack_require__(16);\\n\\n/**\\n * Create a new instance of Axios\\n *\\n * @param {Object} instanceConfig The default config for the instance\\n */\\nfunction Axios(instanceConfig) {\\n this.defaults = instanceConfig;\\n this.interceptors = {\\n request: new InterceptorManager(),\\n response: new InterceptorManager()\\n };\\n}\\n\\n/**\\n * Dispatch a request\\n *\\n * @param {Object} config The config specific for this request (merged with this.defaults)\\n */\\nAxios.prototype.request = function request(config) {\\n /*eslint no-param-reassign:0*/\\n // Allow for axios('example/url'[, config]) a la fetch API\\n if (typeof config === 'string') {\\n config = arguments[1] || {};\\n config.url = arguments[0];\\n } else {\\n config = config || {};\\n }\\n\\n config = mergeConfig(this.defaults, config);\\n\\n // Set config.method\\n if (config.method) {\\n config.method = config.method.toLowerCase();\\n } else if (this.defaults.method) {\\n config.method = this.defaults.method.toLowerCase();\\n } else {\\n config.method = 'get';\\n }\\n\\n // Hook up interceptors middleware\\n var chain = [dispatchRequest, undefined];\\n var promise = Promise.resolve(config);\\n\\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\\n });\\n\\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\\n chain.push(interceptor.fulfilled, interceptor.rejected);\\n });\\n\\n while (chain.length) {\\n promise = promise.then(chain.shift(), chain.shift());\\n }\\n\\n return promise;\\n};\\n\\nAxios.prototype.getUri = function getUri(config) {\\n config = mergeConfig(this.defaults, config);\\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\\\?/, '');\\n};\\n\\n// Provide aliases for supported request methods\\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\\n /*eslint func-names:0*/\\n Axios.prototype[method] = function(url, config) {\\n return this.request(utils.merge(config || {}, {\\n method: method,\\n url: url\\n }));\\n };\\n});\\n\\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\\n /*eslint func-names:0*/\\n Axios.prototype[method] = function(url, data, config) {\\n return this.request(utils.merge(config || {}, {\\n method: method,\\n url: url,\\n data: data\\n }));\\n };\\n});\\n\\nmodule.exports = Axios;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3MuanM/MWNmMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixZQUFZLG1CQUFPLENBQUMsQ0FBWTtBQUNoQyxlQUFlLG1CQUFPLENBQUMsRUFBcUI7QUFDNUMseUJBQXlCLG1CQUFPLENBQUMsRUFBc0I7QUFDdkQsc0JBQXNCLG1CQUFPLENBQUMsRUFBbUI7QUFDakQsa0JBQWtCLG1CQUFPLENBQUMsRUFBZTs7QUFFekM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEIiwiZmlsZSI6IjQ0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2J1aWxkVVJMJyk7XG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyID0gcmVxdWlyZSgnLi9JbnRlcmNlcHRvck1hbmFnZXInKTtcbnZhciBkaXNwYXRjaFJlcXVlc3QgPSByZXF1aXJlKCcuL2Rpc3BhdGNoUmVxdWVzdCcpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9tZXJnZUNvbmZpZycpO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBeGlvcyhpbnN0YW5jZUNvbmZpZykge1xuICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gKi9cbkF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gcmVxdWVzdChjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuICAgIGNvbmZpZy51cmwgPSBhcmd1bWVudHNbMF07XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICB9XG5cbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICBpZiAoY29uZmlnLm1ldGhvZCkge1xuICAgIGNvbmZpZy5tZXRob2QgPSBjb25maWcubWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5tZXRob2QpIHtcbiAgICBjb25maWcubWV0aG9kID0gdGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcubWV0aG9kID0gJ2dldCc7XG4gIH1cblxuICAvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG4gIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuQXhpb3MucHJvdG90eXBlLmdldFVyaSA9IGZ1bmN0aW9uIGdldFVyaShjb25maWcpIHtcbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgcmV0dXJuIGJ1aWxkVVJMKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXFw/LywgJycpO1xufTtcblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXRpbHMubWVyZ2UoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGlvcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///44\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\n\\nfunction InterceptorManager() {\\n this.handlers = [];\\n}\\n\\n/**\\n * Add a new interceptor to the stack\\n *\\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\\n * @param {Function} rejected The function to handle `reject` for a `Promise`\\n *\\n * @return {Number} An ID used to remove interceptor later\\n */\\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\\n this.handlers.push({\\n fulfilled: fulfilled,\\n rejected: rejected\\n });\\n return this.handlers.length - 1;\\n};\\n\\n/**\\n * Remove an interceptor from the stack\\n *\\n * @param {Number} id The ID that was returned by `use`\\n */\\nInterceptorManager.prototype.eject = function eject(id) {\\n if (this.handlers[id]) {\\n this.handlers[id] = null;\\n }\\n};\\n\\n/**\\n * Iterate over all the registered interceptors\\n *\\n * This method is particularly useful for skipping over any\\n * interceptors that may have become `null` calling `eject`.\\n *\\n * @param {Function} fn The function to call for each interceptor\\n */\\nInterceptorManager.prototype.forEach = function forEach(fn) {\\n utils.forEach(this.handlers, function forEachHandler(h) {\\n if (h !== null) {\\n fn(h);\\n }\\n });\\n};\\n\\nmodule.exports = InterceptorManager;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzPzM1NmIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLENBQVk7O0FBRWhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEiLCJmaWxlIjoiNDUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gSW50ZXJjZXB0b3JNYW5hZ2VyKCkge1xuICB0aGlzLmhhbmRsZXJzID0gW107XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gKlxuICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkKSB7XG4gIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgZnVsZmlsbGVkOiBmdWxmaWxsZWQsXG4gICAgcmVqZWN0ZWQ6IHJlamVjdGVkXG4gIH0pO1xuICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZWplY3QgPSBmdW5jdGlvbiBlamVjdChpZCkge1xuICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmbikge1xuICB1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgZm4oaCk7XG4gICAgfVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///45\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\nvar transformData = __webpack_require__(47);\\nvar isCancel = __webpack_require__(12);\\nvar defaults = __webpack_require__(13);\\n\\n/**\\n * Throws a `Cancel` if cancellation has been requested.\\n */\\nfunction throwIfCancellationRequested(config) {\\n if (config.cancelToken) {\\n config.cancelToken.throwIfRequested();\\n }\\n}\\n\\n/**\\n * Dispatch a request to the server using the configured adapter.\\n *\\n * @param {object} config The config that is to be used for the request\\n * @returns {Promise} The Promise to be fulfilled\\n */\\nmodule.exports = function dispatchRequest(config) {\\n throwIfCancellationRequested(config);\\n\\n // Ensure headers exist\\n config.headers = config.headers || {};\\n\\n // Transform request data\\n config.data = transformData(\\n config.data,\\n config.headers,\\n config.transformRequest\\n );\\n\\n // Flatten headers\\n config.headers = utils.merge(\\n config.headers.common || {},\\n config.headers[config.method] || {},\\n config.headers\\n );\\n\\n utils.forEach(\\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\\n function cleanHeaderConfig(method) {\\n delete config.headers[method];\\n }\\n );\\n\\n var adapter = config.adapter || defaults.adapter;\\n\\n return adapter(config).then(function onAdapterResolution(response) {\\n throwIfCancellationRequested(config);\\n\\n // Transform response data\\n response.data = transformData(\\n response.data,\\n response.headers,\\n config.transformResponse\\n );\\n\\n return response;\\n }, function onAdapterRejection(reason) {\\n if (!isCancel(reason)) {\\n throwIfCancellationRequested(config);\\n\\n // Transform response data\\n if (reason && reason.response) {\\n reason.response.data = transformData(\\n reason.response.data,\\n reason.response.headers,\\n config.transformResponse\\n );\\n }\\n }\\n\\n return Promise.reject(reason);\\n });\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzPzJmNGYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLENBQVk7QUFDaEMsb0JBQW9CLG1CQUFPLENBQUMsRUFBaUI7QUFDN0MsZUFBZSxtQkFBTyxDQUFDLEVBQW9CO0FBQzNDLGVBQWUsbUJBQU8sQ0FBQyxFQUFhOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjQ2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgdHJhbnNmb3JtRGF0YSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtRGF0YScpO1xudmFyIGlzQ2FuY2VsID0gcmVxdWlyZSgnLi4vY2FuY2VsL2lzQ2FuY2VsJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLi9kZWZhdWx0cycpO1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKSB7XG4gIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gIC8vIEVuc3VyZSBoZWFkZXJzIGV4aXN0XG4gIGNvbmZpZy5oZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwge307XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgY29uZmlnLmRhdGEsXG4gICAgY29uZmlnLmhlYWRlcnMsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICAvLyBGbGF0dGVuIGhlYWRlcnNcbiAgY29uZmlnLmhlYWRlcnMgPSB1dGlscy5tZXJnZShcbiAgICBjb25maWcuaGVhZGVycy5jb21tb24gfHwge30sXG4gICAgY29uZmlnLmhlYWRlcnNbY29uZmlnLm1ldGhvZF0gfHwge30sXG4gICAgY29uZmlnLmhlYWRlcnNcbiAgKTtcblxuICB1dGlscy5mb3JFYWNoKFxuICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgIGZ1bmN0aW9uIGNsZWFuSGVhZGVyQ29uZmlnKG1ldGhvZCkge1xuICAgICAgZGVsZXRlIGNvbmZpZy5oZWFkZXJzW21ldGhvZF07XG4gICAgfVxuICApO1xuXG4gIHZhciBhZGFwdGVyID0gY29uZmlnLmFkYXB0ZXIgfHwgZGVmYXVsdHMuYWRhcHRlcjtcblxuICByZXR1cm4gYWRhcHRlcihjb25maWcpLnRoZW4oZnVuY3Rpb24gb25BZGFwdGVyUmVzb2x1dGlvbihyZXNwb25zZSkge1xuICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgcmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgICByZXNwb25zZS5kYXRhLFxuICAgICAgcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZVxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0sIGZ1bmN0aW9uIG9uQWRhcHRlclJlamVjdGlvbihyZWFzb24pIHtcbiAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcbiAgICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLnJlc3BvbnNlKSB7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YShcbiAgICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSxcbiAgICAgICAgICByZWFzb24ucmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///46\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\n\\n/**\\n * Transform the data for a request or a response\\n *\\n * @param {Object|String} data The data to be transformed\\n * @param {Array} headers The headers for the request or response\\n * @param {Array|Function} fns A single function or Array of functions\\n * @returns {*} The resulting transformed data\\n */\\nmodule.exports = function transformData(data, headers, fns) {\\n /*eslint no-param-reassign:0*/\\n utils.forEach(fns, function transform(fn) {\\n data = fn(data, headers);\\n });\\n\\n return data;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcz8yOGUyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxDQUFZOztBQUVoQztBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsZUFBZTtBQUMxQixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBIiwiZmlsZSI6IjQ3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBiZSB0cmFuc2Zvcm1lZFxuICogQHBhcmFtIHtBcnJheX0gaGVhZGVycyBUaGUgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2VcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGRhdGEsIGhlYWRlcnMsIGZucykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgdXRpbHMuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIGRhdGEgPSBmbihkYXRhLCBoZWFkZXJzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///47\\n\")},function(module,exports){eval(\"// shim for using process in browser\\nvar process = module.exports = {};\\n\\n// cached from whatever global is present so that test runners that stub it\\n// don't break things. But we need to wrap it in a try catch in case it is\\n// wrapped in strict mode code which doesn't define any globals. It's inside a\\n// function because try/catches deoptimize in certain engines.\\n\\nvar cachedSetTimeout;\\nvar cachedClearTimeout;\\n\\nfunction defaultSetTimout() {\\n throw new Error('setTimeout has not been defined');\\n}\\nfunction defaultClearTimeout () {\\n throw new Error('clearTimeout has not been defined');\\n}\\n(function () {\\n try {\\n if (typeof setTimeout === 'function') {\\n cachedSetTimeout = setTimeout;\\n } else {\\n cachedSetTimeout = defaultSetTimout;\\n }\\n } catch (e) {\\n cachedSetTimeout = defaultSetTimout;\\n }\\n try {\\n if (typeof clearTimeout === 'function') {\\n cachedClearTimeout = clearTimeout;\\n } else {\\n cachedClearTimeout = defaultClearTimeout;\\n }\\n } catch (e) {\\n cachedClearTimeout = defaultClearTimeout;\\n }\\n} ())\\nfunction runTimeout(fun) {\\n if (cachedSetTimeout === setTimeout) {\\n //normal enviroments in sane situations\\n return setTimeout(fun, 0);\\n }\\n // if setTimeout wasn't available but was latter defined\\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\\n cachedSetTimeout = setTimeout;\\n return setTimeout(fun, 0);\\n }\\n try {\\n // when when somebody has screwed with setTimeout but no I.E. maddness\\n return cachedSetTimeout(fun, 0);\\n } catch(e){\\n try {\\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\\n return cachedSetTimeout.call(null, fun, 0);\\n } catch(e){\\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\\n return cachedSetTimeout.call(this, fun, 0);\\n }\\n }\\n\\n\\n}\\nfunction runClearTimeout(marker) {\\n if (cachedClearTimeout === clearTimeout) {\\n //normal enviroments in sane situations\\n return clearTimeout(marker);\\n }\\n // if clearTimeout wasn't available but was latter defined\\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\\n cachedClearTimeout = clearTimeout;\\n return clearTimeout(marker);\\n }\\n try {\\n // when when somebody has screwed with setTimeout but no I.E. maddness\\n return cachedClearTimeout(marker);\\n } catch (e){\\n try {\\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\\n return cachedClearTimeout.call(null, marker);\\n } catch (e){\\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\\n return cachedClearTimeout.call(this, marker);\\n }\\n }\\n\\n\\n\\n}\\nvar queue = [];\\nvar draining = false;\\nvar currentQueue;\\nvar queueIndex = -1;\\n\\nfunction cleanUpNextTick() {\\n if (!draining || !currentQueue) {\\n return;\\n }\\n draining = false;\\n if (currentQueue.length) {\\n queue = currentQueue.concat(queue);\\n } else {\\n queueIndex = -1;\\n }\\n if (queue.length) {\\n drainQueue();\\n }\\n}\\n\\nfunction drainQueue() {\\n if (draining) {\\n return;\\n }\\n var timeout = runTimeout(cleanUpNextTick);\\n draining = true;\\n\\n var len = queue.length;\\n while(len) {\\n currentQueue = queue;\\n queue = [];\\n while (++queueIndex < len) {\\n if (currentQueue) {\\n currentQueue[queueIndex].run();\\n }\\n }\\n queueIndex = -1;\\n len = queue.length;\\n }\\n currentQueue = null;\\n draining = false;\\n runClearTimeout(timeout);\\n}\\n\\nprocess.nextTick = function (fun) {\\n var args = new Array(arguments.length - 1);\\n if (arguments.length > 1) {\\n for (var i = 1; i < arguments.length; i++) {\\n args[i - 1] = arguments[i];\\n }\\n }\\n queue.push(new Item(fun, args));\\n if (queue.length === 1 && !draining) {\\n runTimeout(drainQueue);\\n }\\n};\\n\\n// v8 likes predictible objects\\nfunction Item(fun, array) {\\n this.fun = fun;\\n this.array = array;\\n}\\nItem.prototype.run = function () {\\n this.fun.apply(null, this.array);\\n};\\nprocess.title = 'browser';\\nprocess.browser = true;\\nprocess.env = {};\\nprocess.argv = [];\\nprocess.version = ''; // empty string to avoid regexp issues\\nprocess.versions = {};\\n\\nfunction noop() {}\\n\\nprocess.on = noop;\\nprocess.addListener = noop;\\nprocess.once = noop;\\nprocess.off = noop;\\nprocess.removeListener = noop;\\nprocess.removeAllListeners = noop;\\nprocess.emit = noop;\\nprocess.prependListener = noop;\\nprocess.prependOnceListener = noop;\\n\\nprocess.listeners = function (name) { return [] }\\n\\nprocess.binding = function (name) {\\n throw new Error('process.binding is not supported');\\n};\\n\\nprocess.cwd = function () { return '/' };\\nprocess.chdir = function (dir) {\\n throw new Error('process.chdir is not supported');\\n};\\nprocess.umask = function() { return 0; };\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzPzliYTEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVSIsImZpbGUiOiI0OC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///48\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\n\\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\\n utils.forEach(headers, function processHeader(value, name) {\\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\\n headers[normalizedName] = value;\\n delete headers[name];\\n }\\n });\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qcz9kMzUwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxDQUFVOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCBub3JtYWxpemVkTmFtZSkge1xuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uIHByb2Nlc3NIZWFkZXIodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAobmFtZSAhPT0gbm9ybWFsaXplZE5hbWUgJiYgbmFtZS50b1VwcGVyQ2FzZSgpID09PSBub3JtYWxpemVkTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWROYW1lXSA9IHZhbHVlO1xuICAgICAgZGVsZXRlIGhlYWRlcnNbbmFtZV07XG4gICAgfVxuICB9KTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///49\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar createError = __webpack_require__(15);\\n\\n/**\\n * Resolve or reject a Promise based on response status.\\n *\\n * @param {Function} resolve A function that resolves the promise.\\n * @param {Function} reject A function that rejects the promise.\\n * @param {object} response The response.\\n */\\nmodule.exports = function settle(resolve, reject, response) {\\n var validateStatus = response.config.validateStatus;\\n if (!validateStatus || validateStatus(response.status)) {\\n resolve(response);\\n } else {\\n reject(createError(\\n 'Request failed with status code ' + response.status,\\n response.config,\\n null,\\n response.request,\\n response\\n ));\\n }\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzP2ZkMWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0JBQWtCLG1CQUFPLENBQUMsRUFBZTs7QUFFekM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4vY3JlYXRlRXJyb3InKTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICB2YXIgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChjcmVhdGVFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICBudWxsLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///50\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\n/**\\n * Update an Error with the specified config, error code, and response.\\n *\\n * @param {Error} error The error to update.\\n * @param {Object} config The config.\\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\\n * @param {Object} [request] The request.\\n * @param {Object} [response] The response.\\n * @returns {Error} The error.\\n */\\nmodule.exports = function enhanceError(error, config, code, request, response) {\\n error.config = config;\\n if (code) {\\n error.code = code;\\n }\\n\\n error.request = request;\\n error.response = response;\\n error.isAxiosError = true;\\n\\n error.toJSON = function() {\\n return {\\n // Standard\\n message: this.message,\\n name: this.name,\\n // Microsoft\\n description: this.description,\\n number: this.number,\\n // Mozilla\\n fileName: this.fileName,\\n lineNumber: this.lineNumber,\\n columnNumber: this.columnNumber,\\n stack: this.stack,\\n // Axios\\n config: this.config,\\n code: this.code\\n };\\n };\\n return error;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZW5oYW5jZUVycm9yLmpzP2UyZTciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFVwZGF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZmlnLCBlcnJvciBjb2RlLCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgVGhlIGVycm9yIHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV0gVGhlIGVycm9yIGNvZGUgKGZvciBleGFtcGxlLCAnRUNPTk5BQk9SVEVEJykuXG4gKiBAcGFyYW0ge09iamVjdH0gW3JlcXVlc3RdIFRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgZXJyb3IuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZW5oYW5jZUVycm9yKGVycm9yLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gIGVycm9yLmNvbmZpZyA9IGNvbmZpZztcbiAgaWYgKGNvZGUpIHtcbiAgICBlcnJvci5jb2RlID0gY29kZTtcbiAgfVxuXG4gIGVycm9yLnJlcXVlc3QgPSByZXF1ZXN0O1xuICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICBlcnJvci5pc0F4aW9zRXJyb3IgPSB0cnVlO1xuXG4gIGVycm9yLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBTdGFuZGFyZFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgLy8gTWljcm9zb2Z0XG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIG51bWJlcjogdGhpcy5udW1iZXIsXG4gICAgICAvLyBNb3ppbGxhXG4gICAgICBmaWxlTmFtZTogdGhpcy5maWxlTmFtZSxcbiAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcbiAgICAgIGNvbHVtbk51bWJlcjogdGhpcy5jb2x1bW5OdW1iZXIsXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcbiAgICAgIC8vIEF4aW9zXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgY29kZTogdGhpcy5jb2RlXG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGVycm9yO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///51\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar isAbsoluteURL = __webpack_require__(53);\\nvar combineURLs = __webpack_require__(54);\\n\\n/**\\n * Creates a new URL by combining the baseURL with the requestedURL,\\n * only when the requestedURL is not already an absolute URL.\\n * If the requestURL is absolute, this function returns the requestedURL untouched.\\n *\\n * @param {string} baseURL The base URL\\n * @param {string} requestedURL Absolute or relative URL to combine\\n * @returns {string} The combined full path\\n */\\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\\n if (baseURL && !isAbsoluteURL(requestedURL)) {\\n return combineURLs(baseURL, requestedURL);\\n }\\n return requestedURL;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcz84NGY4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLG9CQUFvQixtQkFBTyxDQUFDLEVBQTBCO0FBQ3RELGtCQUFrQixtQkFBTyxDQUFDLEVBQXdCOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBpc0Fic29sdXRlVVJMID0gcmVxdWlyZSgnLi4vaGVscGVycy9pc0Fic29sdXRlVVJMJyk7XG52YXIgY29tYmluZVVSTHMgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2NvbWJpbmVVUkxzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBiYXNlVVJMIHdpdGggdGhlIHJlcXVlc3RlZFVSTCxcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cbiAqIElmIHRoZSByZXF1ZXN0VVJMIGlzIGFic29sdXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVlc3RlZFVSTCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdGVkVVJMIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBjb21iaW5lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgZnVsbCBwYXRoXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpIHtcbiAgaWYgKGJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///52\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval('\\n\\n/**\\n * Determines whether the specified URL is absolute\\n *\\n * @param {string} url The URL to test\\n * @returns {boolean} True if the specified URL is absolute, otherwise false\\n */\\nmodule.exports = function isAbsoluteURL(url) {\\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\\n // by any combination of letters, digits, plus, period, or hyphen.\\n return /^([a-z][a-z\\\\d\\\\+\\\\-\\\\.]*:)?\\\\/\\\\//i.test(url);\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcz8wZWFmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZFxcK1xcLVxcLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///53\\n')},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\n/**\\n * Creates a new URL by combining the specified URLs\\n *\\n * @param {string} baseURL The base URL\\n * @param {string} relativeURL The relative URL\\n * @returns {string} The combined URL\\n */\\nmodule.exports = function combineURLs(baseURL, relativeURL) {\\n return relativeURL\\n ? baseURL.replace(/\\\\/+$/, '') + '/' + relativeURL.replace(/^\\\\/+/, '')\\n : baseURL;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanM/MjFhOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///54\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\n\\n// Headers whose duplicates are ignored by node\\n// c.f. https://nodejs.org/api/http.html#http_message_headers\\nvar ignoreDuplicateOf = [\\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\\n 'referer', 'retry-after', 'user-agent'\\n];\\n\\n/**\\n * Parse headers into an object\\n *\\n * ```\\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\\n * Content-Type: application/json\\n * Connection: keep-alive\\n * Transfer-Encoding: chunked\\n * ```\\n *\\n * @param {String} headers Headers needing to be parsed\\n * @returns {Object} Headers parsed into an object\\n */\\nmodule.exports = function parseHeaders(headers) {\\n var parsed = {};\\n var key;\\n var val;\\n var i;\\n\\n if (!headers) { return parsed; }\\n\\n utils.forEach(headers.split('\\\\n'), function parser(line) {\\n i = line.indexOf(':');\\n key = utils.trim(line.substr(0, i)).toLowerCase();\\n val = utils.trim(line.substr(i + 1));\\n\\n if (key) {\\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\\n return;\\n }\\n if (key === 'set-cookie') {\\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\\n } else {\\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\\n }\\n }\\n });\\n\\n return parsed;\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzPzQ2MzUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLENBQVk7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsZUFBZTs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSIsImZpbGUiOiI1NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG4vLyBIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xudmFyIGlnbm9yZUR1cGxpY2F0ZU9mID0gW1xuICAnYWdlJywgJ2F1dGhvcml6YXRpb24nLCAnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJywgJ2V0YWcnLFxuICAnZXhwaXJlcycsICdmcm9tJywgJ2hvc3QnLCAnaWYtbW9kaWZpZWQtc2luY2UnLCAnaWYtdW5tb2RpZmllZC1zaW5jZScsXG4gICdsYXN0LW1vZGlmaWVkJywgJ2xvY2F0aW9uJywgJ21heC1mb3J3YXJkcycsICdwcm94eS1hdXRob3JpemF0aW9uJyxcbiAgJ3JlZmVyZXInLCAncmV0cnktYWZ0ZXInLCAndXNlci1hZ2VudCdcbl07XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VIZWFkZXJzKGhlYWRlcnMpIHtcbiAgdmFyIHBhcnNlZCA9IHt9O1xuICB2YXIga2V5O1xuICB2YXIgdmFsO1xuICB2YXIgaTtcblxuICBpZiAoIWhlYWRlcnMpIHsgcmV0dXJuIHBhcnNlZDsgfVxuXG4gIHV0aWxzLmZvckVhY2goaGVhZGVycy5zcGxpdCgnXFxuJyksIGZ1bmN0aW9uIHBhcnNlcihsaW5lKSB7XG4gICAgaSA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGtleSA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoMCwgaSkpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cihpICsgMSkpO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgaWYgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICBwYXJzZWRba2V5XSA9IChwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldIDogW10pLmNvbmNhdChbdmFsXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///55\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\n\\nmodule.exports = (\\n utils.isStandardBrowserEnv() ?\\n\\n // Standard browser envs have full support of the APIs needed to test\\n // whether the request URL is of the same origin as current location.\\n (function standardBrowserEnv() {\\n var msie = /(msie|trident)/i.test(navigator.userAgent);\\n var urlParsingNode = document.createElement('a');\\n var originURL;\\n\\n /**\\n * Parse a URL to discover it's components\\n *\\n * @param {String} url The URL to be parsed\\n * @returns {Object}\\n */\\n function resolveURL(url) {\\n var href = url;\\n\\n if (msie) {\\n // IE needs attribute set twice to normalize properties\\n urlParsingNode.setAttribute('href', href);\\n href = urlParsingNode.href;\\n }\\n\\n urlParsingNode.setAttribute('href', href);\\n\\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\\n return {\\n href: urlParsingNode.href,\\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\\n host: urlParsingNode.host,\\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\\\?/, '') : '',\\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\\n hostname: urlParsingNode.hostname,\\n port: urlParsingNode.port,\\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\\n urlParsingNode.pathname :\\n '/' + urlParsingNode.pathname\\n };\\n }\\n\\n originURL = resolveURL(window.location.href);\\n\\n /**\\n * Determine if a URL shares the same origin as the current location\\n *\\n * @param {String} requestURL The URL to test\\n * @returns {boolean} True if URL shares the same origin, otherwise false\\n */\\n return function isURLSameOrigin(requestURL) {\\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\\n return (parsed.protocol === originURL.protocol &&\\n parsed.host === originURL.host);\\n };\\n })() :\\n\\n // Non standard browser envs (web workers, react-native) lack needed support.\\n (function nonStandardBrowserEnv() {\\n return function isURLSameOrigin() {\\n return true;\\n };\\n })()\\n);\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzP2E3YjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsWUFBWSxtQkFBTyxDQUFDLENBQVk7O0FBRWhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMIiwiZmlsZSI6IjU2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3RcbiAgLy8gd2hldGhlciB0aGUgcmVxdWVzdCBVUkwgaXMgb2YgdGhlIHNhbWUgb3JpZ2luIGFzIGN1cnJlbnQgbG9jYXRpb24uXG4gICAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHZhciBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgIHZhciB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIHZhciBvcmlnaW5VUkw7XG5cbiAgICAgIC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXQncyBjb21wb25lbnRzXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHBhcnNlZFxuICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAqL1xuICAgICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgICAgdmFyIGhyZWYgPSB1cmw7XG5cbiAgICAgICAgaWYgKG1zaWUpIHtcbiAgICAgICAgLy8gSUUgbmVlZHMgYXR0cmlidXRlIHNldCB0d2ljZSB0byBub3JtYWxpemUgcHJvcGVydGllc1xuICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgICAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcbiAgICAgICAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LFxuICAgICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxuICAgICAgICAgIGhvc3RuYW1lOiB1cmxQYXJzaW5nTm9kZS5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpID9cbiAgICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lIDpcbiAgICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgICAvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cbiAgICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4ocmVxdWVzdFVSTCkge1xuICAgICAgICB2YXIgcGFyc2VkID0gKHV0aWxzLmlzU3RyaW5nKHJlcXVlc3RVUkwpKSA/IHJlc29sdmVVUkwocmVxdWVzdFVSTCkgOiByZXF1ZXN0VVJMO1xuICAgICAgICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVVJMLnByb3RvY29sICYmXG4gICAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVVJMLmhvc3QpO1xuICAgICAgfTtcbiAgICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnZzICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAgIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgfSkoKVxuKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///56\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar utils = __webpack_require__(1);\\n\\nmodule.exports = (\\n utils.isStandardBrowserEnv() ?\\n\\n // Standard browser envs support document.cookie\\n (function standardBrowserEnv() {\\n return {\\n write: function write(name, value, expires, path, domain, secure) {\\n var cookie = [];\\n cookie.push(name + '=' + encodeURIComponent(value));\\n\\n if (utils.isNumber(expires)) {\\n cookie.push('expires=' + new Date(expires).toGMTString());\\n }\\n\\n if (utils.isString(path)) {\\n cookie.push('path=' + path);\\n }\\n\\n if (utils.isString(domain)) {\\n cookie.push('domain=' + domain);\\n }\\n\\n if (secure === true) {\\n cookie.push('secure');\\n }\\n\\n document.cookie = cookie.join('; ');\\n },\\n\\n read: function read(name) {\\n var match = document.cookie.match(new RegExp('(^|;\\\\\\\\s*)(' + name + ')=([^;]*)'));\\n return (match ? decodeURIComponent(match[3]) : null);\\n },\\n\\n remove: function remove(name) {\\n this.write(name, '', Date.now() - 86400000);\\n }\\n };\\n })() :\\n\\n // Non standard browser env (web workers, react-native) lack needed support.\\n (function nonStandardBrowserEnv() {\\n return {\\n write: function write() {},\\n read: function read() { return null; },\\n remove: function remove() {}\\n };\\n })()\\n);\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcz9mZTcyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLFlBQVksbUJBQU8sQ0FBQyxDQUFZOztBQUVoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDO0FBQzFDLFNBQVM7O0FBRVQ7QUFDQSw0REFBNEQsd0JBQXdCO0FBQ3BGO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDLCtCQUErQixhQUFhLEVBQUU7QUFDOUM7QUFDQTtBQUNBLEtBQUs7QUFDTCIsImZpbGUiOiI1Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gICAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgICAgICB2YXIgY29va2llID0gW107XG4gICAgICAgICAgY29va2llLnB1c2gobmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKHBhdGgpKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKGRvbWFpbikpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlY3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ3NlY3VyZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQobmFtZSkge1xuICAgICAgICAgIHZhciBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShuYW1lKSB7XG4gICAgICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gICAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZSgpIHt9LFxuICAgICAgICByZWFkOiBmdW5jdGlvbiByZWFkKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgICAgfTtcbiAgICB9KSgpXG4pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///57\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\nvar Cancel = __webpack_require__(17);\\n\\n/**\\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\\n *\\n * @class\\n * @param {Function} executor The executor function.\\n */\\nfunction CancelToken(executor) {\\n if (typeof executor !== 'function') {\\n throw new TypeError('executor must be a function.');\\n }\\n\\n var resolvePromise;\\n this.promise = new Promise(function promiseExecutor(resolve) {\\n resolvePromise = resolve;\\n });\\n\\n var token = this;\\n executor(function cancel(message) {\\n if (token.reason) {\\n // Cancellation has already been requested\\n return;\\n }\\n\\n token.reason = new Cancel(message);\\n resolvePromise(token.reason);\\n });\\n}\\n\\n/**\\n * Throws a `Cancel` if cancellation has been requested.\\n */\\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\\n if (this.reason) {\\n throw this.reason;\\n }\\n};\\n\\n/**\\n * Returns an object that contains a new `CancelToken` and a function that, when called,\\n * cancels the `CancelToken`.\\n */\\nCancelToken.source = function source() {\\n var cancel;\\n var token = new CancelToken(function executor(c) {\\n cancel = c;\\n });\\n return {\\n token: token,\\n cancel: cancel\\n };\\n};\\n\\nmodule.exports = CancelToken;\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz9iM2ZiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLGFBQWEsbUJBQU8sQ0FBQyxFQUFVOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNTguanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBDYW5jZWwgPSByZXF1aXJlKCcuL0NhbmNlbCcpO1xuXG4vKipcbiAqIEEgYENhbmNlbFRva2VuYCBpcyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiBhbiBvcGVyYXRpb24uXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIENhbmNlbFRva2VuKGV4ZWN1dG9yKSB7XG4gIGlmICh0eXBlb2YgZXhlY3V0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICB2YXIgcmVzb2x2ZVByb21pc2U7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICB9KTtcblxuICB2YXIgdG9rZW4gPSB0aGlzO1xuICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSkge1xuICAgIGlmICh0b2tlbi5yZWFzb24pIHtcbiAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWwobWVzc2FnZSk7XG4gICAgcmVzb2x2ZVByb21pc2UodG9rZW4ucmVhc29uKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqL1xuQ2FuY2VsVG9rZW4ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQgPSBmdW5jdGlvbiB0aHJvd0lmUmVxdWVzdGVkKCkge1xuICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICB0aHJvdyB0aGlzLnJlYXNvbjtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICovXG5DYW5jZWxUb2tlbi5zb3VyY2UgPSBmdW5jdGlvbiBzb3VyY2UoKSB7XG4gIHZhciBjYW5jZWw7XG4gIHZhciB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbihmdW5jdGlvbiBleGVjdXRvcihjKSB7XG4gICAgY2FuY2VsID0gYztcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdG9rZW46IHRva2VuLFxuICAgIGNhbmNlbDogY2FuY2VsXG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbFRva2VuO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///58\\n\")},function(module,exports,__webpack_require__){\"use strict\";eval(\"\\n\\n/**\\n * Syntactic sugar for invoking a function and expanding an array for arguments.\\n *\\n * Common use case would be to use `Function.prototype.apply`.\\n *\\n * ```js\\n * function f(x, y, z) {}\\n * var args = [1, 2, 3];\\n * f.apply(null, args);\\n * ```\\n *\\n * With `spread` this example can be re-written.\\n *\\n * ```js\\n * spread(function(x, y, z) {})([1, 2, 3]);\\n * ```\\n *\\n * @param {Function} callback\\n * @returns {Function}\\n */\\nmodule.exports = function spread(callback) {\\n return function wrap(arr) {\\n return callback.apply(null, arr);\\n };\\n};\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzPzhlNDAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcbiAgfTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///59\\n\")},function(module,exports,__webpack_require__){eval('/* WEBPACK VAR INJECTION */(function(global) {!function(e,t){ true?t(exports):undefined}(this,function(e){\"use strict\";function t(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}function r(e,t){Object.defineProperty(this,\"kind\",{value:e,enumerable:!0}),t&&t.length&&Object.defineProperty(this,\"path\",{value:t,enumerable:!0})}function n(e,t,r){n.super_.call(this,\"E\",e),Object.defineProperty(this,\"lhs\",{value:t,enumerable:!0}),Object.defineProperty(this,\"rhs\",{value:r,enumerable:!0})}function o(e,t){o.super_.call(this,\"N\",e),Object.defineProperty(this,\"rhs\",{value:t,enumerable:!0})}function i(e,t){i.super_.call(this,\"D\",e),Object.defineProperty(this,\"lhs\",{value:t,enumerable:!0})}function a(e,t,r){a.super_.call(this,\"A\",e),Object.defineProperty(this,\"index\",{value:t,enumerable:!0}),Object.defineProperty(this,\"item\",{value:r,enumerable:!0})}function f(e,t,r){var n=e.slice((r||t)+1||e.length);return e.length=t<0?e.length+t:t,e.push.apply(e,n),e}function u(e){var t=\"undefined\"==typeof e?\"undefined\":N(e);return\"object\"!==t?t:e===Math?\"math\":null===e?\"null\":Array.isArray(e)?\"array\":\"[object Date]\"===Object.prototype.toString.call(e)?\"date\":\"function\"==typeof e.toString&&/^\\\\/.*\\\\//.test(e.toString())?\"regexp\":\"object\"}function l(e,t,r,c,s,d,p){s=s||[],p=p||[];var g=s.slice(0);if(\"undefined\"!=typeof d){if(c){if(\"function\"==typeof c&&c(g,d))return;if(\"object\"===(\"undefined\"==typeof c?\"undefined\":N(c))){if(c.prefilter&&c.prefilter(g,d))return;if(c.normalize){var h=c.normalize(g,d,e,t);h&&(e=h[0],t=h[1])}}}g.push(d)}\"regexp\"===u(e)&&\"regexp\"===u(t)&&(e=e.toString(),t=t.toString());var y=\"undefined\"==typeof e?\"undefined\":N(e),v=\"undefined\"==typeof t?\"undefined\":N(t),b=\"undefined\"!==y||p&&p[p.length-1].lhs&&p[p.length-1].lhs.hasOwnProperty(d),m=\"undefined\"!==v||p&&p[p.length-1].rhs&&p[p.length-1].rhs.hasOwnProperty(d);if(!b&&m)r(new o(g,t));else if(!m&&b)r(new i(g,e));else if(u(e)!==u(t))r(new n(g,e,t));else if(\"date\"===u(e)&&e-t!==0)r(new n(g,e,t));else if(\"object\"===y&&null!==e&&null!==t)if(p.filter(function(t){return t.lhs===e}).length)e!==t&&r(new n(g,e,t));else{if(p.push({lhs:e,rhs:t}),Array.isArray(e)){var w;e.length;for(w=0;w<e.length;w++)w>=t.length?r(new a(g,w,new i(void 0,e[w]))):l(e[w],t[w],r,c,g,w,p);for(;w<t.length;)r(new a(g,w,new o(void 0,t[w++])))}else{var x=Object.keys(e),S=Object.keys(t);x.forEach(function(n,o){var i=S.indexOf(n);i>=0?(l(e[n],t[n],r,c,g,n,p),S=f(S,i)):l(e[n],void 0,r,c,g,n,p)}),S.forEach(function(e){l(void 0,t[e],r,c,g,e,p)})}p.length=p.length-1}else e!==t&&(\"number\"===y&&isNaN(e)&&isNaN(t)||r(new n(g,e,t)))}function c(e,t,r,n){return n=n||[],l(e,t,function(e){e&&n.push(e)},r),n.length?n:void 0}function s(e,t,r){if(r.path&&r.path.length){var n,o=e[t],i=r.path.length-1;for(n=0;n<i;n++)o=o[r.path[n]];switch(r.kind){case\"A\":s(o[r.path[n]],r.index,r.item);break;case\"D\":delete o[r.path[n]];break;case\"E\":case\"N\":o[r.path[n]]=r.rhs}}else switch(r.kind){case\"A\":s(e[t],r.index,r.item);break;case\"D\":e=f(e,t);break;case\"E\":case\"N\":e[t]=r.rhs}return e}function d(e,t,r){if(e&&t&&r&&r.kind){for(var n=e,o=-1,i=r.path?r.path.length-1:0;++o<i;)\"undefined\"==typeof n[r.path[o]]&&(n[r.path[o]]=\"number\"==typeof r.path[o]?[]:{}),n=n[r.path[o]];switch(r.kind){case\"A\":s(r.path?n[r.path[o]]:n,r.index,r.item);break;case\"D\":delete n[r.path[o]];break;case\"E\":case\"N\":n[r.path[o]]=r.rhs}}}function p(e,t,r){if(r.path&&r.path.length){var n,o=e[t],i=r.path.length-1;for(n=0;n<i;n++)o=o[r.path[n]];switch(r.kind){case\"A\":p(o[r.path[n]],r.index,r.item);break;case\"D\":o[r.path[n]]=r.lhs;break;case\"E\":o[r.path[n]]=r.lhs;break;case\"N\":delete o[r.path[n]]}}else switch(r.kind){case\"A\":p(e[t],r.index,r.item);break;case\"D\":e[t]=r.lhs;break;case\"E\":e[t]=r.lhs;break;case\"N\":e=f(e,t)}return e}function g(e,t,r){if(e&&t&&r&&r.kind){var n,o,i=e;for(o=r.path.length-1,n=0;n<o;n++)\"undefined\"==typeof i[r.path[n]]&&(i[r.path[n]]={}),i=i[r.path[n]];switch(r.kind){case\"A\":p(i[r.path[n]],r.index,r.item);break;case\"D\":i[r.path[n]]=r.lhs;break;case\"E\":i[r.path[n]]=r.lhs;break;case\"N\":delete i[r.path[n]]}}}function h(e,t,r){if(e&&t){var n=function(n){r&&!r(e,t,n)||d(e,t,n)};l(e,t,n)}}function y(e){return\"color: \"+F[e].color+\"; font-weight: bold\"}function v(e){var t=e.kind,r=e.path,n=e.lhs,o=e.rhs,i=e.index,a=e.item;switch(t){case\"E\":return[r.join(\".\"),n,\"→\",o];case\"N\":return[r.join(\".\"),o];case\"D\":return[r.join(\".\")];case\"A\":return[r.join(\".\")+\"[\"+i+\"]\",a];default:return[]}}function b(e,t,r,n){var o=c(e,t);try{n?r.groupCollapsed(\"diff\"):r.group(\"diff\")}catch(e){r.log(\"diff\")}o?o.forEach(function(e){var t=e.kind,n=v(e);r.log.apply(r,[\"%c \"+F[t].text,y(t)].concat(P(n)))}):r.log(\"—— no diff ——\");try{r.groupEnd()}catch(e){r.log(\"—— diff end —— \")}}function m(e,t,r,n){switch(\"undefined\"==typeof e?\"undefined\":N(e)){case\"object\":return\"function\"==typeof e[n]?e[n].apply(e,P(r)):e[n];case\"function\":return e(t);default:return e}}function w(e){var t=e.timestamp,r=e.duration;return function(e,n,o){var i=[\"action\"];return i.push(\"%c\"+String(e.type)),t&&i.push(\"%c@ \"+n),r&&i.push(\"%c(in \"+o.toFixed(2)+\" ms)\"),i.join(\" \")}}function x(e,t){var r=t.logger,n=t.actionTransformer,o=t.titleFormatter,i=void 0===o?w(t):o,a=t.collapsed,f=t.colors,u=t.level,l=t.diff,c=\"undefined\"==typeof t.titleFormatter;e.forEach(function(o,s){var d=o.started,p=o.startedTime,g=o.action,h=o.prevState,y=o.error,v=o.took,w=o.nextState,x=e[s+1];x&&(w=x.prevState,v=x.started-d);var S=n(g),k=\"function\"==typeof a?a(function(){return w},g,o):a,j=D(p),E=f.title?\"color: \"+f.title(S)+\";\":\"\",A=[\"color: gray; font-weight: lighter;\"];A.push(E),t.timestamp&&A.push(\"color: gray; font-weight: lighter;\"),t.duration&&A.push(\"color: gray; font-weight: lighter;\");var O=i(S,j,v);try{k?f.title&&c?r.groupCollapsed.apply(r,[\"%c \"+O].concat(A)):r.groupCollapsed(O):f.title&&c?r.group.apply(r,[\"%c \"+O].concat(A)):r.group(O)}catch(e){r.log(O)}var N=m(u,S,[h],\"prevState\"),P=m(u,S,[S],\"action\"),C=m(u,S,[y,h],\"error\"),F=m(u,S,[w],\"nextState\");if(N)if(f.prevState){var L=\"color: \"+f.prevState(h)+\"; font-weight: bold\";r[N](\"%c prev state\",L,h)}else r[N](\"prev state\",h);if(P)if(f.action){var T=\"color: \"+f.action(S)+\"; font-weight: bold\";r[P](\"%c action \",T,S)}else r[P](\"action \",S);if(y&&C)if(f.error){var M=\"color: \"+f.error(y,h)+\"; font-weight: bold;\";r[C](\"%c error \",M,y)}else r[C](\"error \",y);if(F)if(f.nextState){var _=\"color: \"+f.nextState(w)+\"; font-weight: bold\";r[F](\"%c next state\",_,w)}else r[F](\"next state\",w);l&&b(h,w,r,k);try{r.groupEnd()}catch(e){r.log(\"—— log end ——\")}})}function S(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.assign({},L,e),r=t.logger,n=t.stateTransformer,o=t.errorTransformer,i=t.predicate,a=t.logErrors,f=t.diffPredicate;if(\"undefined\"==typeof r)return function(){return function(e){return function(t){return e(t)}}};if(e.getState&&e.dispatch)return console.error(\"[redux-logger] redux-logger not installed. Make sure to pass logger instance as middleware:\\\\n// Logger with default options\\\\nimport { logger } from \\'redux-logger\\'\\\\nconst store = createStore(\\\\n reducer,\\\\n applyMiddleware(logger)\\\\n)\\\\n// Or you can create your own logger with custom options http://bit.ly/redux-logger-options\\\\nimport createLogger from \\'redux-logger\\'\\\\nconst logger = createLogger({\\\\n // ...options\\\\n});\\\\nconst store = createStore(\\\\n reducer,\\\\n applyMiddleware(logger)\\\\n)\\\\n\"),function(){return function(e){return function(t){return e(t)}}};var u=[];return function(e){var r=e.getState;return function(e){return function(l){if(\"function\"==typeof i&&!i(r,l))return e(l);var c={};u.push(c),c.started=O.now(),c.startedTime=new Date,c.prevState=n(r()),c.action=l;var s=void 0;if(a)try{s=e(l)}catch(e){c.error=o(e)}else s=e(l);c.took=O.now()-c.started,c.nextState=n(r());var d=t.diff&&\"function\"==typeof f?f(r,l):t.diff;if(x(u,Object.assign({},t,{diff:d})),u.length=0,c.error)throw c.error;return s}}}}var k,j,E=function(e,t){return new Array(t+1).join(e)},A=function(e,t){return E(\"0\",t-e.toString().length)+e},D=function(e){return A(e.getHours(),2)+\":\"+A(e.getMinutes(),2)+\":\"+A(e.getSeconds(),2)+\".\"+A(e.getMilliseconds(),3)},O=\"undefined\"!=typeof performance&&null!==performance&&\"function\"==typeof performance.now?performance:Date,N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},P=function(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)},C=[];k=\"object\"===(\"undefined\"==typeof global?\"undefined\":N(global))&&global?global:\"undefined\"!=typeof window?window:{},j=k.DeepDiff,j&&C.push(function(){\"undefined\"!=typeof j&&k.DeepDiff===c&&(k.DeepDiff=j,j=void 0)}),t(n,r),t(o,r),t(i,r),t(a,r),Object.defineProperties(c,{diff:{value:c,enumerable:!0},observableDiff:{value:l,enumerable:!0},applyDiff:{value:h,enumerable:!0},applyChange:{value:d,enumerable:!0},revertChange:{value:g,enumerable:!0},isConflict:{value:function(){return\"undefined\"!=typeof j},enumerable:!0},noConflict:{value:function(){return C&&(C.forEach(function(e){e()}),C=null),c},enumerable:!0}});var F={E:{color:\"#2196F3\",text:\"CHANGED:\"},N:{color:\"#4CAF50\",text:\"ADDED:\"},D:{color:\"#F44336\",text:\"DELETED:\"},A:{color:\"#2196F3\",text:\"ARRAY:\"}},L={level:\"log\",logger:console,logErrors:!0,collapsed:void 0,predicate:void 0,duration:!1,timestamp:!0,stateTransformer:function(e){return e},actionTransformer:function(e){return e},errorTransformer:function(e){return e},colors:{title:function(){return\"inherit\"},prevState:function(){return\"#9E9E9E\"},action:function(){return\"#03A9F4\"},nextState:function(){return\"#4CAF50\"},error:function(){return\"#F20404\"}},diff:!1,diffPredicate:void 0,transformer:void 0},T=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.dispatch,r=e.getState;return\"function\"==typeof t||\"function\"==typeof r?S()({dispatch:t,getState:r}):void console.error(\"\\\\n[redux-logger v3] BREAKING CHANGE\\\\n[redux-logger v3] Since 3.0.0 redux-logger exports by default logger with default settings.\\\\n[redux-logger v3] Change\\\\n[redux-logger v3] import createLogger from \\'redux-logger\\'\\\\n[redux-logger v3] to\\\\n[redux-logger v3] import { createLogger } from \\'redux-logger\\'\\\\n\")};e.defaults=L,e.createLogger=S,e.logger=T,e.default=T,Object.defineProperty(e,\"__esModule\",{value:!0})});\\n\\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(9)))//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtbG9nZ2VyL2Rpc3QvcmVkdXgtbG9nZ2VyLmpzPzhjMDMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkRBQWUsS0FBb0QsWUFBWSxTQUE4RixDQUFDLGtCQUFrQixhQUFhLGdCQUFnQixrREFBa0QsYUFBYSxtREFBbUQsRUFBRSxnQkFBZ0IsbUNBQW1DLHNCQUFzQixrREFBa0Qsc0JBQXNCLEVBQUUsa0JBQWtCLDREQUE0RCxzQkFBc0Isb0NBQW9DLHNCQUFzQixFQUFFLGdCQUFnQiw0REFBNEQsc0JBQXNCLEVBQUUsZ0JBQWdCLDREQUE0RCxzQkFBc0IsRUFBRSxrQkFBa0IsOERBQThELHNCQUFzQixxQ0FBcUMsc0JBQXNCLEVBQUUsa0JBQWtCLGtDQUFrQyxxREFBcUQsY0FBYyw2Q0FBNkMsdU5BQXVOLDBCQUEwQixnQkFBZ0IsaUJBQWlCLDBCQUEwQixNQUFNLHVDQUF1Qyx3REFBd0Qsd0NBQXdDLGdCQUFnQiwyQkFBMkIscUJBQXFCLFVBQVUsa0VBQWtFLGdQQUFnUCx1QkFBdUIsNEJBQTRCLG9DQUFvQywrQ0FBK0MsaUVBQWlFLGlCQUFpQixnQ0FBZ0MsS0FBSyxXQUFXLFlBQVksb0JBQW9CLE1BQU0sU0FBUyxRQUFRLFdBQVcsd0VBQXdFLEtBQUssV0FBVyxvQ0FBb0MsS0FBSyxzQ0FBc0Msd0JBQXdCLG1CQUFtQixnRUFBZ0Usd0JBQXdCLHlCQUF5QixFQUFFLG9CQUFvQixnRUFBZ0Usb0JBQW9CLGlDQUFpQyxhQUFhLHNCQUFzQixrQkFBa0IsMEJBQTBCLCtCQUErQixRQUFRLElBQUksbUJBQW1CLGVBQWUsdUNBQXVDLE1BQU0sNEJBQTRCLE1BQU0sb0NBQW9DLG9CQUFvQiwrQkFBK0IsTUFBTSxpQkFBaUIsTUFBTSwyQkFBMkIsU0FBUyxrQkFBa0Isb0JBQW9CLDRDQUE0QyxNQUFNLGlGQUFpRixpQkFBaUIsZUFBZSxnREFBZ0QsTUFBTSw0QkFBNEIsTUFBTSxxQ0FBcUMsa0JBQWtCLDBCQUEwQiwrQkFBK0IsUUFBUSxJQUFJLG1CQUFtQixlQUFlLHVDQUF1QyxNQUFNLDJCQUEyQixNQUFNLDJCQUEyQixNQUFNLDZCQUE2QixvQkFBb0IsK0JBQStCLE1BQU0sbUJBQW1CLE1BQU0sbUJBQW1CLE1BQU0saUJBQWlCLFNBQVMsa0JBQWtCLG9CQUFvQixZQUFZLDBCQUEwQixJQUFJLHNEQUFzRCxpQkFBaUIsZUFBZSx1Q0FBdUMsTUFBTSwyQkFBMkIsTUFBTSwyQkFBMkIsTUFBTSw4QkFBOEIsa0JBQWtCLFNBQVMsa0JBQWtCLHdCQUF3QixVQUFVLGNBQWMsNkJBQTZCLG9CQUFvQixjQUFjLHlEQUF5RCxVQUFVLG9DQUFvQyw4QkFBOEIsNEJBQTRCLHdDQUF3QyxrQkFBa0Isb0JBQW9CLGFBQWEsSUFBSSwyQ0FBMkMsU0FBUyxjQUFjLHdCQUF3QixvQkFBb0IsbURBQW1ELHlCQUF5QixJQUFJLGFBQWEsU0FBUywwQkFBMEIsb0JBQW9CLCtDQUErQyxtRUFBbUUsMkJBQTJCLGtCQUFrQixjQUFjLCtCQUErQix1QkFBdUIsaUJBQWlCLDRHQUE0RyxnQkFBZ0IsK0pBQStKLHdCQUF3QixtR0FBbUcsaUNBQWlDLCtDQUErQyxTQUFTLGdEQUFnRCxxQkFBcUIsc0JBQXNCLEdBQUcsMkNBQTJDLHNCQUFzQixtQ0FBbUMsc0JBQXNCLEdBQUcsZUFBZSxJQUFJLDBJQUEwSSxTQUFTLFNBQVMsbUdBQW1HLHFCQUFxQixpQ0FBaUMsb0JBQW9CLDBCQUEwQiwwQkFBMEIsa0JBQWtCLDhCQUE4QixvQkFBb0IsMEJBQTBCLDBCQUEwQixvQkFBb0IsK0JBQStCLG1CQUFtQixFQUFFLDBCQUEwQiwwQkFBMEIscUJBQXFCLGlDQUFpQyxvQkFBb0IsMEJBQTBCLDBCQUEwQixjQUFjLElBQUksYUFBYSxTQUFTLHdCQUF3QixFQUFFLGFBQWEsK0RBQStELG1CQUFtQix5R0FBeUcsMkNBQTJDLG1CQUFtQixtQkFBbUIsZUFBZSxxTEFBcUwsU0FBUywrUEFBK1Asb0JBQW9CLEVBQUUsc0ZBQXNGLG1CQUFtQixtQkFBbUIsZUFBZSxTQUFTLG1CQUFtQixpQkFBaUIsbUJBQW1CLG1CQUFtQiw2Q0FBNkMsU0FBUyxpRkFBaUYsYUFBYSxTQUFTLE9BQU8sU0FBUyxhQUFhLFlBQVksNENBQTRDLGlEQUFpRCx1QkFBdUIsSUFBSSxPQUFPLG9DQUFvQyxZQUFZLHdCQUF3Qiw4QkFBOEIsaUJBQWlCLHNDQUFzQyxlQUFlLHNHQUFzRyxzTEFBc0wsZ0JBQWdCLGFBQWEsb0dBQW9HLGVBQWUscUJBQXFCLDhCQUE4QixXQUFXLGNBQWMsU0FBUyxxQkFBcUIsTUFBTSxtSEFBbUgsbUNBQW1DLCtEQUErRCx5REFBeUQsTUFBTSxzQkFBc0IsaUJBQWlCLHNCQUFzQixZQUFZLHNCQUFzQixjQUFjLHNCQUFzQixlQUFlLHNCQUFzQixhQUFhLGlCQUFpQiw0QkFBNEIsZUFBZSxhQUFhLGlCQUFpQixpQ0FBaUMsSUFBSSxZQUFZLGdCQUFnQixFQUFFLE9BQU8sR0FBRyxnQ0FBZ0MsSUFBSSw4QkFBOEIsSUFBSSxnQ0FBZ0MsSUFBSSwrQkFBK0IsSUFBSSxnSUFBZ0ksU0FBUywrQkFBK0IsU0FBUyw4QkFBOEIsU0FBUyxTQUFTLGlCQUFpQixnQkFBZ0Isc0JBQXNCLGdCQUFnQixtQkFBbUIsZ0JBQWdCLHNCQUFzQixnQkFBZ0Isa0JBQWtCLGlCQUFpQixpREFBaUQsY0FBYywrREFBK0QsMkJBQTJCLHNEQUFzRCxzQkFBc0IsNlJBQTZSLGVBQWUsMEJBQTBCLDJGQUEyRixTQUFTLEVBQUUiLCJmaWxlIjoiNjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT90KGV4cG9ydHMpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wiZXhwb3J0c1wiXSx0KTp0KGUucmVkdXhMb2dnZXI9ZS5yZWR1eExvZ2dlcnx8e30pfSh0aGlzLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSx0KXtlLnN1cGVyXz10LGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfWZ1bmN0aW9uIHIoZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImtpbmRcIix7dmFsdWU6ZSxlbnVtZXJhYmxlOiEwfSksdCYmdC5sZW5ndGgmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicGF0aFwiLHt2YWx1ZTp0LGVudW1lcmFibGU6ITB9KX1mdW5jdGlvbiBuKGUsdCxyKXtuLnN1cGVyXy5jYWxsKHRoaXMsXCJFXCIsZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJsaHNcIix7dmFsdWU6dCxlbnVtZXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJyaHNcIix7dmFsdWU6cixlbnVtZXJhYmxlOiEwfSl9ZnVuY3Rpb24gbyhlLHQpe28uc3VwZXJfLmNhbGwodGhpcyxcIk5cIixlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInJoc1wiLHt2YWx1ZTp0LGVudW1lcmFibGU6ITB9KX1mdW5jdGlvbiBpKGUsdCl7aS5zdXBlcl8uY2FsbCh0aGlzLFwiRFwiLGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwibGhzXCIse3ZhbHVlOnQsZW51bWVyYWJsZTohMH0pfWZ1bmN0aW9uIGEoZSx0LHIpe2Euc3VwZXJfLmNhbGwodGhpcyxcIkFcIixlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImluZGV4XCIse3ZhbHVlOnQsZW51bWVyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiaXRlbVwiLHt2YWx1ZTpyLGVudW1lcmFibGU6ITB9KX1mdW5jdGlvbiBmKGUsdCxyKXt2YXIgbj1lLnNsaWNlKChyfHx0KSsxfHxlLmxlbmd0aCk7cmV0dXJuIGUubGVuZ3RoPXQ8MD9lLmxlbmd0aCt0OnQsZS5wdXNoLmFwcGx5KGUsbiksZX1mdW5jdGlvbiB1KGUpe3ZhciB0PVwidW5kZWZpbmVkXCI9PXR5cGVvZiBlP1widW5kZWZpbmVkXCI6TihlKTtyZXR1cm5cIm9iamVjdFwiIT09dD90OmU9PT1NYXRoP1wibWF0aFwiOm51bGw9PT1lP1wibnVsbFwiOkFycmF5LmlzQXJyYXkoZSk/XCJhcnJheVwiOlwiW29iamVjdCBEYXRlXVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpP1wiZGF0ZVwiOlwiZnVuY3Rpb25cIj09dHlwZW9mIGUudG9TdHJpbmcmJi9eXFwvLipcXC8vLnRlc3QoZS50b1N0cmluZygpKT9cInJlZ2V4cFwiOlwib2JqZWN0XCJ9ZnVuY3Rpb24gbChlLHQscixjLHMsZCxwKXtzPXN8fFtdLHA9cHx8W107dmFyIGc9cy5zbGljZSgwKTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgZCl7aWYoYyl7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgYyYmYyhnLGQpKXJldHVybjtpZihcIm9iamVjdFwiPT09KFwidW5kZWZpbmVkXCI9PXR5cGVvZiBjP1widW5kZWZpbmVkXCI6TihjKSkpe2lmKGMucHJlZmlsdGVyJiZjLnByZWZpbHRlcihnLGQpKXJldHVybjtpZihjLm5vcm1hbGl6ZSl7dmFyIGg9Yy5ub3JtYWxpemUoZyxkLGUsdCk7aCYmKGU9aFswXSx0PWhbMV0pfX19Zy5wdXNoKGQpfVwicmVnZXhwXCI9PT11KGUpJiZcInJlZ2V4cFwiPT09dSh0KSYmKGU9ZS50b1N0cmluZygpLHQ9dC50b1N0cmluZygpKTt2YXIgeT1cInVuZGVmaW5lZFwiPT10eXBlb2YgZT9cInVuZGVmaW5lZFwiOk4oZSksdj1cInVuZGVmaW5lZFwiPT10eXBlb2YgdD9cInVuZGVmaW5lZFwiOk4odCksYj1cInVuZGVmaW5lZFwiIT09eXx8cCYmcFtwLmxlbmd0aC0xXS5saHMmJnBbcC5sZW5ndGgtMV0ubGhzLmhhc093blByb3BlcnR5KGQpLG09XCJ1bmRlZmluZWRcIiE9PXZ8fHAmJnBbcC5sZW5ndGgtMV0ucmhzJiZwW3AubGVuZ3RoLTFdLnJocy5oYXNPd25Qcm9wZXJ0eShkKTtpZighYiYmbSlyKG5ldyBvKGcsdCkpO2Vsc2UgaWYoIW0mJmIpcihuZXcgaShnLGUpKTtlbHNlIGlmKHUoZSkhPT11KHQpKXIobmV3IG4oZyxlLHQpKTtlbHNlIGlmKFwiZGF0ZVwiPT09dShlKSYmZS10IT09MClyKG5ldyBuKGcsZSx0KSk7ZWxzZSBpZihcIm9iamVjdFwiPT09eSYmbnVsbCE9PWUmJm51bGwhPT10KWlmKHAuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmxocz09PWV9KS5sZW5ndGgpZSE9PXQmJnIobmV3IG4oZyxlLHQpKTtlbHNle2lmKHAucHVzaCh7bGhzOmUscmhzOnR9KSxBcnJheS5pc0FycmF5KGUpKXt2YXIgdztlLmxlbmd0aDtmb3Iodz0wO3c8ZS5sZW5ndGg7dysrKXc+PXQubGVuZ3RoP3IobmV3IGEoZyx3LG5ldyBpKHZvaWQgMCxlW3ddKSkpOmwoZVt3XSx0W3ddLHIsYyxnLHcscCk7Zm9yKDt3PHQubGVuZ3RoOylyKG5ldyBhKGcsdyxuZXcgbyh2b2lkIDAsdFt3KytdKSkpfWVsc2V7dmFyIHg9T2JqZWN0LmtleXMoZSksUz1PYmplY3Qua2V5cyh0KTt4LmZvckVhY2goZnVuY3Rpb24obixvKXt2YXIgaT1TLmluZGV4T2Yobik7aT49MD8obChlW25dLHRbbl0scixjLGcsbixwKSxTPWYoUyxpKSk6bChlW25dLHZvaWQgMCxyLGMsZyxuLHApfSksUy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2wodm9pZCAwLHRbZV0scixjLGcsZSxwKX0pfXAubGVuZ3RoPXAubGVuZ3RoLTF9ZWxzZSBlIT09dCYmKFwibnVtYmVyXCI9PT15JiZpc05hTihlKSYmaXNOYU4odCl8fHIobmV3IG4oZyxlLHQpKSl9ZnVuY3Rpb24gYyhlLHQscixuKXtyZXR1cm4gbj1ufHxbXSxsKGUsdCxmdW5jdGlvbihlKXtlJiZuLnB1c2goZSl9LHIpLG4ubGVuZ3RoP246dm9pZCAwfWZ1bmN0aW9uIHMoZSx0LHIpe2lmKHIucGF0aCYmci5wYXRoLmxlbmd0aCl7dmFyIG4sbz1lW3RdLGk9ci5wYXRoLmxlbmd0aC0xO2ZvcihuPTA7bjxpO24rKylvPW9bci5wYXRoW25dXTtzd2l0Y2goci5raW5kKXtjYXNlXCJBXCI6cyhvW3IucGF0aFtuXV0sci5pbmRleCxyLml0ZW0pO2JyZWFrO2Nhc2VcIkRcIjpkZWxldGUgb1tyLnBhdGhbbl1dO2JyZWFrO2Nhc2VcIkVcIjpjYXNlXCJOXCI6b1tyLnBhdGhbbl1dPXIucmhzfX1lbHNlIHN3aXRjaChyLmtpbmQpe2Nhc2VcIkFcIjpzKGVbdF0sci5pbmRleCxyLml0ZW0pO2JyZWFrO2Nhc2VcIkRcIjplPWYoZSx0KTticmVhaztjYXNlXCJFXCI6Y2FzZVwiTlwiOmVbdF09ci5yaHN9cmV0dXJuIGV9ZnVuY3Rpb24gZChlLHQscil7aWYoZSYmdCYmciYmci5raW5kKXtmb3IodmFyIG49ZSxvPS0xLGk9ci5wYXRoP3IucGF0aC5sZW5ndGgtMTowOysrbzxpOylcInVuZGVmaW5lZFwiPT10eXBlb2YgbltyLnBhdGhbb11dJiYobltyLnBhdGhbb11dPVwibnVtYmVyXCI9PXR5cGVvZiByLnBhdGhbb10/W106e30pLG49bltyLnBhdGhbb11dO3N3aXRjaChyLmtpbmQpe2Nhc2VcIkFcIjpzKHIucGF0aD9uW3IucGF0aFtvXV06bixyLmluZGV4LHIuaXRlbSk7YnJlYWs7Y2FzZVwiRFwiOmRlbGV0ZSBuW3IucGF0aFtvXV07YnJlYWs7Y2FzZVwiRVwiOmNhc2VcIk5cIjpuW3IucGF0aFtvXV09ci5yaHN9fX1mdW5jdGlvbiBwKGUsdCxyKXtpZihyLnBhdGgmJnIucGF0aC5sZW5ndGgpe3ZhciBuLG89ZVt0XSxpPXIucGF0aC5sZW5ndGgtMTtmb3Iobj0wO248aTtuKyspbz1vW3IucGF0aFtuXV07c3dpdGNoKHIua2luZCl7Y2FzZVwiQVwiOnAob1tyLnBhdGhbbl1dLHIuaW5kZXgsci5pdGVtKTticmVhaztjYXNlXCJEXCI6b1tyLnBhdGhbbl1dPXIubGhzO2JyZWFrO2Nhc2VcIkVcIjpvW3IucGF0aFtuXV09ci5saHM7YnJlYWs7Y2FzZVwiTlwiOmRlbGV0ZSBvW3IucGF0aFtuXV19fWVsc2Ugc3dpdGNoKHIua2luZCl7Y2FzZVwiQVwiOnAoZVt0XSxyLmluZGV4LHIuaXRlbSk7YnJlYWs7Y2FzZVwiRFwiOmVbdF09ci5saHM7YnJlYWs7Y2FzZVwiRVwiOmVbdF09ci5saHM7YnJlYWs7Y2FzZVwiTlwiOmU9ZihlLHQpfXJldHVybiBlfWZ1bmN0aW9uIGcoZSx0LHIpe2lmKGUmJnQmJnImJnIua2luZCl7dmFyIG4sbyxpPWU7Zm9yKG89ci5wYXRoLmxlbmd0aC0xLG49MDtuPG87bisrKVwidW5kZWZpbmVkXCI9PXR5cGVvZiBpW3IucGF0aFtuXV0mJihpW3IucGF0aFtuXV09e30pLGk9aVtyLnBhdGhbbl1dO3N3aXRjaChyLmtpbmQpe2Nhc2VcIkFcIjpwKGlbci5wYXRoW25dXSxyLmluZGV4LHIuaXRlbSk7YnJlYWs7Y2FzZVwiRFwiOmlbci5wYXRoW25dXT1yLmxoczticmVhaztjYXNlXCJFXCI6aVtyLnBhdGhbbl1dPXIubGhzO2JyZWFrO2Nhc2VcIk5cIjpkZWxldGUgaVtyLnBhdGhbbl1dfX19ZnVuY3Rpb24gaChlLHQscil7aWYoZSYmdCl7dmFyIG49ZnVuY3Rpb24obil7ciYmIXIoZSx0LG4pfHxkKGUsdCxuKX07bChlLHQsbil9fWZ1bmN0aW9uIHkoZSl7cmV0dXJuXCJjb2xvcjogXCIrRltlXS5jb2xvcitcIjsgZm9udC13ZWlnaHQ6IGJvbGRcIn1mdW5jdGlvbiB2KGUpe3ZhciB0PWUua2luZCxyPWUucGF0aCxuPWUubGhzLG89ZS5yaHMsaT1lLmluZGV4LGE9ZS5pdGVtO3N3aXRjaCh0KXtjYXNlXCJFXCI6cmV0dXJuW3Iuam9pbihcIi5cIiksbixcIuKGklwiLG9dO2Nhc2VcIk5cIjpyZXR1cm5bci5qb2luKFwiLlwiKSxvXTtjYXNlXCJEXCI6cmV0dXJuW3Iuam9pbihcIi5cIildO2Nhc2VcIkFcIjpyZXR1cm5bci5qb2luKFwiLlwiKStcIltcIitpK1wiXVwiLGFdO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIGIoZSx0LHIsbil7dmFyIG89YyhlLHQpO3RyeXtuP3IuZ3JvdXBDb2xsYXBzZWQoXCJkaWZmXCIpOnIuZ3JvdXAoXCJkaWZmXCIpfWNhdGNoKGUpe3IubG9nKFwiZGlmZlwiKX1vP28uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmtpbmQsbj12KGUpO3IubG9nLmFwcGx5KHIsW1wiJWMgXCIrRlt0XS50ZXh0LHkodCldLmNvbmNhdChQKG4pKSl9KTpyLmxvZyhcIuKAlOKAlCBubyBkaWZmIOKAlOKAlFwiKTt0cnl7ci5ncm91cEVuZCgpfWNhdGNoKGUpe3IubG9nKFwi4oCU4oCUIGRpZmYgZW5kIOKAlOKAlCBcIil9fWZ1bmN0aW9uIG0oZSx0LHIsbil7c3dpdGNoKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBlP1widW5kZWZpbmVkXCI6TihlKSl7Y2FzZVwib2JqZWN0XCI6cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZVtuXT9lW25dLmFwcGx5KGUsUChyKSk6ZVtuXTtjYXNlXCJmdW5jdGlvblwiOnJldHVybiBlKHQpO2RlZmF1bHQ6cmV0dXJuIGV9fWZ1bmN0aW9uIHcoZSl7dmFyIHQ9ZS50aW1lc3RhbXAscj1lLmR1cmF0aW9uO3JldHVybiBmdW5jdGlvbihlLG4sbyl7dmFyIGk9W1wiYWN0aW9uXCJdO3JldHVybiBpLnB1c2goXCIlY1wiK1N0cmluZyhlLnR5cGUpKSx0JiZpLnB1c2goXCIlY0AgXCIrbiksciYmaS5wdXNoKFwiJWMoaW4gXCIrby50b0ZpeGVkKDIpK1wiIG1zKVwiKSxpLmpvaW4oXCIgXCIpfX1mdW5jdGlvbiB4KGUsdCl7dmFyIHI9dC5sb2dnZXIsbj10LmFjdGlvblRyYW5zZm9ybWVyLG89dC50aXRsZUZvcm1hdHRlcixpPXZvaWQgMD09PW8/dyh0KTpvLGE9dC5jb2xsYXBzZWQsZj10LmNvbG9ycyx1PXQubGV2ZWwsbD10LmRpZmYsYz1cInVuZGVmaW5lZFwiPT10eXBlb2YgdC50aXRsZUZvcm1hdHRlcjtlLmZvckVhY2goZnVuY3Rpb24obyxzKXt2YXIgZD1vLnN0YXJ0ZWQscD1vLnN0YXJ0ZWRUaW1lLGc9by5hY3Rpb24saD1vLnByZXZTdGF0ZSx5PW8uZXJyb3Isdj1vLnRvb2ssdz1vLm5leHRTdGF0ZSx4PWVbcysxXTt4JiYodz14LnByZXZTdGF0ZSx2PXguc3RhcnRlZC1kKTt2YXIgUz1uKGcpLGs9XCJmdW5jdGlvblwiPT10eXBlb2YgYT9hKGZ1bmN0aW9uKCl7cmV0dXJuIHd9LGcsbyk6YSxqPUQocCksRT1mLnRpdGxlP1wiY29sb3I6IFwiK2YudGl0bGUoUykrXCI7XCI6XCJcIixBPVtcImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogbGlnaHRlcjtcIl07QS5wdXNoKEUpLHQudGltZXN0YW1wJiZBLnB1c2goXCJjb2xvcjogZ3JheTsgZm9udC13ZWlnaHQ6IGxpZ2h0ZXI7XCIpLHQuZHVyYXRpb24mJkEucHVzaChcImNvbG9yOiBncmF5OyBmb250LXdlaWdodDogbGlnaHRlcjtcIik7dmFyIE89aShTLGosdik7dHJ5e2s/Zi50aXRsZSYmYz9yLmdyb3VwQ29sbGFwc2VkLmFwcGx5KHIsW1wiJWMgXCIrT10uY29uY2F0KEEpKTpyLmdyb3VwQ29sbGFwc2VkKE8pOmYudGl0bGUmJmM/ci5ncm91cC5hcHBseShyLFtcIiVjIFwiK09dLmNvbmNhdChBKSk6ci5ncm91cChPKX1jYXRjaChlKXtyLmxvZyhPKX12YXIgTj1tKHUsUyxbaF0sXCJwcmV2U3RhdGVcIiksUD1tKHUsUyxbU10sXCJhY3Rpb25cIiksQz1tKHUsUyxbeSxoXSxcImVycm9yXCIpLEY9bSh1LFMsW3ddLFwibmV4dFN0YXRlXCIpO2lmKE4paWYoZi5wcmV2U3RhdGUpe3ZhciBMPVwiY29sb3I6IFwiK2YucHJldlN0YXRlKGgpK1wiOyBmb250LXdlaWdodDogYm9sZFwiO3JbTl0oXCIlYyBwcmV2IHN0YXRlXCIsTCxoKX1lbHNlIHJbTl0oXCJwcmV2IHN0YXRlXCIsaCk7aWYoUClpZihmLmFjdGlvbil7dmFyIFQ9XCJjb2xvcjogXCIrZi5hY3Rpb24oUykrXCI7IGZvbnQtd2VpZ2h0OiBib2xkXCI7cltQXShcIiVjIGFjdGlvbiAgICBcIixULFMpfWVsc2UgcltQXShcImFjdGlvbiAgICBcIixTKTtpZih5JiZDKWlmKGYuZXJyb3Ipe3ZhciBNPVwiY29sb3I6IFwiK2YuZXJyb3IoeSxoKStcIjsgZm9udC13ZWlnaHQ6IGJvbGQ7XCI7cltDXShcIiVjIGVycm9yICAgICBcIixNLHkpfWVsc2UgcltDXShcImVycm9yICAgICBcIix5KTtpZihGKWlmKGYubmV4dFN0YXRlKXt2YXIgXz1cImNvbG9yOiBcIitmLm5leHRTdGF0ZSh3KStcIjsgZm9udC13ZWlnaHQ6IGJvbGRcIjtyW0ZdKFwiJWMgbmV4dCBzdGF0ZVwiLF8sdyl9ZWxzZSByW0ZdKFwibmV4dCBzdGF0ZVwiLHcpO2wmJmIoaCx3LHIsayk7dHJ5e3IuZ3JvdXBFbmQoKX1jYXRjaChlKXtyLmxvZyhcIuKAlOKAlCBsb2cgZW5kIOKAlOKAlFwiKX19KX1mdW5jdGlvbiBTKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHQ9T2JqZWN0LmFzc2lnbih7fSxMLGUpLHI9dC5sb2dnZXIsbj10LnN0YXRlVHJhbnNmb3JtZXIsbz10LmVycm9yVHJhbnNmb3JtZXIsaT10LnByZWRpY2F0ZSxhPXQubG9nRXJyb3JzLGY9dC5kaWZmUHJlZGljYXRlO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiByKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUodCl9fX07aWYoZS5nZXRTdGF0ZSYmZS5kaXNwYXRjaClyZXR1cm4gY29uc29sZS5lcnJvcihcIltyZWR1eC1sb2dnZXJdIHJlZHV4LWxvZ2dlciBub3QgaW5zdGFsbGVkLiBNYWtlIHN1cmUgdG8gcGFzcyBsb2dnZXIgaW5zdGFuY2UgYXMgbWlkZGxld2FyZTpcXG4vLyBMb2dnZXIgd2l0aCBkZWZhdWx0IG9wdGlvbnNcXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdyZWR1eC1sb2dnZXInXFxuY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShcXG4gIHJlZHVjZXIsXFxuICBhcHBseU1pZGRsZXdhcmUobG9nZ2VyKVxcbilcXG4vLyBPciB5b3UgY2FuIGNyZWF0ZSB5b3VyIG93biBsb2dnZXIgd2l0aCBjdXN0b20gb3B0aW9ucyBodHRwOi8vYml0Lmx5L3JlZHV4LWxvZ2dlci1vcHRpb25zXFxuaW1wb3J0IGNyZWF0ZUxvZ2dlciBmcm9tICdyZWR1eC1sb2dnZXInXFxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHtcXG4gIC8vIC4uLm9wdGlvbnNcXG59KTtcXG5jb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlKFxcbiAgcmVkdWNlcixcXG4gIGFwcGx5TWlkZGxld2FyZShsb2dnZXIpXFxuKVxcblwiKSxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUodCl9fX07dmFyIHU9W107cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWUuZ2V0U3RhdGU7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihsKXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBpJiYhaShyLGwpKXJldHVybiBlKGwpO3ZhciBjPXt9O3UucHVzaChjKSxjLnN0YXJ0ZWQ9Ty5ub3coKSxjLnN0YXJ0ZWRUaW1lPW5ldyBEYXRlLGMucHJldlN0YXRlPW4ocigpKSxjLmFjdGlvbj1sO3ZhciBzPXZvaWQgMDtpZihhKXRyeXtzPWUobCl9Y2F0Y2goZSl7Yy5lcnJvcj1vKGUpfWVsc2Ugcz1lKGwpO2MudG9vaz1PLm5vdygpLWMuc3RhcnRlZCxjLm5leHRTdGF0ZT1uKHIoKSk7dmFyIGQ9dC5kaWZmJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBmP2YocixsKTp0LmRpZmY7aWYoeCh1LE9iamVjdC5hc3NpZ24oe30sdCx7ZGlmZjpkfSkpLHUubGVuZ3RoPTAsYy5lcnJvcil0aHJvdyBjLmVycm9yO3JldHVybiBzfX19fXZhciBrLGosRT1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgQXJyYXkodCsxKS5qb2luKGUpfSxBPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEUoXCIwXCIsdC1lLnRvU3RyaW5nKCkubGVuZ3RoKStlfSxEPWZ1bmN0aW9uKGUpe3JldHVybiBBKGUuZ2V0SG91cnMoKSwyKStcIjpcIitBKGUuZ2V0TWludXRlcygpLDIpK1wiOlwiK0EoZS5nZXRTZWNvbmRzKCksMikrXCIuXCIrQShlLmdldE1pbGxpc2Vjb25kcygpLDMpfSxPPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBwZXJmb3JtYW5jZSYmbnVsbCE9PXBlcmZvcm1hbmNlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxOPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIGV9LFA9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciB0PTAscj1BcnJheShlLmxlbmd0aCk7dDxlLmxlbmd0aDt0Kyspclt0XT1lW3RdO3JldHVybiByfXJldHVybiBBcnJheS5mcm9tKGUpfSxDPVtdO2s9XCJvYmplY3RcIj09PShcInVuZGVmaW5lZFwiPT10eXBlb2YgZ2xvYmFsP1widW5kZWZpbmVkXCI6TihnbG9iYWwpKSYmZ2xvYmFsP2dsb2JhbDpcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSxqPWsuRGVlcERpZmYsaiYmQy5wdXNoKGZ1bmN0aW9uKCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGomJmsuRGVlcERpZmY9PT1jJiYoay5EZWVwRGlmZj1qLGo9dm9pZCAwKX0pLHQobixyKSx0KG8sciksdChpLHIpLHQoYSxyKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjLHtkaWZmOnt2YWx1ZTpjLGVudW1lcmFibGU6ITB9LG9ic2VydmFibGVEaWZmOnt2YWx1ZTpsLGVudW1lcmFibGU6ITB9LGFwcGx5RGlmZjp7dmFsdWU6aCxlbnVtZXJhYmxlOiEwfSxhcHBseUNoYW5nZTp7dmFsdWU6ZCxlbnVtZXJhYmxlOiEwfSxyZXZlcnRDaGFuZ2U6e3ZhbHVlOmcsZW51bWVyYWJsZTohMH0saXNDb25mbGljdDp7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2Ygan0sZW51bWVyYWJsZTohMH0sbm9Db25mbGljdDp7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gQyYmKEMuZm9yRWFjaChmdW5jdGlvbihlKXtlKCl9KSxDPW51bGwpLGN9LGVudW1lcmFibGU6ITB9fSk7dmFyIEY9e0U6e2NvbG9yOlwiIzIxOTZGM1wiLHRleHQ6XCJDSEFOR0VEOlwifSxOOntjb2xvcjpcIiM0Q0FGNTBcIix0ZXh0OlwiQURERUQ6XCJ9LEQ6e2NvbG9yOlwiI0Y0NDMzNlwiLHRleHQ6XCJERUxFVEVEOlwifSxBOntjb2xvcjpcIiMyMTk2RjNcIix0ZXh0OlwiQVJSQVk6XCJ9fSxMPXtsZXZlbDpcImxvZ1wiLGxvZ2dlcjpjb25zb2xlLGxvZ0Vycm9yczohMCxjb2xsYXBzZWQ6dm9pZCAwLHByZWRpY2F0ZTp2b2lkIDAsZHVyYXRpb246ITEsdGltZXN0YW1wOiEwLHN0YXRlVHJhbnNmb3JtZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGFjdGlvblRyYW5zZm9ybWVyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxlcnJvclRyYW5zZm9ybWVyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxjb2xvcnM6e3RpdGxlOmZ1bmN0aW9uKCl7cmV0dXJuXCJpbmhlcml0XCJ9LHByZXZTdGF0ZTpmdW5jdGlvbigpe3JldHVyblwiIzlFOUU5RVwifSxhY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm5cIiMwM0E5RjRcIn0sbmV4dFN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuXCIjNENBRjUwXCJ9LGVycm9yOmZ1bmN0aW9uKCl7cmV0dXJuXCIjRjIwNDA0XCJ9fSxkaWZmOiExLGRpZmZQcmVkaWNhdGU6dm9pZCAwLHRyYW5zZm9ybWVyOnZvaWQgMH0sVD1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSx0PWUuZGlzcGF0Y2gscj1lLmdldFN0YXRlO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHR8fFwiZnVuY3Rpb25cIj09dHlwZW9mIHI/UygpKHtkaXNwYXRjaDp0LGdldFN0YXRlOnJ9KTp2b2lkIGNvbnNvbGUuZXJyb3IoXCJcXG5bcmVkdXgtbG9nZ2VyIHYzXSBCUkVBS0lORyBDSEFOR0VcXG5bcmVkdXgtbG9nZ2VyIHYzXSBTaW5jZSAzLjAuMCByZWR1eC1sb2dnZXIgZXhwb3J0cyBieSBkZWZhdWx0IGxvZ2dlciB3aXRoIGRlZmF1bHQgc2V0dGluZ3MuXFxuW3JlZHV4LWxvZ2dlciB2M10gQ2hhbmdlXFxuW3JlZHV4LWxvZ2dlciB2M10gaW1wb3J0IGNyZWF0ZUxvZ2dlciBmcm9tICdyZWR1eC1sb2dnZXInXFxuW3JlZHV4LWxvZ2dlciB2M10gdG9cXG5bcmVkdXgtbG9nZ2VyIHYzXSBpbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdyZWR1eC1sb2dnZXInXFxuXCIpfTtlLmRlZmF1bHRzPUwsZS5jcmVhdGVMb2dnZXI9UyxlLmxvZ2dlcj1ULGUuZGVmYXVsdD1ULE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///60\\n')},function(module,__webpack_exports__,__webpack_require__){\"use strict\";eval(\"__webpack_require__.r(__webpack_exports__);\\nfunction createThunkMiddleware(extraArgument) {\\n return function (_ref) {\\n var dispatch = _ref.dispatch,\\n getState = _ref.getState;\\n return function (next) {\\n return function (action) {\\n if (typeof action === 'function') {\\n return action(dispatch, getState, extraArgument);\\n }\\n\\n return next(action);\\n };\\n };\\n };\\n}\\n\\nvar thunk = createThunkMiddleware();\\nthunk.withExtraArgument = createThunkMiddleware;\\n\\n/* harmony default export */ __webpack_exports__[\\\"default\\\"] = (thunk);//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtdGh1bmsvZXMvaW5kZXguanM/NGExOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRWUsb0VBQUsiLCJmaWxlIjoiNjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBjcmVhdGVUaHVua01pZGRsZXdhcmUoZXh0cmFBcmd1bWVudCkge1xuICByZXR1cm4gZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG5cbnZhciB0aHVuayA9IGNyZWF0ZVRodW5rTWlkZGxld2FyZSgpO1xudGh1bmsud2l0aEV4dHJhQXJndW1lbnQgPSBjcmVhdGVUaHVua01pZGRsZXdhcmU7XG5cbmV4cG9ydCBkZWZhdWx0IHRodW5rOyJdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///61\\n\")}]);\n",
" </script>\n",
"</div>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"h2 = copy.deepcopy(h1)\n",
"\n",
"analysis = CompatibilityAnalysis(\"sweeps-mnist\", n_epochs, h1, h2, train_loader_b, test_loader,\n",
" batch_size_train, batch_size_test,\n",
" OptimizerClass=optim.SGD,\n",
" optimizer_kwargs={\"lr\": learning_rate, \"momentum\": momentum},\n",
" NewErrorLossClass=bcloss.BCCrossEntropyLoss,\n",
" StrictImitationLossClass=bcloss.StrictImitationCrossEntropyLoss,\n",
" lambda_c_stepsize=0.25, device=\"cuda\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 4
}