JackV commited on
Commit
a2860cd
1 Parent(s): 56732b8

let's deploy to huggingface spaces

Browse files
Files changed (9) hide show
  1. .gitattributes +1 -0
  2. Cat.jpg +0 -0
  3. Dog.jpg +0 -0
  4. DogCat.jpg +0 -0
  5. app.ipynb +633 -0
  6. app.py +28 -0
  7. model.pkl +3 -0
  8. requirements +2 -0
  9. saving-a-basic-fastai-model.ipynb +308 -0
.gitattributes CHANGED
@@ -25,3 +25,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
25
  *.zip filter=lfs diff=lfs merge=lfs -text
26
  *.zstandard filter=lfs diff=lfs merge=lfs -text
27
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
25
  *.zip filter=lfs diff=lfs merge=lfs -text
26
  *.zstandard filter=lfs diff=lfs merge=lfs -text
27
  *tfevents* filter=lfs diff=lfs merge=lfs -text
28
+ *.pkl filter=lfs diff=lfs merge=lfs -text
Cat.jpg ADDED
Dog.jpg ADDED
DogCat.jpg ADDED
app.ipynb ADDED
@@ -0,0 +1,633 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "id": "9bde898e",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "#|default_exp app"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "code",
15
+ "execution_count": 2,
16
+ "id": "87c050db",
17
+ "metadata": {},
18
+ "outputs": [],
19
+ "source": [
20
+ "#|export\n",
21
+ "from fastai.vision.all import *\n",
22
+ "import gradio as gr\n",
23
+ "import skimage\n",
24
+ "\n",
25
+ "def is_cat(x): return x[0].isupper()"
26
+ ]
27
+ },
28
+ {
29
+ "cell_type": "code",
30
+ "execution_count": 3,
31
+ "id": "02e134f8",
32
+ "metadata": {},
33
+ "outputs": [
34
+ {
35
+ "data": {
36
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMAAAABsCAIAAACzYCrFAACRSklEQVR4nJT9SYys25Yehq21dvd30WVGNqe9/WuK9YqtiqTMThJkUDbgkWAPDMMDDTzTyAY8MOCBB57YhgUbHhrQ0DA8IGA1oEwaolmkSxJZZLmq3qv37rnN6bLPaP9md2t58EfmPfe+J5b0I0+eyMiIyIi9v73ab62F/9t/72/Tw4WI1lpjjLXWOae11saQIqWU1loppZRCxMfHK6Uenzjej4gAIIcL/JBSSiGEGGNK6eF+YWYRAaPogyullHPOOaeUmDknzlkyx5RCzoEIFQlzFMk5Z1IoikPbcx8Mi0OyRFVZOmuVJkW6wgK1EuuwKsAVQkSoFRlLWqMe/Jo5Eiki0loDgLU25ywiKaUUEglGzqAVGa20yjmnwacQlSCAeO5ySN4PKfoUA+dUlqXVOgTfd13SMi6dNoa08iEICCKiVoCgMqDA4+qJCACMS0dEiIRIACgCwgRASpmuHe7vV36I+33HWY0rPK7V48qPr2CqQmltrdXWaKOLqrLWWueKqjTGWF1oskorY8zj3j1uHwAw8+Pt8WU/3JEY43g75zz+yMz6By/0g9tI+IM/84N3/OvXuCLjmyBSSolSKueslBpxMz5ARAQOb3r8kR+ux9vjgxGRkEByTizAIoKAnDPHhFkMkQUsjWmKKsaAgGXZGK0LqsgaKhxaK1YXVYNIkBFZkLEoZilH7z0RjdAxxozvX2sdIRhlRCEoYgQkQsSodLZJCQCIziQuF87GGJizRrTOKETvB2tMxwORUlprY5AIAFgECABREBQAwffO26+vIQACjN/GBxwApxRxPqBnXJkPd2R8tXExAUAEmDkzM/O4/jkzQkbGR+SNSz0+/cPnPt7+cF8+3JTH21pr/SEgHvH0IbA+vOcHH/hD8TP+1cePASBKqfG7UurD93RADB0emXMekcQPn/bwXRhACIAUcWaWTAhASICcc05sSBtjjKBm4JQnVQ2IOaTCluX8SDunSytKsUjT1JAlhZhDYM7FpIzZjpgeV+Dx8woIZCBA1BoVJWAaP3hmAlSCAMzEorJSyhgjwk4rpRQIK6U0KS0FERIpVIREKWcWZhAWZhGtiQBE4PF4fLicH6zeiB4BEURUpIxBY2xOeZQEj3Lr+6f3ET0iIpn5IENyzjkTZJTvdnB82Pgi4zv5cPsehRz/2vXhnVpr/Qid8ft4PUBefXjPiJIfAOsHAHpEDwBpTSOARjXxKG8Ogorg8Q09fuxH9GTOIkwghEBIDCSoFYEiVAo1lk6RJqUZIOY8hK7tcpKmqVFR13uvu7m2C9eUtSPCvuskRY6BfZAYey2o1PjmmTmlZIw5fEBEY3QKyQ8DHlQYPh5DlHHdYRQKpJEl5xyZmRCIVFFU1jxsA6IAMEiGcTNSZtaoEOBxGz48kI/nc5QCSMg8bieSUgbJGO0HHtXH48Z9eP750XwQERDOORP9EEAIH27WQcZ/oMgewfQDuHx3sMcNyllE9KNcGQH04Yf5ni77vrD5dan74dEREQAEQKXUiPERjsw8an0iYmZEeJSi41J+X5clEIbDO0GFREppIquINGrEAskojVG87xlw0kyRiIWsKerKtsYmpROI9zGnIClSTpAScQaU+9VaF66uawAYhiHnbK1lZmMMIlhrCajb70ByUxVFUaQYRBsSUIIizGxIRECjCHPebz0RGK0K57TSrAVGXQsiAIKYJaeUIhKkpJUioJTT4dffk+gE8J0BIAKIIABEqBQJglZqFNjjAv36jsDDORzF1+NOP8CfBWU8pePJ+YHm+lAUPYqxH2ixHxgY30mg8bVGY3m8zczq4UU/VD3fSdjv/73H6/C2BFLiR4A/IvrRCssP8nb87XcWDxEA5JzgQdchgyIotHNGaULhnEPYdV1VlItmpkvqpGcW4wo0WtminE6L6aIqC2dN9iEMg1OKEAFRSAFCM3E+pRBCURTW2r7vU0pVVSml2q6blDUnLpxDrUipnLOxDjKEvi+K0hijUoCcY4yKqGt3dd30XWtNMR4UIiAiEAgphRTLqkjMCEEbN1GKc04pY1JE+kGFATPnlJkZAfCwGMAsiBoAUsoikrNYV1QVtm07nsxH8+Vx+43RpNQIjhjTeCvnHGMEADQKAFm+d1YfjzcijgfpYf3zaCb/QGeN0Hl8un4UPI9y6FHwAAB+cDzgv+2FgB8crxEoo/gZVfj3Hvt9NYxI1mgQVEhakSHAHJEzshAQgjhny7ru9t3NzY0i3e4HQaKQTFWezI9my9NUutI5zJz6YZQcCISkGUmEjDH88Km11o8WNDyo0RgjIiqttNakVIrJe59yHgZfFIVEAAEihQg5CwMjKSLFLMFHZQg1klJGaQDIKRORM1YAR89BEYACBBTmx/1WxDkzIIs8LI4gIjF/Z9aMLs3jcjHzo3H53aIDMAAwAwiyekQAEWXKhIyA/IG39bj+4zX+6vGcPxoVv36NptjBiMYPFPCj9fOhmwAfWF6/UW39ZggRQv4NXsbDoZHvPfh7GAJShIAKUaEQACEqRGQYhrbftSK5dMVivjg/O7+/W/uQQxZVFF3m6+1Wz2YWQ/Rtpa3VqLQJ3uO4CwiCREiuKPBwag08Wp05E+K4dqCQkIw2LJw5D8OQUiqUyVm01tvdHhGNVkVZ7DdbVzgiYs4xJYHRgtRaaSJqh14bY50TgBBCTpm0cs7FmLquA0CtzaNczxxzDiLILIwogvzBYZMPTRz53uqNFzMLCIkwEAhyzhkx56wOKMqE37O+H3dzxM0o2MaPn1IavfffaP0w86j6vwegRznxnVj7NWsHvi9U/tX4+Y24GYWQiKBk+f6jP4Qp5wzCqEgjaQIEwpwlJyVQOksExhWD9/erFWqtnM2DjwjHZ08WpyfGWZEWQQ9tLz4pxhwzAKIyogiQHJFzdkTMqLVTSvBBTAERldKICCA+hPFAgdZlWYYQlLV9PxijCbEsi9APhSuEM6FyRhEBgSZUo04GIWGQLETKaetcGWLo+56Zq6oWAeaMqA52BCMijwASQs6Q4gOA8NcQ9GsYYs4IJCIEAqOkRzxY0IQJvwPQr+/WuCmP0uURPY/QGSN5jwAaH/A9FTbKgO/ZyIAf7i78txE/H6Lh4cfvP/3XjtAjhkTEOacJEUCDKGBhBgZOqd1u13d3IQVduDB4q91yeVo2s9nRMRVl5Lze7yd6Nq1UHoIC1MZIYGUUkkGjRRvUBrEfPXBm1lqPm5FSEmEAQSJrjShikJhSSgm1dkXhaoOZY/QhZyJV15MUfAypqmprTbvfFdYWRZFyICIESDmHGDVRZg4hWOcKV/gcEdE5yywCklJkFiIBVAoBiUjUuFaC+J2QlgcIfT9O82sAYgRBUiACwsiMH6gwRTxKmtGIHr/D9yXCo536GPj9r3Pmxydq82uW/MGHJ1JEohAIkXAMggECIMjD1/dCFr8BT8g8qio16vN8cD1EZDQUWSSPmkxQCIGFBRISGKMsiVFYFYVG5BDKSY0pra5vFeDR/MgZl7NsqPOJL2/3uInVNLz4+KOzo+PB97DfmmwpSYwxA2hjBUUokwZtSVtlcgEJlTKVK0KKIOhcCRBSZgU5c0RiZ21IiZJgSByzpFgfT7ardWm1D74pzaxxm3VfOjf6PkXhiCgLK6MEJOfMkJFEBJAZQDjFTMiCVTXlkNvtrt3vfddqhaRlejwV7sk4tk3OOcScIIuIGMUGAXUefN/7xKysScMgIDw6ciwIY7gAhIiFlKAIIAOnjCKMKCQMmZESooBCEmRRGpEESQAZADMzx6xIsXDOKXMa7eUDerKknBBJAGKK3nsgIQStiPDx6AOMhs9jRJ0RBRHw+2B5PAEfuE6/UQL94IT8QPDK4+8RQIAUoYzRI2WMKS1VzqYQDVLhJtkPbd+nmIqi2G+3by9vrK4Wy5Namy4zKFM2NaFyRhsqAFgCG6VtaRPnkFPOrC0QKZAcfcdZla5EwRADM5BWShmtURtAVMG3kr3WJiXmlJGZlBYAFEFCVKgVERphds5pbcZjbawb1yHLIDnL6JATalIpJc4ZckaQoqhj5hjSZrOzqArtCLPVMGw32kjf9WAm1tnSFYIYM2eByBmTEoUhJR/6R4kiIiyCIoICPEKJREBkjCQJCYAwcJYxBJ0zq0QEIiSCIhmERm9KUIRRgEUJiDDnMRYn421mZknMhCLCmTlzUpoQUT8K8A+tk/FikV/XMj9EiPwQFt8TQXCQL7/xawxEHxwMBE5JQAhRa+WcMyQc88nxEnLerzbCcn9//+bV15KDJg2CIcdvXn87MDSL45MnT46Xx0dH86IsOSs/9Pu+s9YaMKMnabQuXeEKl1LuujazKGCldc48rrowCmSrbVE6r1KMgEhaoR8iAFprE6EIGGNCiEpbhehTLupJjCExK6VGu5kUyRAEDxEvYCBSWgMTIZKw7Nu9dZWrypPz85v3l8F7ktR3cbu5KZwGbQNuibCo6sls5sqqKavCupjzarNpeTfmC1mExkijMAIgAxAoIRYRTohqDHiyIAqNMSkBEMnMmTOIIs7AGRMeTF4RBkAQGsNcOcUU04dRn0cPPjMLZKUPOUSttf7Q0X+0hA6iReC7L3j4ergHvm/V/aux9hvghUjjyyAAQEwZQJRRTpvCmeV0Wmh9c3kV/DCt6vV2o0l99PFH/X6XY9JkY8a02bVt3/X9br8vt1trtdZYFkYr1E2ZUvIpWGPqosg5G0SMWbyX3ovi/a4visKVlfchsAcovPfChXWEwEYRMxutAqK1doyOCKA2bvCJdKG0it6TrThDENGimCkxKkAipQAB8njKmQVgjKxwn0PSBiSL4H4Yuhiqonz/+hv2neRhIJkdHaPKpDUmTr0nIVNWTVMJYOgGZLGFG80yeYjEAALygxzHDATCIICACEBAPGbFgFlyZowMzAkJJCcYbd7DF4z2PolITjGn+KEKExGWgwuGhJrIKI2IegwkPHofv3Gj/5ug4TcrMnyUN/zw9d2PClgeQqcAUhijFFprJpNmNp1axHazLZ07ns2cNk+Wy9ury9dffxP6zvth3w4+0pt3F6vdsDg9ahbzyXTSTBrrNJH0fqjqWhstmYEhBi8s3eCTD2HwMQYq0RWOmaI/xIyHHNqu84MlyCBgjQURa3S09pCKQWJA0kpoACIkpY0VAG1drc3jB2YZQzyPhiUgYt/3bbtHxLKsEubtet2UTcj57cVVv9kumqrfD05jVdjdaj8IhxBsUR2fLqfzoxhy8qGs6+PZIj/hlO9EJKbIMWVmVEpE8rjOchCkh+QtgYAAKBkjhyIiGQRBQCSJgDAwjuBWI8SFEZFAhDlyjiwHFSY8JvI4pcjMCgwZpTWBoIYHI/zgWj8E00bQESKCZhZUD04U0QEEIqiIFD0+/tGkf8RPToGFWTKAAAoSxODH8BcpFX3MKSlF1hWZkwg7Z46Pj8qysM6ur2+M4PHiaLte+7a9uby4fP9+v9kYRW3btl3oPNXTqbgi5jydLQCBOYsoEFAKunYvwpwysCBLt9ujAB3sw2wYtRbfJw9YlJXWJuWY4gCc7+9CUzUaMKakytIYVZZ1zAyCOWUWVtoiqsxSlBUzF0UJH2TxRARBcRJmyPmQ5mOWoqhSSjFE0ubkaImoUpTFcrnb7u62u369qwzJYGdH8+W0KcoiM6x3Wz/E47OzoiwJ0Fl7crxcdxxiaJi7tpWUBSAL8xgP0YTCyPh4bjU6jagQUBgkI9BBLjJylgwMophwTOISEqLiIMz8EAnKj17YAZsiikgRKoKcUl03+jtt8v20yCiT4ANQIKL6MH5Ah4P2+PgPUYhjZhgEEcaQpAghQgiISNYaEYFEGnXKOQVvjLJFYYxSAFar/Wbt9+35sxdfffmq3e0QYLO6l5yPjo6CH0LwU9vQAOvtNuT87OVH2toYY4xBWGfIRACZh6Fv963v+hSTApDMwGKNscZyjkMHCESKFClFGpgtEXOK0SdtA1JKmRD58UggIQEB2IKs1uO9VV0xMymVUxotT84ZgYx2hBokcPZVVbXtPqWMIM45W9ZGW1fWzlXOVU0z26/ud1VjcioISdFuv1NaTabzatIYV6LRVVkaa2NKiHh0shSA66srFu67jlDxaH4A0YNzjGMQQFARKkKCMarICJkACbIIcGYERmBkGJMGCjWROSSyx//GwA8fAAQESimlUStEEEJoqkr/IKgjD1HzA3KYQQSUgpQQER+S6ocHZ+Bfiww93iBC58yjMBMRpYg5i4hSKsaoAJEUsqCi2XSSc8opTaqq37c3V9cfnT29eX9Z2eKzn31MSkmMr7/9+vbmJvgBEF1RtClFluXJ6UeffDxfLI6OZ4VFbcgqJKMSe2U447Dr+vVqXZWFc0VVls45RSpyTEPIOSMpRZZQMYvRpm1bY130g+RESvsBMhDQnrQhbUkZ0haBJQ2KNAvnGAAx5cSZZcz+iqAia8yYJEHElA5HeaR/5C7kwJIwArLAdHFEgNvVarXd6Zyn08KWtGv3u74v6/rJs6ktiiRsFVWuQpvmhSqr0scwZhJQAEHyBx4uERChIiKFROMXjK71SFRDERIhFBQGFgEcVQuDPBg5D+n3lABgJLYBiihAAkKFKERYlWX9IYAexMb33PIUEyJKPqTcUAC1ZhYgARJhBuYP8x6PT3xQi6M/OfJUYJQ9iMjM3mdnzdAPBGKN6fY7ADheHg1d9+7dm5OTU01Kkz47OUWBq3fvve/fvXt7e3sb/XB1eSmqWA1UN/X86Ljt+qfPn81mM6PFUSZImBPEDAKVNdOqgpz2+z0SuMKQKa2zuR1yjIMPgGhtQOiMscYVkkCUiGQffNk0KSEDDkOvLBTaaW3G4J7KATimEHLOKWXvhzGhZrRRlnKUGBMRicDo5ANgjLHv+74fal0obfoEHrBLfLdab+7vxRS6qtO+u7i5rRv97PnzxBI5MwloZQsHipjQOOdIGa2fP3/ed53WeuiHKMAcRsuHICOQIqW0MlorxDELRIh08H0YHuIyApIZxojuQWPw9xL4OWc40OkQxmwSIREoQkSpSjdG6T4UIDjaTaNWHDO3CCgkoEBYCImRkR7FFbB8x2f7gRDCQ0Z9lEAgIiO/ERByyiEGSVw4U5alUjQMfVHYpq6++uoVAi6XR3nvnbVd2/7yl386n83u7m43682Y5tRagbG5DdrYxHx0vDSuUFqXpXJKQr/zfjAxsffiY2mMms5ms9koLrMIE2plJDMnERBk8L032gmDQp0928rElBSRAIBAjFkUM0sWCTEk3zcQfIhd14pA13UiYoxxzlnrjDE5cwghpaS1doVzzhljQgjMHGIoIoFiEEWusM5N5rhv22Ho2xBm06aZ2Zz2693GFlVjqhCTSuloOu2HYd+2tqiGISmlmmZy/uTJ7dV1CpE15UySmVlgDBcgaKW0Vg8SiEaCAIGgMArhIVI0RoDGPSMWSemDnFfKfOB7kCKFNCJJCB8YkiNQR7UJNP6HACgsAjAiadRoBMTIiIhACISCLEIsQAhw4BKMEaPHyBEisEjITHggpgBni5qDF2aJIWy3RGpyeiogXdciobGubTtny1kzSX24fPduOV/c3d1//PLZ9eVFt1tzSpK5KOuUcdOm07OXp6dHT1+c/+SnnxHlyuXGaRJGUtpVqXQIOvR+iFkbvTw+Iq1QqZiTj5FpzEBlQBAMpAxijqEHEmFAIltYAEHC5GNGscA5hzTkzBL9ECH2XUcAV1eXTVNZowECxJS4zwNkAh8iZ87JxKCUtgDiqlIUkdYwRABlSyPGEGJWJCnd3txu71Zvuu7JsjmeGj+Eupohy/XF1dkzGvreFEZUCYhOcz/slTKz+Wy73cGulZSyCADrMWtAiARIgCSkCBUgAeDIEsGHdMghRjOG6g5bxyyZhUXygccEQiAKRYEQCkE+sE0IgIQ1gSHQGUQQeDSKkERYAD+IGx0ApA7cAn2AICORECpFj0FqAQZBYABBBKEMEBVarRQixZjDEIaBJK9vb5CZ2+305Els2yElVhhTJFLC7EwxLSf79W4Yhuvbq9Lp7f2N5FA5naOVxJs2AJWTWQF62ne+KoxVoZ4YpZIwdG2QpMriiCw5BHu02K5XKfYJoSpcTHkyn/nbe2UMEBini8oZB9oikw+BBZTWJqboShc5l7ZQmYkohI6BESkxQ8w+Zo6cYiBmp9AS5ByJMwpkyYG473sFypUNsnLaoi4G5gC8aVsMqSpKwgzZxxB5CE4g9V4b2xvW5ST4NsZY265QZjGf1cY1dakLt/NdYl40lmOXIJVlcXJ+ngV3240Isx8UgVKoFJFCJAEUVCPzAMYfAXEMCR2YZ9/jAB4O/wFOjIiaCBAVghqtc2ImRMxCxERoNTmN+sNQ4+PtR8v3MWfGwESUUhptnTEKSTCSePHBkQMAUAfeFpCACBgADQCERhtEunp73e33TVlNqwkz79tWOae0EZGyKq8vrp4+eRJiuL27vby8mjRlrqtpWTDz6n41+sN3d7d3q+3R8umPfnI+P5o0TYGafAIUl2yFjQNwURmdV1rTbDk99svb25vNZn3TtvOjIynLgcCaWpXAcTB1SYYYhMggxgMNQSttHAsn5iyQQvQpmcTWFYMPlrDv9ojQd/vZrBHOwzBwjkSCwAzSA/veGzSs2Vo3dL1Pe7KuLEoAAJfHEFzKaeR5HS+PlifLV6++1kr3XRfD1hgzDMMwDElYOTvZ7s4X83LarNbr2Pqqqu83O1eVZ6en15dXKKCJxGhNSOpAX0R8DMKN2mGMzhyifQeL4oEA+SAAHlwoEB6FwZhjQhltph+Yy+Na6YdABX/IHpIH3v+HocVH43okMR7oBw8sahqV7cNfGkHl0CoCZE6Zc0i79QqzHE3mVqtJM7m5u0dEAAkhNE3DzGVdGaO3t/eb9abrurOT4/PzJ3no292eM9/frbo+IpIik7Pfb69Pz+rzkyPfe8VFPa9VcWTLI4Ey+ghh04eQCZRz1XLZnJ1ut9uu72bzeRNjd9PNF2dh2GUOVVNwjigCoFFIkwZNgiSCvY8hxN57ZYz3PiUuigJyVIoBwGiYzyZ9u2vbIByFkMagJIIkSZC2q03w96SUK2tyWcVcN01WmTOPe6m1CmEAkNlsZq2NWVJKHDwz930/nUyKogiDX93fZwJbl6R0URSkc2TofZzPZ4ujIwSWFELPKGyNVupg9DzkD+QhA86jCsMHgSMPGuZw8YgcAc4oMjo9KA/ZUPkhF/4AoO8nOn4D+/Xx9T/0sJRSAPoh+oSPBjodWIiiBJFIK8U5R+/9bj90XbvZ5BCsK0Ho3es3yjkgBIHFYr44Prq5vT05Wa7v10PXbXfbxXwxnc7vbu//5A//RfADASKRcy5t2rKslKbMQ1WanL0xpioKZEghEuXEcb3exPW7GFNISVlbVHXKqevaorDdkOrJXOPi+Phk6NYx7OeTqt2tOHitI2QwSmdUfYqFK4Witi4jxpgB8khYVaRVprbrrKGcYuY4BrkIAQWBsCoqyZiGEILv90POYotgqqFsJlVZWG0iHjzlMbm9221zjpNJdXF9Wyq9X62WyxOlFRLVRVU0lUIa9l039NqYaTMTwNJZJE0IhTOFdVXhNLBCQOKDjzVmmka3C0ZJg4eE2IGqDQeG5HcSSESSHLQZH+gWD5CDQ4b9w6pAUkrpX9dZj6Eg+YBoPYqfUVA9llggoHow8w+UQQCFoISRWULs/D6FEGPodrvt/fri3bs4hKdn503TlLZgrYYYhhTNUDQx1lXNmW9ub+4ur43Wz549v3h/+fb1N7eXF8eLuXFuUtS39+th8FUza5pJc3SknLNaDd3O1lWt6XZ1s8nbNxer1Wpzd/2L7X6/2beo7WK5XCwWi/lkMSNu2GrFRcNk0VZ16QCztiUqwzpKYoXKWCspF9aB913fjwGdmJJSigit0n4fQhzKshxCH2IEohwjKkVKCXPbDtaWs2Y27PrY3RitmXMOnlOxW93NlieucMGHkSQxmdQhhJvbu2EY7u9uFy/PT85OjTKX19fHs1iV5SmdG2ddY7Zt23EbB99M5qLMdNL4mJdHR5W1ldW+a8PQxdCL8IEIgIAiyIDIBEgw2j6AICgMMkZ5P7iExxijCI/pbZQxUsxEQt8VID0ILGZE1B/iZrw+vD1i7RFGHzrqAKCIjLKg4AFAoIiMCCVJwecYJaV+v0dASbFv94V1z07P5/O5JuWH4dtvv21m0+cffySEOfN2u+Wc233bVNVsNru/v7+5vbW2QCDvo9Hu4vKy68JisRA088Xy9NkLQXV3d//sdInBt/3lu6/eXN/tt2188+769fXtu8vLb9/dubL45LOPnj45e3KyePn09MniuLIGyCZmY5w1nPzeuFJSVMpCSpwlCSHpBFjWTcwcQrKu4HZPiHVVh34fJLuqdGWJAiElAtm3XVUZzpKztN4rYwefBh8ms1kYPJAqJ3U9acq60mWBxhhr1ODbzq9W9yJgjA7Bl2UBCErpoiwnTVO74vW3r3f7/fOPPwoxnj45187cre622/Xy9ElOcb/bt/u2dPbJ+emw36/v7waPKcUUo4AohZkzACOMfjuMBvVBf41UY/oQQgfffvSpRsNp1IMEmpB/YAN570XkNxjRP7B7HpNcH+qyx2JnelCReHDHMoBATphC6rvr+3s/+BSiCNST+sXzF03VrFerm9t7BHz69NnHn31yu171Pmx226qub29vtVazqtFKdVmaZvL1l1+WZV0UDpFylslker3asjCR3qx3PITqdBGHZBp7fXlhrbu+++a//Be/+pd/9PX7NocxJNG2O7745t397/zkk0lZ3V7d6TyVRmsS0A+53cP6ESiLAEVZWVKD733KSrui5BhDXVVVVYokluyaCQKQ0jklskVdlX3M2hW77VZrN1/OUoyo9Gx53O/aLMLMIQTle+005GiMMloPAMPQjYTronQfffyy80NK8WZ7P5/Gzz/5dF5Pzs/Ou64b9u3IzH/68vmL589v7lbbzWaxPCusDdZfXLwvlFpMm/l80vUUvO/7PucIONqsI1NZRABHzsb3pM4HP4ogsbAgCox0EGBERFKIP8TAwY5i+c4GerSm5YPre1HGDzJjY1TeKKNQCaEQokIYA2+ZOUcOA0k+Pll0u3a/bwlVUzXtvtt37ayZzZWx1ipLl5eXf/rll8dnJ0+ePdvtt4BYlOV8Pt9vd0VRfPPV11VVLmezxWx2eXk5m81Wq33TTATMt99880X1hatrSbBe79+9v71ebf/LP/ry7/3DP7jZDUywZ0LSYCxotdsMk7afHN1//vmLb96949QtzqjkOhrQoiUHOMTJCUijRgY1pNwNIQ69IlLaIIA1qiyLHCMA6rIw2gIghgDKkHVFkwpX+IR1Xa/9rp5OF5MpJgaEXdcyZz0yBCVrYCIyRltrlFKKsE8peN/3rfe+tsVsNvG9f/3tt8VnXxzP5x+9fLnabIYY2u3u4u27elEr7Y7mc6XIGnN0dDS07frudmi3y6OjuiwIWDjGIHKwmmUkm6HwmHj6niT4Hjeax2waIAPIqN8IhIAPgezvX2PAUX+Imx+g53sm+oNAAjjUaRtjtNaj0wVISAgkwBmBJcccQ/KhC3nf7ZXRTdUQKFS0mM+0Njf375FION3c3frgtTHMWQSsNUfzRfDB+/7i/bWInJ2dT4vCaFWV1fXNG62tKPP24vrs7MSkvLm5diBbUN9e3fzLV2//k3/yR6+3kW3tpkdV0QiQq6q2684Wk7N5sd9c/PzbbxfzL9aD1atrytNsCZPLHK1zhApJERlCPWQWIFdUhGiNtlr7bq8IrNEhZaV1IqiqChi1LZTSJKRsCQyRVVXXd3c7MAqN9r7btO0QfFUVR8dHk/msKApWWmmlFRVlcXS0KMs68+12uxuGIaVIVLGw1ppF3rx5Y7VuX7369NPPMsjt+v7q3btz83Tf35a79se/9bPEsN+2hXPPnj1b3Vy1+50xyDmDgFKIqA+eFeec44NFS9/f0O+cJEAZnf/RDRrzG0RAeOAw/wAMow33nQ30qMbgA0sIcdRRhPTI6MbRBEeiUfwj4hjzIREaeSM5y1jIixkYbGER0ft4vDwGUV/+6suu6xHVfN4slyfL89Mksl1vGOB4cayQ1vt11w3397cny9PTs/Pj2Wy328rtfVWVl5c36y74hG/fvitUNoXrhpip+Pnr9//wv/j5+22CZo7g/qf/s3+/Lu1/8H/4P/7Vv/E3/hf/q//5f/C//z9986f/Yrfdd2l2ebdqSj0xZlBQcMEaU07W2g88DJVjyjkZo0GstbqwNoYBRsIooXYuMQJZ0kojOVdopZwPQ9erwaOm47OndeFyTJvtHoA++9GPp9NJNW2UdSGHdtcPnUcMfEjvQFUV88Xs7dt3OScA7NoeBZaLo/lkul6vm6a+vr02ZVGUBRp1dXP75MnzXdt//eVX589eBN9rpbr95vnz533f3t9cjcUSY20+84H680i2eAw7H0TQQxeHkRyKCIxABCAoYwAbEBBHijx8h6SDr5ZS0vlDFQaS0wclfwjMYzoNxlyKAJJS2lildE65o6gtOUItTCEgR8g5+5haH4acIirRJZZhF1VpClesbjddP/iQyNimaZrJJKecB84pWTbPnj5brVdfffOKmQGxKswXP/k0or2NnNF02ffdOoZdEoymWW02s7ur4xefbIO66dJ/9odvX911Wuk6tp++mP31M/r//PN/5u++lvU7//abI0y//9VXcbtpT0//9OdXBc6mvLNAzpRWVRrFgBVGYc4ShJLRIgqEgymUdS4xJ0VEugPK2lptF5n8kJRz6OwQ2ZLex85VVnsNGlR5OoS0vb8GqBbzWVlNsZru0IBrvMKmIL5fD8NWq6gpeL8H8U3pzk/PvvrqzX697zebxXS23exKVywW8z6FVb8l7ubLI9Fqfwvfvr3+6KOX+902dLtpXVy3W210F/zs6BgF7u/ujGbnbIwhRJ8zgeSxigGIBEE4S048BntAiECNFuxDEC8jiSYBBYCZEUCTLqzRinrArJCBGVCjpO16rZkP8aSHUu0PraofCK1DQdoIOK3UWLipNWlCYOIkMQT2YUxTj7p3u91OZrOyLEOMg/ftfj8MwyeffXZ8fLy6vRvJ4dbas7Mz7/2rV6+22+3R0VFV1fPmo8v3795crv7KX/vXydlwemol1c3kaj38/M3d9fX+p8/nT87P32/Tqy9/kVNYHh9bV15dXax27f/yf/2/WbWdM/Y//0f/+B/8w380nc0leqep3W0bLJPvbu5281mhCPzQK6NjHKnFiBmJKDIwkTFGk+KYcs5NWcWUgvekVOh7rSwJE+QchsTJmsoqCn5AwGHwzvr7+7t3335ztjjtEnz1zS8mx/NqMdOTUpxSaqKEOfrbm+sY94hQ2EKY67o+Oz1LQztsbm9ubjXhfDZLKR0fH7e+W8zmbdstT09j0ldXV1dXVy9evHj//v2zZ8/Ksry5uamqKoQwmUz2u10IoaoqgTLnkHMKwXs/hBBkpG3ggRUoI1cHHiSTjPViSAoBFKAW+SD0CMBCighJoTKIJqUcYvjOBvow+fXh9Wh+y0PJ2CHRby09sDhEBHLmlOIQUtfHIWISRUYrtVwujXUA0HZdCAGJfvyTH5M2RPT8+XMi6vseEb/55psQwm63Syktl0vvAwrd391VVS3Mk2lzydn7oSzc8riubvuq2n3x+csnZyetbGbT+qjn7nb76RdfXN7c9okZFGi7mM6vrm6NcZNJs77Zx9AbwsopjdloVVVVPWky81hVmOEg6BExZgatrVGIlFLOKUVhBDRasYg1CmJAEMzIwkPfYQ5IkGMkoBzz+z/9k5vbdQz0+//Vv7y/35GyzbTq/JZU/ot/+XfqF18czRbV0ZyH9fWms9YMMXd9jjG6spTo5/MpCpRllXO+urpypTOFHZMFq/vV4uhpSmm/379///7s7Kzv+7FrxdXV1XK5BKLz8/P379+/evXVfDGbzydKKWsdEWqtQ4opZ3rglPKBqQqIougAlFGJExlAzQKUJQviWMQ3hvlIa22UsiwoAJofONcj6ewH+PlBBeMIpjGMOrpmKWcCQA4SfO77frf3bZeGqFGVpZrOZvf390hKAFJMWql60Ww3G59y8H5S1V3XWWu99xcXF7PZjIg+//xzY8xmsz1ZlCfLI3CTwrk4DDmGxXwWY3Jmcr72JP3Z6YmzuqmKj18+6+D226u7nNJkNrte3S2PT7/46JOnT5//8Z/8nEhNJ5PbN18vZ83Z8XTe2I+enn38dLqYz4vC9d7nnDLnB5NODueTOYcAOY/WX/RRa2W0SSlZpTj3hIgZJIaw3/bbtRABqc1uNwwDd7uvv/z6V9/evr7c90mnzGVhzo7Ls+PiV3/882Hdffz85enxrCldnEzu7++3bWerubEGSfXD4Lvu/PT8/OwUmEXydrstctmFvllM23b//EWz3W6ZeRgG731RFLvdbjqdvnnzJsb4/OSkKsvnz58rRbd3t33fNk3VNI1STphDijS2jEEcyZZycLZGKvdoNSNprbVFMjlzgDzWD4/0UgFC0kpbra02rqrq7wUSmeX7egtFfuj34XdtrYBFEmdkphQleCU4qWoMOYmy1iGqi4uLuq5jjIP3gDCbzfrB58xNXe/3+83damywcnNzUxQFET19+vTk5OTy8vJ4ecxx99HLl99e3msC3w/Tptn5NnpPup40VVtXOcemLp+o8n7IVM2HJF++/uboaHG/Xg9+6Harzb1bzCbffPPN9btvKQ2LyVHl9MfPzl6cnzw9nyuNOcWc4+AHrbUrSxlDHghEKiWJPrBSzlmNVJdlzikMAynVd63OwWhNACkMHPq2G7qQQLuvvnm97wbN4Z/+wZ/+8derbbLbQD5mkfBkWvzs09Oj5elm3//y1Veb9fT8eGrIKECnzNB1OdFsPu139zrWm8162tTL4+PdbrPf75XVx8cnQwhI+vXr16enJ+/fv6+qaly3sizbtj0/P3/79u0lc0qpruvlclk39Wa76rv26upKa5o0jbVuCAM+JDvgkL54yLg+uGmHXoakAFAxZObRrsmgCDSRUcqQMVVdl1Wlhz48IgPHpg7fYQXgIb06lrbgQ+1zSinF5GwxBqrLwjWTokBc396svc+Z9yEiqgMfD9EY45Qe/LDZbMu6HoaBiFzhyqq8vr7WWqeU+r5/+fLldrttmqZwxf36kjCfLY+N0VjYuxwJoamrbMxyufz61S927T4l/+T8WSSbv7n87R99vNvvbtb7T148CTGG7e0vr95v9wOLHE0nZyfn58ezo6Y8WUwqS4iQcw4hOGdzTkAICForUhRjRMHsvbFGoYS+d85577VWkhOA5BTj0LG1Cq2CrAkl59X9at2Gd1f3geF+tf7qepg+/8nN1X6bY7OYx2F30d7e/IvX31zv//t/+y98/vJ8tR+6/Z7iYAiroqIM6/2671qFGAGNsdvdDkRevHi+2twLIilaTBeJpW0HETk9Pb29vR23ZmyNJSLPnj178+pV4ZwxxvuhqsrFfFGVxTAMOUcWIUJrbYoxc2YWZubMWZiMttZqrQDAGKONQSR+iAISje6pyizGFE0zK+tKGWtdAUQ654e8CX7n3+EYEBBAygKMgh9mOUYbKKZkQIwxpSbHKQ/der+9u7qSlEeegLGm730IwboCENu2JfUdpZqIJk1zeXGplFoul69fv/7oo49EJITwySef/PEf/wnGVjicTo9ROPS9RsxEQwxgZTGdTCeT1XoTY2wK+9lHT4VUyt/+1qdPv724Xm3aAWW5mK/Wm3tKk+ni048/fnZ6jH5/PJ8cz6c5+GHoy6ogwhACEaFCZlYPoa+cIqeYQIQoM2sEQ0gACkEjiFIeVYixtEaTRoGc+d2765udf3u9aUP+6uru3/33/v1/59/9H//ptzdsy//oP/1//b3/+/8NnG5v33x1u/l//P3f+yt/7ou/+3f++na35XZjkZUiXdXTpr66W3Xtrt3tpk1TV3Vd11qrFy9e7IfOaGOMMahiDPf39+fn57PZrOu6rutijPP5fEwsfPzxx5v12vuhKIp+6FOK1urFYg7AMaZ916WQH8PCRCRKPXYLekwwaK0BFArGlMc7kTSR0tbaoja2NLYcO0ACok4pPcaXHxNe38kkYYFDOT4/1I6Ndrf33sRkKmWtoSG1u113f9/t2hBjUVUsvGvbFNJisUBSXd8zC0NWSo0RqjEIOZ/Pq6ra7XZPnz51zl1cXJyenoqIUkqBfvfmdTFZTOdH09nUr4uwlxi9cTKbTV9+9FFRBG00Qpo49+mzE+eMM7CYuKvb9eXlxQSGz37yUtm689EHn9rVoi6UpHa7OZ/VMfkCLCDH4MfcsEAWIGEWyQjirB0/rELMMWZmIooxJqIYk5ByxviUJEZtLAuZou7v/LubzfX9fo2mXp7+vf/4Pzk6f/k//J/8j/70V79cXb+bH8/PPvrk6u2b657//u//yfLsyY+fHO/W7dRSVdjOryvAqrAAslwuOeVhGD56+aLvem31crmczKdo1dX1rXOzm5ubs7Oz+Xw+LuPXX3+tlGqaJufMWk+n0/V6M59DWRYtp5wzIhChszYLI0HOOSlKWsWAUYQPdVwyLvuB/I5KMgAcWnkorY2xtpxWVV3VjSscaTLWAoFOKcEDL39kUD+iBwCQGCAjEn9QvTra0d57G7wKfsiJ+r7bt/2+RRGt1Hq9bkNYHJ80TbPb7VCRtYU2qu36x4ZIxpiu6wBgGIa+7xeLRd/3ZVkeHR29evVKaz1tZm9ff/Pu3buj45NZXY0VCGMFuFY0mUxTuPHBd/vdoiiWs6IqTxaT8s3FzabtCbEY7pWt9j6v9z4D7TZbTJ6ECaEsXIbsvZexsR9R5gwIo7YVkRiCynDoEgSgtXbOET6UAVs7CLRDNymssW4IfTOdz4/D9R9+u+2yKqa1c//X//A/vL5boTH/l//z/+766kqZHP3Ozs7IleL0arX6f/6//8v5f+9vLadLlTvJrI1e3d3db7dVWQyb9dF8XpXler221gBACKEf+lm98N5Ppg4AVqvV8fHxyLZWSl1fXwOAc05E+r4XkbZtSVFVVn3f7vctESilUJHWBhGBM4AAszDndGAxM481cxnHnqdyINsjktbaWjuZTMuyrOraOIuI2hogGFWYPABGADQijE0EBIBQBGTsMSkPLOn80E85xIj9gAiq62IIzJzGYE/fs1KAsNlsnbOEynsfU2aBoqgYBAAVUWC21t7d3R0fHyNi3/enp6e73a7ruidPnu1vvxXJF+/f/9af+1lTN86abc6jWZZiVAoHZu/9bret67pUxH5YzqrZ9ON9F4ahL3qbQbdB2ghJ1JdffkWsTueT0+VRzhk0D0NHBFVTx5RyDoqMCB0CYcJKmbG/ySh9AUCYY4xElAHFFIAqJSGFSmvNCpXpY6omi6vVdvny5PLyql3f+pjef/tKaV0Z4/tBeGELu9kPpO3F7fr3//kf/pt/8ac5BNfYFGPww+ruBgQopZy5aZrZZALAdV3Pjhd32/v2/VCWJRHVdX13d+eKwlnrvX/x4sW3376+vb1dLBalUoVzq76PMaQUz5+cTiYTY/R2u9ntdrZwpHRKIccQY0AQrRSPrQRFZOyKp+K4+cxjbBGJSCultS7K2hWFc4UyGhG10UKPlPiDFhSAKBAFfJaBpYsxRw8xQAwSI6d8aCukFOWc4m5j9+sFMO1227cXebfP/QA5TqdFUeHt3ZvN6pJ5IEq938U0+NSLFp9j4LxqdwnkfrOeLGaqMAGzmxa7uHv1/tXy5bI4dkGRaxYnJ8fJ70kxa5NcJUVVVqqAjeV2fbPf3G05cL9vrdLzxTxzjiKqKnUzMbPTxemTj54+nUC6+ZN/vpTdx3P7dFm4WjrsmJRyTdalhwKKOZVHYGoGnWLq2z1IFPCkEqqUxbPKCWKfvJfURt8F7/etQSgsSto7nS2l5+fHP/70k8a60Pmrd7cKbFMvyrJJEXKULz757He++AJ3m2rYG9QMFrX+8us3b99/XZbo/Xa/We1Wm9BGA/r8/KyZNGXT6LIUa/chgXLGNvutL0wDmauijN6noRPvN9dXFP2zk3l7d+W395Cjs/p4MfN9l0JY360ggSQ4mi1nzZFNTO3OhlAiGgHIGQhJ66x1J9DlzJlTlsySOCfgRITOZqOhMPXxXE8KqEy2BM5QXUpRgC01Z0Eagx8IIHxI+I+WlYDQKNdzzinmbHKmUWcSi/ih7yDfdN3++haEnSuKotj2myGGPnZd703W7W7rh8HHVJSTsigIEFi0UXXdTKrKWaedyTmlnHrPfd9+/qPP5/P5Zrct6/r09EwbY7S+ubmZLxbffvvtvu+N1VXlOIcQ0tAPfddPpo33Q+VmdV2XtsjKtl2vWqyL6uL16+uLi1nTHB1Ny7oqZ7WtC9JUlVNlHChD2pAx3g/MUUkmyJIjpJxzGrtUj+I35kxKl7ZWWiOqvosaYs6HHnWR1f3tliQP3S70fda2qKp3F1f1dLJYnkyauqim2Q8ZaPAZVSo0fXp2DquLFP1sNtncdte3t0nUMKTCydiKdd+2mdkWrqzr3X5/v1ozi/feFdXQ94pot93RBAhROFdFcTSfre/vCuNGj6wsCs6574at3lZVpUhZY/2ARusQY9sPxlpry+HQC0seerE85NyRRJDGzsWkjXO2LF1ZKKW0tdoaUnakfeic80gVEoWAoggPHJmx6AMFYGz5CYjRGE2EzAIAWoAldZLXuzbtu6eLo8pZP7QxZR9DZlZERkzyMcXMQKZRKGiNqZtpVTXzxYKM3u32bdsqRZnzbDo9OTlOKd5cX603m267s9pwztYWMca6LAFg0kw4C2fRymQR78Nut1sczVer1ZCyLmvlCgCpnJ2XJ0PfC0g9nVhF00lTVK6a1LqwoEmBFgBhTjFxSixMACzCAjz+k0PiGEkJYEqsCY3WtnCIGkBDouRDYu67/n7biVTOmtPlkSmaP3p3td2uq6rebrbz5RKU++rN+263jz7GTMD+oyfHz06m1ZytEiQUVJ2P6/2+T/B8tkgpxZiKsqyqKubkh6GqKq0VZOi6br5Y9sMgAtfX10VR+BByTlVVLI5PMstms5lOJqvVaj6fp5SGYdiseeQaa2M8AItoYwqAxDmzEGmWTCKK1Oh1IypEJTCWiSoBcq6YTKZVWZVlOWavSBtQChkEQKfEI6dZBIHGVvzyiKGx59Oh+BrAmESKiA6eGgH3OTFzUZamKrPkTdeFmAHJaEuYFR96ZylEQmWN1Wg0qPX9arPaZAWCaDTFFM/PzzabzXa7btuOcwoxFkjWFj6k7Wa7WMyHYZg0jbV2s14zQ1GUiBBTzjkPw6CM1s4r53L0oMEq0+52XduGEEipsWAzA0TmnLJkthpx7PagBJBSYpGkJOeYQkqQskIEJCBFgIIKlQKixCI+KgVlVXNUnHptC4ppPl98+359dfG20G5eu9NZdbNaoSNOami3+902hgg82hL26cL85MUxDtuPn539tZ99/rMff/7+zTsv+Hu//0ddxvnRUQGDMTaL7Pd7W7jpdLrb7fq+19YAYNsPzWQWw3B/d7fb7avCpZh2u9bZmDJnH277oSiKoeuttSjg+36LqLWezmbTyXS7uW/bTltjbZFgdKsxj01jmQEJUAGSIAESkhbBoignk3lVTZx1MFZK4yE1i0B6TEqMTT+QIR8socceUGPDodHKSjlzTgx6tN+FhYeha1xRlmUXAuU0pIhaa1I5Dn4IcQDrHCrKkoaujyG3XXBlNfjYNI0pS1c4ROzublar1dB3337zLQKcPzkfhiFyvm97o82f/MnPf/az3y6crarm7u42+IAT0toAKgFUSgXfT2eN1UTAvu90AVXh2pj6thtC0M5UVRVzhsycskYaawWUQm21UpqMZQDOoJFQUs4mZYkMRIf+5qSUUloZa4xR1gFDiFEp0kV5VDlTuHfvb5hjUxruWZOak//Rn/+8C+nrd+9eX16z1oGwcFVhiuPl2Y+fFrMif3T27MVy9vzped91oFUzndtySmSOT043718ZY5u6fvHy5Xq7+fLLL421DDJ4vzg6SjnPF4ury0ulTdf1SimjKCfe7vb7/b40dui6sijGc/WY6ASA7WazmJRaGyIVQiyMscb6FImIQJGACD6gRwEQgkZSLKBtUVSNLUohAhk7gGZhUtbACLGHakWU0bQ5uGMiIgj5QAoRyDkPgycii4Ywx5gImYiiSBu8ykw5kbHt0DVN7YPPIaUgPiZtHJLat91sUfoQySSljXWFKcvE6fb6RiTtL3er1Z1CnNbN6vYuxiigZpPp8vj46fl5VdXOGhGMISFSiJEFrbOZk1KqrmvnrCKM3jNSJuz30Ld7P/SIAlr3KY0EYENGu9JZl4KXQz9lkMxFUXnfCUdAcrbQZFLkxFmIyrrOWYAUKMOoSDDlHIahKg0ZG+KQAcuqXiz4k4+f79s0DOlsppUzp8+e37ef/LP/3x+9vbwGNIjaKPv8xdHcDl+8PPs7//pfS8Mu7He7tr+5vdnstyGn09MnStF8NssCIUYA+Pzzz1+/fXN/f4+EMcb9fm+rmdKmKKuymQxDn3m7mE/Lqso5x8xGQuHczc2Nc66qqjFJ7vvBat32fRrapiqrst73Xc6irWrqIqSU2j0AG2MVkAjmLGOJa8qiTDGdLoqiAtIC4/CdA84AEQD1A39jzJriQwXamAgbDQFCIJYsAt5HeHgcAAoBahWYIbBFVMI5RVOUIrJbb6uy2gwtEQ0xCiQxbr3bTSbzkPJ0Nu1DvLp4F2Lo2tYotEqP76htW07p/OxsPplXZeWcm0+niLK6vy/L8unT5/vdxhi9We99SDnn/X7fD00dPO8yaIPGxRT32x3vfc5REMZ++KRVVkqUAqVJ20IpQBRUjMQiMPqqGtGQUxhD6vshhCiAqKxSqI1lAQbwKQuzMpqBkISVcmV9bEoWJDAp4/t3V/Nnzcn5WRfjFy+XT46Ki+u7zEigmnoynx8/Oa2PpkVdKLL1Jg3dfrNarVKMR3P7O7/9afQemCfTWdU02+12cXT04sWL+/v7YRhcUSDSzc3tbDYv63qeFv3eMKeUJeW82m43ux1ZV5el73pgJoGiKDSp/XZrlNJEvu9RRBujSKGgVoaU1oCkNLEQKQRiUCAKgAhJhKwyrqxQGxE6gAYJ6NC1AQA1Ao0jKx5jh3CggQAAZR4DbKMNJCmFnMfur6W1llBCSgpICBgh+6EgbMrq5v27sqy8D2hMzLzr2hjzZ2dPQmLW5ENaFG5oO1CETIvFot1vb25vndHWGo3UzGa3tzdhiEZZ5+zrb77d7TaFtX3XWqMnTdN3ez8MbduVzmzL3WRdaAXammY20ZrCkNp+UB5jziyCWitriqrWxmpXkC6EtNMWEJJgYkkCSUQbQ0A0jvEAZlDKEGlti4qUBsTEIinnzIJAAJ33wgE5I2eOqSrcHnZ58I3DSeVmdVmyG5g/e/HkxflJWdSlK7QydVkXlTKOVrfX6/V91+5u725yCpcX76b17NnZ8dtvv3ZITV0/f/ny4uLi8vLy7Mn50dHRvu+n00k/eIWuH4ayLPt+UNaFNnb9wJzH+VI5peB9Sslks9lsiqJg5r7riOj4eNmnFHfBFYUt3Dj9SXKmsS8vZ0ASUXhAiULQAIq0UdoSme+6HgA+lHsRIGg8JGfpMR02hoTGtDw/zGEaU2E555TTqFarSpQlwawJmTETSE5OF10/pMzTulndrwdQ6/X66HhpAIecmtkclSmaMgmYslLGKEX3t7eZ+fT0lFMkYcz81atXiqgw1euLd4jy1a9e9cP+45cvFQJzfvbkiTUGUQtI13XMs8zctvupno692hCypBA8CKKy2laFrqpqMlVKazKaNJFhSCLjNICxJSArQyEETn2OgyJjrMvMABRi0qgAIY9Fm4eUEQlwTpw5I4A2xndDDL0GWTSFLuohQzmZWqW0ViElRTStmmndaFSrbtUPfrfb7ff77XodY+z6PSf/3/mbv9Pv73PoJsfHzWRSluVsNnvz9i2DzGYzITw5OVmtt6suDT4qpRdHR/d3d9qYGELXDWVZ73YtxSiZFRKn7LueU+77npDa3X7aTDhLCIEFUGlt3TB4R5V1xhiXszCMPDKFoACVADGi1tbYgpRJOQPQQ3sYgoeGHPqREAtCD9XU+KimBFgOhKHvCg69D6NAcmDJwNgwBAQUQpY8dG1dVu12p7W+u1t3fVemcLQ8BVLNbNZMpqaoWKAfBmPt11+/slqfnp6mwQNbiSH0vTM25/zlr75s2wERhqHXSuecT8/Obm9vxvppEbbWjjY4iGithXMMXghTHBs9ASmlrXF1bScTIZ2ROGUGiJKCBIUo2qDSqLQPHkBJzmPgNcaUOSulSJNClJGnTOrQuVJAhI11SlPfhmEYIKccPecEKaXEnaoqO0nkJrNp5nRUFGHox7jIMAzD0G/bbU4p5eS955z2m/XZ8mjWlLf3903pqqo6Pz/fbrcppaPjo+1+R0Q5JUWkje66XVGUg/dVWRwvl1cXF23bHjrUKQUxKkXOOeaMRG3bEhECjN2ohDnHmIiYues6IbSFG6vTkYgYRmqrEB0K4YGQlNYGSEHiMUw/1t8eqNREWqmHRtDISGP+Qx7I+oJCgpDlcQ4VCqjMnDj7ODjPVVOUhRPSvQ+QWDJaVaQcRVHKeXO/OTldGmWsNsvlcnl8TNYyUI65rKrV5r4qJovFXIGABs5h0jQ34Qq16vv95v4uDOHufh08n55MAUBbuzw7O3n6bLNZ992mcObJ2cliNjFaKyRCnTImn2OWxDpiUbqiLF3pyr7dDj6gsnUz67wvqkaTZsmcEuSsDEv0GbVVylrnBzJW5yyD9yMfaujbnBMnVqSMMagoCOuRg5khRsieS1029WIXViwJORotTWOVFq21cZgZQt/e3W9zCDn0w3qFZNrdcLvpvv363fVt/3f/7d9tuxZTZA4h+aqy69X99v5uuTyBlDll44qLu7vpfDYpVLu51fPZgDHFeHJ6vL6/IaJ27de3t9OyYVTKuM39XVkWQ4hG65jz2JY/QM6FGkJXQmOVGnxIIURjRjIrP6S+BMdRY0kZNakrZJYUiTCNxWLf1feICNNoWRIJERMKIiPy4UeSh24uhyJYGVukgcpMfeDNuru73m7WQ9dxjIahSGB0MRFthpz3fbuYTpZHy+Vi+fT82Xw+3+33IjAMg3WuHwZny4uL6/Xdpiyquqonk2lmMdZsd7uu705Ojmtnp1VxdjKzRnvvLy4vyrq+Xa1MWaHWdVlUZV1VVVXVRVmRsj7kmDBl6j2znYCpgWy/3+uUK4WlQqPIFQWQXrdDBMWk9v3Q9cO+7W9v1++v7m5XLVNty1k1XQDqLAhAhXOF1QpZ2CuM1oByBo0ipaxxRVGDUPCidWlcA9oZyJq9xqwoEEaRkPPAeYix67v19u467rab+/uLi6vNbgiin3/82WR2NAyBSGbTSUjeOtNuN91mgylPm2YYemVMYO5DmDUFsCfMs2mjDSFy01RW69D1GrAPSbuSjO0Gr4yNmWNK1tlhGESYFZim7FO4ub8RYaNUTpxSyikhojLq4L+PhFfOROCsTjFICIc5rj+8RP/gDnyo9DhcRARAgCxIgML58UUIIXHa7rp+GKqqbuqqLLRBxVYhKh8yoD5/el5W1fnTZ0Bqt2+PTk6GwfsQMotW6u7u7snZ2Y+++GLo91nEKJUBNusNEZVl6dCenp1NptOYkisK4yxpZY05f/o0xnh9fVMUpTZGG+uKwhjrQ9Cu3LVtOwRlK6NVVReT2nZtBGJEpYtKQPU+FqoKov0+7tv2+vo6eD+yoYdhaJrms88+S1erpqmMcorgbr09WS7IgMoZgJ0xSpvIohFFI1mGxB1iTBE4Kz12BlOShUQUjzQYwcyQhGPy/eB92Oza99e3q13b9jH54bf+0p8faZDOVKBwfXPbt8Nuv3NlBYq6vielfUrLk2WMYXn6ZHF8MsTQtr3S1vdDWdYRBiRVuGrfDyKSU2qaZuh7QgRGrSmEICL7/e50et409c3FVVNU8/mCOY9cg22774ahcMWHSCBSOXOKKalktEZ1KOkZfS0QQIQfAujX8YQEOOZncTSPHtNkoLVGBO9jCOu+HwpLhaY0q0sNZF3ZzFxZV5OJtk6QisLd3txe39//6Mc/yQjee0U0PTrqh4EAjDbRd9eXV8H7J+fnFxfv9rvdyWJ5dHQEiGOr7sy5KIqiKM7Pz3/15SvjXDNtqroSAB9CYg5DH2MeOZmL+bysjDKwPD25X92xcMycOStTdUP88mL16qtvLi4u+r5r205rXdd1CEFr/Qe/fAM5nRwvjo8WTVUoiExq3lQCxDntdntUvaobocP8Vq21c8Wu9yIZFbIwsQr9wD4JYMwh55xjAo4cc/Jhu2u73scYd7vd1fXtj3/605Pjo/XqLuVslNak66L+9vW3pMww+MBc1o0XRoTpZLbZrLf7fUrpbrPuhq4oSmetK0slaK1jytJ2wzBwTiLiQzBaK2NiiGNaY7fZHJ8enx4v/b7rh/5YLVGpfdtNrbOuGGJ8tH8BABFGun4IgZRWxoDR+NDp45H5/GdIIKSxnSbwWGfGAvhQm4ailTLGAKoYU4gxRG4lc/S1o3ntdFFmwKKeIClXlver9Xa/e/bs2cnJ6Zdfvbq7u1seLxWqOHhnKee82+20UqfLk91us5jPezDtvi3Lcrlc9sNARk9m09vb29Vqtd/tjHXKFEqZGFMKGUCAqJpO29Axy3xxZKxiySHknBlJOVsNGRlMEvUf/f1/8C9fvb28ud3tdtqYceiLtSanrJTCry4qq5FjXRXH88lnHz+/vlt99Oz0dDGdT0pEzjnx4EEbAhBmRGyaer/djtORhuANQN+2oRuAsx/6mAIhGq0MklYqs6w2m7v71fr+7ngx/9lv/TSnUBbOg5yen4ZhiD69eft+0kyS8O39fT2duars++Hy/fuyqgHpdrXqvTfOkTYCqJRG61xRDl3fTCZERKj9IGVZ5pSstV27zzl3fUcEvm8Xk8nTJ+ftrhv8MJkttNa9D0zkiopT+L4EopG3k1LizPTgWH3grYN+oFIf7mNmeJivAgAgPJaiKvjOk5cH5mvOkoUQibTOzMjELLs+xCgIUBWusCZkQe1ev33vvf/8Rz8yzu52Gz/0dVWiYPC+dHZ9vw1DbxQ2dd23u/lsllN906d2iG3buqJYLo8zwMnJydOnT//RP/7Hfd83k3nZOB8iCGl1CEXs2zYzTOdH2hofhvl84hyt1ncpsyKbs+z7/Hu//0/+/j/4RxssA0uIaACNsTFFHzBGqSq737aFSYZk3W2v7tbXd/ep33307Ox3/+Jv/4Wf/XQ+bYAIcs4cgCiHqFHZojDW+sELoSCGEIxVoe85hb7rtruNH7xzGhG6rt3u29V2G2KMMT59cnY0n3Zdtzw/H4ah90NdNsZ0zmZXlq5ubFFmkM4HARz68Ob1u2nTaGusA1sWRGSNib0XxNl8kRMbY1KKIlCWJQgTIgCEGCaTifcBAVIcOIW6LAkwhOBDXB4fB4Ft26acH6cfioiwjLRxY4I2lpklZUJBgnFuL2QGfADQI4YeAIRjj34WRiSlSRIBHlow8ti2FyBn4TxOMBipWKi1TRIjy26IIcmRnRhXbdveh7Q8O/cxjk33y8K1XUeInA6NiZu6QUl9u59NZ2Xhrt6/K5zzuvfe73a709PTqq5ijGNFy93dnTJOtMspFk5bQ1oriy7nJGRdUQpiWTlSGGKwzjpVaVcnjf/VH/3Rf/6Pfz+y3vqA2qIumciWE9Qxc5ZMXWCyVR88awIBzBGkI85/+tXbXdvebfZ/62/89fmknBXQdd1+306aRgGBiHWWtAIiXbjU9QAYQuCEEJNBVTTN/ea+7brM4fWbdzd398LZaPPpxy83q7vZbN51rQgimfls0W33ifnd+wufMyjVzOZlWSml15tNGMJW9k+fP6cYSOucszaWQG3bexKoqrprd2OcBSUzs9EKiZy1Sql+6EyBOfgcgy1M5UpjhZn3+66czWxZhf1WIcqhypQFwXvv/aC1M9allCiIKE0Kx16toz30Z9lAh9zqyOs4NLEeu/se6lmBWFAQsiAKRmRiUEhRSJMJWXxiETlantqi0FqvVqujo3nXdjEGLMFoPfSD7/vFZBL6VFdl5dx6dVcWxdAOObOA7Ha79xcXf+Ev/cXM/P79ewBo23a92ZoIy8U8hKF0ejqdhBBdXZtqIgDBR2U8S8wpZEmuKAcZMtX/5Pf/2VevL2w5RdKkbFPXk8kEEBWRdXbSTMYSkdIaP+y363W733QxQxaFeXh7e3X/T9sI/4O/+29V0mtSi/kieK8U5pyV1kQUOQkCGZ0RsoglVTeNVipBLqt60+4ub276GG1RllYvZpPz05Oc0tOz09vV+ps375Rxn3386enJMnJ++uJFH2N3KEmgwfu727v5bHZ5dWWKoplNx8lXWhsfsg8RM3NKRAoAtNar+3VdVYoU52ysSyHs9/uni2NOfui7aTMFbThEJsVwCMdnASUMMo52RsFDz+gQg/fee+90MQ4tHtm9Y9HgnwGgQzwJ5fAURSTC4xipnJjHDuKYgRhBBJCFBAhAMzLQ4NO+7WeziTJGWPZt9+b1a+/7EMJsPnHOaqLoB60UEZVFsVndrW5uZpOJcfY23WqjjbVlWcYQbm9vm0kz1h4Q0dXVJdpd4XRduNHUz8xIyrmCAYQ5xFDVU9uUiROQCWLu1u3rt5e6qJWt5mWZOPfdrmt3TdM8e/78s08/LYrCWa2NmTWNH7pf/PzniBLjsLlrtYLp+TIB/5M/+MVv//bPTj5uOHPnQ11VnHJKyVpLWnEMQMiEPsc+eKuosZYQOj9M51PPsU1DNT9TpLLvv/j4IxQ5Wsxyjr/4+S/++Je/AmUuX783OT39+KPmaLpf3R+fnvoQL95f5JhOlid+8Gfn55vNZn680M5prRmRtFJWi49jVaSIKK0BYPDDpKlRRJEhAM5stALQOcWcknXWGpvICEAaCyYEOeeR18uMgpJijCESeSKtjRUFWmcAGPsZjjOC/kwvbGz5MTbzA0IkRcgswpkTZwVAjMAi/BBgYkZCTqxiFgxxCGmmNBDd3a8ZIhBOJ1OG7Jwti8pZE4MvC5NC5OSHwZdFeXp6enNzWdd19HHsI0NEIYS7u7sYY9/1hXOgZN35q8vro/nE6KMYo7I2MwNAytkVriicc0ZrJQkEKfp8e7/a7loBdbfaQde1XRtDEJF3KX315a/2m9XyeNn1PSH6dtdU9Xw2u0sxpYTGkVG3m94VNrf9f/EHf/Rb859qVzRlNbQdj3PkrVX6YA8EySkEEC6MHjkxk9ls3a5tVZ6/eNa3+O71u9PjKRKs7m98v7+6vun6QSl9ebf66PxZaYr7+7usFSr97uICiW5X9xz45PMTa50t3fbN27KqSRsWTilbY6fTeeqHbtdmbkOI1ujl8fHbt29Pl0utlFJUFkVROACZTBoEats9kbauFlFZJGXOzAwyDqJgQRAUgEw5xoQUELUxPWM2xo1jfY3wGBb6DkAPmYpDS8WxuaeA8KGlHisCUQQg6bHxGQpkZkQRyA+t01CYCJKAD4kcMuQYvLW6H7qisIUrRLJzViulFSqNRemcqdZ3d5IjIMxm01HwhRBCDJgwMk+nk13XJs67vr/fbRPIk+fPy33PKYbMQspWVWZhQRFwxjhrcg6DH1RCpS2RzjkyS8p58GkIWaMyRJE5pYgCfbf///7T33O2qOr69OzMKLq7vSOlur5HwpSiDlRWrtJOMHe9T4gKsPeBiHKMI2uCCBFAOMeYgBNkDilEjoUz23YfQ0RATVpiP6mKoesuL31Tuu3uZrPZ3a53wlyVhTLG57xbrzvmLoZ9P3z8ySdHs/nlu4v7u7vz8zNBmk4nR8fHMSUGabe7UXj7LNGGfh/quowxKKUBhAids973RVnVTT0M8fh4gUAx5hDZVoYYIwukDAAIkABhbC916PGTffSCdMj2EAErRUmrBEDEAcZOqwer+8GYHtP040g8QRHJxIIgRoFV2AfygJlRsABIKBGZsuQslEdGEQAhRQZSUmLMyTPHod1WlUWB4+NFDEFyQlekcghdq40qK7vfqXa7q+qiqMrNdiOMSNR1fdnUs/m0mEwzwmazud63yVmoquPnT5u2Q6LBe13XARRp1czmxmgETkNHlVG6UMoopda7LkQqynoym1xvrqx1IYbVeu2DV0oDAioCoiHH1O93b3q/3ztStqgSgKtqslXmNIaRJPuUQzFbTCczFG73e61UUxRd206bCcfou1ZYCEgpCmHY7u+DMaRV8sN+vVPGaI7d5kYAuKqPTk5ts7i4+4Uty103pL6936zqZjo5WiJiWG+PmgZ6z23vdzv79CmBRA5H8wkxcwramBxDBiGSHAfIyTmdYgyBrbWTSROiPz89+vbbO4Q8n03vVvcx6slkiiFm1gwKCeIQEQMqjaSCtiKYc+IsAEKcQ985YTBEQRE5gEyUFHrhwzyM3zD++V9xPfKEDrcFs0A+dI597BnLIKKJCmOLolBaja1jcs4pBWttXVdjQZPWOoSIiCnlpmmqqiIkpXRd18wcfGim8+l0MZseNc1kMVv4wd/d3RW2qItqNpsfL09zYj+EqqxEYDqZnp6cNs1kpA6QVilzjFlpPZ/PRaSuSmO01kqAQwicGREFZJxJg4DjH+27Xis1m81zztv7+9vLy+A7pZBz8n2XUzSaqqoaZxgyc4hh37Zt2/Zdl2JERK2Nc6W1Rc683e5776+vb421J2enzrnMHFPebHZFUT57+izFULhivV6v1vdlVV5fXb58/uJkuXz39q0w55RiCMJ8tDhSRClGjXraTHOMcfD77bbd7XzX55BIUCFNJ9P9fm+Ndc4tl0vvfc58slyOheR1XeWclVLGWkZJzILIwJxHQy5z4hE9OUvO4+zmHEMchtB3w3a33W432+1mvOH94IPX/EEnaPi1ieJ8qL5nfCSR8UNbfIExBMfjQEXJ42AXzlkIjVJl6erKGqPlYSKaMcZY7b2PMZyfnvFIjAWJMSqllNK6IKVU9AMzh8SuqCbTRVHUSGq1Wt/drYbeHx1p5+z97d1Pf/pTpdV2uwPEo+Pls2dPjTEppbKqQgzDEOqqcUWhlPZDEuDdvntyetYF+Pkvv4pJxrTy49TzDwq3s51MYozb7YYUKa3azUbjtNCQgmiUj148jzFCCdbZSdMIFxJiHIZEOKYF+sAphWEIyumidP3glVYhJDKYWWLM/eCNNU+ePe2HYbPZXF9d92332ceffPbZZ00zm9TzX/3ql7UtmqaZz+b7dr9fbVJKq6vbyhYsTE3DMWmkoevTEPrIERBj1ohj2wKWzMxVXaXo7+7ulstjIhARrXXfDyElU5RGWWWNZ8kCkjNnjjkmPowSGwveRQDGHmPSceZsc0pGJApEm602QEJ/lhf2nVIbIzg4TmcdZQ0D5LG+USCPQ1UJhRklG02Fs2VVaq0EZLSUrLPBD0apqppZZ7u+18aMg81yilqrHHm/2xEIc1bK1M30eHmCivow7Nu2LMpPPvqoqEthuby8nB8ti6JyicnYoqp3Xa910lop46zSpqBu8NtdO5sttasK50rH/9pf+UtMf1xUzeXN6urmdrVagch4ZphZEQGikOHM690KAYhUTskVJoVe2QJzNJaePzljHocZS4yRU4SUvPchRADQxmiTOKecY8w5MVujiZSPyaIt63oaozamaZrZdD7Kg3/tr/6V58+fD32/2+/32/abX337i1/8/Isvvjg/OfXeX757T4jTuhm6HlmmVXM8n+/a9vL6uuu7HJNtJsa6mMN+s2OTnXN910vO4/Drruu6tjRGMXNZlILQDx6sc4VipVhyRhzp7illBjk0XRg57yzCkCIzA2dJ0RtjUvYpe+fcyL77LpD4X6OzUB4YaGPSH3HsZE1jNTkLZsB8aHMqo7giIK2wtNpaTQQPra9ZJAPSOFar77u+H2bTKeecY+y7TlKMfsgxphDCMJT1ZDpfNNMpILS33dD3w9AtT5aCYpxhlF9+9ep3f/d3yZqqqkTREOP58TEgDMOgUHfJV2WptI05tZuN1pVV+vmzp+9v1sYVtmhsUVprAbGsyourSx/CSIsZmZ79fmetNca2XQusJLESW1n9d//tf3M+qbuuK11htHLOkbPtdktKIQIppUhpbVVFoYfM8W61rqxFRYnh/u170jaltGv7sydPs0g/DLPZbDKZbFarb77+Ogz97e3mzTcX0+l0s95wyrPZrCrKuq5dUXz5q1+1+/0QQ84pxNTudl3fN3WdYhwSh7bLMXa+M8Zst5ucIiJYq0vn9vt9UVitVVlWpFWfsviQtNUqsFASzlk4jWGZETpjpbOklIURMSEGZvY+GWPGmtcYPXPWWv1mCfRI5YeRqgQjZwycKxLHlPpxZCozCqoHsuM4fTwpImv1pConk1ppIEAkUYhEGkBiDB7FOl3XVcqcc+77rtvtCKDdbnzfTaqamcuyIuumi9m+27ftvuvbfbs9PTlyhV6t7tmozbZ9d9d+/qMfn5+dVVU1XyxAZBzaoo3LnI0ri7JRRDlJVTsfYTa3F3dvz09PiPTri9uiKH7yk5+8e//Oh+C9L8qSRVJKEmM9mSxm891+H5NfLhfOqrpwlMPxrP7o2Vm/X9dPX5RlOfSd73tOcdjvnXOFtUPXAgt0SQB7P2AOBuFmtUKAmGW7b9fbXc7sQ66baT+E7Xb71asvh76rC7fb7b755qvF7OT07CzFMJ1OvPeA8Oz58/u7u5zz8uRkv9vP3JFSerdejyMDmHm/30+KarVeJx/c1DJzSil6P5tNb69vjhdzpVRVFV3X952fHR0b6xgxgWx3u5iFGYQFx6KVkbTLkrNwHoeJEUAOMSFA4VCpkEaXDTGlbTVOLPxXqa+D7CGAkR0tOfNDK0UCIBndeQaAPL4SIZTOOqvVSE46hLMP/Max6VBKYRhoLBsQlr7vfd83ZVG6OWSOQdp2H9vB1fV2s+mHjiWWpZnNq/X6nnnICWezRs+ehJSLulmeno55434YjDFFVaecjVHD0BNSWZREZK0ha377z/3W023/h3/0c/iDP3715auyKi+vrozRoznMzESUhX0YSqUWi8XTp0+PjmYc/ccvz6/efr2clc/PlxrTu3fvCHCs6EREVxQpBIVora3r+m7/zodhPj+6uXg7xME523fdertTppjO5srYHKO2xfXN7bs3315fX9elS1lt1neL6WQY+k8+Xd6ttnfr/uXz5ZOnT40xk+lkv9+XVfn+4n3MabqYF039q69erdab0+WJssaWxfmTJ9v1Ggyv1quyKHfbTbtviej29vbo6Kht26Io+s57H5Ynz7ZhWLd7tEUeR7AcfCB4lD0jg5BZAPKIMDiMr4S+H7wPXddb62JMfxaAvkvNE4DkzDGOM5A0jVWbAjCGvwkJECVpoqoq6qpUCgHH3pWPhOsxVMoh+JyiMTxanWVRbNfrHHzf7j/75NO6Km+uruvpbNuu312+sc68efvtv/Vv/O2+22mdnZOu3ZRlXZWT29Xqx0qFlIhZKYVaxZxJqbKqBuGYO6PAGEdIfev3Q6eLaVOVk6Y2Rm13WxaezWY5J0ZAIhZx1g0RlVIhhKq2gNK37bOnJy+ePX2+nBgIdzcXlqB+ejyeBGZOMSiBqqrC0JNSu+3WlZXRBpL/0Y9/cnP5bn1/r4199vxFSFw3U22LN29f+xD2u11Zlp988nH0PXGuy7Iq3Hof2jDMTs7+0//4P/vn/wJfvPjoL/zFH33+2eenT5/c3Nzshv7bt290Vfzsz//O757/9ddvXjttkEVCsqQYZN+t+74vnHPObTbr46N5IjRGX11dLRaLoqi9Dz4EJorMCJJYgAEzQGYZ580x53SwgVLikTA+znw1GpkZKQ1DdtYXZRl8/jMB9IghAcDRtct5JAcTIIOMPCF6EDaIKFVR1mWpUMaWwYfQ5IFOBCLsfeKcJhNblqWrqhT82zdv1ttNt9/FwX/08sVPf/LToOTnX/4yS7y8uv3xjz9TWhiCc9T3PobW5kEAQowp57brMnPhnHVWQCKzyrkLvqqb0jkQ8D46VwxhaPc7RldX5d/8m39rvet+8YtfVM5NZ1Pd7mNKlFLd1DAoiyAi/dD//I//+Ge//dPPPvnk7Ph4MXlSUJLQQQ5FURpjUgwhBM7JGisidV2v7u5yzk+fPLu8fLdvt5L98fHxbDrJmYeQbFGFlHdd33UDC8zm84t3O0ghDkNh1enpSV0W1Zxvd8P58+K/++/89T/9xatv3r293Vxf3Fz/5b/8l5vZpNnPlpKE8FdfvXr28iUjvH7/7vzk9ObqwpG+v70THg6tm8w4S1RPj2oA0FqtVvfLY6uLerPdclWQtQE4jyNXRIiRD6NSJedxEDTkzDnlGGOMmZmjorFjCdHIgnJt3f838cK+uzjzmAiTwyCXBwsJAWXEEJJCZ421VjhmyIfWQyP3XRiRRCTlFL13NvSqM5NJXddPnjx54wffdymly8vL5dFxMZ9st5uLy/eff/7Jxx+/DL5FYJHc7rcAmQjryQxRlNLNZLparQYfMnNZlopU23XKWmN0SomzlK4Ess5JkLRth+PFvL7Z/fiLLxTh7d2dj2Es+YZhqKoqg4R2r0UIcXl89Fs//clnn356vpy8OD0qVNqvbrr9pqoqUgoTVlVFCBICAIQYJ5NJVdXZmhgiC7etv9repxDm8/l0vrhfb99fXNqq+vTTz6aTeuj2VVW++eYy9d2T02PQJMJHi6N93u/27cuPPpnO5k/evr29vcuc371/f3Z29uTp08BZUKbz+e/909/723/n77x7/5608jEqq1xZ7Db79WZzenIyDt/KKR0dPdnv90qbEMK+bZvjE9K694NUlWRgYWBCHtPjkrM8NIIaM6mSMseYQkw58ZBziCGlhIBEZIypqk6PFYUPNYQfEMrGyE/isa8rA6aUd13noxhjIDOnVgmKKBIcJ/VxZhCZzqZV1YAgZzCEKEA82kGUcxqHhhBZ45yzbrfZWm0UgStcNWnevntzcnb6V3/3r2w227fvrgozGdpIgk4rjlA443tVqLIbsvT5k+Pjy5vrzd3ddNJM5hNtzHa9urvfFkbXVeVIQY6COimzZVSA4kxj9XZzXZXFZwt2Xxz/9ovpH/7i1c7nf/nHv0yCksF3viAzWZ4gCgH/9k9+9Od+6/OffvHCKR7adR97o/D4eGmQ4+CJFBmVYtwOQSs9ViPkLCa3x0+OfvXL2227i1lmi6WaTG42+z/5+c9z4o+eE4bNop53YDqrq7K0k4kty6EfNDsNZnl8vDw+ev3mzdmT85cff2zKsm5q0bQLw7PFy+dt/yd/+ounZ09+/PmPXr36+uNPP9ekhwSLxfTmelM2R82CXT1TBCUqIsjWrbtrVVXTpn51dcspHSsTA8ouKNIKkFkkSx5NaQZImOPYHFuyQIyx99mHkGKKSeWMMUqMMedUlhXtgoaHLBgcmr7id99h7A4MLJJZUv6uk/QBcPLdk8e7kUhrLQIj7+zDMYlwMIYeLqIsTETMuWkm6SqVZTmZTWNK+7a9vrnp+lRV1enpyXJ5nHJ66NI/MnJh6NsYh6Yu+/0uxWh1SYjOFQplLB/b73aAipVlNIxW6VSV1dB3ZVmGMMyaqp9PcNueHM/99f3x0fTNu6uqsAr5xfPnP/7xj+azSQzDpy+f/ujTjyRFOXClsipsWRWODmH38SBa54wxiDj8/+t60+a4siRLzN3vvW+NHUAAIBYuuVbW2l3TM6NZNNPqkcz0E/RBP1FmMpP1B5lpzMZqWtJ0dS1dVZm1ZCaZJJMEsQQQ69vu4q4PNwJEVreehYFBEAgCeA53v8ePn9N1XduSlixNDw+PekXhnNOkrq6u/u5nPzMm+eFnP8jzdLw3qarNb3/zm6vr62G/X5bDw+nh3WzWNO201+ubDAQW83mSmNPTs6qqR+PRcDRarJZ1Ve3vTQ6PDv/4hz/893/zP3zz9k2apCgwHA7X683ewX6WoNY6cDjYG3/91fLs/NHl5VVrXX9QZmkyPTw0iWnaLlrIe+cRiEUkSBAWz8Gx98G5YL3jIF7EOe+ctdY5H7rWRvJWLGnWLgEioUy2w7P4B8IuhkAgQoVBfAiddT6wCMQixnL/qe+HG0qR0SbyIBX9MxLBD6/gfdO1tKGDg/3xeLxY3B1Mp6kxr15/yyFMJgfrTXVwcHBwcCDSKUXOxehlAbDWVutF0e/Z4BGxaVp0igCzLDdaGU1aJ86LFbKMLohSalNt2Lk4r2hXm3azuruZHR/sdS5Y6/ZGoz99+eW/+au/YuHPnp1rwMne6GAyMsTLu5uT4/3ad+O9YVkWECwxROmCSBaI4n9KKa0U5bnzbdM1ANLr90HEtp1z7smTJ955IkrT7PW33zZ1M57sIdLd7e2lvW47O+j1z8/Pp4eHgEnXtY+mR4v53B1M8yTRgNVqrQXrzSYrytPTk3VT/91//a8//ulfJknqXXj65PHrb16PhsOuXn/8yUdd123Wq5PT07LXe3f5bry/nyTGezsYjJQ2bdNqrbU2XWcRiRk43lYfnHWeg7XO++3GdOd8a13XWWddXTt5oEkff2d03AB7LzH+0FFqhx8ys/XeWuf9VicxSFzTvK9+MZpEKRXBZWttniVx1vYg6XzHMxEQnXPRAqEcDNIsc84WZakIsyQdDAeL1fJgupcY3dlWtupXMW4ZwC0X14NhKQC+61jp6NggGpOYE3SiDIhl70WBCt5rUo1vgKVr2s1yPru+KLOSKWQaHh1M5qvNh49Pxr00ONdTWK9WlgKnSEVSJETAg1GPgR13RWJMQACIHWUUKM7zPHav1tmuq7xzRCTMbdu++uZlXdePjk96vTK4oI3KsjzPC/ah7bqiLKcHU0JczBfr1er585dp2hsOB+ePTjTS8nauFJ0cP1pvNhfvLlKtQ10Vvd75+em3b989/9NX//bf/du3b96OhuP+Dz6r1lVrsK7rfr/fNFVru5yL/cPjtm3qzhqjSRtnXQjBWp8k4pwHoC2TQ8R731kbfIj5JjBb5zvnu852nXXeWxse1qutgORuOIoP/227JA8AW9dN4cDOBx94KxwUWWU7GZj3XRSRUhTVpeWfJB75rgGZUiovirJXrjdrEC77Pe9smmVlmSdJul6tE6OPj48CW+edcBeZtAKMID7Yen3TLz5eNG61XByePBaixWrVdR1LEAmV3zAQ6syYTCmT5b2721uFdLdcOOucbYa9ktJ83YZxr8xcWM1vT6eT6bhHCFffvhiX/XZpNxlo6O9Px+vlXd5LtaGqsa6jniQQT2pNE0LI87zrOmttFAydL2cHk73pdLpaLL74/PNXL18eHR4hofd+NByOh+V6lWw2m7u7uTbJp5988u3r123TDgbD9Xq1Wq5GA/1mtXLOTadT571JkquLd5dXV2Wv1ETz5XzTVNOjo+neJAgsbm/vbmaXF5ePHz8dDHsQ2q6Dfr+vjSKjiBQTVW0bgEIQgdAFp5Vu2wqAhIHZ78xSYrWKAuDBee8Cd9Y57zvnWme989GdAHYD020ARQTpPglFu43o2ywicdbRWWetsztpgcDIEWFGYkB2LgQGRK21QqzrpkxULysJkdk/7Hvi5DIK7iBiEC56pUmSICwhKG1Qq16/lyZmPp8Tmf2DvaiqaYxCSL3rqs2K2StNJFSvZ3e3F0m59/zLL/vDfZXkzNDv99tmc2cXWkDpNC0NoE+LYnZzk5rk8vpakfLOZllWZMX1fKnR5Jmx1p6fHvXL0hg1Gg6lsSmppmvazdoVxnatACultFarzdIjGcVEKkrVWmujbmQ8vxhjPnj2wWa9btt2uVo1TXN0eFSWZb/XK4oiEqii0sNqtU7T/Ha+sC6cnZ1b61gkOGnbNkmSz3/7+aOzkzilGk3GStFgMCiKQsC2bbtaLJIsPxiO/vTF7/uD4Wg0+Ief/7ey33t2dpJkpqo3OknL/rCqq9b5unPW+7zIvfOtdYo8ANrOiex0nphDYO9DZ12ck1gXPAszOBc655ijEpB/mHvipflBHQKAOLwQ4R1yKCHKiofALAzAQiwsgvfj2njFsCCi2B3F7KOU3lpw7WxZHpYwJFBKCYKweO/rpnEc3ly8PXn0qNfv284SYQieMMRM573zwSNEBY0goa7Xd73+fvD+53//ix/95b9IkuT2bmE0F1lCQdI0ZWZDqtpsFvN5WfSKLEfhq4u3in3TtErr6fT49cV1r18CIAeXmywz1DXcOY8KBsOB1nq92SiN3oUkNWXRRw7tpr3/iRljuq4riqIoCmMMALTdRiE+f/78+VdfjcdjYcnSNMtzAGi7ztp2OOzf3i4ur25++pd/eXnx7vzJU2D++g9/ctamJiuS9G4xX27WZjZ7dPLo9vLS5Kk2JohY7zZN5a0npF5ZbpaLfp4bhcfTQ2b++psXv/r1r8fj8dn5WQqIRCbNyDSstLUOfQgBgo9rEBTERwZOCBzH7z4EF3wI7Dy7wCGwC751ztoQa9Q/CxnqbTO8iyHeHsolFkYX2Pvgt9AAsGDss6PmL+6qHhLtXFS1IgVx4iqstXkYQPcZKF6CQkQg4jlY7513WZrWzld1MxwOEDEi6wIswj7YrmudcwCgFCkKwq5r1wC+zPO316vff/77Zx99mOYZg0WtxbYkgIBNVa+qFgWyJKmtBZGzk1MOrmm6wWT/4vp2NJnM7uaPHh3fza4VQLPZ5GUJgEli0rJMixRJtFFEBsGASKITk6PzXkSSJNFai8h4PO66ro3iCW1tu65t2/l8PhwOh/1B13Vt0xCRJsXsWWRdbW5ms7btDqZT29nXr15v1hvn3ay+lSDn5+cHR4eAUHXt/vEhIuosCcCMMBgOfOe6uk2Uuluu47Le7e3taDz6Uf9Hl9++upvdvXr9WplkenRksgxVAkpbhq7pMLImdpOoOKyIuHMIIbC4EJz31oXYRbfOdp133omgIlJ/ZvIcKa0hfDeAgosnsihr13kfmEXE72zFtsxRgMASzTVEQEUVOK2VVvfsiPvc9v93EIvEgS3QqHAymQRv9yYTpajrLETGBEeRT3bOdl0bghcEpZRGQICu3dSb1XAw9ZD/4h8/f/Xtm//4n/69SbBrOxNCVVdZqdebJgR0nZvd3KSJ6WWZQthUnOTl1fVtELi+ua277u3Fu7vrq88++7RMtEozx1AUmXdWp1mSGgAOQTabptqs+3k67eWB2XvfdV0Uj766uhKRNE3n83ln66auX79+fXR8HEJAxKIoXGe9c13XjUbDECTN8rPzx6/fvP3+9z6z1psk/fCTT7zz69WKkLquOzg+NEavq+r49LTXKz0HRNJZmpkkN8nidm6bVpzrOjspeyG4tq37o8nTZ0+d7RxLmqWL5cLYonXOBu6ctz5ojkrYEPXEItrCAWIS8sKWQwhsrXORXhYrsyAhAZGC73LFmGMG+k4Ns85umdXMIhAkat0CAwjgDgTa+rcIy06NapuDlNK4o6TFngB3tvO7Ekb38dsGq0klWpNSxhgJ3iSJ0aquK47L5xIEUCAAcgjeeRvYIZAi0iR5mm3qajGfP/7ow9ly3uv1fv3rf1xV83/37/9lv5fv50Vwbr1cKEpR6wYsIjRNfXt1+e7tG1Gq83x5c3s9W1zObgeDweXl9XJ+k2j68NnTwhid5TrLhOhuuSLCk+Mj2zXeeWd55ar1zbs0zdIkaupu4e/lchnNhwKHy8t36/XaKLU3GRNRlFYhIpNlLJKm6d7eXlEUy/nSOlvXtbU2z/Kusywym8+Gw+FgNNRGf/rDH5Rl2XRtXdfaGKWobZbc2X6/BzZcrFaz2zuT5/uPjhr2jW1ygJOTk6vZrQ9eZ/mmqjd103audc5abwDM9ryktr/kIQ4uhJlDdKQOwXnvfAjCEDUDBKOFBjj3z5SwOrj7RCECzgcR2VI1BGLEbumHIAzMW/0XAJCAGAiAOUUwgClGBQwB5A6CiFOtNcakSaJ0dAmP1opRFA1SNFs5RkBFBlXCIXSOURcQAnsngaUDoxJrfb0StklGAxQ2ZJQKgKKImmbTdktQ3ehgpPuD//3/+n9vXDoaDf7lpx/tP3pUeV+USWhcWHG3mc+uZy/ffmslvPn2rXX+4ubGCj86Ofn7X/6u6eygLP6P//Nn3//ezenZyWg8PNjfP5zuZUlarebr2TXbRqOUIqFrtVhDFMDP2yrrlYu7eZbn6/W8s1WvLH/3669fvXr19MnTPM8kEGhVFuXSLpI0ybKsrpapaOGQaNXrZz/7u//y45/8KBtny3aVD1Nicz7+cP9gv+vao9Oz4Xjy4uU3ddOMxuPlcoWEk7K3qKrmavH6m68TrXWibxdzS3T25CkL6r0jwDvdgjQ1O6cDu3Vll5V0gqyDeMGo1RNEMN7ObQx5YRRWEEKcKrBwCD4gQqqFSAg4AN1jMYgUNYB0FzxsSc0AgLGgCTPvHHq27GeRHeKzU5oCYaQARCCEoEiMltwoRSAQLAfw4pUohQIGMfoI329XCyBoVLKjNsruH1jAewlBFIN4Digc0LWhbQJ70pQSBI1KkRJ2SqkQXNtuhNmHrjfo7x0cvnxzHV5dvvrji49/+IPL+e3h0eHvfv6bo2Lwow+/9+bbN68uL/rT/Zdfv9Wk1tXGAd/QzXyx8Z2F1mf76S//4bfvLq6d637605/8keAH3/84NdjWtZYAJESYZYnv2rpZQkiSLGm6LrC4VdXvTV69eFlvKttYFGzq5tHxoyRJvPdZllnronHR/O5mubgbDAdOws3ybngwev7mm9FwuH8wni/mRPrs/OzzLz7/3ve+l2XZH/70R23MeG+SZVmaZ1qberFRSVb2cbXZDPrlo7MTpZPWdjc3s95gqFglvWG2qVzbSgBgdm1rm449CCgGjlqXIsKMMYZC2J7FggQXjRsBFJFWlGdJNGqJ+J3taMv8gojCGwDQzrttetk+UESEMa6agWybrvdw4YOCF5cIo42m0SbRRhsVDRXZeSfARkd6djwoxnXp3VgDcWe0EN+yiOxOlRz3Fl0ACQ6lbaJShRApit8QBABAkWC7rq4SlXNXT0c99cmH/+X//vvj45O0t//rX/4KM/P65avF9bIK12ej6Wq+YBfurm+mvZFtu6Q3vr6b3bx+l4Mw6cwjVJ1t66VOyKjnf/hqNrsmkdOTw3Wmzx5NN8HmOqlc1SuMhiQgBSRBnSZpu2m/+uPb3/7q9/PZ3X/4jz894P3BYOCcK8sy8krTNL27u7PWHhxML294tll3wXUa+0fTttocTA/r+WKYlKPpQZLop0+fHB0dvr14a7u27ZpHp8fr9cYk5t3Fm9m7m48+fHZ7d6u1ctZmaVb0+vtZaQOvVyvoL/Yme11R1EvlhTdVU9ddYzvrkVGJWBQvDNvVwbi0tWVRAIfgnFWKtFZJYkhRYtTOYQaRUErN0ZDFh2jRDADadm53FzHiQMJ0T0iMTcjDwHnQLwGLIDIhak3GaKPVrjuKZuEYWLaPIEQispVtiE+IeAdB3UPZHJfcQpDgg7OeQ0DwzaZpW6sRMpMoDYRCABIAmb1vbb1KeuZgVJLyXecO+tkg00brd+9mg73RerVMAp49elyt1imZwqTBqKSXrN2yDW6c94rgN80GAMusyEFPBgfrph31p82ybVbt7dXdq29e9QfZ5ZOz1tY/+smPyjK/s8s0LwAVon777Zv/52c/f/PNuyfHxyeHp+Qz7/x0etjr9bTWzrm6rruu22w2vV7v5cuXl9cX05PDJNdZbhLfffPiRalNENkbTcJyU2pTdZZDIMSryysBODo+upvdvr24ODicvnnz5ubt5eXFm6ODvdSYs9NTQqg3m0ywHE4GA9N6p5DzLCGtBGldNeu6qesuCIIywg7E85Ystt2rwZ2jChIkJvqAaWMMESLJNgMpVKTSNI99bRzdRM0hbX1Eh1BYQKJjL4sgS/SNF9iZ9MAW93kQRVutRVJE0QLS2jZJjDaUGK00boklzEFEyf0kVCSKUcfKtX09jJNaFuGYaoNYL+yDsK9a6zqfp1qUIq0BGIGQOxQO3rm2Goz2+hl5T10//+DkmHT26tWbQZl569uqefb0w/3hxDAJ6cPxwbyphqMsJV3ZbjgZO+DXb76tqnpvspcnCXiWlqTxi9UCBdtVl+XFxcX17Wrzs//2i//lf5XHj8+6agWABPirX/z6j5//aTVf7/Xzn/7gsxDap09OsozOz8+jo+Dt7a21djAYaK2fP3/OzKTIgnQgQcKLt9/+8cXXTw+PnhwcD4o+d5Kp5MXbV977zXq9tzdRWqVpUm02ivCPv//99dX1px9+nBi9ms/29iZNU+1NxsJ8ezsbTPbGo2ELql4tEk1Ga0DqHNdt11oroCjOE3gL/8RDEggq2h6cjdFFkkfJREWEBKSiyEusYsoYQSBEAkwiyAIC2oWt96owAKCCEEHuGDQYj1/fPfrDe5IhRrZoYrRRMU61psj1DMIEiljABSbnecvJfw9JK0UP4xEAmMUHjqdIDuIDdjZ429kAgEZABVGekRkCs2YSAWRum8p1daLTIiVy7cfnpze3q8lwdFutTKIfffrZp48/oGXbp1RSDgRFWSBTfzBsvKPE1Lb1iBcXFwdHR2WW11WVNh2HEJJ8/2Cvn/bqrk4onx6eTI/ezNf1r/72P1+/mRsFk0Hvm69fUmgOJ/mz8+Oumx+fHRe5EzD3driIGI30ImJUbarjs1MrIorulsu3l1dXN7MeGv80pGm6CbJerQiBENqmOj05ttbN7m6VJgm+LPLjo2mcQGvE8WhUb1ZNU00Pj/pDKrIUESlYkhCcECnnZbHZtC4IkA+BBKLA3HZyEe9vtFPRpDVpoxNjIrq7CxpUikwST0CkNOMDgkWU79Q79VXedj9AILzLMLgNq13fEuMnNsOEhChKgVFKK4UICiHRBpUgioTAKGBSBmQAF5ghEHJs4oMAEbKEKEsd8xsCBGbngvPB+xAsWMdN523rgEErHRA9I3hhFvSSIAUWRtV13Wa97A0PCqM1MAEUiSlyupjdYOBP/sXHB+Wo31epBfDsgC2IQxSi1ls0OmnrjllIHRwdjQej5XzOrQ1Nm6EyoELdvnvzJiSgi7TeVF9//TIthmenR221Cq765NnTrro9GGV7o7zsSdYLpKvR+PFmswGA1WoVBUnevXu3Xq8//fTT1XK56ToyGQS4u5mBI7cRWzbffP3iQBWjwRA17Sv48quv7so8KtrkWTab3Rij94rxi+fzjMyzx+ezq3dv33x7sDfx1jZNnRV9o9R6tdIGE5NUwSJi69x6U1vHQcD7ABBAdpSYbRoApUhrMokyRitFhKJIKUKtKUIuxugkMYlJlCZSuxXCbRgAAGh+0ACB4M4WI8YK4w5ujjEkO0PM+4sAEYRAdvJVHPeAEAi25s54H/FBhACACJgBSGI7950OPTbRIIIuhMaF1gbrAoSQaFGk1Zb+hiAKWLvAXpC9b9vm8Qfjpoa9cbtZ26vLO63Kk+NTK/54ejxJyj3KUgsY2LFYgo1zjGA5qMT0bKuV6ee9R8fHeZplKuWu8XU1LIvNak0sZ9PDlW36Jre1vZ0tT04Hs6vLjz84f/V8Jlom/WIySAf9tFcmJhGTEBFt1tW9IfVms9lsNt5759yzZ8/mytfOhsYVKktd2DN6lJar+fKbb19/8uRZP+t/dPBsuVqsFnM6O9UKiYx3dry3Nz2cNlXVVe2mWt/MrptqpSBkWQ6EWWuTrNjU9f7+CBVG38qm6TrHNrD1wXsf3VAAEHf+glFgTmulowWPUop0bKKVimlJEZHRyujtJOo+8nZ5BHQ8roOwCIkIIkukkIkIkBKgqGmGW0/1HVUxfimwk7hHxC23cVviQAAkCAKDEmRBYGDmKCuzE5dx32nJd46+LBwtCkJAzxgCCAsxOC9xEUKYgcEHcgGASKy/XS6c86Ph/tEh1T3x3tiZXdf1dHoogZ+cP8G7qkgQGRyzQ0naLuYynWc922Hnxmkx3ZtqpIFKm2pVa8AyNxIIcE8P166pJDw9PioOxqePDtvbz5e33yRQHYxHvl0pMBpVluZJ0svLHACTJMnzvCzLmIoAIDpUjoaj681N1baToqeVN42bZmXBylbdN69fD/f3BvsTAfmLH/94dnuriIoiv7q+rpv6dz/7/OTk5C9+/BMI8vrFC9t2EMQ556wbDEfRlSdNU2IPnoxKSNGmbmwIgmp3v0QEEKKEJCoibVSSaK0pSYwxWu2iSGsVoydN06jpoxQhIeGfEaAFALTfHrfi+h9AlPbYnucDRP3yHQ3jPu7eZyDEWLMJtyOWKASMEb9mJsQIMyBud4cfQEr3AKYAQIRr49eCAISKlCJSqDQBc+wAGRFBmIGRA3aOdYLMvF4s7+Z3+/unxrRFrsqi792V9+HF8+f/41//p9Ozs7vqZaE1sngOFkGJRiQPkpZFm1q7qjHFw/5Ek5I8VINiXWfdukLniKVzNi0GOfIPv/fZFy+e380uk2QBos5Ph4ejvq2oXxT9Yljmk9SMjM6adZOnWQihqqubm5uqrpIkKYuiLIr53d3e6bS+fvfu7cVEZR9MT2YOyrzoxHcgz9+9Xa4WP3r81KSJQvG+q+7Wk8loMPzh3t7YO/eb3/5jNV/Xm/X+eLColqv53CTJZrMe7x1oo3u9PnAt7JXOFKmmbVlAGaO9BxGUAIEQSBlljDJakUKtdyfoRGvSBg0ppTWSUkbrIs8QZGurAhjVq+6v7ShDAcm9/TzHO4+wE3nBiD/vMhAhIkanuig4jcB0r/uKJEAiBILIQABIW9jKMyOgihmUAQUQBTCEB8d4YAYQ2u23gkhgYEFhQkLNHJywYiIgDBg4uCBeFHhmJnZ4+fZmerAyRiUmC2K/evEq7/cSk5VZ2Ve5S8vcI7I4YY1gQBMqUKRTk+mkzntKqUnR16SC8wUkZZbZdP14fyouzOer2vkquD3tv/zidz0uxagiTY+GeakD9JPxuN8fD3rDPmZph1gHXi0WobPr+bLZNEaZ8XQv6xXWkNOQeba3q9//6nf/81//zarqPBKmeb1aqCxxDi6u77pVbdJ0NBoqpdM8u3791iQJmrxtvcl6xUjVzq2tTXq9sizXy+XL16+A6AwYgqUEk7QkHftIQdQKlA+tABqTMrEAoiEyRJqIUBllEk2ERKS03s40jdbbCKMHAfR+MWubOxQBgE5QcwTwOPJZ3/czALjTPowjLEGK/pj3PDMlQQFvlfCQRIgBMSDGrETAIMCMHFAQSCcSbd6AQICY4Z5XLYigAJG3GCa44Bx7L+IRCBUgoKggWgVCr1xoGnHIGHyAAJqK5e3ad2FvcnBxPaMknDx+SlrnRbGcLWaX1wUlaWS/kQhJMEKk4iDdAA6yQmtd6ISUqq0zkJTUL3Ma5MY3rq9Gq7Vducab+qw3yL0XKfqUZAFHvaQok3KQDQ/7kKsOnTK5ZGndNKlO8rxnVJoXWZIVXptaq6v1evByXb25zlEjEhQ5Dgat1lT0ACChjIq8koBO6kXlnIue6Ig4HAyzrOfasPLL808+QuFU681y8fTRo2a9st5uVnMFvjg4YqUF1O3doqobrRMRQlSAGkkxWFAiSpjYIxhSJtEmMcIBAJRWW9OiRCdZoghjKUGKHB+ILuD3R6p4+NeoCIERorziVoFjJzC129OA+0/Eh6f6XT8LO3sx2S6Hva+RcVKBggAMwlG/Kn4OMIBgpFUjAAnIvaRVlHKIGBcASYxkEkFkFuDgQmidIxHkgMEjsPcsAlmWp0nqQjh5dDRfLiej4e3tbDaePentQ3TTQyEAreLOtgRmDi6eNbQmpVSWpdaxUcho66oyqAeDnpfGtSwFPf3g6bqd7R0MkH0v08NRfzjsDydD0ytX1jVVg8av58t6Xamyj6nSZZb0eypNPbMKePPi7cubm+lodHBwAACDfn92cxO8z7PMOTeZjFerpbMBdrcseM8htG27mM9Ho3GvVwDQu8ursij2J5O8N/AiB8enk0E/zzKtqXGu7laPzg8mk4lSyMEJqDQ1BAokcFBAEMk1avdHpGSpeJG6f0KE0aKdKLo34z0l6J5PAQCaYrLY7i9HqQrcBVC0X+H7ITrid7RgYAcu7nqmbZ+2LYUMUTgRAFABMgBjjM44oyWOLdMWVhRBENmtfaBAtI3RiB4iIIrASB48s9gAPiDFiU6QaCDTdp2PDTiHerMc9MvgOm/b0aDP1ipUQBIQEcAoHUnZwgIsRmujTUREE2NQHBEJpnVbaaI8TcuC2YgayOnp8eWsO9wbe2eNwdGwNxwPx3vjddsqAHHt5dt3bGvnfZFnSV4kox6kGeV5fTu/vnx9881lcNVHTx4vl6vlcqm1Hg6Hs9ksMvMRSViSJJHILtfae1/XdZIkWZYxh7v5/ODoke3atmlu7ub7o7Hn8Prt1XyxPj46KrKstu2mbiyrYrD/F3/5k3/45W+ur29BIEkNMMbx1/aQpUgpZbTRWguj1lprrSgi0UZrvTW3RIgRQRQVWjDif/fBpDGas8QNngg976xYdnknEuPjCOI7GUi25/9t070LAgQhYBREFCSFQlE4MWIEtFPKx91L4G5BCECAhXZBpBANYAA0UVAv5kYvEtj5gKCMIEEAIEAS6/nN5eXR+RMr4eBw6kjfLZevXr/8/n/4m16eJt4TAAgQCAJE1IO3WZN1HMt5LwAKRABJQOlE5TkweNcZRaVJTI/6/XTTZFmiTZFlZd4f9rKiXLf+4nLedDYAaUxXy0vHoe73ODEdQdU2q9ouru9mby4TR/3J/tXV9d7eHhFVVTUcDjebTQwX5rBNwyJxUd9aG8/PTdMMB4Ob2ax2bjKeHJ+crZaLZdUUeVq74NYN6IUmpUhIae9C01RHR9OPPv7AObvZVAASgt+6MG9TDUX+1n0AqbheqfUuC8VYeZiB1INCtDvGx4YaI8sC6EEBgvtYiZVLvlO7dh/BW32g2FfFRfkd5y12HEqYhJExItEEgsL3Oe2+zu0UigEENGBsvQlEEZqIRzGIC4EZRIhJEyKgRyQSJcG5YK9ms8Vm0x8Ms3KUFPin//yH5d3NB8/Og+uEAYQIt78xgoDAKIzACiFwYA+sEAgQUSMSi0YwaeY721lLpBODxgCI7/ezwaBgUKbIG8HFcj2bL66ubtbrul/0yyIvsrKTkKaZB2i8q+tufjOHyrrWTvKBs3Xrqu9///v9fv/LL7+s63o0GkVSbEw5ZDQzR55a5FzHGNpUFSIOBsPFYhkCD3q9/ekeB1+Ug9ViWVuf58l4OKirTZqmQdj77qOPnrRt/c2Ll03VxK4lnoOIKCYbRQoRtzFF9wXsPoDkz0sYABLuti62ARTVOoAIBXcF6YFlwsNowe2gFKJoKwIyi3PeOy2AiIqZcWs7JnGOC4IiGEf7sSPDnd0mA+3+BwQghhCpt0BIhK7x3rKAAkIRLwDMwXUevNeo0SgINuqhkxAqZYO/vZ1vqupwOJQurJc3++PB8vbOdS2rQjxAUIo0KoVaWXZxTIciidbBOeAQe3th0aAUAAQGDolC0OiJGrGkVNtt+oMyKdOOpSW8Xa82rUNKrMmp0FaUW3cZKgYYjPbuqo0E6NpOA6w2VZkki/nd/uNxMZgURbFYLJqmGY/HIrJer4uiUEo750bDQdu21lrnnPdeax29c40xUb4tOihwkV/fXEuQs7PTrOC6rhno9nYxHAysdfvH+0mvcIE/+vhZ2zYXb955pYHARz1fxFiqYiMco+c+u0Tzw4clLAaQ8PsG6D4m9O40DruQQtiWKYGHFMbt5/KDtASwbZlRRNiHQNsmO45IAVGEEBGEhAnVVh4PcQsIbP/rXTlDIIEIQ3MIkadC26UiUQASJHhBjslMSEBhZEwjCwcXIHTd85cvzz74ALXs73VIT4VDUy1VMVKEGgEjPwUCAd9TWJg5M4aINJFE0FaMQdoK1SJ6YKPAorTtuu0207NHSZGTTm42zVXTvHj7zrMGx/PL2SdPPuiadn+QEuF607W1a5dVEuBmdgfsm+AOjibjyUilKkmS9XqtlBKRbf+hFHNIkySWNhHxPgo6Oa3vF4gl2DbRZEjYW4Wq6ppXr17tH0yVMcokGMB2vrm7a4KdHO6Xw+Hp2aFzTgK/e3vpRYwxIkKEuJtL4nuW+u7J+3c+CKBoRIcPY2jbAyGAgEJg2dW1+yb6QbPy3maMERGQt+ASkLBwYO85qBDpZLArRSIYz04gCIwBdihATGb4EJiKtmQSNwS2PEuhABwEgyCD+AA+gLAwgEIkiCsgkeVEaZ455svr67pt+4Nxr6wWC3lyfnJzdfm96bkm0kTAsGXqq9hQCjIDs1FKKx1Xt4J3SggVEopCICRIqQ6hLLM/XnxVlmmSa9VPN52fh3ZJ/IfLqxffXCSo/vpf/ZuvL96tZrejEvcm4050QmiXNYSwub2dTvf3JuPReFwUWa9Xdl0HAFprIkqSJEmSKPCYpCkzt22bZdnD7Zldw8DiO5MXCgW8Qw2DfmGt97ZLjRFmo9Plcv3o6SNK0XtXllmS5sELu+A6d7tYamOC94pg1wrtdh4U/dMSRlt7+JiBCET9M6ew99AQigi8H1ZEc0N5f38BHozhth8X3Xs5BPHeB0VEsjOejxgkxlCMwDTE5pg4WrTCluG9fen4Lt7q9XEIDzhu0Z47iGORIAzRHFVF5JGBCFnrlINfbTa/++KLf/2v/7uT46MQ/OvXb4O1ZZ4ZGzRC2M5BQGIq3do1xEkOExAhaiLyIoFJgSKlFaKgx9AGu7i7HRyUnp1oXK7rN/PZGnQ+3X/797/tDwY/++WvVhfX0+Ho8rY93HQK0lBXFLirN589+2B4MIRU6UyXZZlo0zRNkiTxJ2mSJBaUwBzZZ7GbjeMz2DEAAVCE2XVJr0BkDk4jJMaYLK0267LoheApmCRJ6qreH05MZkRCkuo8T46Pjjaryn/zynpPRAS8jZz3C1dEpKJwL9J2BeO7TTQR6ocn+Vj1tvkqtieIhBhVSwmRonn49hHfgzvv53jywVivhEG8sOfAEL1XYEsjggf3RyCwBGFmCRxCpBYIiaAwMseNMwjMfrtLxNHAIYh4AR8kbMUfwQt7jq8jISokCfogIYjr7B+++MNyvkyz9MmzZx98+Mx6dzO/1XnikUkBkShmAomy6RolISRmZA8cFIomVApQggjHKBcFaZnerW4xUULEStUY3s5nt5t11ivPnj4+/fi8Wq7fvHlng7u8uuy6djDsv3796vrdRZlm56dnj8/Pe2UZvO33yzzPnfU+hCRJBoOB914hKiJFBMxGadvZJDI7BZxzkQAcB5LAIsyGiJCC9zHZp2ky6PUIYdTvpanJ8myzWa+WK62UtVaTIlKAMj083N+fpInSClW08RHYklWBdkGEREjbuHl4xSi7f66U0oq0Iq21FIwC214aIkwcC0xkbe0a6zjAol0CAkQS6FBVpE1IklZBQHEgCkVDSAgAJTAiEUaomoSUlm0WCACYhixOYGND7iR4Zud8Z70PoQN0cTGDWSSwj9vSBKSCcPCuk6AiIYFSJQbEs6cs0fVt9e7lxWjvPC97e4/opJNvlte9vZHq2qGYftDSNhvAQKQBNCMhRuDAto0Yxc4mSoMEFhGTrrjlFFwK73gm+z0Z5ksN//DylQ+cjUf9NOmR+Z/+4nv/2++/TcUe72WJMh/sj4uwXITlaG+s+zg8HBMRhnA+2tNKd43Nil7btmli2rZVSLZtDKEKDoC1NrlJuq4zqFrnc5XUTZ2mWQiBgohnlZU2EGECQMEn66XtD8ze3mi1ntfVfFD2qmYNCMEHIwYsJZTlqdXZJu0nZyejXDc3162zcbsPIBAACantPSVGYiTZmZzGckQRhWP2iIoIY5rWyoiARkICiFDv9hAEuB204y5h7XhA9/VrVwgJMUFUwsQBhYA9oAArDABIpEnvsppCVBwk8uljf+W21r7bditI8HGzBDAgykPmyq7Uvf97HNOJMAfP4iWYuKZIGNj/6le/PP7g0145GAyHH3700W9+/ouL66uPp6e8tk3bAQTHCCJeRML2h6S0jnlZKQWKPPt+vycaUoUtuZvlDSM9/vBp0PCr53+YvbsKnnvFUJXQWddUzWefPMqAR0WeED2ZHs5vZ6enp8fHx4PBILbJeZ7H81R8m6ZJ8F4pAmMQUGuNhCiyWq2apimKIq5LI2IUAAGAtu2SNHXOiQgp1CpJkoyImqa6uKjPz0+Wq8V6vS56PeucdW693pyMxkmS9Hpl1TaojN0sJ5MJormdLZ1lrc19nYp16J5UAzsOz8OWecfouG+9EQA1EQnuhqmAHHGabRgB4T3j6z1v8AGOZAg1IYEQBwyAHoBZgBEYlULSCiU2owoEA+/a6xhAHKJWy7bJZmYWL8KMzMSx9O2kZN5/J0TI26FHEGbPwAElqESFENCxSZLrm5uvv/zyk4+/dzef9wb9T37w/bdfvVyN25O9SRPmzJzqFATBB6KdMqBIPMEaAJMlkFDQ2LFLe6n3vmN//OQsGHx99Wa2mIN1ZVK4uv3j7754fPr48eGjiUpv31wUiXl2dq7YKcLpdBoF7b33SqmILwOAVqrt2sSkUSglTVOUkKYpewcAdV2JSJ7ny+Uyfr8RYxSRECpjjHWWkKIKitbaOa9J3S1meZE8ffrk7etvEXEymdTWNk0T4YDdoZ1NYsqiAFHVpgu+/W6Riivt8jCG8M8ven9iI1JKI6JWSm1Tz3Yw/p0MRLtYuX/R72QgMISR/iEs4IUIUDGRADJyEPaMKKhi7xTdqFAgzjvACu+2eQAQorTjFlREFRPETrjoQQBtv57YAET+vUMOIB44BI9GU2D+3e8+/+lf/avRZLJeV6bIjp+eXc7viHE0LNKyh5VlGxijKntAEaUUAMQE3XoniZLUsA9Xi7u5Xff2J60Jv/zitxfz6+v5jMVdvrsllU73j6G1H5w+vkET7lYHw+Gk11+t7k5PT3u9nvceAPI8jz/xEEKWZQwQOApXUGIMgnDgLE2bygMAIvX7RTzexy47otJRkzAEn2d5ZLnE25EkRoSm02lTNxcXF8fHx6+//TbNsn6/r43prK3rWukkphOtlCPK8nxvsoewsDbcn+F3h6ftLY5yRw8hn/g0fnh8v9Yat9IZ7yGBPwtKevDx+P7ZvdIPKsIEQYFoZhUCvn8wBU9dy7Zj24X4NgQMgXYP5QLYIO8fnm0Ax+iFgtCOgP/w8LcrXhC5JxJEQhSF935TVwzgONzcztab9auXL//2b/+WjKLUWAnFaDA8PFj6duM7l5LK87Qo8rxIsyxLU6RIptv+ANJeOXh0SLlRRRo0YqovF7fLpsI8+eLrL5+/fpkKnR0dH44m/TTrp0U1X0xH40cHh+OyD9ZPxpPhcAgA0RIkz/MYEMycJAkRplnGIiGEoigiZWqL+4rEzjoWryRJ4hkphEBEWZb5EPI8i2OsuB2hlLLOElFRFlVVWWvPzs7quh70B0rF7XeOh3KjdZblsZhOpwej0fg+RHZxAPfc0fsSdn/901oWX/b/A7/Se4nsxBxBAAAAAElFTkSuQmCC\n",
37
+ "text/plain": [
38
+ "PILImage mode=RGB size=192x108"
39
+ ]
40
+ },
41
+ "execution_count": 3,
42
+ "metadata": {},
43
+ "output_type": "execute_result"
44
+ }
45
+ ],
46
+ "source": [
47
+ "im = PILImage.create('Dog.jpg')\n",
48
+ "im.thumbnail((192,192))\n",
49
+ "im"
50
+ ]
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": 4,
55
+ "id": "8aa2e243",
56
+ "metadata": {},
57
+ "outputs": [],
58
+ "source": [
59
+ "#|export\n",
60
+ "learn = load_learner('model.pkl')"
61
+ ]
62
+ },
63
+ {
64
+ "cell_type": "code",
65
+ "execution_count": 5,
66
+ "id": "ec967332",
67
+ "metadata": {},
68
+ "outputs": [
69
+ {
70
+ "data": {
71
+ "text/html": [],
72
+ "text/plain": [
73
+ "<IPython.core.display.HTML object>"
74
+ ]
75
+ },
76
+ "metadata": {},
77
+ "output_type": "display_data"
78
+ },
79
+ {
80
+ "name": "stderr",
81
+ "output_type": "stream",
82
+ "text": [
83
+ "/home/jack/anaconda3/lib/python3.8/site-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /opt/conda/conda-bld/pytorch_1623448278899/work/c10/core/TensorImpl.h:1156.)\n",
84
+ " return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)\n"
85
+ ]
86
+ },
87
+ {
88
+ "data": {
89
+ "text/plain": [
90
+ "('False', tensor(0), tensor([9.9995e-01, 5.1218e-05]))"
91
+ ]
92
+ },
93
+ "execution_count": 5,
94
+ "metadata": {},
95
+ "output_type": "execute_result"
96
+ }
97
+ ],
98
+ "source": [
99
+ "learn.predict(im)"
100
+ ]
101
+ },
102
+ {
103
+ "cell_type": "code",
104
+ "execution_count": 6,
105
+ "id": "cbbb9d29",
106
+ "metadata": {},
107
+ "outputs": [],
108
+ "source": [
109
+ "#|export\n",
110
+ "categories = ('Dog','Cat')\n",
111
+ "\n",
112
+ "def classify_image(img):\n",
113
+ " pred,idx,probs = learn.predict(img)\n",
114
+ " return dict(zip(categories,map(float,probs)))"
115
+ ]
116
+ },
117
+ {
118
+ "cell_type": "code",
119
+ "execution_count": 7,
120
+ "id": "416893f6",
121
+ "metadata": {},
122
+ "outputs": [
123
+ {
124
+ "data": {
125
+ "text/html": [],
126
+ "text/plain": [
127
+ "<IPython.core.display.HTML object>"
128
+ ]
129
+ },
130
+ "metadata": {},
131
+ "output_type": "display_data"
132
+ },
133
+ {
134
+ "data": {
135
+ "text/plain": [
136
+ "{'Dog': 0.9999487400054932, 'Cat': 5.121831418364309e-05}"
137
+ ]
138
+ },
139
+ "execution_count": 7,
140
+ "metadata": {},
141
+ "output_type": "execute_result"
142
+ }
143
+ ],
144
+ "source": [
145
+ "classify_image(im)"
146
+ ]
147
+ },
148
+ {
149
+ "cell_type": "code",
150
+ "execution_count": 8,
151
+ "id": "c984370a",
152
+ "metadata": {},
153
+ "outputs": [],
154
+ "source": [
155
+ "title = \"Pet Breed Classifier\"\n",
156
+ "description = \"A pet breed classifier trained on the Oxford Pets dataset with fastai. Created as a demo for Gradio and HuggingFace Spaces.\""
157
+ ]
158
+ },
159
+ {
160
+ "cell_type": "code",
161
+ "execution_count": 9,
162
+ "id": "908edaf4",
163
+ "metadata": {},
164
+ "outputs": [],
165
+ "source": [
166
+ "article=\"<p style='text-align: center'><a href='https://tmabraham.github.io/blog/gradio_hf_spaces_tutorial' target='_blank'>Blog post</a></p>\""
167
+ ]
168
+ },
169
+ {
170
+ "cell_type": "code",
171
+ "execution_count": 10,
172
+ "id": "626ab3b7",
173
+ "metadata": {},
174
+ "outputs": [
175
+ {
176
+ "name": "stdout",
177
+ "output_type": "stream",
178
+ "text": [
179
+ "Running on local URL: http://127.0.0.1:7860/\n",
180
+ "\n",
181
+ "To create a public link, set `share=True` in `launch()`.\n"
182
+ ]
183
+ },
184
+ {
185
+ "data": {
186
+ "text/plain": [
187
+ "(<fastapi.applications.FastAPI at 0x7f5d1cda8ee0>,\n",
188
+ " 'http://127.0.0.1:7860/',\n",
189
+ " None)"
190
+ ]
191
+ },
192
+ "execution_count": 10,
193
+ "metadata": {},
194
+ "output_type": "execute_result"
195
+ }
196
+ ],
197
+ "source": [
198
+ "#|export\n",
199
+ "image = gr.inputs.Image(shape=(192,192))\n",
200
+ "label = gr.outputs.Label()\n",
201
+ "examples = ['Dog.jpg','Cat.jpg','DogCat.jpg']\n",
202
+ "\n",
203
+ "intf = gr.Interface(fn=classify_image, inputs=image, outputs=label, examples=examples)\n",
204
+ "intf.launch(inline=False)"
205
+ ]
206
+ },
207
+ {
208
+ "cell_type": "code",
209
+ "execution_count": 11,
210
+ "id": "974b81e0",
211
+ "metadata": {},
212
+ "outputs": [],
213
+ "source": [
214
+ "interpretation='default'\n",
215
+ "enable_queue=True"
216
+ ]
217
+ },
218
+ {
219
+ "cell_type": "code",
220
+ "execution_count": 12,
221
+ "id": "c6d080ef",
222
+ "metadata": {},
223
+ "outputs": [],
224
+ "source": [
225
+ "m = learn.model"
226
+ ]
227
+ },
228
+ {
229
+ "cell_type": "code",
230
+ "execution_count": 13,
231
+ "id": "c8de1551",
232
+ "metadata": {},
233
+ "outputs": [],
234
+ "source": [
235
+ "ps = list(m.parameters())"
236
+ ]
237
+ },
238
+ {
239
+ "cell_type": "code",
240
+ "execution_count": 14,
241
+ "id": "1c29d8d7",
242
+ "metadata": {},
243
+ "outputs": [
244
+ {
245
+ "data": {
246
+ "text/plain": [
247
+ "Parameter containing:\n",
248
+ "tensor([ 2.3532e-01, 2.6711e-01, -5.1096e-08, 5.1703e-01, 3.4404e-09,\n",
249
+ " 2.2236e-01, 4.2136e-01, 1.3153e-07, 2.5234e-01, 1.5152e-06,\n",
250
+ " 3.1680e-01, 2.4778e-01, 3.7890e-01, 1.0862e-05, 2.7515e-01,\n",
251
+ " 2.3752e-01, 2.4186e-01, 3.9407e-01, 4.6862e-01, 2.9020e-01,\n",
252
+ " 2.7151e-01, 2.7820e-01, 2.9074e-01, 2.0487e-01, 2.6023e-01,\n",
253
+ " 2.7775e-01, 2.9265e-01, 3.1585e-01, 3.8752e-01, 3.0455e-01,\n",
254
+ " 2.6713e-01, 2.1207e-01, 2.8719e-01, 3.3273e-01, 4.2679e-01,\n",
255
+ " 3.7354e-01, 7.4804e-08, 1.9030e-01, 1.4740e-08, 2.2530e-01,\n",
256
+ " 1.8001e-01, 2.4755e-01, 2.7374e-01, 2.5899e-01, 2.9401e-01,\n",
257
+ " 2.9993e-01, 2.2322e-01, 2.6375e-01, 2.2001e-08, 2.6563e-01,\n",
258
+ " 2.2172e-01, 2.8452e-01, 3.3147e-01, 2.2754e-01, 3.6605e-01,\n",
259
+ " 2.1161e-01, 2.3832e-01, 2.4952e-01, 5.2613e-01, 2.4867e-01,\n",
260
+ " 2.9496e-01, 2.5869e-01, 4.8316e-01, 2.6730e-01],\n",
261
+ " requires_grad=True)"
262
+ ]
263
+ },
264
+ "execution_count": 14,
265
+ "metadata": {},
266
+ "output_type": "execute_result"
267
+ }
268
+ ],
269
+ "source": [
270
+ "ps[1]"
271
+ ]
272
+ },
273
+ {
274
+ "cell_type": "code",
275
+ "execution_count": 15,
276
+ "id": "ee70c89e",
277
+ "metadata": {},
278
+ "outputs": [
279
+ {
280
+ "data": {
281
+ "text/plain": [
282
+ "torch.Size([64, 3, 7, 7])"
283
+ ]
284
+ },
285
+ "execution_count": 15,
286
+ "metadata": {},
287
+ "output_type": "execute_result"
288
+ }
289
+ ],
290
+ "source": [
291
+ "ps[0].shape"
292
+ ]
293
+ },
294
+ {
295
+ "cell_type": "code",
296
+ "execution_count": 16,
297
+ "id": "820af164",
298
+ "metadata": {},
299
+ "outputs": [
300
+ {
301
+ "data": {
302
+ "text/plain": [
303
+ "Parameter containing:\n",
304
+ "tensor([[[[-1.0371e-02, -6.0737e-03, -1.7333e-03, ..., 5.6638e-02,\n",
305
+ " 1.7043e-02, -1.2758e-02],\n",
306
+ " [ 1.1178e-02, 9.6355e-03, -1.0981e-01, ..., -2.7118e-01,\n",
307
+ " -1.2907e-01, 3.7211e-03],\n",
308
+ " [-6.8638e-03, 5.9185e-02, 2.9559e-01, ..., 5.1977e-01,\n",
309
+ " 2.5635e-01, 6.3599e-02],\n",
310
+ " ...,\n",
311
+ " [-2.7453e-02, 1.6144e-02, 7.2696e-02, ..., -3.3275e-01,\n",
312
+ " -4.2049e-01, -2.5774e-01],\n",
313
+ " [ 3.0674e-02, 4.1065e-02, 6.2963e-02, ..., 4.1391e-01,\n",
314
+ " 3.9368e-01, 1.6613e-01],\n",
315
+ " [-1.3681e-02, -3.5849e-03, -2.3989e-02, ..., -1.5065e-01,\n",
316
+ " -8.2174e-02, -5.7240e-03]],\n",
317
+ "\n",
318
+ " [[-1.1323e-02, -2.6540e-02, -3.4532e-02, ..., 3.2586e-02,\n",
319
+ " 6.5361e-04, -2.5781e-02],\n",
320
+ " [ 4.5812e-02, 3.3743e-02, -1.0437e-01, ..., -3.1242e-01,\n",
321
+ " -1.6047e-01, -1.2708e-03],\n",
322
+ " [-7.3293e-04, 9.8534e-02, 4.0224e-01, ..., 7.0797e-01,\n",
323
+ " 3.6893e-01, 1.2462e-01],\n",
324
+ " ...,\n",
325
+ " [-5.5813e-02, -5.0903e-03, 2.7234e-02, ..., -4.6164e-01,\n",
326
+ " -5.7068e-01, -3.6541e-01],\n",
327
+ " [ 3.2956e-02, 5.5721e-02, 9.9830e-02, ..., 5.4647e-01,\n",
328
+ " 4.8288e-01, 1.9879e-01],\n",
329
+ " [ 5.3906e-03, 6.8168e-03, -1.7116e-02, ..., -1.4813e-01,\n",
330
+ " -7.7162e-02, 8.1245e-04]],\n",
331
+ "\n",
332
+ " [[-1.8671e-03, -8.9911e-03, 2.1413e-02, ..., 8.9352e-02,\n",
333
+ " 3.3761e-02, -2.0026e-02],\n",
334
+ " [ 1.5610e-02, -1.8429e-02, -1.2566e-01, ..., -2.5320e-01,\n",
335
+ " -1.2964e-01, -2.7851e-02],\n",
336
+ " [ 1.0033e-02, 4.9258e-02, 2.1723e-01, ..., 3.4891e-01,\n",
337
+ " 1.0451e-01, 1.8588e-02],\n",
338
+ " ...,\n",
339
+ " [-2.8145e-02, 1.8642e-02, 9.8909e-02, ..., -1.1717e-01,\n",
340
+ " -2.5741e-01, -1.5430e-01],\n",
341
+ " [ 2.0962e-02, -2.3744e-03, -3.7544e-02, ..., 2.4163e-01,\n",
342
+ " 2.4366e-01, 1.1816e-01],\n",
343
+ " [ 9.3660e-04, 9.9884e-04, -9.7999e-03, ..., -1.4845e-01,\n",
344
+ " -1.1736e-01, -3.8164e-02]]],\n",
345
+ "\n",
346
+ "\n",
347
+ " [[[-4.3598e-03, -4.0001e-03, 3.2201e-03, ..., -3.6965e-02,\n",
348
+ " -2.5102e-02, -4.7870e-02],\n",
349
+ " [ 5.1388e-02, 5.3492e-02, 8.0506e-02, ..., 1.4486e-01,\n",
350
+ " 1.4294e-01, 1.2320e-01],\n",
351
+ " [-7.2494e-03, 2.2657e-03, 3.7657e-02, ..., 6.1599e-02,\n",
352
+ " 8.0406e-02, 1.1722e-01],\n",
353
+ " ...,\n",
354
+ " [-2.6683e-02, -1.2289e-01, -1.3645e-01, ..., -1.4062e-01,\n",
355
+ " -1.1146e-01, -4.9471e-02],\n",
356
+ " [ 2.3581e-02, -1.7209e-02, -1.1016e-02, ..., -1.8736e-02,\n",
357
+ " -2.3196e-02, -2.9364e-02],\n",
358
+ " [ 2.8753e-02, 2.1741e-02, 4.7980e-02, ..., 2.5596e-02,\n",
359
+ " 3.5452e-02, 1.1371e-02]],\n",
360
+ "\n",
361
+ " [[ 4.5553e-04, 1.2147e-02, 4.2034e-02, ..., 4.6400e-02,\n",
362
+ " 4.0403e-02, -1.4438e-02],\n",
363
+ " [ 4.3474e-02, 6.8798e-02, 1.3268e-01, ..., 2.8604e-01,\n",
364
+ " 2.6904e-01, 2.0935e-01],\n",
365
+ " [-5.7608e-02, -2.2630e-02, 3.0541e-02, ..., 1.3763e-01,\n",
366
+ " 1.6538e-01, 1.7946e-01],\n",
367
+ " ...,\n",
368
+ " [-1.0818e-01, -2.5228e-01, -2.9743e-01, ..., -2.8503e-01,\n",
369
+ " -2.1492e-01, -1.0320e-01],\n",
370
+ " [ 4.0686e-02, -3.2776e-02, -6.3434e-02, ..., -9.2350e-02,\n",
371
+ " -6.9845e-02, -4.9818e-02],\n",
372
+ " [ 8.2932e-02, 8.7583e-02, 1.0112e-01, ..., 5.2723e-02,\n",
373
+ " 6.0975e-02, 4.1196e-02]],\n",
374
+ "\n",
375
+ " [[-1.6455e-02, -1.3923e-02, 5.2383e-03, ..., 4.3658e-02,\n",
376
+ " 2.2652e-02, -4.6026e-02],\n",
377
+ " [ 3.3169e-02, 4.1989e-02, 9.3464e-02, ..., 2.6157e-01,\n",
378
+ " 2.2965e-01, 1.6690e-01],\n",
379
+ " [-4.6016e-02, -1.6397e-02, 2.6769e-02, ..., 1.4947e-01,\n",
380
+ " 1.3210e-01, 1.3572e-01],\n",
381
+ " ...,\n",
382
+ " [-7.2174e-02, -1.8907e-01, -2.3394e-01, ..., -1.9044e-01,\n",
383
+ " -1.5614e-01, -7.6042e-02],\n",
384
+ " [ 5.1112e-02, -2.5866e-02, -6.9388e-02, ..., -5.9046e-02,\n",
385
+ " -6.1586e-02, -4.4603e-02],\n",
386
+ " [ 1.1170e-01, 7.8938e-02, 6.5804e-02, ..., 3.1575e-02,\n",
387
+ " 2.5162e-02, 7.3570e-03]]],\n",
388
+ "\n",
389
+ "\n",
390
+ " [[[-7.0824e-08, -6.4305e-08, -7.3805e-08, ..., -9.7998e-08,\n",
391
+ " -1.0904e-07, -8.3420e-08],\n",
392
+ " [-6.1124e-09, 2.0612e-09, -8.0921e-09, ..., -4.9840e-08,\n",
393
+ " -4.3835e-08, -3.0537e-09],\n",
394
+ " [ 7.1952e-08, 7.5615e-08, 5.9281e-08, ..., -9.7507e-09,\n",
395
+ " -1.0951e-09, 4.2442e-08],\n",
396
+ " ...,\n",
397
+ " [ 9.5887e-08, 1.0039e-07, 7.9816e-08, ..., -1.7490e-08,\n",
398
+ " -4.7665e-08, -1.3265e-08],\n",
399
+ " [ 1.2904e-07, 1.4761e-07, 1.7476e-07, ..., 1.3232e-07,\n",
400
+ " 1.0628e-07, 9.3314e-08],\n",
401
+ " [ 1.2558e-07, 1.3644e-07, 1.8431e-07, ..., 2.1398e-07,\n",
402
+ " 1.7709e-07, 1.7166e-07]],\n",
403
+ "\n",
404
+ " [[-1.2690e-07, -9.6137e-08, -1.0372e-07, ..., -1.1808e-07,\n",
405
+ " -1.3309e-07, -1.0819e-07],\n",
406
+ " [-5.7412e-08, -2.5054e-08, -3.0114e-08, ..., -7.2921e-08,\n",
407
+ " -6.7021e-08, -2.2574e-08],\n",
408
+ " [ 2.1813e-08, 4.8608e-08, 3.1221e-08, ..., -1.8694e-08,\n",
409
+ " -7.9589e-09, 3.9749e-08],\n",
410
+ " ...,\n",
411
+ " [ 5.6012e-08, 7.5524e-08, 4.4495e-08, ..., -4.4127e-08,\n",
412
+ " -5.9929e-08, -1.8247e-08],\n",
413
+ " [ 7.7612e-08, 9.8346e-08, 1.0455e-07, ..., 6.3270e-08,\n",
414
+ " 4.1780e-08, 4.5900e-08],\n",
415
+ " [ 5.9832e-08, 7.1005e-08, 9.0435e-08, ..., 1.1654e-07,\n",
416
+ " 8.7549e-08, 9.8835e-08]],\n",
417
+ "\n",
418
+ " [[-4.3809e-08, 1.3270e-08, 7.8274e-09, ..., -5.8803e-09,\n",
419
+ " -2.6217e-08, -1.5649e-08],\n",
420
+ " [ 4.1699e-08, 1.0777e-07, 1.0946e-07, ..., 7.6402e-08,\n",
421
+ " 7.1449e-08, 9.7613e-08],\n",
422
+ " [ 1.0436e-07, 1.6585e-07, 1.5933e-07, ..., 1.3517e-07,\n",
423
+ " 1.3487e-07, 1.6448e-07],\n",
424
+ " ...,\n",
425
+ " [ 9.8762e-08, 1.5072e-07, 1.2546e-07, ..., 6.8314e-08,\n",
426
+ " 6.8381e-08, 1.1367e-07],\n",
427
+ " [ 9.1433e-08, 1.3576e-07, 1.3793e-07, ..., 1.1678e-07,\n",
428
+ " 1.1723e-07, 1.4394e-07],\n",
429
+ " [ 6.2181e-08, 8.8183e-08, 1.0456e-07, ..., 1.3941e-07,\n",
430
+ " 1.3332e-07, 1.5844e-07]]],\n",
431
+ "\n",
432
+ "\n",
433
+ " ...,\n",
434
+ "\n",
435
+ "\n",
436
+ " [[[-6.1888e-02, -3.0174e-02, 1.9244e-02, ..., 4.3601e-02,\n",
437
+ " -2.2192e-02, -4.2292e-02],\n",
438
+ " [-3.8036e-02, 6.1249e-03, 4.5824e-02, ..., 9.5968e-02,\n",
439
+ " 5.9178e-02, 2.9933e-02],\n",
440
+ " [-2.9671e-02, 2.8087e-03, 2.0472e-02, ..., 5.9693e-02,\n",
441
+ " 4.1303e-02, 2.3059e-02],\n",
442
+ " ...,\n",
443
+ " [ 1.1850e-02, 4.5660e-02, 4.4850e-02, ..., 4.7272e-02,\n",
444
+ " 2.2078e-02, -5.6974e-03],\n",
445
+ " [-3.2581e-02, -1.2320e-02, 2.1909e-02, ..., 5.7912e-02,\n",
446
+ " -7.6699e-03, -5.9911e-02],\n",
447
+ " [-4.3445e-02, -2.8265e-02, -5.9919e-03, ..., 8.8342e-02,\n",
448
+ " 8.3350e-03, -5.0136e-02]],\n",
449
+ "\n",
450
+ " [[-6.1221e-02, -1.3927e-02, 1.7289e-02, ..., 1.8310e-02,\n",
451
+ " -3.2762e-02, -4.1110e-02],\n",
452
+ " [-3.1370e-02, 2.4600e-02, 4.5634e-02, ..., 6.6870e-02,\n",
453
+ " 4.6721e-02, 3.3299e-02],\n",
454
+ " [-3.2109e-02, 2.0853e-02, 2.3466e-02, ..., 3.5286e-02,\n",
455
+ " 3.6499e-02, 3.1337e-02],\n",
456
+ " ...,\n",
457
+ " [ 1.7768e-02, 6.1103e-02, 4.8322e-02, ..., 3.7737e-02,\n",
458
+ " 2.8764e-02, 1.3854e-02],\n",
459
+ " [-1.0903e-02, 2.2090e-02, 4.2763e-02, ..., 6.0185e-02,\n",
460
+ " 1.6130e-02, -1.2603e-02],\n",
461
+ " [-2.2318e-02, 1.3237e-02, 3.0937e-02, ..., 1.0400e-01,\n",
462
+ " 4.0087e-02, -5.3933e-03]],\n",
463
+ "\n",
464
+ " [[-8.5255e-02, -4.2523e-02, 6.8824e-03, ..., 3.0748e-02,\n",
465
+ " -3.4842e-02, -4.9978e-02],\n",
466
+ " [-2.9072e-02, 1.8316e-02, 5.1211e-02, ..., 9.0290e-02,\n",
467
+ " 5.3507e-02, 4.0244e-02],\n",
468
+ " [-3.9814e-02, -9.6470e-04, 9.7550e-03, ..., 2.4207e-02,\n",
469
+ " 2.6362e-02, 2.5553e-02],\n",
470
+ " ...,\n",
471
+ " [-3.1406e-03, 3.0533e-02, 1.6427e-02, ..., 5.5678e-03,\n",
472
+ " -6.2801e-03, -8.4954e-03],\n",
473
+ " [-2.2969e-02, -2.7523e-03, 2.3285e-02, ..., 3.5936e-02,\n",
474
+ " -1.4276e-02, -3.2448e-02],\n",
475
+ " [-9.8640e-03, 7.1443e-03, 1.0765e-02, ..., 7.0571e-02,\n",
476
+ " 1.3040e-02, -8.3499e-03]]],\n",
477
+ "\n",
478
+ "\n",
479
+ " [[[-7.9636e-03, 1.9806e-02, 3.4058e-02, ..., 2.8530e-02,\n",
480
+ " 1.2682e-02, 1.8005e-02],\n",
481
+ " [ 8.6733e-03, -3.3049e-02, -3.5933e-02, ..., 7.2341e-02,\n",
482
+ " 4.5721e-02, 5.2235e-02],\n",
483
+ " [-3.6231e-02, -1.1894e-01, -1.3785e-01, ..., 3.3661e-02,\n",
484
+ " 3.7666e-02, 2.6798e-02],\n",
485
+ " ...,\n",
486
+ " [ 1.7242e-02, 3.8832e-03, -8.3154e-03, ..., 2.6821e-03,\n",
487
+ " 1.8225e-02, 1.5979e-02],\n",
488
+ " [-1.0236e-03, 1.6355e-02, 1.7065e-02, ..., 3.2948e-03,\n",
489
+ " 2.2780e-02, 5.9491e-04],\n",
490
+ " [ 6.0888e-03, 2.7059e-02, 1.4245e-02, ..., 7.5219e-03,\n",
491
+ " 1.8695e-02, 1.5569e-02]],\n",
492
+ "\n",
493
+ " [[-1.3428e-02, -5.2683e-04, 8.0258e-03, ..., -6.2113e-03,\n",
494
+ " 9.1388e-03, 1.5659e-02],\n",
495
+ " [-1.8293e-02, -6.7961e-02, -7.0796e-02, ..., 2.9736e-02,\n",
496
+ " 2.6144e-02, 2.3664e-02],\n",
497
+ " [-5.4284e-02, -1.4657e-01, -1.6214e-01, ..., 1.1723e-02,\n",
498
+ " 3.2393e-02, 1.1879e-02],\n",
499
+ " ...,\n",
500
+ " [ 8.7467e-04, -1.7481e-02, -1.9483e-02, ..., -4.1293e-03,\n",
501
+ " 2.4618e-02, 1.2863e-02],\n",
502
+ " [-6.1881e-04, 1.1811e-02, 2.4806e-02, ..., 6.0966e-03,\n",
503
+ " 3.9180e-02, 9.6544e-03],\n",
504
+ " [-7.1816e-03, 6.6815e-03, 5.2450e-03, ..., -7.6175e-03,\n",
505
+ " 2.7221e-02, 1.7738e-02]],\n",
506
+ "\n",
507
+ " [[-2.6432e-04, -4.9575e-03, 2.2028e-03, ..., -4.8078e-02,\n",
508
+ " -2.6259e-02, -2.3626e-02],\n",
509
+ " [-3.2725e-04, -5.1541e-02, -6.0127e-02, ..., -1.7499e-02,\n",
510
+ " -2.3477e-02, -3.7444e-02],\n",
511
+ " [-2.2673e-02, -9.9471e-02, -1.1189e-01, ..., -1.1797e-02,\n",
512
+ " -8.4821e-03, -4.0748e-02],\n",
513
+ " ...,\n",
514
+ " [ 1.1402e-02, -8.0548e-03, -1.5673e-03, ..., -3.4194e-02,\n",
515
+ " -8.8273e-03, -2.3603e-02],\n",
516
+ " [ 2.9159e-03, 6.3760e-04, 1.9852e-02, ..., -2.2071e-02,\n",
517
+ " 1.4723e-02, -1.4567e-02],\n",
518
+ " [-1.9127e-02, -2.9497e-02, -2.3374e-02, ..., -4.8654e-02,\n",
519
+ " -1.3150e-02, -2.4429e-02]]],\n",
520
+ "\n",
521
+ "\n",
522
+ " [[[-3.6273e-02, 7.2578e-03, 1.9202e-02, ..., 1.9734e-02,\n",
523
+ " 1.5011e-02, -1.7157e-02],\n",
524
+ " [-1.1040e-02, 8.5732e-02, 1.2678e-01, ..., 1.3876e-02,\n",
525
+ " 8.8220e-05, -3.0011e-02],\n",
526
+ " [ 1.1324e-01, 1.8641e-01, 5.0776e-02, ..., -1.7319e-01,\n",
527
+ " -7.1880e-02, -6.2327e-02],\n",
528
+ " ...,\n",
529
+ " [-5.3042e-02, -2.5774e-01, -2.6736e-01, ..., 2.6796e-01,\n",
530
+ " 1.4361e-01, 5.5317e-02],\n",
531
+ " [-2.1005e-02, -2.9936e-02, 1.0252e-01, ..., 2.0855e-01,\n",
532
+ " -4.0068e-03, -3.7960e-02],\n",
533
+ " [-2.2157e-02, 1.2397e-02, 8.4349e-02, ..., -4.4893e-02,\n",
534
+ " -1.4674e-01, -9.0741e-02]],\n",
535
+ "\n",
536
+ " [[-5.3739e-03, 3.2867e-02, 1.5604e-02, ..., -7.5765e-03,\n",
537
+ " 3.2058e-03, 1.2969e-03],\n",
538
+ " [ 6.1755e-02, 1.4908e-01, 1.4659e-01, ..., -2.8719e-02,\n",
539
+ " -2.0035e-02, -8.9951e-03],\n",
540
+ " [ 1.6150e-01, 2.0896e-01, -2.5438e-02, ..., -2.7259e-01,\n",
541
+ " -1.0714e-01, -6.2789e-02],\n",
542
+ " ...,\n",
543
+ " [-1.3717e-01, -4.0851e-01, -3.8537e-01, ..., 4.0864e-01,\n",
544
+ " 2.6222e-01, 1.3512e-01],\n",
545
+ " [-5.9357e-02, -6.1123e-02, 1.4207e-01, ..., 3.5796e-01,\n",
546
+ " 9.1065e-02, -1.5403e-03],\n",
547
+ " [ 7.8781e-03, 5.8443e-02, 1.5346e-01, ..., 4.7184e-02,\n",
548
+ " -1.0078e-01, -9.7731e-02]],\n",
549
+ "\n",
550
+ " [[-5.6557e-03, 1.3477e-02, -2.6363e-02, ..., 4.6122e-03,\n",
551
+ " 2.2044e-03, 1.4039e-02],\n",
552
+ " [ 6.6347e-03, 4.5257e-02, 6.0375e-02, ..., 1.4498e-02,\n",
553
+ " -4.9248e-03, 4.2125e-03],\n",
554
+ " [ 5.5308e-02, 1.2406e-01, 4.3308e-02, ..., -1.4471e-01,\n",
555
+ " -7.4329e-02, -5.7385e-02],\n",
556
+ " ...,\n",
557
+ " [-3.1464e-02, -1.6325e-01, -1.5783e-01, ..., 2.2919e-01,\n",
558
+ " 1.2034e-01, 7.2164e-02],\n",
559
+ " [-1.0441e-02, -1.0932e-03, 8.4661e-02, ..., 1.5761e-01,\n",
560
+ " 2.2270e-02, -9.9331e-03],\n",
561
+ " [-4.8670e-03, -4.9970e-03, 3.6399e-02, ..., -2.4241e-02,\n",
562
+ " -7.1060e-02, -6.6646e-02]]]], requires_grad=True)"
563
+ ]
564
+ },
565
+ "execution_count": 16,
566
+ "metadata": {},
567
+ "output_type": "execute_result"
568
+ }
569
+ ],
570
+ "source": [
571
+ "ps[0]"
572
+ ]
573
+ },
574
+ {
575
+ "cell_type": "code",
576
+ "execution_count": 17,
577
+ "id": "f479fca8",
578
+ "metadata": {},
579
+ "outputs": [],
580
+ "source": [
581
+ "#This part is for exporting\n",
582
+ "from nbdev.export import notebook2script"
583
+ ]
584
+ },
585
+ {
586
+ "cell_type": "code",
587
+ "execution_count": 18,
588
+ "id": "90437873",
589
+ "metadata": {},
590
+ "outputs": [
591
+ {
592
+ "name": "stdout",
593
+ "output_type": "stream",
594
+ "text": [
595
+ "Converted app.ipynb.\n"
596
+ ]
597
+ }
598
+ ],
599
+ "source": [
600
+ "notebook2script('app.ipynb')"
601
+ ]
602
+ },
603
+ {
604
+ "cell_type": "code",
605
+ "execution_count": null,
606
+ "id": "c52e64d8",
607
+ "metadata": {},
608
+ "outputs": [],
609
+ "source": []
610
+ }
611
+ ],
612
+ "metadata": {
613
+ "kernelspec": {
614
+ "display_name": "Python 3 (ipykernel)",
615
+ "language": "python",
616
+ "name": "python3"
617
+ },
618
+ "language_info": {
619
+ "codemirror_mode": {
620
+ "name": "ipython",
621
+ "version": 3
622
+ },
623
+ "file_extension": ".py",
624
+ "mimetype": "text/x-python",
625
+ "name": "python",
626
+ "nbconvert_exporter": "python",
627
+ "pygments_lexer": "ipython3",
628
+ "version": "3.8.13"
629
+ }
630
+ },
631
+ "nbformat": 4,
632
+ "nbformat_minor": 5
633
+ }
app.py ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AUTOGENERATED! DO NOT EDIT! File to edit: . (unless otherwise specified).
2
+
3
+ __all__ = ['is_cat', 'learn', 'classify_image', 'categories', 'image', 'label', 'examples', 'intf']
4
+
5
+ # Cell
6
+ from fastai.vision.all import *
7
+ import gradio as gr
8
+ import skimage
9
+
10
+ def is_cat(x): return x[0].isupper()
11
+
12
+ # Cell
13
+ learn = load_learner('model.pkl')
14
+
15
+ # Cell
16
+ categories = ('Dog','Cat')
17
+
18
+ def classify_image(img):
19
+ pred,idx,probs = learn.predict(img)
20
+ return dict(zip(categories,map(float,probs)))
21
+
22
+ # Cell
23
+ image = gr.inputs.Image(shape=(192,192))
24
+ label = gr.outputs.Label()
25
+ examples = ['Dog.jpg','Cat.jpg','DogCat.jpg']
26
+
27
+ intf = gr.Interface(fn=classify_image, inputs=image, outputs=label, examples=examples)
28
+ intf.launch(inline=False)
model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c1b769b64e0e28ef4c5687b5bb3aa480eb07ac1612285fb816f7a010f7446adf
3
+ size 47060011
requirements ADDED
@@ -0,0 +1,2 @@
 
 
1
+ fastai
2
+ scikit-image
saving-a-basic-fastai-model.ipynb ADDED
@@ -0,0 +1,308 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {
6
+ "id": "98d53c05"
7
+ },
8
+ "source": [
9
+ "## Saving a Cats v Dogs Model"
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "markdown",
14
+ "metadata": {},
15
+ "source": [
16
+ "This is a minimal example showing how to train a fastai model on Kaggle, and save it so you can use it in your app."
17
+ ]
18
+ },
19
+ {
20
+ "cell_type": "code",
21
+ "execution_count": 1,
22
+ "metadata": {
23
+ "_kg_hide-input": true,
24
+ "_kg_hide-output": true,
25
+ "execution": {
26
+ "iopub.execute_input": "2022-05-03T05:51:37.949032Z",
27
+ "iopub.status.busy": "2022-05-03T05:51:37.948558Z",
28
+ "iopub.status.idle": "2022-05-03T05:51:59.531217Z",
29
+ "shell.execute_reply": "2022-05-03T05:51:59.530294Z",
30
+ "shell.execute_reply.started": "2022-05-03T05:51:37.948947Z"
31
+ },
32
+ "id": "evvA0fqvSblq",
33
+ "outputId": "ba21b811-767c-459a-ccdf-044758720a55"
34
+ },
35
+ "outputs": [],
36
+ "source": [
37
+ "# Make sure we've got the latest version of fastai:\n",
38
+ "!pip install -Uqq fastai"
39
+ ]
40
+ },
41
+ {
42
+ "cell_type": "markdown",
43
+ "metadata": {},
44
+ "source": [
45
+ "First, import all the stuff we need from fastai:"
46
+ ]
47
+ },
48
+ {
49
+ "cell_type": "code",
50
+ "execution_count": 2,
51
+ "metadata": {
52
+ "execution": {
53
+ "iopub.execute_input": "2022-05-03T05:51:59.534478Z",
54
+ "iopub.status.busy": "2022-05-03T05:51:59.533878Z",
55
+ "iopub.status.idle": "2022-05-03T05:52:02.177975Z",
56
+ "shell.execute_reply": "2022-05-03T05:52:02.177267Z",
57
+ "shell.execute_reply.started": "2022-05-03T05:51:59.534432Z"
58
+ },
59
+ "id": "44eb0ad3"
60
+ },
61
+ "outputs": [],
62
+ "source": [
63
+ "from fastai.vision.all import *"
64
+ ]
65
+ },
66
+ {
67
+ "cell_type": "markdown",
68
+ "metadata": {},
69
+ "source": [
70
+ "Download and decompress our dataset, which is pictures of dogs and cats:"
71
+ ]
72
+ },
73
+ {
74
+ "cell_type": "code",
75
+ "execution_count": 3,
76
+ "metadata": {
77
+ "execution": {
78
+ "iopub.execute_input": "2022-05-03T05:52:02.180691Z",
79
+ "iopub.status.busy": "2022-05-03T05:52:02.180192Z",
80
+ "iopub.status.idle": "2022-05-03T05:53:02.465242Z",
81
+ "shell.execute_reply": "2022-05-03T05:53:02.464516Z",
82
+ "shell.execute_reply.started": "2022-05-03T05:52:02.180651Z"
83
+ }
84
+ },
85
+ "outputs": [],
86
+ "source": [
87
+ "path = untar_data(URLs.PETS)/'images'"
88
+ ]
89
+ },
90
+ {
91
+ "cell_type": "markdown",
92
+ "metadata": {},
93
+ "source": [
94
+ "We need a way to label our images as dogs or cats. In this dataset, pictures of cats are given a filename that starts with a capital letter:"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type": "code",
99
+ "execution_count": 4,
100
+ "metadata": {
101
+ "execution": {
102
+ "iopub.execute_input": "2022-05-03T05:53:02.467572Z",
103
+ "iopub.status.busy": "2022-05-03T05:53:02.467289Z",
104
+ "iopub.status.idle": "2022-05-03T05:53:02.474701Z",
105
+ "shell.execute_reply": "2022-05-03T05:53:02.474109Z",
106
+ "shell.execute_reply.started": "2022-05-03T05:53:02.467536Z"
107
+ },
108
+ "id": "44eb0ad3"
109
+ },
110
+ "outputs": [],
111
+ "source": [
112
+ "def is_cat(x): return x[0].isupper() "
113
+ ]
114
+ },
115
+ {
116
+ "cell_type": "markdown",
117
+ "metadata": {},
118
+ "source": [
119
+ "Now we can create our `DataLoaders`:"
120
+ ]
121
+ },
122
+ {
123
+ "cell_type": "code",
124
+ "execution_count": 5,
125
+ "metadata": {
126
+ "execution": {
127
+ "iopub.execute_input": "2022-05-03T05:53:02.476084Z",
128
+ "iopub.status.busy": "2022-05-03T05:53:02.475754Z",
129
+ "iopub.status.idle": "2022-05-03T05:53:06.703777Z",
130
+ "shell.execute_reply": "2022-05-03T05:53:06.703023Z",
131
+ "shell.execute_reply.started": "2022-05-03T05:53:02.476052Z"
132
+ },
133
+ "id": "44eb0ad3"
134
+ },
135
+ "outputs": [],
136
+ "source": [
137
+ "dls = ImageDataLoaders.from_name_func('.',\n",
138
+ " get_image_files(path), valid_pct=0.2, seed=42,\n",
139
+ " label_func=is_cat,\n",
140
+ " item_tfms=Resize(192))"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "markdown",
145
+ "metadata": {},
146
+ "source": [
147
+ "... and train our model, a resnet18 (to keep it small and fast):"
148
+ ]
149
+ },
150
+ {
151
+ "cell_type": "code",
152
+ "execution_count": 6,
153
+ "metadata": {
154
+ "execution": {
155
+ "iopub.execute_input": "2022-05-03T05:53:28.093059Z",
156
+ "iopub.status.busy": "2022-05-03T05:53:28.092381Z"
157
+ },
158
+ "id": "c107f724",
159
+ "outputId": "fcc1de68-7c8b-43f5-b9eb-fcdb0773ef07"
160
+ },
161
+ "outputs": [
162
+ {
163
+ "name": "stderr",
164
+ "output_type": "stream",
165
+ "text": [
166
+ "/home/jack/anaconda3/lib/python3.8/site-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /opt/conda/conda-bld/pytorch_1623448278899/work/c10/core/TensorImpl.h:1156.)\n",
167
+ " return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)\n"
168
+ ]
169
+ },
170
+ {
171
+ "data": {
172
+ "text/html": [
173
+ "<table border=\"1\" class=\"dataframe\">\n",
174
+ " <thead>\n",
175
+ " <tr style=\"text-align: left;\">\n",
176
+ " <th>epoch</th>\n",
177
+ " <th>train_loss</th>\n",
178
+ " <th>valid_loss</th>\n",
179
+ " <th>error_rate</th>\n",
180
+ " <th>time</th>\n",
181
+ " </tr>\n",
182
+ " </thead>\n",
183
+ " <tbody>\n",
184
+ " <tr>\n",
185
+ " <td>0</td>\n",
186
+ " <td>0.188899</td>\n",
187
+ " <td>0.049849</td>\n",
188
+ " <td>0.018268</td>\n",
189
+ " <td>00:06</td>\n",
190
+ " </tr>\n",
191
+ " </tbody>\n",
192
+ "</table>"
193
+ ],
194
+ "text/plain": [
195
+ "<IPython.core.display.HTML object>"
196
+ ]
197
+ },
198
+ "metadata": {},
199
+ "output_type": "display_data"
200
+ },
201
+ {
202
+ "data": {
203
+ "text/html": [
204
+ "<table border=\"1\" class=\"dataframe\">\n",
205
+ " <thead>\n",
206
+ " <tr style=\"text-align: left;\">\n",
207
+ " <th>epoch</th>\n",
208
+ " <th>train_loss</th>\n",
209
+ " <th>valid_loss</th>\n",
210
+ " <th>error_rate</th>\n",
211
+ " <th>time</th>\n",
212
+ " </tr>\n",
213
+ " </thead>\n",
214
+ " <tbody>\n",
215
+ " <tr>\n",
216
+ " <td>0</td>\n",
217
+ " <td>0.078320</td>\n",
218
+ " <td>0.068075</td>\n",
219
+ " <td>0.016238</td>\n",
220
+ " <td>00:06</td>\n",
221
+ " </tr>\n",
222
+ " <tr>\n",
223
+ " <td>1</td>\n",
224
+ " <td>0.053089</td>\n",
225
+ " <td>0.035447</td>\n",
226
+ " <td>0.010825</td>\n",
227
+ " <td>00:06</td>\n",
228
+ " </tr>\n",
229
+ " <tr>\n",
230
+ " <td>2</td>\n",
231
+ " <td>0.025057</td>\n",
232
+ " <td>0.022673</td>\n",
233
+ " <td>0.006089</td>\n",
234
+ " <td>00:06</td>\n",
235
+ " </tr>\n",
236
+ " </tbody>\n",
237
+ "</table>"
238
+ ],
239
+ "text/plain": [
240
+ "<IPython.core.display.HTML object>"
241
+ ]
242
+ },
243
+ "metadata": {},
244
+ "output_type": "display_data"
245
+ }
246
+ ],
247
+ "source": [
248
+ "learn = vision_learner(dls, resnet18, metrics=error_rate)\n",
249
+ "learn.fine_tune(3)"
250
+ ]
251
+ },
252
+ {
253
+ "cell_type": "markdown",
254
+ "metadata": {},
255
+ "source": [
256
+ "Now we can export our trained `Learner`. This contains all the information needed to run the model:"
257
+ ]
258
+ },
259
+ {
260
+ "cell_type": "code",
261
+ "execution_count": 7,
262
+ "metadata": {
263
+ "id": "ae2bc6ac"
264
+ },
265
+ "outputs": [],
266
+ "source": [
267
+ "learn.export('model.pkl')"
268
+ ]
269
+ },
270
+ {
271
+ "cell_type": "markdown",
272
+ "metadata": {
273
+ "id": "Q2HTrQKTf3BV"
274
+ },
275
+ "source": [
276
+ "Finally, open the Kaggle sidebar on the right if it's not already, and find the section marked \"Output\". Open the `/kaggle/working` folder, and you'll see `model.pkl`. Click on it, then click on the menu on the right that appears, and choose \"Download\". After a few seconds, your model will be downloaded to your computer, where you can then create your app that uses the model."
277
+ ]
278
+ },
279
+ {
280
+ "cell_type": "code",
281
+ "execution_count": null,
282
+ "metadata": {},
283
+ "outputs": [],
284
+ "source": []
285
+ }
286
+ ],
287
+ "metadata": {
288
+ "kernelspec": {
289
+ "display_name": "Python 3 (ipykernel)",
290
+ "language": "python",
291
+ "name": "python3"
292
+ },
293
+ "language_info": {
294
+ "codemirror_mode": {
295
+ "name": "ipython",
296
+ "version": 3
297
+ },
298
+ "file_extension": ".py",
299
+ "mimetype": "text/x-python",
300
+ "name": "python",
301
+ "nbconvert_exporter": "python",
302
+ "pygments_lexer": "ipython3",
303
+ "version": "3.8.13"
304
+ }
305
+ },
306
+ "nbformat": 4,
307
+ "nbformat_minor": 4
308
+ }