diff --git a/README.md b/README.md index 38fdcd4..e18431f 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,5 @@ ## Performance ![img.png](benchmark/results-0.1.1.png) + +![img.png](benchmark/results-df-0.1.1.png) \ No newline at end of file diff --git a/benchmark/results-df-0.1.1.png b/benchmark/results-df-0.1.1.png new file mode 100644 index 0000000..6a25114 Binary files /dev/null and b/benchmark/results-df-0.1.1.png differ diff --git a/benchmark/run_bench.ipynb b/benchmark/run_bench.ipynb index b094d5b..c2dd756 100644 --- a/benchmark/run_bench.ipynb +++ b/benchmark/run_bench.ipynb @@ -510,10 +510,13 @@ }, { "cell_type": "code", - "execution_count": null, "id": "f77062ce640cc526", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-12-13T15:23:49.587766Z", + "start_time": "2024-12-13T15:23:49.239179Z" + } + }, "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -538,7 +541,9 @@ " ax.grid(True)\n", " fig.set_size_inches(10, 5)\n", " plt.show()" - ] + ], + "outputs": [], + "execution_count": 5 }, { "cell_type": "code", @@ -566,20 +571,44 @@ }, { "cell_type": "code", - "execution_count": null, "id": "657a85d9bf76f15c", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-12-13T15:24:43.293282Z", + "start_time": "2024-12-13T15:24:43.236555Z" + } + }, "source": [ "metrics = {\n", " \"polars-bio-pl-df--pl-lf\" : {\"0-1\": 0.147, \"0-3\": 44.942, \"0-8\": 6.096, \"7-8\": 9.522},\n", " \"polars-bio-pd-df--pl-lf\" : {\"0-1\": 0.177, \"0-3\": 43.369, \"0-8\": 6.241, \"7-8\": 9.688},\n", - " \"polars-bio-pd-df--pd-df\" : {\"0-1\": 175 , \"0-3\": 51.226 , \"0-8\": 7.435 , \"7-8\": 11.756 },\n", + " \"polars-bio-pd-df--pd-df\" : {\"0-1\": 0.175 , \"0-3\": 51.226 , \"0-8\": 7.435 , \"7-8\": 11.756 },\n", "}\n", "plot_metrics(\n", - " metrics, [\"0-1\", \"0-3\", \"0-8\",\"7-8\"], \"Overlap performance comparison\"\n", + " metrics, [\"0-1\", \"0-3\", \"0-8\",\"7-8\"], \"Overlap performance comparison between DataFrames\"\n", ")" - ] + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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UNOwYUMzdepUM2vWLHPTTTcZm81mlixZ4miXkJBgJJmGDRua9u3bm9dff91MmTLFad6+ffsc7fv27WsGDBhgXn75ZTN37lxzxx13GElmzJgxTvW0b9/eVKlSxYSFhZmRI0ea1157zbRt29ZIMvPnzy9w3UgyjRs3NhUrVjQTJ040U6dONVFRUSYgIMDs2LHD0e7IkSOmWrVqJjIy0kycONHMnTvX3HrrrUaSmTFjhqPd2rVrHa+zWbNmZvr06Wby5Mnmp59+MjNmzDCSzN13323ee+89s3TpUsc6LFOmjImIiDCTJk0yU6ZMMTVr1jR2u91s2rTJpXWYsx4iIyPN448/bl5//XXTsGFD4+3tbT766CMTHh5uxo8fb2bOnGmqVq1qQkNDzalTpxx9L1q0yDRt2tQ8++yz5s033zT/7//9P1OuXDkTFRVlzp49m6uG66+/3nTq1Mm8/vrrZvTo0cbb29sMGDDAad0mJCQYm81mGjdubF544QUze/Zsc//995t7773X0WbNmjXGz8/PxMbGmmnTppkZM2aY6667zvj5+ZnNmzdf8m934cIF07lzZyPJ3HXXXWbWrFlm8uTJplOnTmbZsmXGGGOys7NNp06djM1mM/fff7+ZNWuW6d27t5FkRo0alWtbuO6660xkZKSZMmWKmTJligkNDTXVq1c3s2bNMg0bNjTTpk0zzzzzjPHz8zMdO3Z0er6r2+Jff/1lIiIiTHx8vJk7d6556aWXTHR0tPH19TXbtm1ztNu3b5/j712rVi0zZcoUM2PGDPPHH3845iUkJDjat2nTxoSGhppnnnnGvP322+bFF180HTt2NOvXr3e0ee6554wk06VLF/P666+bkSNHGm9vb9OiRQuTkZGR67VERkaaRx991MyZM8d06tTJSDJffvnlJf8uOevSXePqyJEjZuLEiUaSeeCBB8x7771n3nvvPbN3717z448/Gknms88+c/TZp08f4+XlZZo3b+6YtmXLFiPJfP75545p999/v/Hx8THDhg0zb7zxhnnyySdNmTJlcq2Ld99919hsNnPzzTeb119/3UydOtXUqFHDlC1b1mmfFRcXZ/z9/U2jRo3MfffdZ+bOnWv69+9vJJk5c+YUuM7at2/vtG/9u0mTJuV6DS1atDCDBw82M2bMMK+//rrp1q2bkWRmzZrlaLN06VJTrVo1U79+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9erVnR6XK1fOqc+ca4IaN26cZ63Sxd+Mki4GyvykpqY6+v67vXv3Kjo6Wj4++b99/PHHH6pSpUquLwkaNGjgmG/199eVs65cWYeS69viwoULNW3aNO3atUuZmZmOtnn9bV3Zlux2u6ZOnarRo0ercuXKat26tXr16qVBgwYpPDzc6bX+fVvz8/NTrVq1cq2LvLancuXK6eeffy6wHqloxlVe2rVrp/Hjx+vcuXPasGGDIiIidMMNN6hp06basGGDunbtqu+++04DBgxwPGfPnj1KTU1VWFjYJZebs4126tQpz3YhISFOj/39/XMF2nLlyuUbXAvjzJkzkpy/8Nq4caOee+45JSUlKS0tzal9amqqYzvNT3Z2tl599VXNmTNH+/btc7p2qkKFCrna161bV126dMm3v/y21c8//1zPP/+8tm/frvT0dMf0v29f0uWPwcLsT1566SXFxcUpMjJSMTExuuWWWzRo0KBivXERUBiEJKAIhIaGKiIiosAPNj///LOqVq3qeNO32+3q27evli5dqjlz5ig5OVkbN27Uiy++6HhOzrdyY8aMUffu3fPst06dOk6PXTm6kpKSovbt2yskJEQTJ05U7dq15e/vrx9//FFPPvnkJY8uFIWc5d1zzz35vgFfd911To9deZ2XK7++8ztCl990axB6+OGHlZCQoFGjRik2NtbxY7d33XVXnuvblT4LktPvyy+/nO9tnXO+PS8uV7IOXfX+++9r8ODB6tu3rx5//HGFhYXJ29tbkydPdrrhRA5Xt6VRo0apd+/eWrZsmVauXKlx48Zp8uTJ+uabb3T99dcXuk53vua8XM64ykvbtm2VmZmppKQkbdiwQe3atZN0MTxt2LBBu3bt0l9//eWYnrPssLAwffDBB3n2mRN0cmp87733HGHT6u8B3ZWj5Jcr52Y5OfvUvXv3qnPnzqpfv76mT5+uyMhI+fn56csvv9SMGTNc2k+++OKLGjdunO677z5NmjRJ5cuXl5eXl0aNGnVZ+9m8ttUNGzbo1ltv1U033aQ5c+YoIiJCvr6+SkhIyHUTF+nyx2Bh9icDBgxQu3bttHTpUn399dd6+eWXNXXqVC1ZskQ9evQo8HUCxY2QBBSRXr166a233tJ3332ntm3b5pq/YcMG7d+/3+k0IeniKXcLFy7UmjVrtHPnThljHKfaSXJ86+br63vJbxcLa926dTp+/LiWLFmim266yTF93759ebY/dOhQrlth//bbb5LkdNpGfnK+gbT67bffFBgY6PiwFBwcrKysLLe+Tunih7HAwEDt3r0717xdu3bJy8sr1zeoRWHx4sWKi4vTtGnTHNPOnz+f665nrqpdu7akix/s/h6U/94mJCTkstZr7dq1tXnzZmVmZub72zFRUVFavXq1Tp8+7fQNfM4pmzl3HHQXV7bFxYsXq1atWlqyZInTN+nPPffcFS+/du3aGj16tEaPHq09e/aoWbNmmjZtmt5//33Ha929e7fTN+YZGRnat2+f27dtd46rvI445GjZsqX8/Py0YcMGbdiwQY8//rgk6aabbtJbb72lNWvWOB7nqF27tlavXq0bb7zxkiE0ZxsNCwtz+/opjKysLCUmJiowMNCxD//ss8+Unp6u5cuXOx19yesUwPzW3+LFi9WxY0fNnz/faXpKSooqVqzolto/+eQT+fv7a+XKlbLb7Y7pCQkJbuk/R2H3JxERERo+fLiGDx+uo0eP6oYbbtALL7xASEKJxDVJQBF5/PHHFRAQoAcffFDHjx93mnfixAk99NBDCgwMdHy4yNGlSxeVL19eH3/8sT7++GO1bNnS6XSKsLAwdejQQfPmzdPhw4dzLTevW0K7IucbQ+s31hkZGZozZ06e7S9cuKB58+Y5tZ03b54qVarkdE1EfpKSkpzOjf/zzz/16aefqlu3bvL29pa3t7f69++vTz75xOnW5zku93VKF19rt27d9OmnnzrdzjY5OVmJiYlq27ZtrlN6ioK3t3euIwSvv/76Zd+6uFu3bgoODtbkyZN1/vx5p3k5y4mJiVHt2rX1yiuvOE4lsipovfbv31/Hjh3TrFmzcs3LWcYtt9yirKysXG1mzJghm83m9g9ErmyLeW3fmzdvdlw/cznS0tJyrefatWsrODjYcXpTly5d5Ofnp9dee81p2fPnz1dqaqp69ux52cvPizvHVU7ozCu0+/v7q0WLFvrwww914MABpyNJ586d02uvvabatWsrIiLC8ZwBAwYoKytLkyZNytXfhQsXHMvp3r27QkJC9OKLLzqdFplXjUUlKytLjzzyiHbu3KlHHnnEsT/IaztKTU3NM3yUKVMmz3WX17hftGhRrmtJr4S3t7dsNpvTvmT//v1atmyZ25Yhub4/ycrKynUKcVhYmKpUqeJ0KiBQknAkCSgidevW1cKFC/WPf/xDTZo00dChQ1WzZk3t379f8+fP17Fjx/Thhx86vonL4evrq379+umjjz7S2bNn9corr+Tqe/bs2Wrbtq2aNGmiYcOGqVatWkpOTlZSUpL++9//XtbvbbRp00blypVTXFycHnnkEdlsNr333nv5nuZTpUoVTZ06Vfv371e9evX08ccfa/v27XrzzTdd+nX6xo0bq3v37nrkkUdkt9sdYWzChAmONlOmTNHatWvVqlUrDRs2TA0bNtSJEyf0448/avXq1Tpx4kShX2eO559/XqtWrVLbtm01fPhw+fj4aN68eUpPTy/079Jcrl69eum9995TaGioGjZsqKSkJK1evTrP6xJcERISohkzZuj+++9XixYtNHDgQJUrV04//fST0tLStHDhQnl5eentt99Wjx491KhRIw0ZMkRVq1bVwYMHtXbtWoWEhOizzz7LdxmDBg3Su+++q/j4eH3//fdq166dzp49q9WrV2v48OHq06ePevfurY4dO+rpp5/W/v371bRpU3399df69NNPNWrUqFzb/JVyZVvs1auXlixZottuu009e/bUvn379MYbb6hhw4Z5frhzxW+//abOnTtrwIABatiwoXx8fLR06VIlJyc7buZRqVIljR07VhMmTNDNN9+sW2+9Vbt379acOXPUokULl38k1FXuHFe1a9dW2bJl9cYbbyg4OFhlypRRq1atHF/atGvXTlOmTFFoaKiaNGki6eIH3+joaO3evVuDBw92qq19+/Z68MEHNXnyZG3fvl3dunWTr6+v9uzZo0WLFunVV1/V7bffrpCQEM2dO1f33nuvbrjhBt11112qVKmSDhw4oC+++EI33nhjniH9cqWmpur999+XdDH4/v7771qyZIn27t2ru+66yynUdevWTX5+furdu7cefPBBnTlzRm+99ZbCwsJyfWkVExOjuXPn6vnnn1edOnUUFhamTp06qVevXpo4caKGDBmiNm3aaMeOHfrggw/cem1Oz549NX36dN18880aOHCgjh49qtmzZ6tOnTouX9/mClf3J6dPn1a1atV0++23q2nTpgoKCtLq1au1ZcsWpyPpQIlSjHfSA65JP//8s7n77rtNRESE8fX1NeHh4ebuu+92+t2Sv1u1apWRZGw2m/nzzz/zbLN3714zaNAgEx4ebnx9fU3VqlVNr169zOLFix1tcm4dvWXLllzPz+sW4Bs3bjStW7c2AQEBpkqVKuaJJ55w3Lo655azxvzvtrk//PCDiY2NNf7+/iYqKsrpd0IuRZIZMWKEef/9903dunWN3W43119/vdMyciQnJ5sRI0aYyMhIx/rr3LmzefPNNx1tcm4BvmjRolzPz+8W4MYY8+OPP5ru3buboKAgExgYaDp27Gj+/e9/57me8lqH+d0+OCoqyvTs2TPf153j5MmTZsiQIaZixYomKCjIdO/e3ezatctERUWZuLi4AmvIed1/X2/Lly83bdq0MQEBASYkJMS0bNnSfPjhh05ttm3bZvr162cqVKhg7Ha7iYqKMgMGDDBr1qzJVfffpaWlmaefftrUrFnT8Te5/fbbnW6nfvr0afPYY4+ZKlWqGF9fX1O3bl3z8ssvO90mOK91Ykz+f7O8/s6ubovZ2dnmxRdfNFFRUY7t7fPPPzdxcXEmKiqqwGVb5+XcEvvYsWNmxIgRpn79+qZMmTImNDTUtGrVyvzrX//K9dxZs2aZ+vXrG19fX1O5cmXzz3/+03Fr7L+/lr/7e435cfe4MsaYTz/91DRs2ND4+Pjkuh34F198YSSZHj16OD3n/vvvz/U7VVZvvvmmiYmJMQEBASY4ONg0adLEPPHEE+bQoUNO7dauXWu6d+9uQkNDjb+/v6ldu7YZPHiw0y3O4+LiTJkyZXItI+e3qQqSc9v1nH9BQUGmbt265p577nH8rtHfLV++3Fx33XXG39/f1KhRw0ydOtVxa3zr/vTIkSOmZ8+eJjg42Ehy3A78/PnzZvTo0SYiIsIEBASYG2+80SQlJZn27ds73TL8UttijrzGT4758+c7toP69eubhISEPNfLlY5BYwren6Snp5vHH3/cNG3a1AQHB5syZcqYpk2buvRbVoCn2Ixx09WgAK4ZHTp00LFjx/I8XccVNptNI0aMcOu3wbg2Xem2CABAXrgmCQAAAAAsCEkAAAAAYEFIAgAAAAALrkkCAAAAAAuOJAEAAACABSEJAAAAACyu+h+Tzc7O1qFDhxQcHCybzebpcgAAAAB4iDFGp0+fVpUqVeTllf/xoqs+JB06dEiRkZGeLgMAAABACfHnn3+qWrVq+c6/6kNScHCwpIsrIiQkxMPVuC4zM1Nff/21unXrJl9fX0+XA5R6jCnA/RhXgHsxporeqVOnFBkZ6cgI+bnqQ1LOKXYhISGlLiQFBgYqJCSEQQK4AWMKcD/GFeBejKniU9BlONy4AQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALAgJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsPDxdAEAcK1osrBJkfS7I25HkfQLAMC1iiNJAAAAAGBBSAIAAAAAC0ISAAAAAFgQkgAAAADAwqMhafz48bLZbE7/6tev75h//vx5jRgxQhUqVFBQUJD69++v5ORkD1YMAAAA4Grn8SNJjRo10uHDhx3/vvvuO8e8xx57TJ999pkWLVqk9evX69ChQ+rXr58HqwUAAABwtfP4LcB9fHwUHh6ea3pqaqrmz5+vxMREderUSZKUkJCgBg0aaNOmTWrdunVxlwoAAADgGuDxkLRnzx5VqVJF/v7+io2N1eTJk1W9enVt3bpVmZmZ6tKli6Nt/fr1Vb16dSUlJeUbktLT05Wenu54fOrUKUlSZmamMjMzi/bFuFFOraWpZqAkKwljyi57kfTLfgKeUhLGFXA1YUwVPVfXrc0YY4q4lnx99dVXOnPmjKKjo3X48GFNmDBBBw8e1C+//KLPPvtMQ4YMcQo8ktSyZUt17NhRU6dOzbPP8ePHa8KECbmmJyYmKjAwsEheBwAAAICSLy0tTQMHDlRqaqpCQkLybefRkPR3KSkpioqK0vTp0xUQEHBZISmvI0mRkZE6duzYJVdESZOZmalVq1apa9eu8vX19XQ5QKlXEsZUbGJskfSbNDCpSPoFClISxhVwNWFMFb1Tp06pYsWKBYYkj59uZ1W2bFnVq1dPv//+u7p27aqMjAylpKSobNmyjjbJycl5XsOUw263y27PfUqLr69vqdzYSmvdQEnlyTGVrvSCG10G9hHwNN6rAPdiTBUdV9erx+9uZ3XmzBnt3btXERERiomJka+vr9asWeOYv3v3bh04cECxsUXzbSwAAAAAePRI0pgxY9S7d29FRUXp0KFDeu655+Tt7a27775boaGhGjp0qOLj41W+fHmFhITo4YcfVmxsLHe2AwAAAFBkPBqS/vvf/+ruu+/W8ePHValSJbVt21abNm1SpUqVJEkzZsyQl5eX+vfvr/T0dHXv3l1z5szxZMkAAAAArnIeDUkfffTRJef7+/tr9uzZmj17djFVBAAAAOBaV6KuSQIAAAAATyMkAQAAAIAFIQkAAAAALAhJAAAAAGBBSAIAAAAAC0ISAAAAAFgQkgAAAADAgpAEAAAAABaEJAAAAACwICQBAAAAgAUhCQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALAgJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAIAFIQkAAAAALAhJAAAAAGBBSAIAAAAACx9PFwAAV6rGU18U2MbubfRSS6nx+JVKz7IV2H7/lJ7uKA0AAJRCHEkCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAIAFIQkAAAAALAhJAAAAAGBBSAIAAAAAC0ISAAAAAFj4eLoAACiRxoe6v8+a1d3fJwAAcDuOJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAIAFIQkAAAAALAhJAAAAAGBBSAIAAAAAC0ISAAAAAFgQkgAAAADAgpAEAAAAABaEJAAAAACwICQBAAAAgAUhCQAAAAAsCEkAAAAAYEFIAgAAAACLEhOSpkyZIpvNplGjRjmmnT9/XiNGjFCFChUUFBSk/v37Kzk52XNFAgAAALjqlYiQtGXLFs2bN0/XXXed0/THHntMn332mRYtWqT169fr0KFD6tevn4eqBAAAAHAt8PF0AWfOnNE//vEPvfXWW3r++ecd01NTUzV//nwlJiaqU6dOkqSEhAQ1aNBAmzZtUuvWrfPsLz09Xenp6Y7Hp06dkiRlZmYqMzOzCF+Je+XUWppqBjzF7m0KbuNlnP5bkEwv/yuqKc8aZHd7nxL7CXgO71WAezGmip6r69ZmjHHtE0MRiYuLU/ny5TVjxgx16NBBzZo108yZM/XNN9+oc+fOOnnypMqWLetoHxUVpVGjRumxxx7Ls7/x48drwoQJuaYnJiYqMDCwqF4GAAAAgBIuLS1NAwcOVGpqqkJCQvJt59EjSR999JF+/PFHbdmyJde8I0eOyM/PzykgSVLlypV15MiRfPscO3as4uPjHY9PnTqlyMhIdevW7ZIroqTJzMzUqlWr1LVrV/n6+nq6HKBEazx+ZYFt7F5Gk5pna9wPXkrPthXY/hf7UHeU5iQ2KtLtfUpS0sCkIukXKAjvVYB7MaaKXs5ZZgXxWEj6888/9eijj2rVqlXy93ffaS12u112e+5TWnx9fUvlxlZa6waKU3pWwaHH0Tbb5lJ73+zzV1JS3stWesGNLgP7CHga71WAezGmio6r69VjN27YunWrjh49qhtuuEE+Pj7y8fHR+vXr9dprr8nHx0eVK1dWRkaGUlJSnJ6XnJys8PBwzxQNAAAA4KrnsSNJnTt31o4dO5ymDRkyRPXr19eTTz6pyMhI+fr6as2aNerfv78kaffu3Tpw4IBiY2M9UTIAAACAa4DHQlJwcLAaN27sNK1MmTKqUKGCY/rQoUMVHx+v8uXLKyQkRA8//LBiY2PzvbMdAAAAAFwpj98C/FJmzJghLy8v9e/fX+np6erevbvmzJnj6bIAAAAAXMVKVEhat26d02N/f3/Nnj1bs2fP9kxBAAAAAK45HrtxAwAAAACURIQkAAAAALAgJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAIAFIQkAAAAALAhJAAAAAGBBSAIAAAAAC0ISAAAAAFgQkgAAAADAgpAEAAAAABaEJAAAAACwICQBAAAAgAUhCQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALAgJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAIAFIQkAAAAALAhJAAAAAGBBSAIAAAAAC0ISAAAAAFgQkgAAAADAgpAEAAAAABaEJAAAAACwICQBAAAAgAUhCQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALAgJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAIAFIQkAAAAALHxcabR8+fJCd9y1a1cFBARcss3cuXM1d+5c7d+/X5LUqFEjPfvss+rRo4ck6fz58xo9erQ++ugjpaenq3v37pozZ44qV65c6HoAAAAAwBUuhaS+ffsWqlObzaY9e/aoVq1al2xXrVo1TZkyRXXr1pUxRgsXLlSfPn20bds2NWrUSI899pi++OILLVq0SKGhoRo5cqT69eunjRs3FqoeAAAAAHCVSyFJko4cOaKwsDCX2gYHB7vUrnfv3k6PX3jhBc2dO1ebNm1StWrVNH/+fCUmJqpTp06SpISEBDVo0ECbNm1S69atXS0dAAAAAFzmUkiKi4sr8NQ5q3vuuUchISGFKiQrK0uLFi3S2bNnFRsbq61btyozM1NdunRxtKlfv76qV6+upKSkfENSenq60tPTHY9PnTolScrMzFRmZmahavKknFpLU82Ap9i9TcFtvIzTfwuS6eV/RTXlWYPsbu9TYj8Bz+G9CnAvxlTRc3Xd2owxrn1iKCI7duxQbGyszp8/r6CgICUmJuqWW25RYmKihgwZ4hR4JKlly5bq2LGjpk6dmmd/48eP14QJE3JNT0xMVGBgYJG8BgAAAAAlX1pamgYOHKjU1NRLHtRx+XS7/Jw6dUrffPONoqOj1aBBg0I/Pzo6Wtu3b1dqaqoWL16suLg4rV+//rLrGTt2rOLj453qi4yMVLdu3Qp9dMuTMjMztWrVKnXt2lW+vr6eLgco0RqPX1lgG7uX0aTm2Rr3g5fSs20Ftv/FPtQdpTmJjYp0e5+SlDQwqUj6BQrCexXgXoypopdzlllBCh2SBgwYoJtuukkjR47UuXPn1Lx5c+3fv1/GGH300Ufq379/ofrz8/NTnTp1JEkxMTHasmWLXn31Vd15553KyMhQSkqKypYt62ifnJys8PDwfPuz2+2y23Of0uLr61sqN7bSWjdQnNKzCg49jrbZNpfa+2afv5KS8l620gtudBnYR8DTeK8C3IsxVXRcXa+F/p2kb7/9Vu3atZMkLV26VMYYpaSk6LXXXtPzzz9f2O5yyc7OVnp6umJiYuTr66s1a9Y45u3evVsHDhxQbGzsFS8HAAAAAPJS6CNJqampKl++vCRpxYoV6t+/vwIDA9WzZ089/vjjhepr7Nix6tGjh6pXr67Tp08rMTFR69at08qVKxUaGqqhQ4cqPj5e5cuXV0hIiB5++GHFxsZyZzsAAAAARabQISkyMlJJSUkqX768VqxYoY8++kiSdPLkSfn7F+5uUEePHtWgQYN0+PBhhYaG6rrrrtPKlSvVtWtXSdKMGTPk5eWl/v37O/2YLAAAAAAUlUKHpFGjRukf//iHgoKCFBUVpQ4dOki6eBpekyZNCtXX/PnzLznf399fs2fP1uzZswtbJgAAAABclkKHpOHDh6tVq1Y6cOCAunbtKi+vi5c11apVyy3XJAEAAACAJ13WLcBjYmIUExPjNK1nz55uKQgAAAAAPMmlu9vFx8fr7NmzLnc6duxYnThx4rKLAgAAAABPcSkkvfrqq0pLS3O509mzZyslJeVyawIAAAAAj3HpdDtjjOrVqyebzbUfbCzMUScAAAAAKElcCkkJCQmF7rhy5cqFfg4AAAAAeJpLISkuLq6o6wAAAACAEsGla5IAAAAA4FpBSAIAAAAAC0ISAAAAAFgQkgAAAADA4rJD0u+//66VK1fq3Llzki7eJhwAAAAASrtCh6Tjx4+rS5cuqlevnm655RYdPnxYkjR06FCNHj3a7QUCAAAAQHEqdEh67LHH5OPjowMHDigwMNAx/c4779SKFSvcWhwAAAAAFDeXfifJ6uuvv9bKlStVrVo1p+l169bVH3/84bbCAAAAAMATCn0k6ezZs05HkHKcOHFCdrvdLUUBAAAAgKcUOiS1a9dO7777ruOxzWZTdna2XnrpJXXs2NGtxQEAAABAcSv06XYvvfSSOnfurB9++EEZGRl64okn9Ouvv+rEiRPauHFjUdQIAAAAAMWm0EeSGjdurN9++01t27ZVnz59dPbsWfXr10/btm1T7dq1i6JGAAAAACg2hT6SJEmhoaF6+umn3V0LAAAAAHjcZYWk8+fP6+eff9bRo0eVnZ3tNO/WW291S2EAAAAA4AmFDkkrVqzQoEGDdOzYsVzzbDabsrKy3FIYAAAAAHhCoa9Jevjhh3XHHXfo8OHDys7OdvpHQAIAAABQ2hU6JCUnJys+Pl6VK1cuinoAAAAAwKMKHZJuv/12rVu3rghKAQAAAADPK/Q1SbNmzdIdd9yhDRs2qEmTJvL19XWa/8gjj7itOAAAAAAoboUOSR9++KG+/vpr+fv7a926dbLZbI55NpuNkAQAAACgVCt0SHr66ac1YcIEPfXUU/LyKvTZegAAAABQohU65WRkZOjOO+8kIAEAAAC4KhU66cTFxenjjz8uiloAAAAAwOMKfbpdVlaWXnrpJa1cuVLXXXddrhs3TJ8+3W3FAQAAAEBxK3RI2rFjh66//npJ0i+//OI0z3oTBwAAAAAojQodktauXVsUdQAAAABAicDdFwAAAADAwqUjSf369dOCBQsUEhKifv36XbLtkiVL3FIYAAAAAHiCSyEpNDTUcb1RaGhokRYEAAAAAJ7kUkhKSEjQxIkTNWbMGCUkJBR1TQAAAADgMS5fkzRhwgSdOXOmKGsBAAAAAI9zOSQZY4qyDgAAAAAoEQp1dzt+BwkAAADA1a5Qv5NUr169AoPSiRMnrqggAAAAAPCkQoWkCRMmcHc7AAAAAFe1QoWku+66S2FhYUVVCwAAAAB4nMvXJHE9EgAAAIBrAXe3AwAAAAALl0+3y87OLso6AAAAAKBEKNQtwAEAAADgakdIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALAgJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAICFR0PS5MmT1aJFCwUHByssLEx9+/bV7t27ndqcP39eI0aMUIUKFRQUFKT+/fsrOTnZQxUDAAAAuNp5NCStX79eI0aM0KZNm7Rq1SplZmaqW7duOnv2rKPNY489ps8++0yLFi3S+vXrdejQIfXr18+DVQMAAAC4mvl4cuErVqxwerxgwQKFhYVp69atuummm5Samqr58+crMTFRnTp1kiQlJCSoQYMG2rRpk1q3bu2JsgEAAABcxTwakv4uNTVVklS+fHlJ0tatW5WZmakuXbo42tSvX1/Vq1dXUlJSniEpPT1d6enpjsenTp2SJGVmZiozM7Moy3ernFpLU82Ap9i9TcFtvIzTfwuS6eV/RTXlWYPsbu9TYj8Bz+G9CnAvxlTRc3Xd2owxrn1iKGLZ2dm69dZblZKSou+++06SlJiYqCFDhjiFHklq2bKlOnbsqKlTp+bqZ/z48ZowYUKu6YmJiQoMDCya4gEAAACUeGlpaRo4cKBSU1MVEhKSb7sScyRpxIgR+uWXXxwB6XKNHTtW8fHxjsenTp1SZGSkunXrdskVUdJkZmZq1apV6tq1q3x9fT1dDlCiNR6/ssA2di+jSc2zNe4HL6Vn2wps/4t9qDtKcxIbFen2PiUpaWBSkfQLFIT3KsC9GFNFL+css4KUiJA0cuRIff755/r2229VrVo1x/Tw8HBlZGQoJSVFZcuWdUxPTk5WeHh4nn3Z7XbZ7blPafH19S2VG1tprRsoTulZBYceR9tsm0vtfbPPX0lJeS9b6QU3ugzsI+BpvFcB7sWYKjqurleP3t3OGKORI0dq6dKl+uabb1SzZk2n+TExMfL19dWaNWsc03bv3q0DBw4oNja2uMsFAAAAcA3w6JGkESNGKDExUZ9++qmCg4N15MgRSVJoaKgCAgIUGhqqoUOHKj4+XuXLl1dISIgefvhhxcbGcmc7AAAAAEXCoyFp7ty5kqQOHTo4TU9ISNDgwYMlSTNmzJCXl5f69++v9PR0de/eXXPmzCnmSgEAAABcKzwakly5sZ6/v79mz56t2bNnF0NFAAAAAK51Hr0mCQAAAABKGkISAAAAAFgQkgAAAADAgpAEAAAAABaEJAAAAACwICQBAAAAgAUhCQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALAgJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAIAFIQkAAAAALAhJAAAAAGBBSAIAAAAAC0ISAAAAAFgQkgAAAADAgpAEAAAAABaEJAAAAACwICQBAAAAgAUhCQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALAgJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAIAFIQkAAAAALAhJAAAAAGBBSAIAAAAAC0ISAAAAAFgQkgAAAADAgpAEAAAAABY+ni4AAAAAQMnQZGGTIul3R9yOIum3qHAkCQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALDwaEj69ttv1bt3b1WpUkU2m03Lli1zmm+M0bPPPquIiAgFBASoS5cu2rNnj2eKBQAAAHBN8GhIOnv2rJo2barZs2fnOf+ll17Sa6+9pjfeeEObN29WmTJl1L17d50/f76YKwUAAABwrfDx5MJ79OihHj165DnPGKOZM2fqmWeeUZ8+fSRJ7777ripXrqxly5bprrvuKs5SAQAAAFwjPBqSLmXfvn06cuSIunTp4pgWGhqqVq1aKSkpKd+QlJ6ervT0dMfjU6dOSZIyMzOVmZlZtEW7UU6tpalmwFPs3qbgNl7G6b8FyfTyv6Ka8qxBdrf3KbGfgOfwXgW4V0kYU1f7e5WrddiMMa59YihiNptNS5cuVd++fSVJ//73v3XjjTfq0KFDioiIcLQbMGCAbDabPv744zz7GT9+vCZMmJBremJiogIDA4ukdgAAAAAlX1pamgYOHKjU1FSFhITk267EHkm6XGPHjlV8fLzj8alTpxQZGalu3bpdckWUNJmZmVq1apW6du0qX19fT5cDlGiNx68ssI3dy2hS82yN+8FL6dm2Atv/Yh/qjtKcxEZFur1PSUoamFQk/QIF4b0KcK+SMKZiE2OLpN+S8l6Vc5ZZQUpsSAoPD5ckJScnOx1JSk5OVrNmzfJ9nt1ul92e+zChr69vqdyBl9a6geKUnlVw6HG0zba51N432/03iElXesGNLgP7CHga71WAe7k8psaHun3Z6TWru71PqeS8V7laR4n9naSaNWsqPDxca9ascUw7deqUNm/erNjYokm4AAAAAODRI0lnzpzR77//7ni8b98+bd++XeXLl1f16tU1atQoPf/886pbt65q1qypcePGqUqVKo7rlgAAAIDSoMZTXxTYxu5t9FLLi6eRu3LWw37332MI/z+PhqQffvhBHTt2dDzOuZYoLi5OCxYs0BNPPKGzZ8/qgQceUEpKitq2basVK1bI358tAgAAAEDR8GhI6tChgy51cz2bzaaJEydq4sSJxVgVAAAAgGtZib0mCQAAAAA8gZAEAAAAABaEJAAAAACwICQBAAAAgAUhCQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALDw8XQBAAAAl6vJwiZu73NH3A639wmgdOFIEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAIAFIQkAAAAALAhJAAAAAGBBSAIAAAAAC35MFgAAFL3xoUXTb83qRdMvgGsaIQkAADip8dQXLrWzexu91FJqPH6l0rNsl2y7398dlQFA8eB0OwAAAACwICQBAAAAgAUhCQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALAgJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQAAAAAsCAkAQAAAIAFIQkAAAAALAhJAAAAAGBBSAIAAAAAC0ISAAAAAFgQkgAAAADAgpAEAAAAABaEJAAAAACwICQBAAAAgAUhCQAAAAAsCEkAAAAAYEFIAgAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALAgJAEAAACABSEJAAAAACwISQAAAABgQUgCAAAAAAtCEgAAAABYEJIAAAAAwKJUhKTZs2erRo0a8vf3V6tWrfT99997uiQAAAAAV6kSH5I+/vhjxcfH67nnntOPP/6opk2bqnv37jp69KinSwMAAABwFfLxdAEFmT59uoYNG6YhQ4ZIkt544w198cUXeuedd/TUU095uLoSYnxokXTbpGZ1t/e5I26H2/sEAAAA3KlEh6SMjAxt3bpVY8eOdUzz8vJSly5dlJSUlOdz0tPTlZ6e7nicmpoqSTpx4oQyMzOLtmAXtJq8xqV2di+jZ67PVrOnlyg923bJtpv9/NxRWi4+59y/eRw/ftztfQI+F84W3CbbKC0tWz6ZXsoqYExJ0vEM94+rohhTEuMK7ufKmJIKN66KYkxJvFeh9OC9qmSMq9OnT0uSjDGXbGczBbXwoEOHDqlq1ar697//rdjYWMf0J554QuvXr9fmzZtzPWf8+PGaMGFCcZYJAAAAoBT5888/Va1atXznl+gjSZdj7Nixio+PdzzOzs7WiRMnVKFCBdlsBSfykuLUqVOKjIzUn3/+qZCQEE+XA5R6jCnA/RhXgHsxpoqeMUanT59WlSpVLtmuRIekihUrytvbW8nJyU7Tk5OTFR4enudz7Ha77Ha707SyZcsWVYlFLiQkhEECuBFjCnA/xhXgXoypohUaWvD1/CX67nZ+fn6KiYnRmjX/u44nOztba9ascTr9DgAAAADcpUQfSZKk+Ph4xcXFqXnz5mrZsqVmzpyps2fPOu52BwAAAADuVOJD0p133qm//vpLzz77rI4cOaJmzZppxYoVqly5sqdLK1J2u13PPfdcrlMHAVwexhTgfowrwL0YUyVHib67HQAAAAAUtxJ9TRIAAAAAFDdCEgAAAABYEJIAAAAAwIKQBAAAAAAWhCQPmT17tmrUqCF/f3+1atVK33///SXbv/DCC2rTpo0CAwNL9Y/jAkWpsOPq1ltvVfXq1eXv76+IiAjde++9OnToUDFVC5R8hR1Tv/32m/r06aOKFSsqJCREbdu21dq1a4upWqBkq1Gjhmw2W65/I0aMyPc5jCnPISR5wMcff6z4+Hg999xz+vHHH9W0aVN1795dR48ezfc5GRkZuuOOO/TPf/6zGCsFSo/LGVcdO3bUv/71L+3evVuffPKJ9u7dq9tvv70YqwZKrssZU7169dKFCxf0zTffaOvWrWratKl69eqlI0eOFGPlQMm0ZcsWHT582PFv1apVkqQ77rgj3+cwpjzIoNi1bNnSjBgxwvE4KyvLVKlSxUyePLnA5yYkJJjQ0NAirA4ona5kXOX49NNPjc1mMxkZGUVRIlCqFHZM/fXXX0aS+fbbbx3TTp06ZSSZVatWFXm9QGnz6KOPmtq1a5vs7Ow85zOmPIsjScUsIyNDW7duVZcuXRzTvLy81KVLFyUlJXmwMqD0cse4OnHihD744AO1adNGvr6+RVUqUCpczpiqUKGCoqOj9e677+rs2bO6cOGC5s2bp7CwMMXExBRX6UCpkJGRoffff1/33XefbDZbnm0YU55FSCpmx44dU1ZWlipXruw0vXLlyhw6BS7TlYyrJ598UmXKlFGFChV04MABffrpp0VZKlAqXM6YstlsWr16tbZt26bg4GD5+/tr+vTpWrFihcqVK1ccZQOlxrJly5SSkqLBgwfn24Yx5VmEpBLmoYceUlBQkOMfgCt3qXH1+OOPa9u2bfr666/l7e2tQYMGyRjjoUqB0iGvMWWM0YgRIxQWFqYNGzbo+++/V9++fdW7d28dPnzYwxUDJcv8+fPVo0cPValSRRJjqiTy8XQB15qKFSvK29tbycnJTtOTk5MVHh6uiRMnasyYMR6qDiidrmRcVaxYURUrVlS9evXUoEEDRUZGatOmTYqNjS2O0oES6XLG1DfffKPPP/9cJ0+eVEhIiCRpzpw5WrVqlRYuXKinnnqq2OoHSrI//vhDq1ev1pIlSxzTGFMlD0eSipmfn59iYmK0Zs0ax7Ts7GytWbNGsbGxCgsLU506dRz/ABTMXeMqOztbkpSenl7kNQMl2eWMqbS0NEkXr12y8vLycowtAFJCQoLCwsLUs2dPxzTGVMnDkSQPiI+PV1xcnJo3b66WLVtq5syZOnv2rIYMGZLvcw4cOKATJ07owIEDysrK0vbt2yVJderU4bQ8QIUfV5s3b9aWLVvUtm1blStXTnv37tW4ceNUu3ZtjiIBKvyYio2NVbly5RQXF6dnn31WAQEBeuutt7Rv3z6nD4PAtSw7O1sJCQmKi4uTj8+lP4YzpjzMw3fXu2a9/vrrpnr16sbPz8+0bNnSbNq06ZLt4+LijKRc/9auXVs8BQOlQGHG1c8//2w6duxoypcvb+x2u6lRo4Z56KGHzH//+99irBgo2Qr7XrVlyxbTrVs3U758eRMcHGxat25tvvzyy2KqFij5Vq5caSSZ3bt3u9SeMeU5NmO4QhkAAAAAcnBNEgAAAABYEJIAAAAAwIKQBAAAAAAW3N0OuVy4cEEZGRmeLgMAAAAu8PPzK/BueSgc1iYcjDE6cOCAjh075ulSAAAAUAgVK1ZU9erVZbPZPF3KVYGQBIecgFS1alUFBQXl+vEyAAAAlCzZ2dk6c+aMDh48KEmKiorycEVXB0ISJF08xS4nIIWHh3u6HAAAALgoKChIknTw4EGdO3dO9evX93BFpR+HCiBJjmuQcgYZAAAASo+cz3Dfffeddu/e7eFqSj9CEpxwih0AAEDpk/MZLjMzUz/88IOHqyn9+EQMAAAAXCX8/f116tQpXbhwwdOllGqEJFzzFixYoLJlyxb7cvfv3y+bzabt27fn22bdunWy2WxKSUkp8npq1KihmTNnFuo5eb2GjRs3qkmTJvL19VXfvn3dVp8rf6fBgwc7LdMYowceeEDly5cvcF3j8jB+8seYQmExnvJX0sdTXi7373ml485ms8kYI2NMoZeN/+HGDShQjae+KNbl7Z/Ss1iXV5K1adNGhw8fVmhoqKdLcVl8fLyaNWumr776yuPXuK1YsUILFizQunXrVKtWLVWsWLF4CxhfzH+38anFu7wSrjSOn7wwpv6nycImxbq8HXE7inV5JRnjyXM8Pe6uVYQkwA0yMjLk5+fn9n79/PxK3d0G9+7dq4ceekjVqlXzdCnau3evIiIi1KZNG0+Xgktg/FwaYwqFwXi6tJI0nlzFuPMMTrdDqdehQweNHDlSI0eOVGhoqCpWrKhx48Y5DjOfPHlSgwYNUrly5RQYGKgePXpoz549+fa3d+9e9enTR5UrV1ZQUJBatGih1atXO7WpUaOGJk2apEGDBikkJEQPPPCAMjIyNHLkSEVERMjf319RUVGaPHlygfXv2rVLbdq0kb+/vxo3bqz169c75uV1esMnn3yiRo0ayW63q0aNGpo2bdoVryNXff/997r++uvl7++v5s2ba9u2bY55Oac1HD9+XPfdd59sNpsWLFjgUr85r/OLL77QddddJ39/f7Vu3Vq//PJLoeqzGjx4sB5++GEdOHBANptNNWrUuOy+rmaMH/eMn6NHj6p3794KCAhQzZo19cEHHxTYr8SYutownq7t8bRgwQJVr15dgYGBuu2223T8+PEC+87KylJ8fLzKli2rChUq6IknnnBaF4w7zyEk4aqwcOFC+fj46Pvvv9err76q6dOn6+2335Z0cQfzww8/aPny5UpKSpIxRrfccosyMzPz7OvMmTO65ZZbtGbNGm3btk0333yzevfurQMHDji1e+WVV9S0aVNt27ZN48aN02uvvably5frX//6l3bv3q0PPvjApZ3Z448/rtGjR2vbtm2KjY1V7969892xbt26VQMGDNBdd92lHTt2aPz48Ro3bpxLO/pLrSNXnDlzRr169VLDhg21detWjR8/XmPGjHHMj4yM1OHDhxUSEqKZM2fq8OHDuvPOO13uX7q4LqZNm6YtW7aoUqVK6t27d75/p4K8+uqrmjhxoqpVq6bDhw9ry5Ytl9XPtYDxs+CK1lHOevrzzz+1du1aLV68WHPmzNHRo0cv2Sdj6urEeFpwResoZz2VtvG0efNmDR06VCNHjtT27dvVsWNHPf/88wX2OW3aNC1YsEDvvPOOvvvuO504cUJLly51zGfceQ6n2+GqEBkZqRkzZshmsyk6Olo7duzQjBkz1KFDBy1fvlwbN250HKb+4IMPFBkZqWXLlumOO+7I1VfTpk3VtGlTx+NJkyZp6dKlWr58uUaOHOmY3qlTJ40ePdrx+MCBA6pbt67atm0rm83m8i9ejxw5Uv3795ckzZ07VytWrND8+fP1xBNP5Go7ffp0de7cWePGjZMk1atXT//5z3/08ssva/DgwZe1joYNG+ZSnYmJicrOztb8+fPl7++vRo0a6b///a/++c9/SpK8vb0VHh4um82m0NDQyzot47nnnlPXrl0lXXwTrVatmpYuXaoBAwYUuq/Q0FAFBwc76kL+GD9XNn5+++03ffXVV/r+++/VokULSdL8+fPVoEGDS/bJmLo6MZ6uzfH06quv6uabb3asq3r16unf//63VqxYcck+Z86cqbFjx6pfv36SpDfeeEMrV650zGfceQ5HknBVaN26tWw2m+NxbGys9uzZo//85z/y8fFRq1atHPMqVKig6Oho7dy5M8++zpw5ozFjxqhBgwYqW7asgoKCtHPnzlzf3DVv3tzp8eDBg7V9+3ZFR0frkUce0ddff+2Y99BDDykoKMjxzyo2Ntbx/z4+PmrevHm+te3cuVM33nij07Qbb7xRe/bsUVZWljZs2OC0HOspCvmto6ysrFzLyavenTt3Ok4zyKv2vOTVT48ePRyPGzVqlO+6KF++fL5/pwMHDjj1++KLL16yDlwa4+fKxs/OnTvl4+OjmJgYx/z69es73dWKMXXtYDxdm+Np586dTn/bv7fPa4ylpqbq8OHDTs/LWe/wPI4kAX8zZswYrVq1Sq+88orq1KmjgIAA3X777crIyHBqV6ZMGafHN9xwg/bt26evvvpKq1ev1oABA9SlSxctXrxYEydOdDrsX1SaN2/udGvQypUrX1Y/7qo3r37efvttnTt3TpLk6+t7Wf1WqVLF6XWWL1/+smuEezF+8saYwuVgPOWtpI+nvDDGSh9CEq4Kmzdvdnq8adMm1a1bVw0bNtSFCxe0efNmx+kNx48f1+7du9WwYcM8+9q4caMGDx6s2267TdLFb/L279/vUh0hISG68847deedd+r222/XzTffrBMnTigsLExhYWF5PmfTpk266aabJEkXLlzQ1q1bnU6jsGrQoIE2btyYq9569erJ29tbAQEBqlOnTp7PzW8deXt752qbV70NGjTQe++9p/Pnzzu+qdu0aVOey7pUP1WrVs23/aZNm1S9enVJFy9w/u233/I8xcLHxyff14nCY/xc2fipX7++Y9k5pwft3r3b6QJ3xtS1g/F0bY6nBg0a5Pm6cuQ3xiIiIrR58+Zc6/2GG264ZO0oepxuh6vCgQMHFB8fr927d+vDDz/U66+/rkcffVR169ZVnz59NGzYMH333Xf66aefdM8996hq1arq06dPnn3VrVtXS5Ys0fbt2/XTTz9p4MCBys7OLrCG6dOn68MPP9SuXbv022+/adGiRQoPDy/wh+Rmz56tpUuXateuXRoxYoROnjyp++67L8+2o0eP1po1azRp0iT99ttvWrhwoWbNmuXSN2r5rSNXDRw4UDabTcOGDdN//vMfffnll3rllVdcfr4rJk6cqDVr1uiXX37R4MGDVbFixSL/sT8wfq50/ERHR+vmm2/Wgw8+qM2bN2vr1q26//77FRAQcMk+GVNXJ8bTtTmeHnnkEa1YsUKvvPKK9uzZo1mzZhV4PZIkPfroo5oyZYqWLVumXbt2afjw4R77wV4440gSClQaftx10KBBOnfunFq2bClvb289+uijeuCBByRJCQkJevTRR9WrVy9lZGTopptu0pdffpnvYfTp06frvvvuU5s2bVSxYkU9+eSTOnXqVIE1BAcH66WXXtKePXvk7e2tFi1a6Msvv5SX16W/i5gyZYqmTJmi7du3q06dOlq+fHm+PxR3ww036F//+peeffZZTZo0SREREZo4cWKBF8lKl15HrggKCtJnn32mhx56SNdff70aNmyoqVOnOi7ydYcpU6bo0Ucf1Z49e9SsWTN99tlnRfJ7H8WmlPy4K+NncIH1FTR+EhISdP/996t9+/aqXLmynn/+eccF7flhTBVeafhxV8bT4ALruxrHU+vWrfXWW2/pueee07PPPqsuXbromWee0aRJky7Z5+jRo3X48GHFxcXJy8tL9913n2677TalppaO94+rmc0U9odScFVKS0vTzp071aBBAwUGBnq6nELp0KGDmjVrppkzZ3q6lBKrpK+jdevWqWPHjjp58mSB33TCvUr6tlESlMZ1xJjyjNK4rRS30riOSst4yvkst2PHDqWlpWnYsGFuva7qWsPpdgAAAABgQUgCAAAAAAtOt4Ok0n26HQAAwLWO0+3ciyNJAAAAAGBBSIITV24tCgAAgJKFz3DuRUiCJDluYXnmzBkPVwIAAIDCyvkMl56e7uFKrg78ThIkXfwl6IoVK+rgwYOSLv7eQEG/pwAAAADPys7O1pkzZ3Tw4EGlpKQoKyvL0yVdFQhJcKhevbokOYISAAAASoeUlBQlJyfrwoULCgwMlLe3t6dLKtUISXCw2WyKiopSRkaG1q5dKy8vL5UtW1Y2m83TpQEAACAfmZmZys7O1rlz53TmzBlFR0dzRtAVIiQhlzp16igtLU3r16/XX3/9RUgCAAAo4Ywx8vb21nXXXacOHTp4upxSj99JQp6MMTpy5IhSU1M5txUAAKCEs9lsKlOmjMLDw2W32z1dTqlHSAIAAAAAC05WBAAAAAALQhIAAAAAWBCSAAAAAMCCkAQAAAAAFoQkAAAAALD4/wAYUMiTBtbNzwAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 8 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "d67c2ecce87533b8" } ], "metadata": { diff --git a/src/lib.rs b/src/lib.rs index 63c4c3a..a0a280e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,6 +21,15 @@ pub enum OverlapFilter { Strict = 1, } +#[pyclass(eq, eq_int)] +#[derive(Clone, PartialEq)] +pub enum RangeOp { + Overlap = 0, + Complement = 1, + Cluster = 2, + Closest = 3, +} + pub enum InputFormat { Parquet, Csv, @@ -200,5 +209,6 @@ fn polars_bio(_py: Python, m: &Bound) -> PyResult<()> { m.add_function(wrap_pyfunction!(overlap_scan, m)?)?; m.add_class::()?; m.add_class::()?; + m.add_class::()?; Ok(()) }