{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "30388fc2-12fe-41dc-b1cc-bf260619c9c4", "metadata": {}, "outputs": [], "source": [ "#|default_exp app" ] }, { "cell_type": "code", "execution_count": 2, "id": "1012f760-e3e2-45f3-8643-2141d1124450", "metadata": {}, "outputs": [], "source": [ "#|export\n", "from fastai.vision.all import *\n", "import gradio as gr\n", "\n", "def is_cat(x): return x[0].isupper()" ] }, { "cell_type": "code", "execution_count": 3, "id": "a1eaeea1-d441-4107-9ba9-2879b08689b2", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMAAAACACAIAAADS5vE8AABFYElEQVR4nO29Z5Rd53ke+n5t17NPP9MrBnVQCZIgwSYWNapQhbZoyZIiS15Wcq/jm5vkJkteXivJvbGTa6+sm8R2HMVxXOKoWLJVLFGy2ECRIAmQIApBEMBgKqbP6efs/pX7Y88cQrJsy6QIUMQ8P4AzM6fs8+1nv+/zvW0jpRRsYhOvFfhaH8AmfrqxSaBNvC5sEmgTrwubBNrE68ImgTbxurBJoE28LmwSaBOvC5sE2sTrwiaBNvG6sEmgTbwubBJoE68LmwTaxOvCJoE28bqwSaBNvC5cFwRSGzUrCgBASVBCymt6RG8d0Gt9AG88lJQIt1ZnJ44/W6vWNMvad+td+YHRa31YbxGg66CgTMVR8Ojv/ebzjz4ccdFo1JCVf9c/+KX7f/7TGBMFCgABKAToWh/nTyWuBxeGKgvTUyeeBr+aIWF3imhB+Vu//et/8Gv/bGFmGgFSSsm3/lX0RuF6IBA0F2Zjv+bYel+WlbLa3rH8bbsKa8e/8rv/5ydfeOJJjBAgvC6QNvH3xHWggQDi2ooGEiiydGnajsIUlNqzfXCxXP6z3/hlv/Wv7njgZxQoJSVCGKE3ny9TQioATBBAFAZ+sxy4bcYMJ9+lmdbGcxQgSCzp1fwK1wWBgjAMvFYhQ620RViqUqubdkoJlkuJHdB6+D/9am1l9f2/8EuIUlACgFzr4/1rQEQhFdbLSye+s3z2aHNpolat+x4Sdt7pG+navm/34XtLg1sJ0QDgKvP/uiAQBpA81hC1rLTPlWmbhCCJqBAim8uM4eC7/+03FqdeefBXPlfq7RMKMAiEriWNlJIKFEYEAALPX7z0yurZx1hjsj53qVGvSog0Ipr+mnKnJs8/e/rbX3ryD7u7xu9+96c+u/XATQCgFCh0ldTJdUEgoZDnuY7tgIpEpGzTjuM4jkMjlcIyKKTZngHr+Nf/+MKZ05/5V7++59CdSl7jPZkChBBu1Rvnjj269PwTUJ3p7YXFhcvNZpsrzKgWuFEkVcog6Yy0TMFV5eyTX7188cTtH//s/T/7ccpslGwu33hcD9t4mDr2xBf/5ce3DxqF3hImmTAMpIJYYEKoabM49CI/KK815pbq9Zj8zD//9dsf/AfX9oCFlJfPnph4/M/L54+3azMpW8aRXF2u6AY1skU/RrOXGxUvkkI5JipmmIoihNRaBVoq/c5P/sJDv/I5zbCvzqFeFxaoZ+cBmuquVxZyXSU3lkQqy6QaaBHSIgVGriTMoKhZ6ZyzOr/ytd/8NQrBLQ9+NpaCKMDkqvoyLoRC+Nt/8Dv+xLN6uFRZubCy3Iy4iAXN5bTuwXEf2Nmz80cvBQsVz8G4y1b9ea2vaOdslC6EpN389v/645Wqe+s73764sGQ7uV1794+ObUUAUioAhRD6yUrst74FkkpihL/2m5879xf/aWi410rlUibOZQycKnFqLZUrcRhqmsE03WS4tTJz6tySCdGeh/7xvZ/5F4amXd1Ih1KAjj323e/89r/Lmh6NLgdea25ZLK+IUnf2jne/bWTb3m/85SN/8lfPL/sRAGQAChTlLJJNa1lT5bJGj6O1Q5hccbtH93X1b/F56Eb+vptvff9HPj40NAwASqlNAv39oJQEhKdPHfvtT78nmzJG+jL5LMuXcma2FErmSVYvVymAls6KOJKRX54677Ua5bXG/gc+9f5/+f8R3VRCvC47pJS6YmctlOKhL0IXYcLsDMU/8M4Xzxw7+c3fd5vthcmXVmfnmm6kkEIcbdu/+84Pf3xhYuorX/x6oNmYMbdVadWDoNoyiNQdnDWkZbFiNmem0vtvubMe0cWFNUSgWMgFAZe2feiue+58x7tTtvM61vJH4K3vwhDCADCy52DPvsOzx4+WUijrOG4U41AopPl+oDAJeKQiz/M8HgtpZqiUfWZ6+rEvfLnR/OC/+T1iOsbrOICEPVEQNOYnmvMvh7Ult7ISB82Yc91OO/keu9gvmaVb2urs1MnHvxm5DcPJB0F8bj5c9VQK4/1b9eHR7emU+eSZkwaIz/z8B/qGulG0KqPgxImXnzv+8uTcshSIIjw937rjA+/++L/+HaKZoVtfnF9cmps+f+KFiZdf/urv/sfHv/fdz/3bf5/Pl35SawvXA4ESYMpufPcHpk6eUNTUmZWys4oZVHfAXYujUGFWXm26ritFYFIqqYUJJpn81NFvHP1Pqbv+6W+BmQH42zc2P/qvUqlWdaV6/nj57NHWwkURVABhzwswQUrJMAwJ1aWUDClCpY7RYLZ4sRVevDT53ETreEVZQnb169lSyaBq4uTRC6de7h/ZbmjIW71koCb3WjftGzp0aPfJ42eOHD0zt1Dv2rHvH/2r36CaKYRgZnrLjuyWHeO33vPupdmp2VdOB2HIftKK7nohEAAM7NoLutkIBWWawrqRyvjCoGbGFKpZbywtVrxYBIErvLin2+4uGIZlyy40ceTPkJl52z/590QKQtiPitMppaRCRALEzTW/vOAuTUZuS0gsAMLyTGNpjlfnwa/GiitKGaUak7puhjFXAEihKI45ImEMnhKMr+lKLq00Z5abNiW3DJr9Izkn371cbT31/PkLS962HXqt1swY7WZzXk8NWNaQjqvvunvbwZ19v/2Fp9792f+92N0HAIRgtUFqQsnA2LaBsW1vxKpeRwQa3Lprx54bSHPWC7mta4gYtpXHRpZZmVp7giMZep5UrBa41dmIK2cob1CcahCY+PYfDt9w2/Z7PvQ3mCAU8rhx4cjamSPu2uW4uRb7Qb5nUB+5Kbvjtkbo++W5IG4TxWMpc2mHS2I6lFLdAhxFkRIidBthEHABcSxlrIqOvn0obaXt6lpz/5hlF/t0u/S9J88dOTmzLWvHnEuv3G5XUk4hWyrGlbNMLZaD1qXl7B133/muBz6gVELyqxSRvn4IpCw7Pbb/4PKJZrpoZNIWsk2cyunESnf1WYUBOzddX5luVWuZtLZW8xZX4v5iKdVlLp/3pAiO/dFvDt58n5lKASAJCEBhJZQiCiNveebit/9jc+I5ITVdU1TXqEWD5hKrzhnmu/Ge2xbOHA0DRKhpp4hup1OGjYgpidkOxOXV6SjkFrXSOkMyRARjKRV3t5esnpSaL9hC8YUK/suHj84tVHNIjfV25bOOdKtWykil0lFlkUVT59cazzyzFFi5ve+7w8oUlLqqYfTrhUAKAAHq371v4cVngkhF7UYu26+srDJsTHWnd6w0srexulhdmJqfmchUVlfmFi4vrh0auSFfbNbn3ZXzJ174+h/d+fFfUQCgFFJKISwwqp1/4fyf/2verCJqxGGgGxaiNjPTBlHu2mxj8mTx4DuK43eg1goisVPI2IVebGcFKxBEp186vdBiq2vNvmIutrTIbdiaZjGGETIwFiLQAlh0tSefP+O6cQ7DqJPZPTbSl9fTKWJYDNVfCRrnT83JLz4Zbu2jN4+X7v/gz2KMQYmrubDXC4ES59MzPAKUSMnjKMQq1jUg6bzABmY6TqNUPl8cGu3Ztmft8sxc6fzixbPN5aWxwa7jS4tCM7/8+f+c6R0e3ndLptQDCAkeVV9+dPI7/yFYW47AJlyaGd3MdBl2WjcYBa4bPiy96M93jb39QYMEavEkyejY6JI0o5glsCYQXW0G7QgAIbM0ZKW1sLpabsUZAyFN2iYpuH5gkbcfHqfMefnsxNbuweGRwb7hbD5rNGaea66+wlhat8jPvifvQLNn576B7QdAyatconO9EAiB4gpy3f1ONhuKVrvZcusrEU07RoE6tsQxIZqh25aTttPZQt9w344Dpx7/djDzDOsFYthLzdiWy1/5tV/M3/q+h37lc1i26se/unjsq81GTMwUsnRm6ulcWrMsqjuE6ZqlUaoi1wWpiJ0v7LiVa14YcwFm4PlG1pREy2VLYfPU1tHRGw7sjaMIpNY/upcwWl+dq8xNKHclRXhP1MJY9m7d1j3Yz3wwCt2FsW109bSOEC3cvBbY47cP9TrB+ROns0PbAGP4SccJ/05cLwRSSmEFdjrXu/fGlRefMDlxK0u2YYfVAsKmli8yy1RYUxIMzTCzKNXbJ4Evn0sh0dDt2cvV9mhei3ncfuX4/Lf/nYMby5NnW6060LxmWEbGSTsmtdLUzCghBHAOKaTpjpGS7RUUtmm2JIycRsO2L2OldOwgoXI5e3z7oJYpuBGyDKJrfTMrZSn8vkKxZ6vurhnB2rLm+5Q312ZecjLdhb5RX5P1WqMEzNA1P15OQZW64OGMwLo9tO8qSudXcb0QCBBGoADQ8L5bVs48HYNqeSFpNhS+qKim5zOYZqmdQkRTQiAAkKqrf/TymWcyZjadyyM5fX4N7rltTGfMEM3awnSl1sTIsJ2MmS7oJlVEERH49WWrtIXoBY5jioi0i9RMc6+hZYoi3cu9sopDZtJYeFzGQtO7evvrnnhlcoHZ9MlnT5965YLgtLuYuWH3lhvGShbhkGoUcL3aas7XfEIEMrsqmGLWMKHM46nWauQHldLQTUbXwOC+267Jul4vBOpcnUPbdx/T0xQ1WcoRkioe+mtTWNdychdBoCyHYKpCLhFUJ88tnj+Xvevwrjvec+Ls4uzlBWSwkZLu1S43W3WmZxUygGphEGo6Bc1sedy0NCCm0nTBdSloFHBFWsSrUqdACsOB16AGIEJ47FMFQejlHL28tjK3xkVVO37iJabUHUN64K4+/Yx/6oKzPUe2ZCHPjGIWryx4L79yubvQatXdc83lVLziu1DMDw7lhydnl/b93D9L50ugJKCrXaN8vRCoAz3ljN585+xjX9GdnEUps7KgcFy73ADIIKVjohD1Go369Lm5U8diYqys1jO2lc0Y88vy0vmZIrL6hlO6bgLXEcUgBJdiba0aNUXM6eDYoMPSAAgh5UbClHHcWiVeCETHTANQBGMBAIDCwBORV11eWluruKGjabKrOHhwx5jRmnzHDU6lRYKDH3344W+8vOwOpWB7UaUN7bnJctOTQwKvtMLe9EB/z4idMRfDXO/h922/4wEuJcXXoBr3uiOQUrD/vgdeefiLbnVR17qMmGuGLmIe1ebLgFICdN0Ja8uR75bGxsGyiSYr87NOJhfE2txydM+BfOR7CDJIiTh0eSzahNRjJ/JMM5MasrpjPaUZJo58yWOOQKe631jBly+aA1uxkdNlKLgb+C7IoFlemzg/seqCjwgW9o477v30Z3/x//rURx1He+egYONbKrPjL184gS29HoWlgqamVC3kOw06mh4gGjVY2H3T2w9+4DNONosA1N+RaXmjcN0RCJRIZfJb3/XgpT//vUwu57a8MOKE6YbNdD9qTL4UeK6VzqQHxqLLszwOG1HYDnyCgGOkUcjqXAJBWIEScWyYPTusQok1yeTUvPQ45xGXinDJlRI8QEi1JaRSORW5gHWaygbly4CUilyvtlxdXvB9P+aMWdrM5YkXL738wjMv58KqFpthHNbqUVtEh7dnTVNfnFno04ytvd3nLld1gjJ6U0Jq/P2/eOBdH0IIg+SA6bWqobzuCCSRQkIdetfPvfTdb4h6g2SySghsEiCsvHShsTyNJUXWQKrc5gLWlpY4ijFldsrcPpgqZB0Im4LmACuuaGl0PDu634vCbIG0vcb0zOLq6hphqJDLSGQAsCh07VwhVFFQvmRuuVFP97QWZ+IoCpr19upybW01jkIssWkwrGBvasESLSdNbh70Ts5YzeLU3OXJm27pbzaruaxpmerAjr6FSguz9M5Dd/TddPuWfbdzQFjyq697rsR1RyCCKBCw0un7fumfP/87n+va2gcaE5I3y4vLkxO8VbNyduDx2cuLGtOXluadXM5Is5nV6sIa5NNcSMZDjDVDGqZKORcvTHCsG3YGAA11OXHg8TD0Xc8wpJAACrBSsQCmZwXnLFWgZlbGLd+PK8tlFUtCdRJEJq+MDfUj0jpYqoYk/cwZdJoMGy88cXhITxv88kyTMWSlUxrNv/fDD/7MP/wn+d6h5LtQAEDX+AxedwRah4LtN90xMX6ovrbS02dW1y5Xa+1GIGluu4AQi9hgQbvlVlbrk9PLnLG63+rqyfbmsCIIMGu4bra//+Rk9ZFnp9eazWYYd2fzt2wr7bFMHNR9FRHlKCGCVlV4TU4dy6Bha4Vlino6E6xNYmK1IhzEQke8ZAGG5tBA1xMrpb9YtI1Ut8wSi7f29LADuwZDtxGHlOEQMV1K7/6HfjbbOyRfZ4HbTxTXK4FAYsLu+fS/eOL3/h85t9SdckMDyV0PVH1dM8za9Mn29AmHsi39hdPnp1Zr4X333+PQMiq/ohSKfDdlODMt+j8fOT0zu+bF8eG9Nx56+9tmL56rn5oJmtVCV6Y8H4d+aBpMccHsXN/2cdEuh0HArCxHCKkgmy+0Wy1dg1iIbCYj/cbhPQOEScvQkMKFdK9jIs9rrSzXBBaYWYZTwsD8yhIA4Gvqs34I1yuBEICKU90Dd//yvzn3yJenzz/df/gjrhwc7g5Pnj3fRBlROvD80b86tHvbTfe8fbXe7M6y2UvlLI8iDTjXQlr8qxNzqyvVomFOetaDn/z0+99zaK3m/eov/1KzMrdzMGWRMAqiVMrQsdT0SvfYbt5uiOYq2HnCrHZlRQQtJ221XSVRNvDCTCoaGuhBus4UF5EX+XU/UJKHLZ9zoTSN6LqhgqhdXsFwTTZbfyPeRFy+mlAKg6JYqUyxZ/f9n4Gb/rclMtxVzE7Nly+ceWn2wsWBbeOHP/ipIydeXlxd4VF7bXEq9EIlMJcsZOmqsJZXq/tGB/YN5zWd/s7/+29/9+c/2JNOffBjv1ANzek1ObUaVBp+Za0ex5LomfbqYuR73K1xt87SvXa+P/D9KAiREFpURsKjKiZxI5c2JYZQhGbKyXd3U4MS4A4VfcU0koKKQIWuAqXeTG381ymBABRCkgt+6cLUkSPP2YVu03K++pffffib367WGzHHJ549MbJr70d++V888vyZmZnpennNr5YNFAoFNVeenpixs8Xx/txwb/aeXrk73W74a/VWu294IKaS2DYoYpmGAqXpNmWKq9CPeRS4cRzq2ZLdP6an01JKnWpC4ihuttrN0G1GzbJBlKYZlGlEswwzRZSysylspgFRJYVbWeA8flM171+nLgwh8LxgZmppYaHe1Tc6OT35+MPfabWqmq4RomOmxdQ4fX76ffff+8u/Sn7/Nz7nNuKhjEUQ0zTUrrhYqO60Nr0W7WRrd2/TW5yK9PZAioe//hcpgzHhD+d1RDCSzDRMCtJr1bNeXQZNkSpJZpul0ZEDt8uXXqjMTZmUhpGIgqhZq5oGRtSQ2Ghw4JHnezE20wSFBgWMIhxWm6sqCgNG09d6/V7FdUSgpCVKgRKC19Zqs/PzrYa0nfQ3/uJrE+dPaxpyUinEDIWx4zhOobBrx7gU/L0PPNiqN3/v138tDlXBZDuyDudB0THHd5een26fr1k5GTT8VhCiV37t34BX7bfojj6nK41afoiRBAZCcr9eDboC7Ee2kIatsVyXGe7OrDWCWtUrz3MBXMhKpZw2VbrYxRWIIA4pqzZ8P+RjYwOWrUetGqIGtJrSbys7/eaxQdcRgZJCmcALFhZWllfqtVbcbNW+9bX/1tvdSzSipWzCTMPKGJbd09O7d++uG/aNZDJ2FMb/4DOfnZ9d+NPf/c2SU9jS5+ctRDUCUePd+wvHX5qfqzMXG5YB/d3WUC6XI15XzsYiENgXkSu8ikRKZwWJGTIcSXWsGZZuaGYaUUZMa/LFpxuzF7CUXMDKajWVySNCYy9gjqNbel/KSKWdOKhKHgUxcB579bJT7LvWa/kqrgcCJZITCSkra5XyUn1htdZst449+8zq8rJB8MLlWSuXtyzDSZesVHZ4ZHB859ZtW0qObQBCuo58z/0nv/q5M6fPvPTS0/fsJn05rTfbPTVXNhA+vCN7gzKqLUFNI5vNiMhn2LGZbJXbQb3GeUCwohjRTK+e7UZYR4gCYYRSM8UAjbSa9f6Q+76/dnkmFsgLpIhFJptt+40wDEAhpmkgQ+W3Qi9stGKQKGjWrvFy/iDe+gRSSiKEW013/vKiF/AL56e4Qn/59a9ksrkw8JhmprN5M100NLZt546xseGhvsJQf4kSnMy9IxgbllGpNH/1//6NT3zovY1Y78tQp1jyfO5y0d81Gi0vjQyVlKJhFFMsbUvHPBI8jmIeBRFWAbGzRS3tBlzHlmWlKdMopYgQM5XNdw83yk2nf3fTB7+21PKjpu/nLSObp/Pzy0pFRMY+C5lQkRsyTGJJRBxd6xX9AVwPBEKzswvl1WoQxKfPvNxoec8+/Vipp6dRXk3lChgju9ita9ottx4KvfqN+7dYBsMKEvYgUIBIrRo89tSpfXu2Pfipz1Qufa+PoJRj9g51Ly5XJydmRreOciEZMeI40hhWcSCR8PxWFAW+7+tUEEwFIgLTdHePlS8wjYFSAFhLZQZ27DDSuWwxH0o583LQjhoLq20rvcZBarrRqPsUB60WpJiKeSwJklgnhvV3fuWribcgga6YH6Cazfbs9EIY4/OX5ipraydPnPTb1Vw20/b8VCGn65adLQ4ODO4ZH7J0beuhnROvTB64YRcXklCMEeFczcysff3bjz33/ItnXzr9vvc/+PSX5pWaAsGz2UK7XheAVpaX0xrSSt2GZbuNlbRJGGLMsKSsSoWEwrWmV9Qy3dsOANOEUkwBQmhyajKKwkw2Y2ec0f0HpWba6eK5Zx+drzTMVKVQ6vF5YJo60YgfepoIhIwFFwHSkaZdm7qNvwFvQQIl7OGcz84srK5UAWuPPfYIJeTJI48XCgVEqABqpxw7lcmkM7fediPIYP/uHfVaTcSi1FU4f/7S+Ph2zsNa23/mxQtHvn/8/Lnz1dWFRnVpdGyotP3OqeMXUrXLpZFdY9u3Vcr1heXVciACcdk2bIhjlrZI5GZ0YJQ0ZYBZxu7Z4XQP2/nuIObnnzsaRqHn+S8efz70fEIpYHz7nXfs37vXxFAvL86dP3l5tWml0n6jwpimkJ7WNFAhpQZ3A5oyM10Dbx72wFuDQD88skSparU+eWnWD1Sr5T351Hci379w/uW+vn633bJzBUxZsdidsu17336n75YP33J4amJ6y9joxMTc2NjQ2urKpUvThpV++PFj3z96bGVxoV2vB26r1W5+6Uvf+Mf/6JOXXhxcqC7b1ryRLzpp2guZpcUmBqfthpRqnKSIDjGsxpJIoXycuuHw27fsObhaqX//yBOnXjjearsIge8FQRDGUSRi/sxTT992++EPf+i9Ow7cVK+sBfVKteVRPbVca+YVZE0raAVBJHw3GNwxlMp1bVqgnzw6HOKcT03NLs6XMTZeOHGyUinPTl1UXHWVCkEYZXJ5ajqFYtf4rm0Dvfl8WssN7VqYXxoeHZ6cnN22bfi5Z188eGjfH/yPr27dufvF02cWpqfbrWYURYCURojbaJ17+cLuuz5w5hu/lWNukTLN0NNpR7MK1dWyAKKBiAOXMNbyRavdDmNU6N1RGtlebbQ///nfn52eFlJJKZVCURRqmsa5ZIyBUk8fPRoG7U///Eer+w6dfO6pmdVmLmMGXAUccc6l5waxBEILQ9sJJn/XmIerirdCKqMzdatWq01MXFwttzjQP/rTP1qcmz75/DGmGZrDiGEZqUy60D3Q2/vB991XzOv7b9ihFNd1HQCq1Xo6nb54caq7r/uLf/ZdLZX77//9j0kQNKurMvZBRIZhZDKZkbEtlxeqvcNj+sCtcxUvClq15bmgvsJE07aYzpBipoijWBBmdwmFaMrpGhoMo/CLX/jC+fPnFQDGiFJm21Yul8tms8VSiRCiaVoUREefOT6zsnbwrnu37L2hIelSPUhnC7Zlcs4554Zh6LqR6xmSAPBmGun0VrBAEiAMwvLycqPeqrbV0089Pzl5oV5ZK1+e6e7pCYTIOEVNM7p7+0r5zO233uj77m2Hb5q8NLtrfNtLZ89t3zZ27OkX9h/c8/3nJhFOPX/irJJKRP7U9KWMYzRbrUwmle/q7yqVunt6pFSXJudufueHTvzx8Z1xK1scqq8stNxQEk2jDAhqt4OU7pTX1mKBUCrXOzgwPTN95tRpirBt2qZpBlHk+34URVJKBarZamOMqa4vLc5fmrh04IYbtx+8ZblcW5260PLirJNmjErCGFZcs7VijwK4Jt0XfxPeCgRqlCuTEzNuoCYXyk8//r2Vy1O6Rmw7pXJ5DthJpwq5bidj3nvvnTJy8/kM51a91urp6Z6anB0aHHr2uRfH9+39gz/5ysjWHX/yR1/o6SlNXDjf29N3/uLcTTfum5tfzOXzPb2DxWLRsqwoihaX1oZHus2RW2aXnj5Y4JaTadRcACA6RnGTAri11QhpnJqEamYq667ORVFkaBZItbqyKhGk02kpZRiGs3Ozl5cWnVTq8C23tFr1wPMwxnbK0ayUIBox02AW2/6KrjuazgzLsfM9GEAh/GZxYG8BArVdd3p2dWa+8eSTT83NXlQySjkWYwYzLdNJS6AjI0O2Zb3n/nuWFy/ffOOBCxenxraOTE5O9/X1up6PapV2IL76rcfLdX78y18zdXL+5ZdSKbter9x1550Iq8/+o/c/8cTRQqGQSqUAQNe0mMu5ufmBG+575avfH1mZSRf7e5jTqrQUwl4s6g3fyWURYZHAWTvr5ApSzgS+T4g+PzU1vzRPKN2xbbuu6UKIWr0OGHlhMD07RwkxLCOMov7+gT0HDrjNGkZibnZ+OM1NgtyQ5waH0qV+BKDeNAIIfqoJFIXh2ReP1WrNdpD60he+ELjLqVQKWErTmGVnjHSuf3jI1vQ9e7YXcjYGvnPn9onJ6S1jwxMXp7ZuHX7qqWMHbjr4P/7wy/li76OPHimkc2uryxnH5rHYMrq1Vl97z/33fu+vvtPXld63Z3e93dYMPQojIaVGyfJybcf2oTg7Pjd3qitCjp0iSHl+q+7GcSjKq3yp7CotZWW7dTPd09OLMbZSthmk/NkIomhyZnrP+O44igUXBOG+nt7e7h6TEtMyEGNcqnypNL53/+TZM32jYyavslY9inxncJzpJlzdOxn8nXizuNLXAN/zXzn9nUtnjp068a3AXfGikBqpQldvvtQ7MLr15kOH77nztp/58DuyaW372IjkMSHYNPV6rWXb5ktnLha6+v7r7/+Zx/F3v/e97rzzyoUX02mnUqk98MADURj8yv/xD7/36Hc+8Ymf+8tvPnz7XTcghIQQSimMMSaIMdZuuqXh8cUa9tuR16rLOBBhw7EzkcRN3+cK65aTzhWwZmzfsf3QoUMTlyYq1Wo+l0tpOhUQen4Yh7vHx4vZ3PYtY6vLK729vZZluW5b1/We3gE35Hoq0zO6UzftqNUyC0Pdu24UbyL1vI6fYgvkZNLbto9XK/XKy7P7bxh54cTc/MLiwOj47t27D992Q1d3xmSUUpS2tZXl8sDgwKXJqbGto888c2rHzq3Hv/t0rPDZs69IFbZbDSwj20ilbWvLUF9vbzaXG19cXNw6trVcaXR3l8rLy71dhaW1CkYIQGoaJZh5vqtncm2ccus17mlM9yAKRaA4yjTaAQeGqSaxJqW00rn3ffjDFy5NFopduWLXE488wihJZ7LnL1zYvm3b4VsPt1ut3p6uwZGBQk+fnXIAYK281tPfv7a2du7i9I5COjM8vvVdv4BTOSliQtm1XvgfwE+xBcIYD2690bJThw/dMbpl+H0P3EWptrQ494EPvG1spGQbmBKkJOi6YVlGvd7q6u56/vjJ/uH+P/yTPw9i+vB3vsMozM3MakybX1y++667lIo//QsfO3Xyhbe//Z5jzz1/3333Pn30uXvvu/u5Z14YHhqUUhJCmKYZhmEZWtp0AFGjOEA0XYnYb7eCOIpa5Z6Mke/q9kLV9ENgTIKSCoa3jH7iUx/HRD7x6PeKxeKOnbuiKDZ0I4oi13URxtu3bSvki7l8FwLkeV5vT0+pq8twMqvVav/I6O6H/pk+OE6xpsRVHR714+Cn2AIpUIW+sdX5mSDyt45tzxTyff1b/+RPvzE7NbN3704QRGFQSimFcvnU9MySk0nPXV47cvTU9OxKrXaaUrq4tFAqdmuMvf9998so+NQvfPSJ7z/+wAPvP/rMsbvuvuv06XPj47tn5xZSTm5paTntpAQXGiW6zlIaaVRazWY73zucli3NcyWPQsC1RtP3PCfdU+q1nXxhdGzEchxL16WUY9u3Hlw9YGvm7PxSEPgpJ+WkHdOyRkaGKaX5bBYhFnhhpVLJZrNhGHLO+/t6iIxHbnknM/TQ83TNjmPBNJV40mu9/Ot4sxzHa4JiRB8e21/s7rJ0K2gG9917+J//088+/O1H6/UaQoAAIYQIUUGk/Ah/81tPz8yXjz7zXKNWWVpYSDsZALj7rju7i/l733YLAtFVLPgB7+sfWFheHt4ydGFyasv2sVMvvTK0ZXhhcdGxLJOijKWnTL1Sa7punfHwpnveh4w+YmVRqsCY3pXLpVUZ3LqdKUiA2ZmpdssTSumGMTAwMjg42tc/sHv3eKlU3Llr582HD+07sH/r1q2Dg4O2k0JY+m5bClGr1TzPGxsbwxi/7b63U6bHEcdUwwwHoT8xMcE5h2R8+ZsAP92T6pWUUsna6ozvBqdOPb93/6G+odEXXjj78tmLn/nFj2GClZL1hn/i9MWnjp6Ymb5Uq9UwwvMLs3t276/VKw/93IeOPnn0s//w43/2pa9/8hMPffMbD9//nnc+cuTpW2684dTZi93dhVq9qUAauum2fcdxCAKk1PLyosHU2EBfoejsvfm2l777v175zn93dMZYJAKuwvoqd9I3/lyI2OLayt4bbt6ybRsAwlRbXlyevDCxsrQQRVE6m1EIhUGQcdJKSowRIdhJpyUGzvmuXbva7Xar1dq9e7cQAhOi6zrGGGM6Pz+fyWTGxsZ+4jcteG34KXZhAIAwIkDtdIkZXiaXu3D2pVyp5+ANex595Ptf+OLXPvbzD07Orj79zKlTJ07VVpa5iOvVpd6+keHh4T17dnjtlqmRmw7uWrq8smt868LSaqFYqLZahGocoFFvjo6OzM5cHh0ZrlarpqERBEKqlYW5oZ784dsP9Q0MAEJKwo77Pux69YXHv0AIMTXBzWIXltJfuuRnQalMNuc4mTiOwyCSQmCKFUG5Ut40zNmZueWlZcfUq9WqZVm6aWzbtXNky2ipq4tSqhtG/8AAZUwBUEoJYVJKpcTw8MjszGwURYy9KdT0T7ULgySnqBu2QnTXnoPzC7OzUxeF4h/92Af+5xf//PN/9BePHTlx4vkX3UYFqdhtNZRQbrPxmU99YuLiSw899N5jz73wjne888UTp+647bbnnjt+6+23PvXUswcO7Dt2/MXtO3fMXV4oFYpREIJU+XSqXlltVFfuuP3m9z3w3r7BQZVkcDEwqo/e8bPbHvo12rM9xg6SQkOcLBwT1bmIWGura27bjWNerVSU4IauZdOO22odeezR1aX5nq6Coetpx+nt6dm5a9f4nt2DQ0OZTCaTyfT19VHGAEDTNUIoQkgqqUBSSpUCqd4s971/zS7sr71KgVqv4towrRsjrzt/SCKoP/gfAOqMVEdK/eDtt9EPfYxCSgFCauNvKPkGEuI48kP3/KnnXnju6P0f/Plib9fnP/+1P/3S1+6+/bCO0PziTL1ZN+1UqXsAQN1268GenuLlhcXR0eHVtUpPqVitNojJpMS1ci2Tz5bXqsVCod5sZGxb8BgjqFdXe3p6Dh7c1z+4XtAupdxQsmptZTUUXIlY1pdrU6ej2lxQX+bW0Itr4Y49N+3Ze6DtunOzs416XQixMDU9Pz8PSuZz2XQmo2n64OCQBIUZ2zG+K5PLUkqVUkopKaWUEgAY05JLBWPw/fjIkSMf+9jPvUks0N/PhUmp1imxHg9dr1dfH3AkYeOUAlo/zclTJEJ440e1wRic0EsBWn8ZACAkFU96v1VS+AlYAQfASTeyArzxhkiBEoAIYIRB0/VYeCM7dr/w/LHjT31//62Hb75p24nz42utOnLbPI4tK7Vtz/7Dtx42U+azTx992z2HX3rp7PBdt50688qNB/Yde/H0PW+/+9HvHTl048GLFy729PTEQdtm2NS11UZN1/H47l2HDt3EtFdHGlyxD0KmbceNBjNSqH9HenCnjCOMsfCaI43Gcq09OXWpUCh0dZdyuYwQYqCre0e9Vq/VW+224ziYANUJ1fVcsZQr5DVNE0IAgBRCcC6EYIwJISihhNJarfHII48SghJivRnw97ZAQog4iihFCkBwjjAGpaSUuq4jQEIIjJFUEMcxY0wpxXmMMRFxjDDGhCgl4yhECIkw8n2PUcJ5EHNhmlbMueDCcTJKKc6FbVtCCoFA0y2lhJSSEIoRieMIg4qjUAEQSoNm3XVbumHVq/NzE+cbjcbLp06Pbt1hdPdeWvBvv+udp55/fmFhdceOHd093cOjPYamzUwvL61O3bhnz3PPnbzp5hueO3FquH94YWXVMCmSAFIahi55nEql5i9f7uop7t+/e2R4sGNPf+SarK6uappGCAGEECAhpEIKgVSSu64XxRwpZRiGEEJy0Wq3EYAQwvVc33dzuXy+UDAMExCSUnLOpRBxHCdCxzAMQqimG7Zt/9Zv/YdHHnnkoYc+8tBDH+nq6voJnP/XDXrhxOO+H0jFU1Y2in1CLcu2lZRBEJimGYVhs7mm6ywOhJDScjJxHHMeG4bWbDRiv5Uv9Xl+zBixbbvRrFCsOY7Tqq0FQWinHCmkELEC3m61M8VewNRvNy2d6rruRj4g6tjpZr2KMDbtlOu5lmm5daNcLmsEG6bRaDQ0TbOsVLteBiWVVEIq3U7rBm0165adodRsLE0qjHLFrrbv9fePquiV8R3Dbc9L67qKLqOo9tGPfnhici6TzlIClCJG8chw3+zcJGGa6/lUMwMvIJhGvlfIdrVabcu2dV3zmkGlvLZ797YDN+yzLLNja3/kIhJCTNN0XddxHIwRRohRzLkQAilEbBtbSgkhpBCEUmQgwzITD1WEEkKIEAwAQRACAMI4uUQ5jzjnlGkAWDdMxrTf+Z3/8sU//cLYjtGXzp0/NDefy+UYo9e8sgxV1+Z5FBNGhRC+7zGECKFKSckFJjhWAmNN0zTOOSEEEappGmM6xlRIiYhCiCoFikcKkFJCcI4JJZgoJTGhUghKNQVJ7AshjAAwEIoBlJIEY7QhIwAQAiRBIsBCCJACIJFDSqnEm0EYRRgBpRpCGCEMCHElkJAEE8qYQiCEnJx4aWH24vPPv3DToZudbPHi+cn3PvAgoXq91o54nHxWEESLi+W11cU9e3Y9+dSx7VvH5hcWUrZNMCEEpTPpudmZrlJu9/j46JZB+DHu8sc5P3PmTHd3t67rhmF0niyEkFIk0YYEiXtSSkkhACBJsa1/yQ1gjKMobDYblNJMtpjNZsvlyn/9/H/76le+ks84XOG+oZFPfvLj77zvbaXiT/LOX68NNFfsv/JnAeuSBAFcOTVf/eADDKAABCgCiew1AUACACglJUZkXd4AKKleFUAbYkdJqTBFSErFERAFG68GBOtUI2idQCh5gQLAhAFCBCQgDAgrpQhgxQCBUkqCUhhgZMuOUnf/4MiOb33tqx/+mYfEWHjh3MlDh+7mNi/XQs6FH/jNphsLXqk0q7WmaRjtlqtrxLZsAIUUr6ws7t29Y+eubY6T+jH9e6VS/dKXvvyZT3+aEBKGYcIhIQTGBCHEecw5F0Kux62U4pxLKfFGDa5SihBCCJFSUko5567rKgWM6fV6/ctf/vK3vvXtycnJXC7teq1GU6YyuePHnhsbHnhTEOiHfr5y8NWVW3z0ox7QDf17xfMRvHoPRwTJgO+/ZmcRTkqiCPnr95X5EU9ff5eNqVzrx5Vc6Ch5TfIfAZ0QJZE9OnbH3W/7/mOP3/ve+8+eOVUpV1KZDKrWq/VWq+21266UMt9Vujg5W8wXeRzkcjmDafVGxXEMBbxQzDlO6oeP4W9Go96YmV74/vePfvjBB5IK1IQQSikAlOyhlAqF4AihxJ5hjEEpzrkQQkqZfBeMcRzHruvGXMaxeuGpo3/5jW8dPXrUMFi+kG03W+VKK+U4fqt+7syL9Xfe++Mf4RuHn+5A4o8EY7TV9vceuLWysvryyVODI6PnL7x48Oa7KWP1et3zI6VUUlHKGCMU6bqh66TVqGeyqXPnTtWqlZHRgS1bRn78T3TSTjabfeKJJ2686cDo6GhiVJJtmpRKKYkxppQRgoSQyZ+EEAAKY8S5Ehsp0iAIarVauVxeXFx64siTR44c8dr+4OAg02h5reJ5EUJYqbBaW+npKRYLBd/3TdO8tiHptyCBEEK2lfJ8f2R068VXTgVhT8utT09OmHYWYSWliqJQCGHqRrpo6xQ3G1WCaKu19sIL5wlBw0ND4sdLenccXKlU2j6+48jjT/75V77+8U9+rFjMAgilSBTFCCEpFWMMIVAqiVRghAAj4Fz6Qej7brvdjuP4/PlXTp489ehjj5fX1vwgMjQ7nXGGBwdWVsrt1UAqoIQQArlcttms33vf27LZbLPZuFJyXRO8BQmEMcYYG0qrNsrzs5czhf5cOvvy2eMDw/uVQq7XZpRl0ul8OsU0XC2v6hS//NKp6elJJ+UUCz2ZTJZRekWc8G9DcvLKq0umwUZGhk6eOn1xYuKmG/cPDPRvGdvS1d2l6zqlGqEUIxVGXCmFEMYEhWFUr9XL5fLc5bnHHn30/IUL09PTCCEhQNPsUrFHN1gUxXNzC3HMCWGKx7ZlZLPp5ZWVj3/io3fecTshxPM8zvm1jSj+dCdT/3YsLV3+k//ymxGHw3e+Y3ntEqIDeqokBLdtO5N2mIybrfrk9MTs7BQg1dPVbZqmZVm5XK6vv3//vgNXTkL9kVe5UjIIgvLqylNHHvvmt/+qUOoGINVKY3VlmRBy6JaD27eP7d23r6vU5fvB4uLC0uJCGIZSqkaj6bru4uJipVJdWlo9+swzGCMnZeu61tvb02w1Nc1YmF8MwxCBDsAxUr3dpZD7nu9/5CMPffhnPjgyMoyAIkxLpVJSrH2t8BYmkATAL5049s0v/+dc3+6B4f5qpZ3r3mdbuqnTMPLK5ZUzp0+7Xru7u6uruytlmZqmUUodx8lkMjt2jhuGAT+KOp0VW1yYn750sbyyODs9+VdPPKVY2jIM13V5HEVhmM/lGdXGxsb6BvueeOLxC+cvVtcqhBIhhBBCN3WEQdM027Z5HJumwaNI0w3Xi9rtdrvdVkqFYUgJaBordZVWlhf7ero+/alP3vG2e3KFEmMUIaQApVJOsVi82kt7Bd6CLmwdCsWS7zpwo4F/aWri5MWJi8WuIduQpsna7cbgYM9zx44gIrZt25rL5TKZjK5RXdeFEIQQSpnneaZp/sg3Trbo8/Pzq6srMeeCcxn63fnsYj0CANdtt1tVKWWlsqox/eVzZzBSydY9V8xEYUQZ0xiLeJxKpeI4yuezURQbprW6Wgm5inmslFIKNI0ZFnFsI4zipaX5d9zztod+9sNbtozlSiVMWdJLKRVEcbwpot8QKEhuaQEj++7ywnBi4utx0IUgSqXY+K4DuVx24uJ4tVYt5IspO2UYBqVE0zQpZRRFQop2u10oFH7kO0sp5+fnlpeXQQpD06imE9NMmYbVCpUUXKhqpR1FkWFoTd4ihNimCQqiMLYIU0Iww/BdN1coAsKmoUlBEYBSWDeNOJbZTH7ZXywWs2HoCsWXl1YO3XTzQx95cP++vabtmIaOATAChDFCCKQSPOJxzDTtKi9vB29ZAiXXqFIKlNh9831tTvyWd8utt9qpVHK9Dg0Na5qey2YJIbqmIYyT4A1CSHARhmGSzvuht1VKLS4uVisVjFDMOQJw0plsobhli2h7ryxXG0rGUvEg8FrtFiWUc76qahghjPHKWo0xytpBLpdttlxN1y3TVEqlUqkgCFOGGaB2FPm5vH358pzGtPHx8Y88+KEbDx7M5/NRFFFKk7oOjBAkXw0UAuR5bmaTQG8cEAJQ6PY77kt+TNIFCKGurq4wDE3DSJKgnfw2IUQIkQjkv0YgVS6XK5VKskFTSoGUdirV3dVDAW8LIpienZ2dMQxmmNnAjxu1lpQima7HOaeUggJCSBTFOlPMNHgUplImj2PTYLMzU0EYVir1waH+D33wQ7ffftu+vXvzmXTiMREAwQRhjDDG6zcdW68ICMNQCIkxuiaO7C1OIIQQAEHo1XxWZ5Uty7IsiyTnQ4jk95RSXddbrRYoyeMQwLny3XzPK6+tIJAxj5QSBGMhpeA8ly/EXIwSaqeddNr+3pGjnhfoGuntKxBCOBdhEDLGALCUIptL1+v1vr6+dtsnBF++POsHMSjZVSzefPPNt9160/bt23p7ezVNQxhTQqSUURhSTAjGCmFEmUIYbdQGYIyVUnEcJZL/6uMtTqC/BbquU0opIZ3hHp1i9UTz+r6fu2KQShhGK6urSXMP5wgAMMEYsTAMGCPd3d0EoVartX3btltuu+P8uYunX3plYnJ6dWUFUCwEZ0xXUoVh6LqhlHKaz9uWnc/nD+y7cd+BnePbtw329tu2baVTCKEkubHuT4UAAEIIwRgoxYmpQet55qQuKgiCa0Wgt/A2/u9AHMczMzMEA8JYSRnHcXJiOOdxHAOAbdu9ff2WZSulfN9bW1uNoiiOIs65lCIpz1BSSiniMLRtu1oph1HYbrX7+wcz2RRlWqVam5+fX1xYbbfboCAIA9O0slnHtq1sJlvI57PZrGnqlmlKQEIohJEQnGBMCAGAhElRFAEAwVjTNKTpicm5MqcmpGJMu1ab+evXAhFCKKUAkjHGhUjKSAEgqSgNwzDpsEGISMlrteq6ECFJgh0phZRSCCOQ2CKUEFooFtvtlmmamBBKDUpoX0/f0MBQR1RtGA+cJFCTz0p0DFIKIZmk6JPD6MishEwbpWrruNIdJ1YqCUBc/WW8fgkEAJTSJC8mhVAbBIKNZIjreUzTy+W15EJnGpOCJHVihBCEIowRQgoBMMpEzDFhnMeWbSuJkneL47jzngjh5KFSEiH0KnU2nFHyoVcmYpPfrO8lryh86LiwdTsESAgRx/Emga4qEEK6rntuG6N14bORP5cAkAQVlZIYKS54kl3FGDPDSAo2NE0Lw7BDAgkIE2w6aR5zAuvyRW5svhIqJMomjmOMMaUUNgxM8q8QAmOc1AF30nBJQbRUIBFGjKINPiUVI7BhfqSUYehfExl0XRPItu1atZKcv4Q3HeeSnMgwDBFCUkgeRfV6XTcNpmnpdDoJOZqmKTYKCxFCUiZRbEohsR8o0SvJcxJbAgBJyVgixhNWKaUopR2jkhxA8mPyWAEkT07Yk5TDMsaSJ3d4eU1mJ16nBEo8i2EYmqYl9qcjSxPbkJwVjLHruoyyKIwIwnEQEkRqlWo2n0uexhhL9m6EEM45xgQBYIykkAgjjJDgojNOrBPb1HUdYwIKMMYCKVAgFaANusAVfi15CcUY0/UKNXWFsUSIIIwAOMZJVeY1mF12nRIoOUPJgEvXbXdcRidclFgFAIiiiGCiMUYJ4ZynUykuRNJxkDiRJNjY0bBSSkAYUUwJQQhjIoDHiQuDDQOzUUuJE1JhgpXgSq67s6RfSsp1WhNCAGFMSEdWdwQTIIQAI4wxgqTgml71oQs/7Z2prxeOsx4qTK7+RLsAwLpwZiydTiMEpmXphgEIEuoYhpHUNMKG1GWMUUo1TVvfZgMk7RaapjFNSwxPx4sppaRUgJECAIQIIYRShDEghDFhjCXhlUTVY4wpYwjhDnU67uyKvRgCgLbrwlUfunCdWqAOKGNCSqZpivOkW1Jw3onjdZpEAx5JKRGjHKlYCcZY4rM6RuLKBx3XI6XUNA0IEULIjbdNCKcQ7jTkKqUQJoooKRVVSApQcqPzFRNFqErSMQhJhRBGFGEpuRACE5RIKAUK4/Ud5VWe/HK9E4gxijFOuh8552ojPJNQJDEtyeUehmGinTnnCKFky9Mpie9soyilncRIonYTInIpRLxOIEjMRuKrlFq3ZAgLEEopuVE3TQiBK8T1hg3DSgLGWAgllcAYY4Sl5IQA5yKO46u8F7veCUSpZpqW53kIAUIEQFFKDV1fr5dQCiApiae6ricR6jiO4zjWNC05tcnsxE7moSPGOzHA5LFUkPQrAcFyYy5Awqdkp7a+P1cSQCkEhFC4Iui8LpwVKAQKlNyYIaAUIIxAISEEQniTQFcbCCHLsl3XI4TqOk14cEX4TiacSDiUxAYNw4jjOClGTiyQUiqKIkJIUgESRVEihmBDNSulkszoej8TQmQj5kQpTfRvYockrO/huVQUrccCINHOUgEGpBJPixOnlnyJxGsm8aGrvIDXO4GUUkljAyWEMZb4o45pSdodE9+U8CDxLEkskVKaeC4hhErSY0IkGjZhYfK446SS8g+8nkJZH16SPCfhWaKMMcZSAcUkcXOJGRNSKvkD6riTZIWNex9sEujaQNd1SgnnMSGIUg1thIwhyTCgV1MHCS2SM5dYDh5zBCgOQt/zmKEhQhIHZ9s2oUyphDRKSQUIlJIAgDCRaiPhRajg0boQVut2CgAQqGTfjjHhIpHkRIJQGzHGDu0gGVmCiVKQ6DN1dStcr3cCJZFDXdd9z8UYYUIJ4FcNBgAAusKjwatKWcrIC3zXJYQCgnbbNUEhSgjGURR5nuuks0mkT6r1LrNOqyHAq3ulxD51wkiJqUvkFMYbQ22usFKdw06emTx5Y+sHURQJIRILd3VwvRMIABBC6XTG91ypVBzHSUxFCr4eiMEIbaS71+WwECBVEATNas1tNk3LstNOu1WPQt9K2ZaTwhjHUZzMo0n22AqBUopism6TAJSUCCMl1w3GhtABIRXBZH23pTaM1hUp+g6PE3/a0dfJESbjXTcJdPWQnD/TNMn6oqP1MCAoITkAknL9Wu+Um0khqEI8ijmPEQYpReB7qVRqeWGRURJrzLJThFIlpcLrbgkrJYSSyZgSIRCAAHVliiNJxiEEaKNutUOaznEmYevOLzuFlOvqe0OJX+VA4vUeiU7kgqaxZPpTskla9xmAO2ICIcQ2kBSbYoxty7Ysez1WhFA6k3Y9N46iRNF0dE0nj7HuaDYmnXQcU+LFEjv0Q/92ApKcx0Lwjiq/8uA7TvDKHcBVw/VOoA2gJP0OG6kDTTc1w2BM0zRN1/Ukrrge08N4fbdPMWGU6Vri45xsJhbC8/2OhErMW0e4JD8KwZPNHaEaJkwBJEZDAe6I6ytyFAAAGIGSQvA4me9xZdlJ8iCpokw+8cds7P9J4Xp3YR10zhZZ3/5gqqiUQkmxYUrW50TxOMYSlFIIUGfnTwgRQmayGR5zz/OSeDSlrHOaMcZRFCUJMiEEAEp6dDb8V/L+ijHaMUgb0Wci1fr2SiqlADFKYcOFCSGSENRVNjwdbBJoHZSyMIySXCZGIISCJL2AFI8jIZKBdaCkVEJyKaIwjOMYIyQ5VwBxFAkA0zIZ0wAgjmONx4oxtV4ZAsl+SkqBMU1CQElVGkJkw2YkE6hEkiLr5NeUWo8wAYACrqTEyEhkWUfad7TRVRZAsEmgDjKZbLvttltNDyONaYCJpmlcyjjmcRxLzqWSgnMlFULAGNUpIUHgNVqh60uGPd/HlIi2yGSyVNOSlg/O4422G44xJhjFsVRJlhR1CjxwooATMZMoeKVUYoOSjZiSKrFASild1zjnlDKlVBLJhI2KgGRrdpULWzcJtA6EUH9/f71uBb5HKbXslGGs98YLIaRc34IlGQmMGUIgJXebjcmLE9VyWQpJGFNKua6bNnTYMAZRFCU2QWyE+NazWggTQhKhxHksOEcbnYGJL5NSYpyUA4AChRAIIQEgjjnnnmFaCBDCr/ZmdCbkXeUJwJsEWkfiCPL5AsAPt8RTSgH0v/4SjLV0vjS4RTVrTaViRjUFEEU8CiPLtBIdk6japFo+CVp28vkYAaE0isIw8GB9jjiWG2kTypiUSimSiCNCaBhGABDHMQIECjHGCKOJycEbuj5hsGVZV2HF1hfnqn3SWw9KKUAoiiMrm3ZdF1OqMaZJGUVR0sp+pbBNYs2dLTdjLNk3hWHgeS6lLIk6dtp9krysEEImNSEYU0oTGS6larXaCIFhmcltyztlQFLKSqVCCMnn81dnETYJ9LqAAKIoFiARJQojqjOiYL3dcH1SzHpJWlI9nbRkJOlYSKa2x1zTdLZRc7ieoNgINxPClJRSKiEUQoRSDWPE4zgMXamU4FzaIpvLdVo+ksHk1WpV13Xbtq/CCmzGgV47NgyMWi8zJBgw1gw9aQnqTGDthAR1XU+qiDpxQiklAKKUdVxYJxWaUE0IDhs9ZZ7rKakwIowyghGPQt914yhOTFRivToFr41G4+oswqYFeu1Q63VkFCEUxzGjNFE5iXVJWpIhiUxueJ+k1rHTPdjhVqf1pxNu0jQNAIIgxBhTkpRNcowRoYQRyoXgQjjO+uwOvFHF1glJ+75/ddLymwR6XUgueiUlbIgb2AjxJVX3qVSKUApXdAvBFZamk1TvyCNINDtCiV2RIg6DOOkAwQSarUZRZ1wpM2Xlu4qYsCiKpBRKkY2pD+s9RsmtNhIWvqE02nRhrx0IoSiKOI8BwDCMTqgaNro7krMoN2peKSVy414qAKCUiqLoh3IXSQ+8TDb8UkZRFPi+lDIIAs55q9UKw1AIoQAwwZRS27YJJoltQxuVkwlBW63WVUiNbRLodcHzPB5zTIi6IgqcsIcQYhgGpVQkuS6EOZeEUEwIbNSHrFe7XpFjF1J26kbCKOKcJ21oYRi6ruv7fhRF6+JKKASoU+OWBIGuzGm4rpvo9zd0BTZd2OuC53l8fdYCEhuFYElsJrnzVxRFmk4UIEqoRJILntx6ZV1+X+G2Eu+T3KVQKcXjWElJCLEsKzF1QgjTsgijAAgjwmMhhEso7ZTPdjJoCYeiKLoKtUGbFui1g3Puuh7ncaJk2RWj8tRGG2EilKUQYRhKKTfqYxHaOOWJckr2+cnLO34wwXpN9MboBduyh4YG4zj2PM/z/TAI4ziWP9jYn8SEoijyff+NdmGbFui1I46jOPY5Xy+fQMndDK5o61FKJXOrKKUIYZ4IZ1jX3QnUFaM5AAAjJJLMrRAdowIbah0jbFmpTDZn2fbK6orONGVIpWQyHhQ2Ku07Ix/a7XY6nX5DF2HTAr12cB4LIeM4TmKGUgjVmaehVOJ0Ei8Wx3GiRFRnRpCUV9buKKWSMGPybmrjRj6dnXlitXTdyOVyAJDNZRFCQRi0Wi3P9RLb02nJ6JSwtVqtN7o8aNMCvRYkNiYM1ymSbMXx+j3C1gPNSTAmqfXBmBAhpRJSSoxUZwxDhx9XVNFDMp4xIQEhJCn3iaIIQGUyGcuylFLJXBGkQAjBedwZKIuu6EJUSvm+7/v+G3ovhE0CvXYEQdAJ3BFC1MaWKrElCYcAAAGRQgkhYF3eqh8KUidv0umJTmxGMr2q09CYZGFLpVKy59J1XSllmiYllAveaXTsHFvH8bVarU0CvemwUXfxagW7EAKurFrkvN1uU0oBEFccAISUhBKlFIJ1w7Oek98Y2ZEMHets7xPflyjrIAgAwHGcXDab0CsZBoIRRgjZdsrzvSiKTNO8sqg+eZBs5t84Kf3/A9tn9ZXDBfLBAAAAAElFTkSuQmCC", "text/plain": [ "PILImage mode=RGB size=192x128" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "im = PILImage.create('dog.jpeg')\n", "im.thumbnail((192,192))\n", "im" ] }, { "cell_type": "code", "execution_count": 4, "id": "88484021-bd6a-4f2a-8532-66645234013f", "metadata": {}, "outputs": [], "source": [ "#|export \n", "learn = load_learner('fastaiLesson2Model.pkl')" ] }, { "cell_type": "code", "execution_count": 5, "id": "d89e1c89-bc65-4ced-a20e-946afca27a5c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "('False', tensor(0), tensor([1.0000e+00, 1.7541e-07]))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "learn.predict(im)\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "e5f51899-d223-466c-8b5e-a03f25446357", "metadata": {}, "outputs": [], "source": [ "#|export \n", "categories = ('Dog', 'Cat')\n", "\n", "def classify_image(img):\n", " pred, idx, probs = learn.predict(img)\n", " return dict(zip(categories, map(float,probs)))" ] }, { "cell_type": "code", "execution_count": 7, "id": "b440ce00-8c94-4b06-9bc6-641be9dca600", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "{'Dog': 0.9999998807907104, 'Cat': 1.7540861563247745e-07}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classify_image(im)\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "a928b024-6168-406c-9b49-cf1adf7731f2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'4.8.0'" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gr.__version__" ] }, { "cell_type": "code", "execution_count": 9, "id": "154f3a5b-dffd-41f2-bbe1-6780019096a0", "metadata": {}, "outputs": [], "source": [ "m = learn.model" ] }, { "cell_type": "code", "execution_count": 10, "id": "2fa5ce04-03fb-4b8a-9809-b7301fea3293", "metadata": {}, "outputs": [], "source": [ "ps = list(m.parameters())" ] }, { "cell_type": "code", "execution_count": 11, "id": "9ccb55e5-3879-436c-a460-a21486732a58", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Parameter containing:\n", "tensor([ 2.3503e-01, 2.6575e-01, -5.1096e-08, 5.1835e-01, 3.4404e-09,\n", " 2.2202e-01, 4.2180e-01, 1.3153e-07, 2.5122e-01, 1.5152e-06,\n", " 3.1693e-01, 2.4972e-01, 3.7890e-01, 1.0862e-05, 2.7582e-01,\n", " 2.3680e-01, 2.4202e-01, 3.9639e-01, 4.6966e-01, 2.9144e-01,\n", " 2.7273e-01, 2.7782e-01, 2.9135e-01, 2.0612e-01, 2.5977e-01,\n", " 2.7694e-01, 2.9233e-01, 3.1630e-01, 3.8898e-01, 3.0294e-01,\n", " 2.6834e-01, 2.1275e-01, 2.8550e-01, 3.3230e-01, 4.2793e-01,\n", " 3.7229e-01, 7.4804e-08, 1.8957e-01, 1.4740e-08, 2.2422e-01,\n", " 1.7912e-01, 2.4799e-01, 2.7448e-01, 2.5954e-01, 2.9289e-01,\n", " 2.9978e-01, 2.2346e-01, 2.6365e-01, 2.2001e-08, 2.6504e-01,\n", " 2.2149e-01, 2.8356e-01, 3.3081e-01, 2.2670e-01, 3.6718e-01,\n", " 2.1210e-01, 2.3893e-01, 2.4931e-01, 5.2538e-01, 2.4872e-01,\n", " 2.9575e-01, 2.5749e-01, 4.8294e-01, 2.6599e-01],\n", " requires_grad=True)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps[1]" ] }, { "cell_type": "code", "execution_count": 12, "id": "a805378b-6cc0-4b1e-aa58-a7d39bb2148f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", "To create a public link, set `share=True` in `launch()`.\n" ] }, { "data": { "text/plain": [] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#|export\n", "image = gr.Image(height=192, width=192)\n", "label = gr.Label()\n", "examples = ['dog.jpeg', 'cat.jpeg']\n", "\n", "intf = gr.Interface(fn=classify_image, inputs=image, outputs=label, examples=examples)\n", "intf.launch(inline=False)" ] }, { "cell_type": "code", "execution_count": 13, "id": "3f92b957-7938-4dcb-b68e-f597209fb9a8", "metadata": {}, "outputs": [], "source": [ "from nbdev import nbdev_export" ] }, { "cell_type": "code", "execution_count": 27, "id": "14d0f8cf-c2aa-4ab6-bc55-2594b240efdf", "metadata": {}, "outputs": [ { "ename": "InterpolationMissingOptionError", "evalue": "Bad value substitution: option 'lib_name' in section 'DEFAULT' contains an interpolation key 'repo' which is not a valid option name. Raw value: '%(repo)s'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mInterpolationMissingOptionError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[27], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnbdev\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m nbdev_export\n\u001b[0;32m----> 3\u001b[0m \u001b[43mnbdev_export\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mapp.ipynb\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/mambaforge/lib/python3.10/site-packages/fastcore/script.py:110\u001b[0m, in \u001b[0;36mcall_parse.._f\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 108\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_f\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 109\u001b[0m mod \u001b[38;5;241m=\u001b[39m inspect\u001b[38;5;241m.\u001b[39mgetmodule(inspect\u001b[38;5;241m.\u001b[39mcurrentframe()\u001b[38;5;241m.\u001b[39mf_back)\n\u001b[0;32m--> 110\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m mod: \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 111\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m SCRIPT_INFO\u001b[38;5;241m.\u001b[39mfunc \u001b[38;5;129;01mand\u001b[39;00m mod\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;241m==\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__main__\u001b[39m\u001b[38;5;124m\"\u001b[39m: SCRIPT_INFO\u001b[38;5;241m.\u001b[39mfunc \u001b[38;5;241m=\u001b[39m func\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\n\u001b[1;32m 112\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(sys\u001b[38;5;241m.\u001b[39margv)\u001b[38;5;241m>\u001b[39m\u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m sys\u001b[38;5;241m.\u001b[39margv[\u001b[38;5;241m1\u001b[39m]\u001b[38;5;241m==\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m: sys\u001b[38;5;241m.\u001b[39margv\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;241m1\u001b[39m)\n", "File \u001b[0;32m~/mambaforge/lib/python3.10/site-packages/nbdev/doclinks.py:140\u001b[0m, in \u001b[0;36mnbdev_export\u001b[0;34m(path, **kwargs)\u001b[0m\n\u001b[1;32m 138\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m f \u001b[38;5;129;01min\u001b[39;00m files: nb_export(f)\n\u001b[1;32m 139\u001b[0m add_init(get_config()\u001b[38;5;241m.\u001b[39mlib_path)\n\u001b[0;32m--> 140\u001b[0m \u001b[43m_build_modidx\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/mambaforge/lib/python3.10/site-packages/nbdev/doclinks.py:98\u001b[0m, in \u001b[0;36m_build_modidx\u001b[0;34m(dest, nbs_path, skip_exists)\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m idxfile\u001b[38;5;241m.\u001b[39mexists(): res \u001b[38;5;241m=\u001b[39m exec_local(idxfile\u001b[38;5;241m.\u001b[39mread_text(), \u001b[38;5;124m'\u001b[39m\u001b[38;5;124md\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 97\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m: res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(syms\u001b[38;5;241m=\u001b[39m{}, settings\u001b[38;5;241m=\u001b[39m{}) \n\u001b[0;32m---> 98\u001b[0m res[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msettings\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m {k:v \u001b[38;5;28;01mfor\u001b[39;00m k,v \u001b[38;5;129;01min\u001b[39;00m get_config()\u001b[38;5;241m.\u001b[39md\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdoc_host\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdoc_baseurl\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlib_path\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgit_url\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbranch\u001b[39m\u001b[38;5;124m'\u001b[39m)}\n\u001b[1;32m 100\u001b[0m code_root \u001b[38;5;241m=\u001b[39m dest\u001b[38;5;241m.\u001b[39mparent\u001b[38;5;241m.\u001b[39mresolve()\n\u001b[1;32m 101\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m file \u001b[38;5;129;01min\u001b[39;00m globtastic(dest, file_glob\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m*.py\u001b[39m\u001b[38;5;124m\"\u001b[39m, skip_file_re\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m^_\u001b[39m\u001b[38;5;124m'\u001b[39m, skip_folder_re\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124m.ipynb_checkpoints\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n", "File \u001b[0;32m~/mambaforge/lib/python3.10/site-packages/nbdev/doclinks.py:98\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m idxfile\u001b[38;5;241m.\u001b[39mexists(): res \u001b[38;5;241m=\u001b[39m exec_local(idxfile\u001b[38;5;241m.\u001b[39mread_text(), \u001b[38;5;124m'\u001b[39m\u001b[38;5;124md\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 97\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m: res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(syms\u001b[38;5;241m=\u001b[39m{}, settings\u001b[38;5;241m=\u001b[39m{}) \n\u001b[0;32m---> 98\u001b[0m res[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msettings\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m {k:v \u001b[38;5;28;01mfor\u001b[39;00m k,v \u001b[38;5;129;01min\u001b[39;00m get_config()\u001b[38;5;241m.\u001b[39md\u001b[38;5;241m.\u001b[39mitems()\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdoc_host\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdoc_baseurl\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlib_path\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgit_url\u001b[39m\u001b[38;5;124m'\u001b[39m,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbranch\u001b[39m\u001b[38;5;124m'\u001b[39m)}\n\u001b[1;32m 100\u001b[0m code_root \u001b[38;5;241m=\u001b[39m dest\u001b[38;5;241m.\u001b[39mparent\u001b[38;5;241m.\u001b[39mresolve()\n\u001b[1;32m 101\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m file \u001b[38;5;129;01min\u001b[39;00m globtastic(dest, file_glob\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m*.py\u001b[39m\u001b[38;5;124m\"\u001b[39m, skip_file_re\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m^_\u001b[39m\u001b[38;5;124m'\u001b[39m, skip_folder_re\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124m.ipynb_checkpoints\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n", "File \u001b[0;32m~/mambaforge/lib/python3.10/_collections_abc.py:911\u001b[0m, in \u001b[0;36mItemsView.__iter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 909\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__iter__\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 910\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mapping:\n\u001b[0;32m--> 911\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m (key, \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_mapping\u001b[49m\u001b[43m[\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m]\u001b[49m)\n", "File \u001b[0;32m~/mambaforge/lib/python3.10/configparser.py:1260\u001b[0m, in \u001b[0;36mSectionProxy.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1258\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parser\u001b[38;5;241m.\u001b[39mhas_option(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_name, key):\n\u001b[1;32m 1259\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key)\n\u001b[0;32m-> 1260\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_parser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/mambaforge/lib/python3.10/configparser.py:801\u001b[0m, in \u001b[0;36mRawConfigParser.get\u001b[0;34m(self, section, option, raw, vars, fallback)\u001b[0m\n\u001b[1;32m 799\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m value\n\u001b[1;32m 800\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 801\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_interpolation\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbefore_get\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moption\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 802\u001b[0m \u001b[43m \u001b[49m\u001b[43md\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/mambaforge/lib/python3.10/configparser.py:396\u001b[0m, in \u001b[0;36mBasicInterpolation.before_get\u001b[0;34m(self, parser, section, option, value, defaults)\u001b[0m\n\u001b[1;32m 394\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mbefore_get\u001b[39m(\u001b[38;5;28mself\u001b[39m, parser, section, option, value, defaults):\n\u001b[1;32m 395\u001b[0m L \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m--> 396\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_interpolate_some\u001b[49m\u001b[43m(\u001b[49m\u001b[43mparser\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moption\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mL\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdefaults\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 397\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(L)\n", "File \u001b[0;32m~/mambaforge/lib/python3.10/configparser.py:435\u001b[0m, in \u001b[0;36mBasicInterpolation._interpolate_some\u001b[0;34m(self, parser, option, accum, rest, section, map, depth)\u001b[0m\n\u001b[1;32m 433\u001b[0m v \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mmap\u001b[39m[var]\n\u001b[1;32m 434\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n\u001b[0;32m--> 435\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m InterpolationMissingOptionError(\n\u001b[1;32m 436\u001b[0m option, section, rawval, var) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 437\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m v:\n\u001b[1;32m 438\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_interpolate_some(parser, option, accum, v,\n\u001b[1;32m 439\u001b[0m section, \u001b[38;5;28mmap\u001b[39m, depth \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n", "\u001b[0;31mInterpolationMissingOptionError\u001b[0m: Bad value substitution: option 'lib_name' in section 'DEFAULT' contains an interpolation key 'repo' which is not a valid option name. Raw value: '%(repo)s'" ] } ], "source": [ "from nbdev import nbdev_export\n", "\n", "nbdev_export('app.ipynb')" ] }, { "cell_type": "code", "execution_count": null, "id": "20d39636-5ba3-46b0-b639-7eca63b4261e", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }