{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Stain Transfer with Pix2Pix\n\n**Keywords: GANs, Pix2Pix, Histopathology, PyTorch Lightning**","metadata":{}},{"cell_type":"markdown","source":"*This notebook has been forked and modified from a [previous Kaggle notebook](https://www.kaggle.com/code/shir0mani/stain-transfer-w-pix2pix-pytorch-lightning/) where I had used the [PCam](https://www.kaggle.com/competitions/histopathologic-cancer-detection/data) [CAMELYON16](https://camelyon16.grand-challenge.org/Data/) dataset.*","metadata":{}},{"cell_type":"markdown","source":"Color variation in digital histopathology images arise due to differences in processes and lab conditions during acquisition and digitization. Stain normalization --in preparation for downstream automated image analysis tasks-- is an important preprocessing task that normalizes or reduces these color and intensity variations. While there are many stain normalization methods that use conventional image processing, style transfer techniques using generative adversarial networks (cGANs <a href=\"#ref1\">[1]</a>, CycleGANs <a href=\"#ref1\">[2]</a>, Pix2Pix <a href=\"#ref1\">[3]</a>) have only recently been applied to this problem.   \nIn this exercise, we'll use Pix2Pix for stain transfer (i.e. we will generate histopathological patterns within a certain color distribution).\n   \n**Pix2Pix**   \nPix2Pix <a href=\"#ref1\">[4]</a> is a conditional GAN (cGAN) set up as a  pairwise image translation algorithm. The pair consists of a target image and an input condition/label image which is passed to the generator. It should be noted that unlike the cGAN the input is an image, not a noise+label vector. The components of Pix2Pix architecture are a follows: \n    \n*Generator:* A U-Net, which has skip connections, is used so that low level information can be passed from input image to output image. Noise in the form of dropout is applied to several layers of the generator  instead of an input noise used in cGAN models.\n    \n*Discriminator:* The discriminator is a PatchGAN network. It classifies smaller patches of the input image (either real or fake) instead of discriminating the entire image at once. See the [PatchGAN section](#PatchGAN) below.\n      \n*Loss:* In addition to the task of fooling the discriminator, the generator has to generate images close to the ground truth. For this an L1 loss is applied to the generator. This L1 loss however, is only able to preserve low-frequency details in an image and produces blurry images. \nThe PatchGAN discriminator can learn high-frequency features. By fusing the two types of losses, both high  and low-frequency details can be learned and generated.\n         \n**Pix2Pix stain transfer**   \nHere the RGB color and corresponding grayscale transform of an image tile serve as target/condition image pairs. Grayscale images are normalized across channels and serve as a neutral template for stain-style transfer. As training progresses, the stain style generalizes capturing the statistics over the entire training set which had been acquired from different labs. *It should be noted that while the Pix2Pix algorithm requires paired data for training, it is easy to satisfy this by applying grayscale transforms.*\n\n         \n**Implementation**  \n*Training:* Color/grayscale image pairs are derived from the stained (hematoxylin etc.) HPA dataset.\nThe grayscale images serve as input to the generator. The generator outputs stained color images.\nThe discriminator has two input pairs: the generated image/grayscale image pair serves as the fake input, the color/grayscale image pair is the real input. See the figure below.   \nThe network is trained using the most of the same parameters as the original Pix2Pix paper (see the [Config section](#config)).    \n*Evaluation:* We plot the target image and generated image during the training cycle. The target image and generated image can be compared using pixel-based metrics such as PSNR, SSIM as well as human visual perception. The generated image can also be validated on a clinical use-case such as classification.  \n*Code:* We use PyTorch Lightning. Sections of code in the notebook below that were taken from the public domain have been acknowledged.\n\n<br>  \n<br>\n\n\n![pix2pix.drawio.png](attachment:d6952cc2-cb33-4165-8188-e40f6baaf117.png)\n\n","metadata":{},"attachments":{"d6952cc2-cb33-4165-8188-e40f6baaf117.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAzUAAAHhCAYAAABX3JD8AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAADNaADAAQAAAABAAAB4QAAAAC61tiuAAAQonRFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMmFwcC5kaWFncmFtcy5uZXQlMjIlMjBtb2RpZmllZCUzRCUyMjIwMjItMDMtMjdUMDglM0EyNCUzQTQ0LjIxNVolMjIlMjBhZ2VudCUzRCUyMjUuMCUyMChNYWNpbnRvc2glM0IlMjBJbnRlbCUyME1hYyUyME9TJTIwWCUyMDEwXzE1XzcpJTIwQXBwbGVXZWJLaXQlMkY2MDUuMS4xNSUyMChLSFRNTCUyQyUyMGxpa2UlMjBHZWNrbyklMjBWZXJzaW9uJTJGMTQuMS4xJTIwU2FmYXJpJTJGNjA1LjEuMTUlMjIlMjBldGFnJTNEJTIyVGJZeDN6OWFnWDNUaE1qSFM5ZkMlMjIlMjB2ZXJzaW9uJTNEJTIyMTcuMi40JTIyJTIwdHlwZSUzRCUyMmRldmljZSUyMiUzRSUzQ2RpYWdyYW0lMjBpZCUzRCUyMk1hN3VHWjBlaWctQjJwNGczTFJqJTIyJTIwbmFtZSUzRCUyMlBhZ2UtMSUyMiUzRTdWMXRjNXU0RnY0MSUyQldoRzc2Q1BhUkszczd2ZDZVNXZiOXI3cFVNTWR0ZzR4aGVUSnRsZnY1SUJXMGl5TFJ6QXBLbG40Z0ZaQ0RqUGVZN09PVHFRTTN4eCUyRiUyRlElMkJDNWUzSDlNb25wOGhFRDJkNGNzemhEaGg0bHMyUEJjTmxQQ2lZWllsVWRFRXR3MmZrMyUyRmlzaEdVclE5SkZLOXFIZk0wbmVmSnN0NDRTUmVMZUpMWDJzSXNTeCUyRnIzYWJwdkg3V1pUaUxqWWJQazNCdXRsNG5VWDVidEFiSTM3WiUyRmlKUFpiWFZteU1yN3V3JTJCcnp1V2RyRzdES0gxVW12RFZHYjdJMGpRdnR1NmZMdUs1bEYwbGwlMkJLNDhZNWZOeGVXeFl2YzVZRFBQMzRIJTJGd3ZZOWZWdnklMkI4aiUyQk45c2RBblBSeFFWdyUyRndJNXclMkZsSFpkWG16OVhJcGhsNmNQU1BGdDVBVCUyRmlMSSUyQmZiRmlFTjlVSTI5c1ZhaEtuOTNHZVBZdCUyQjVWR01RZzhIM0dlSWMlMkJ3elhGNUJxVERRcHg0a0FCQUdZWUFBeHFYa0g3ZG9RSXc4QmdIQ1BnQU1ZUmFRb3N0dERSamlCWlJ6aW9NQSUyQnB3eFhPcElxUiUyQnp6V1Z0UlNnMlNpbmFKZnI5SnJxSzg0JTJCejZZZXZmMzg4JTJGJTJGS2YyOGZyOFlnZkZxalFoS1hjekFWajRuOVNPZHk3Wlp3bDRnTGlURzMlMkZ0RzE4OTNpYjVQSG5aVGlSUno2S0hxTHROcjhYMTNZSnhlWTBlWW9yJTJCc2o5TE0zRFBFa1hZcGNEc2I4cWZzTFVvNHh2UDVpSjN3UmVlWmdzMXVlV2ZVMnM5JTJCdU9yZ0U3a1I0eGo5TXQwQ0NvUXoyQ1dPS29RQTB0V01zJTJCRm53eDZBalF5aEx0UTFRd1pCSEZVU20lMkZBMURwMEV5VCUyQmZ3aW5hZlplaXc4bmNac01wR1E1Vmw2Rnl1JTJGUkQ2JTJGQVowQ3hJbUhmQiUyRjRqQ01zdmdOY3c0ZEluZ1lDSFVFaSUyQlcweUVRTXZ3SGh6dlBnMmtVS2RBUVhmRGxDc0RnV2hyQ0ZTaEhtSThFMEhIUFFKbE1Pazg3TUFWVXhORlIwUTl4dmlSSmxIa2E5UXFrJTJCYzhOdkJhUVE4N0clMkJuSnNnb01hQWlnZUklMkZJQU1xeHIzQUFnJTJGa25zJTJCN1FvaThJWVIya01XWlNzSkQ5SHhsYWdKJTJCajF4Q0RwTlR6MzdoU0hNTWZhcjVndEFLNXk2JTJGZjdjSnBMeUdGQ2FCUjAxMGlOV3I2OHBOUngzYXRwR05PakdNYU96YnFNT1pqME5tbGZWJTJCVlhKR1FKZ2dpbFMzcklhSG1HS1F5Z3BtT2d1QkZ4eHk2anlpT0JOVjFOOCUyQmJCMGF2TUhCaHJrSGFsSnRDQnZsSGxNZ2daYXd1RGZjNkJ2Q2pmckNWVkRFNmpjRnpzZkNHQ3ZBblpKd3JHZmdydUFsdlRvUmNNd1hRWkVpVmRvUU53aUNPaXJvZE1BUmg3UkYxNWs5eUVCOTVzZkVzJTJCUjBFTEc1elFIMUVBZmJEJTJCcElVTkRCTkowd1kwZDByOHp1Wk8lMkZYQVhmVEpkeEFvT1FIZ3hwJTJCRUZnaFVSbkFnRWN0dVFSSU9ndFMlMkZlNE1sTTAlMkJSV0FTeDhobW55aWowSSUyQjdSQWRxdVhFbSUyRlRyVFc2TVdxd005ZFVLaFZSYTlmVGlDTndRSHNNQ2hpTm1TelRrcE5BNUxFejhMTkg1OTR2R0p4NEVpWlhQcVpyWUVhRiUyRklvSjZYR0U2SkRPSWVWejhCYTRnVUJPQ1VKT3JRSHg0YVZGQ1BPSVhyR3V5ZCUyRnJFRkdobUZ0dUM3V2JPSXpJRTRCJTJCUWZycFpGM2NEYUh6TUJ1RmglMkZPaEZ6TlcxSXI4cWN4UzJpYk1PSnNzclJkM0NpNGtWMExnc3F4TjVrSHE1V3lVUlhaRlhyaFpDeTU2OXl4eVByUmVaMXd6ZloxNE44MDNENXBQYSUyRmZGYjNGRiUyRjZHS2MzRDdOWnZEYyUyQkxEdkdVYTBFeE1SSm5jQnRDbDYyWmZGY01QbUhPcFlkcXZJTW45SkUzTWlHYlVTYnN2amU4R2VWUG1TVHVCeGlpNzR4S2pORzlmZU1Xc2pNR0ZYZ0hqNHIzWmF5dzhyUXVvM0lqbGZFcWlKQVVjUXZmOGJ5ZnQ3SEl2d0pjMEZMWFRFRnpYSk5GV01SUEpWQnF0U2M4Q0ZQVjl0SUs1d25NMmx2SjBLUjFwR2E1R295Q2VmbjVRJTJGM1NSVEpnOSUyQlZOeXBPUTklMkJkMFV2Tk9pelNSV3hZNXJLeHpvYnVUSFFWT2xjUkdyTkh6UWZuejY3Q00yd0NhZ0E0ZWNoJTJCckVVRjE5UnZZbWFNV2ZHY0FrQnFCZ2lxeGtkRXA0ZE16MU9TZjFXMmxhUEUzdllndWZPOEU5NlMlMkZRVkw5N2tUZ2F1eElvTXlWcEJybVoxQVV5QlglMkI0UmhmU0NrMSUyRkUwTmtrN3pvTzFDOWFyNWZUJTJCd2Q3JTJCWXFPNGdtT3RuNTBzRHFtb2Jza0NQSjhFZGNJd1NvNlpyWHZtRVhmbEVSd1VqJTJGVDUlMkJYZ2VNUkZYTWNYdzExMTN6SUVIdExYVXRwaWxNYmphMzNtbFZHTThQOUJmTnpXZ0R5WTZPTVM5VGx2JTJCd09ZdDM1VnZlRmg4UTVveWNTMVI0TXczUWoycUQxVzF0TTB3TFRUQXJPSGN4ZHBsak5WelJ3Nk02WHE5aVlMNmpjTXFEYWdvVjJCUnJzN2k2a29HcDhsUDdNZnBjSXh4cW15RVMyM09DNlVXc3doRU1rNmJaV0dVQ0ltcEtUZnFZeDVaVjZBNWd3SHRSTlphRXVCVW9zY095emN2RlAwNHVMaGFLMnhib205ZW42SGJVMjZXbyUyRlVyZFllVm1iN1g2azl1TzEwS0dIcTJuUnVjaG1zN3F5cktWMjg3RzhoNklMYVRPaXdOOWUwQklTb1h4azVMWkhxOFo3aGZ6c2RMNjJTaTZINTZiV3JUNlBEOVFlb3dQUTdOS1htcHJBZGkwNWhEdmZYUVJOJTJCOFBGN3pmQkR4VUtEV0tKd1dnNnBpVWwyTGpXYng1M0kzemZMYmRKWXV3dm5WdGxYTE4yMzclMkZKR215eEtZdiUyQk04Znk0TEVPVUtXUjIyVFQ2cFREMVZLYVc5Q2FWakYxMTJncWdtb3V3S1dycnVhaUpxcnlZZlRFUTVaNWhlUml5SFZQOExpY1hIZUh4dUxSMWhZNWtobGtla05icE4xNSUyQldTRlYlMkZQQXRpcyUyQjYzWDB2bTRKMjlla3VHbUNiMDRNUkNkM0Q5WGlwMHlzZmo0SlJDeCUyRlU4TUNTV3A2MTdGZnBieU9FUVRlajB4Q2tjMXIyUE9nMG04ZnJoVzR2UTQ1RGRNR1lUJTJCazFBQ2QwN3h6WkluTlhmQndHck9mVmtubEgzS2FMV2t4M05IMHFDZGFGYkhxRHBWJTJCam9zTkNQcmhYY09JcmYxTjhPTFhsNnFvZGFPYTh2V1BMY200ODg3R2tPcTY0UWFxdUJScTJYNjVJbjFJcnFqVnFGSGN1ZGJhMHclMkJnN0xRc2NxWGt2aHlrSGRxQkpBUTlXTml0eE5kWU5vUlJySVVUZjZxeXoxSFFLdVp0cXpVd3NHQXE1ZVVRdzUwQXNVWE9FMUZ0Yk5vYm9tdjBQNE5uVHlrNEZORENhb1IwNE0ydEloQW9NanYwTklkUExuR3pweloxNURJU1NGeEtzU3JaczMlMkJwRE40NjJORFJaZVAyYW12JTJCcEhIVmw1dFFaNmFkMVc2JTJGcnFFRTIyNDJQRDdsd2RQaXdGMHl0dGo3VjJ4a0F2dG5hTzV5RTlWUEZWYnR1ck1KUlFNWk90bExxJTJCQ2ozV1hmWmpLOFlacVplSUl4OTZBQ3RHY1dBMk1YQ29iR21vbXIzcTBjQXFvYWtXc2NHQUh4c2Q2SnBrT0pLbjF4MXpHWHVTTG1RT1RzNWs2Wmw4JTJCN2k4bFBGa25jTkRiQzZmS0x5Uld6TzVsZHpMMTRSTDNKUE1VTHBYJTJCZnhoOCUyRlU4UFpvOHZFb09rVVY5MjNoUDg4TzMzNzdkVGY3NjQyTEpFMzV6JTJGWVUlMkZQdDJQVFBPd1dyOHpKeEtOSHdTUTRiMU0lMkZSYmZWNXY5eGMxcXVSYVFGZkxWV3dXN0JuVTF3eWpROGo2UlJRYXlXUnpPZFFoJTJGY1JRUnJxJTJCS3VTSFh4dE8lMkZWdVRNbkZ2NmtDOGZwTlUxR1Rjcm52Q1doTFVpcXpQMlRVS3N1MzhFbUJCRDJDYzd6Y1Jjc3RnSjhYcVclMkZZWHVMblFkd0xYVnEzYUdyVm0lMkJNUTN2cEpIOVpXek5KUTlzTGJYdTdIVUxWc0RNUE9lbk1KJTJGY3ZqJTJGJTJGVTdSZUpxdUppS1NUeFUlMkYwSG8zbXklMkJrRWVheWVhSVRFanB3dCUyQnVvTU9WdkdyekNmc2tpdmhoVDclMkYwTmElMkZUQXE4RGdYSFdDd2ZOciUyQldKbmNUOGtURW4lMkZyQVlRN0xPT2RMRnlzcGdJd0JLWlplQjglMkZwdGxkZFM1eDZjWHBpb05mbzQ1cyUyRnM5U1M2OHZSMWczeW9hbWJGNDMxNHVtV1A0aFRXR1ZYeDlXTGNEaiUyQjNXZmQ0Y1p0cFhJZElkUSUyQjVVS2JhYXFCcEtCOG8zQ0ZGNGZ3alglMkZGRUM4ZjZBJTJCODAlMkZYS2NqSGQ3OCUyRlJvdSUyRndpOWpNc3ElMkJUNkVsTjFGRXNLJTJCVnNaWkhyd3c5YzJjc05DMXFTM1FWdTl0JTJGc0ZlQXVmMHZoZmpxWHclM0QlM0QlM0MlMkZkaWFncmFtJTNFJTNDJTJGbXhmaWxlJTNFjf8QiwAAQABJREFUeAHsnQeAVNX1xu8CNhRFsSsq2HvDgsYSNGLvvaDB2LtYg5WILbF3YxRL7EYlGmOvsf0t2EsUe0NBY0eXnf/5nfvuMCwzy8AOuzOz34WZ997t77t335zvnXPPbchZCApCQAgIASEgBISAEBACQkAICIEaRaBTjfZb3RYCQkAICAEhIASEgBAQAkJACDgCIjWaCEJACAgBISAEhIAQEAJCQAjUNAIiNTU9fOq8EBACQqD1CHz//ffh1VdfDd99913rK2uhhrZqp4UuKEkICAEhIATqFAGRmjodWN1WfSJw2GGHhYaGhok+0047bVhqqaXCGWecEX799df8zXfv3j307t07f13uyaeffhouvvjiMHDgwLDddtuFwYMHh1deeWWC4m3VlwkaLfNi9OjR4b333guNjY1llhifbUoxG1/D+LOmpibvx5dffjk+ssrOTj/99DDzzDOHZZddNjz88MNTrXdt1c5Uu4E2qvi0007zv+/HHnusjVpUM0JACAiB+kCgS33chu5CCHQMBBCSCausskpYdNFF/Zy4Dz74ILz00kvhmGOOCW+++Wa46qqrPG3OOecMs846q5+X+8Ub+w033DB88sknYbrppvNiY8eODX/+85/D5ZdfHvbYYw+Pa4u+lNvn5vkGDRoUrr76asdkueWWa57c4vWUYFaqwg8//NBJ5VZbbRX+8Y9/lMrWbvH4ifnLX/7i43zggQc6sZkanWmrdqZG39u6zuS7J/19tXX7ak8ICAEhUKsIiNTU6sip3x0agb333jv84Q9/mACDN954I/Tp0ycMGzYsDB06NMw777zh7bffniBPORcHH3ywExqEXc5//vnncM011wSE3gMOOCBsvPHGAcE/hanZl9RGWx6nBLO27F8l2/rhhx8CWq3VVlvNSWsl6y6sq63aKWxT50JACAgBIdCxEJD5Wccab91tHSOw5JJL5rU3b731lt/pbrvtFvbff38/P+GEE0L//v0DZkCFYciQIWGTTTZxLQyma88880xYYoklAtqOaaaZJnTr1s3JDOZtP/74o6cXli92Xom+FKuXuDFjxjjZWmyxxQKmYmituIdx48Z5kZ133jnce++9fr7PPvuEP/3pT37O1+233+5ksFevXgENDtgMHz48n85JIWZcb7311o7F//3f/4Utt9wy9OzZ08kjbaa36uRrHu65556w6667evTjjz/u2L///vuBeMYB86KzzjorgNX111/v+crpH3ko/9xzzwXGFCJLn7bYYouJTAT/9a9/hbXWWivMPvvsYcEFFwybbbZZePnll/N92mmnnfwcIsd9UmcKmB+ut956Xvf666/vfU0Yk6el+0h1cOTei7XTUnm0hKeeemr47W9/G+aee+6w6aab+rz97LPP8lUnHB544IFw8sknh5VWWiksv/zyjglEHG3l2muvHeabbz4n4oxf89DSPd53332O84UXXpgv9tFHH3kcxL7QtPHss8/2+P/+97+el7+Tww8/3DVf/P0w10488cSAxjOFlu4/5UnHF154wbWn/J3SBwUhIASEgBAogoD9KCsIASFQIwiY5oR9pXJ//etfJ+qxmaDlOnXq5OlGajzd1krkFlpoIT83YTZna288z9NPP+1xjzzySM7W6OR69OiRM4Ex9+677+ZMSM4de+yxE9RvpjA5Izpetwljnja1+zJBB7IL+mFCuvdj6aWXzvXr1y9nxMuvTWPkuUzgzM0222weZ4Qhd9RRR3n8ZZdd5nHgt/rqq+dMO5Eve/PNN+ebK8SMSK5NMM3NMMMMOROwvZyZ5XldRhDz5ZqfmNCdW2aZZTzfLLPMkjPylXvnnXdyqR9GMjwN/E0Az8dPqn8mQHs505b52K266qq5VBdx3377rXfFiEquS5cu3vcNNtggt8ACC3g57mPkyJG5f//737kVV1zR47g/+mcExMsaCcn3jfqNFPm1kYucCeaep9R9NMehVDulyv/yyy+5lVde2dsz08kc42laR79mzFNIONB3MDNi50fOE+6kzTPPPPm6vv7661Q8N6l7NM2nlwOXFMykMd/GU089laJzzLOZZprJsTFCkzMS4/mMeOc233zzfP/79u2bM2Lo5Urdv2lZvaytb/J8zz//fA4cGMtbb70136ZOhIAQEAJCYEIEeNOoIASEQI0gkIiErZ3JQUz4PPHEE7lzzjnHhW0EOgSqJDg1F9Dt7bcLTAh933zzTW6RRRbx60KhvhgUpknwfAhuX331lWdpj77YeiHvB4QkBTOfyi2++OIuvP/0008evfvuu3s+W2eUsjkZgvS9+OKL+bi//e1vns+0M/m45phxDa7mMCFn3sE8H8SOuN/97nf5csVOzFmB57M1NfnkJMxCZo444ogceQiQtXL6l4R5xuLBBx/0sqZhy/3mN7/xtv7zn/94XMIgkVAIoWkmPE8iY9wP9wHpSeHOO+/0ONN85BI5RlBfd911PT7NlVL3keopPBZrp1R505x5O5AO07h4Ndyfadc8HuJNSDhAXEzr5XH333+/5+GeDjnk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XJf64HKXMLX7MkEnCy7w7mWka4L+mbCdMwE+nwu3zcldtWlxPB6312nPEu6NPWeM2OS23XZbryu5Zy7EjIJc49GqeTDNh3unah7f/BpcE5ZGwHL0n+vmY1hu/8hHebylFYZhw4Z5/HnnnefRX3zxRc5M9NwlcWqfo22kmffkhstj4ozkFFblLpKTd7xUlj1XTFjP5yt1H/kMBSfF2ilV3szk3FW2kVbvG96/uA8jEDnGmf7gtroUDuypgxfAwoAbZcqZFjIfbetkcpO6x5SZsaa8aYtSVM42TvW4Qs92KRGPaEZ2PD3hhxt125wzZSk5D5LbdSNC+bxffvml7yVFXbfddls+XidCQAgIASEwHoEGTu1BqSAEhIAQqBkExowZ45ol3oQbUfEd21nL0DywjgRtCZonAqZYmN+xS32h1yw0NWghkgex5vW09vqTTz5xkyS0Yy2FqdE/TLfQQmE2hWex5l7TSvUnraFJ3u/QoCRzsFJlKhkPZngKs80vQ1pMbxuLugmWkcySzgAmpw9T8x5ZF8S6JiMkwQhNMGLUpvhNDg7KKwSEgBCoBwREauphFHUPQkAICAEhIASEgBAQAkKgAyMgRwEdePB160JACAgBISAEhIAQEAJCoB4QEKmph1HUPQgBISAEhIAQEAJCQAgIgQ6MgEhNBx583boQEAJCQAgIASEgBISAEKgHBERq6mEUdQ9CQAgIASEgBISAEBACQqADIyBS04EHX7cuBISAEBACQkAICAEhIATqAQGRmnoYRd2DEBACQkAICAEhIASEgBDowAiI1HTgwdetCwEhIASEgBAQAkJACAiBekBApKYeRlH3IASEgBAQAkJACAgBISAEOjACIjUdePB160JACAgBISAEhIAQEAJCoB4QEKmph1HUPQgBISAEhIAQEAJCQAgIgQ6MgEhNBx583boQEAJCQAgIASEgBISAEKgHBERq6mEUdQ9CQAgIASEgBISAEBACQqADIyBS04EHX7cuBISAEBACQkAICAEhIATqAQGRmnoYRd2DEBACQkAICAEhIASEgBDowAiI1HTgwdetCwEhIASEgBAQAkJACAiBekBApKYeRlH3IASEgBAQAkJACAgBISAEOjACIjUdePB160JACAgBISAEhIAQEAJCoB4QEKmph1HUPQgBISAEhIAQEAJCQAgIgQ6MgEhNBx583boQEAJCQAgIASEgBISAEKgHBERq6mEUdQ9CQAgIASEgBISAEBACQqADIyBS04EHX7cuBISAEBACQkAICAEhIATqAQGRmnoYRd2DEBACQkAICAEhIASEgBDowAiI1HTgwdetCwEhIASEgBAQAkJACAiBekBApKYeRlH3IASEgBAQAkJACAgBISAEOjACNU1qfv3115DL5Trw8OnWhYAQEAJCQAgIASEgBISAEKgIqbnjjjvCSy+9NEk0Z5xxxvDYY49NMl+5GZZccslwzz33TJR9tdVWC8cdd9wE8e+++25oaGgIr776qsf/8ssvYe+99w5zzTVX2GKLLcLnn3+ez//jjz+GTp06eX7KFH6uvfbafD6dCAEhIASEgBAQAkJACAgBIdD+CFSE1Jx77rnh/vvvn+Td/POf/wzLLrvsJPO1NkNTU1PgUywkzc6NN94Ynn322fDUU0+Fn376KVx++eX57OThc8MNN4S33357gs+WW26Zz6cTISAEhIAQEAJCQAgIASEgBNofgckiNXfddVfo169fmG222cKmm27q2o1TTjklPPfcc+Hss88OaDHQgBx88MGhd+/eYamllgpHHXVU/i7/9Kc/hQ8++CA88cQTrh059thjQ8+ePcNyyy2X1+BAJs4444yw2GKL+WfIkCF5E7P//ve/Yf311w+9evUK++23Xxg7dmy+7sk9wXQN7cw000zjfVpiiSUmqoK+LbroohN8unXrNlE+RQgBISAEhIAQEAJCQAgIASHQfgh0KbfpH374Ieyxxx5u1nXMMceEE044IZx++ulh//33DzfffHNYY401wjrrrBMuuuiiMHz48ID2pkuXLmH77bcPG2ywgZORZ555Jvzvf/8L33//veeBWFx66aXhpJNOCkcffbRrTf7617+G0047LUCA5p133rDPPvsEiMRhhx0WdtppJzcLO/nkk8OwYcPCxx9/XLL7mLlRbwpjxoxJp37cZZddAvUsssgiYe211w6bb775BOlcQOLeeuutfDwmaWCgIASEgBAQAkJACAgBISAEhED1IFA2qcFEi88XX3wRBgwYEG699dbw5ZdfujYFzQ3kYIEFFgh9+/YNq6++eujTp09gHcs888wTRowY4aSm8LbRkGACNvPMM4fGxsYwcOBAT77kkkv8/KCDDvLrV155Jdxyyy0BEvLCCy8Erpdeeumw1lpruTaosM7CcwjP448/no+ClBWGoUOHhlGjRnkUpAuyddVVV7kGKOW76aabAuuAUoCkidQkNHQUAkJACAgBISAEhIAQEALVgUDZpGb22WcPf/7znwMmY2eeeWZYc801/br5bXTt2jXsu+++vl5llllmccLSPA/XECEIDYF8P//8s59DhCBBaHoImKMtvPDC4eGHH/b8EBoCJmgs8i8Vdt5553Dqqafmk6kX4kV4+eWXXRv00EMPhTfffDMccMAB4Y033givvfbaBKQGczruU0EICAEhIASEgBAQAkJACAiB6kWg7DU1X3/9tWtH0M488MADYdpppw1HHHHERHc2aNCgMMMMM4SRI0eG0aNHh2JrVSjUuXPnicoS0b1798A6mm+//dY/77zzjmt0ICTfffdd+Oabb7wcR/oyJQGzspVXXtnNzvCABgFCS7PeeutNSXUqIwSEgBAQAkJACAgBISAEhEA7IlA2qYGgrLrqqq7R+O1vfxv69+/vpIO+Q1DSmhVMulZZZRU3RcMj2osvvljSE1mx+1533XXD7bff7oSINnfbbTf3TLbSSiu5KRvreCA355133mTVW9gWhAYX1JiyYVKHiRyBNT+FXtPQ3uAEofCD+Z2CEBACQkAICAEhIASEgBAQAtWDQNnmZ2hKWKgPuZhjjjnca9gFF1zgd4KGY/DgwR6PpgbnATgAgCxsu+22viAfhwHs91IqpDScBGyyySZuckbeZZZZxp0GkH7iiSe6edhZZ52VX8OTyhXWO6k4+kt/WP+DBzW0SawRYl0PzgVwhEDYa6+9Cqv1c0zwimmoJsqoCCEgBISAEBACQkAICAEhIATaBIEGW7OSm5yWcMnMonr2mykkD1999ZWvjcEBAN7N0Njg1pnw6aefOsEpzN9Sm2hLcN9M15qbr6G9QVtCPN7IWhPQ+GDmNt9887WmGpUVAkJACAgBISAEhIAQEAJCoB0RmGxS0459VdNCQAgIASEgBISAEBACQkAICIGJEGidqmOi6hQhBISAEBACQkAICAEhIASEgBBoWwREatoWb7UmBISAEBACQkAICAEhIASEQIUREKmpMKCqTggIASEgBISAEBACQkAICIG2RaDNSM3dd98d5p577ra9O7UmBISAEBACQkAICAEhIASEQN0j0GaOAvCO9tprr4V11lmn7kHVDQoBISAEhIAQEAJCQAgIASHQ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arH9Djl0uulSCPz888/hoosuCt9///1EWV599dVw6623ThTf3hFvvvlmmHfeeaeoGz169AgPP/zwFJVVISEgBISAEBACQkAI1AMCZZMaSIgTESczkBhICkcjHE5SjJxAaNCiWJxF+sfJj19amml1PA9Ex+uDtBiMnDeOs7iMxHh91J/qTvljvd52Qfv1MBC6h8oh8N1334UDDzwwjBkzZqJKH3300fDnP/95ovj2jrjzzjvDpptuOkXd8L8/+7tTEAJCQAgIASEgBIRAR0WgbFLTkJGQpjxhQXsCETFhygmGGY/BY5ywJO1LRkZcy2MkBRZEPZ7HCjkpMiIDibERiEQnEiW74H9GeKibuiBOkdhQT779jjp6VXTf1113XVhkkUXCPPPME/baa6/w008/ee9uvvnmsMQSS4SZZ545bLTRRuH999/3+BNOOCEcf/zxYeONNw5zzjmnC/T/+9//wplnnhl22GG8J7sPPvggrLjiiuHdd98No0ePDjvuuKNrNNZYY41w//33e13PPvuslx8yZEhYaqmlwhZbbOHxG264Yfj888/9nK9nnnkmnHbaaQFtzW677ebxpfqXL5SdXH/99WHZZZcNq6yyShg6dGi+Dc4HDx4cttxyy3DYYYeFX375JRx88MGhd+/e3pejjjrKa7j44ovDVlttla+W++G+Ro4c6XGQGvqNlmm//fYLs88+e1hhhRXCpZde6ump3rnnntsxpt5ff/01X186KXU/zfuZ8usoBISAEBACQkAICIF6QKDsNTVOJrhjlr0Yr/Bl/3Y8rt+aVYHDoVcNLtmPc/UWuyQ2lUh48cUXw4ABA5wwQGAOP/zw8Pe//90JwM477xz23HPPsOuuuwZIx3bbbRcgIZCVa665Jpxyyiku7COkX3nllWGllVYKxxxzTDj33HNdeL/99tvdjGzhhRcO66+/fvjmm2/CJZdcEl544QUnMm+88Ub49ttvw9133x3eeustJxQLLbRQ2HzzzZ00zTrrrPlbXHzxxcM222wT7r33XicgL730UijVPxxbpPDFF184CTrxxBOdbHBEO0L48MMPw+WXX+7kDNKC2dvw4cO9/126dAnbb7992GCDDfy+DjjgACd19O+OO+7wfkN+qB+itd5664U//elPgXu++uqrw9tvvx0OPfRQ7/P5558fIFZguMACC4Q99tgjYHZ29NFH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cjjqqKPCeuutFxZbbLGwww47hHfeeSdccskl4Xe/+13YdNNNw8iRI8PYsWPDQQcdFLbeeutw2223hVGjRoVTTz214iiJ1FQcUlUoBISAEBACQkAICAEhIATqH4Fjjz02nHvuueH7778PDz74oGtutthii3DyySeHRRZZJAwfPjx8++23nufII48MvXv3dgI0YsSIioMjUlNxSFWhEBACQkAICAEhIASEgBCofwQwMyOgoSFw3alTJ/+8/vrr4YsvvgjdunULzz//fJh11lnDggsuGO655x7PW+kvkZpKI6r6hIAQEAJCQAgIASEgBIRAB0AAAkPo3j1uBvrqq6+6ZgbtzLPPPuuezW6//fZw2WWXhX/961/hxx9/DIcffvhUQUakZqrAqkqFgBAQAkJACAgBISAEhEDHQGCZZZYJPXr0CFdccUXo3LlzePrpp8Paa68d3nrrLV9XM//884c+ffr4epqrr746jBs3ruLAiNRUHFJVKASEgBAQAkJACAgBISAE6huBhoaG/A3ONNNM4W9/+5t/MDPr379/GDhwoDsMGDBggDsLgPQsvvjioV+/fgHTtPPOO8/L//TTT/l6WnOifWpag57KCgEhIASEgBAQAkJACAiBDojAmDFjJrhrHAR8/vnnrp3BdfPcc8/t6T179nRtDVqbhRdeOEwzzTThxBNPDNNNN13o2rVrGDRoUMDhwP+zdx4AThRfGH939N470nsTkS4dRFRELICVP6KgKCqgSBUURFFUEEWxYa9YECtI7yC9SJfeO0fnyn++t9lwd1zLXZLLJt9osrvT57dHNl/ezJvBgwfr+ps4lXpwQUuNB7CYlQRIgARIgARIgARIgARIIGECECnXXXedW9DYuWDVqVKligoaxMGag7wIQ4YMkUmTJknhwoVl6NChEhERofGevlHUeEqM+UmABEiABEiABEiABEiABLxCIH/+/DJw4EDJmDGjjB07NtXihqLGK7eDlZAACZAACZAACZAACZAACaSGQN++fXU6GryjXbhwIY64iT/NLbH6KWoSI8N4EiABEiABEiABEiABEghxAthIE9PHfP06duyY7m8D3La4mThxopQpU0Y380zuNlDUJEeI6SRAAiRAAiRAAiRAAiQQogSwqD8mJsbnL3hHi46OVspYb5M1a1Z57LHHZOfOnepYIDn89H6WHCGmkwAJkAAJkAAJkAAJkAAJ+IwA1tJcvHhRnQdA2GA62oABAzzyhkZR47Pbw4pJgARIgARIgARIgARIgASSIoA1M6NHj5bIyEh17+ypmLHrpqixSfBIAiRAAiRAAiRAAiRAAiTgVwKjRo3SjTrTuk8NRY1fbxsbIwESIAESIAESIAESIAESsAlg883ixYvbl6k+0lFAqtGxIAmQAAmQAAmQAAmQAAmQQFoIeEPQoH2KmrTcBZYlARIgARIgARIgARIgARJIdwIUNel+C9gBEiABEiABEkg7gcuXL8vp06fTXhFrIAESIIEUEDh16pTgcydQAkVNoNwJ9oMESIAESIAEUkngyy+/1Dnp8CCUVMiUKZNs3LgxqSxJpuXIkUPmzZuXZJ5AT+zWrZv07t070LvJ/pFAQBPo2rWrFC5cWNavX59oP6dMmSI1atRINN3bCXQU4G2irI8ESIAESIAE/Ezgxx9/lM6dO8vLL7+cZMv2BnpJZkoi8ddff5WaNWsmkSPwk/r37y8ZM/LrT+DfKfYwUAlcunRJ8EPKrFmz5Lrrrku0m2n9vEm04kQSaKlJBAyjSYAESIAESMAJBN58802ZM2eO4FfRd999V/CF46mnnpJy5cpJtWrV5LnnnktwGHCf2q5dO4mIiJBjx47JPffco9aexo0by99//51gmZEjR8quXbtkwYIFctNNN+nmeNdcc43ccsstWqZ+/fpax9ChQ93lv/vuO2nUqJEUK1ZM7r77bi2PRGy09+STT0rZsmWlQ4cOMmjQIBk3bpyWS0l/Lly4oPW+8sorUrVqVa3no48+Srbdn376SSDOEJo3by5vv/22CjWnW6DcA+cJCfiYQMeOHQWCBZ8zmzZtUmvNnXfeqZYb/Jv6+eefr+oB9qLBZ8bw4cM1DZ8hDRs21M+FTp06yeHDh68q42kERY2nxJifBEiABEiABAKIAARB5cqVVaDgS8OECRNk6tSpArHz2muvyTvvvCMzZsyI0+Pnn39e3n//fU3PlSuXdOnSRbZt2ybvvfee3HjjjdK+fXv577//4pTBxdKlSwXz6PGaPn26bNiwQbDHxOrVq6Vt27aCLzb4ooO4nTt3uoUL4mFNwhcX25r08ccfaxyuIWwwdQ5fkBBS0p+oqChZsmSJfPjhhzpWTCt77LHH5MSJE0m2i3Hu2LFD21m7dq2KvtatW0ulSpU0jm8kEOgEoqPOSXSkd15GnXg8XFg7EeCKuWTJktKzZ0+Jjo4W/GDQpEkTefzxx/XfoF0xfjjBDyjYXBM/Xuzfv18/L2D1/fzzz/Xf7O23325nT/WR9tdUo2NBEiABEiABEkh/AhUqVJBChQqpZaZ8+fJqvcAvoHXr1pXt27frL6EQHW3atNHOvvrqq/L111/LokWLpFatWipmZs6cqdewqODLxQ8//KDCqE+fPokOMDw8XL799lvJmTOn/PXXX9rWwIED9cvNiBEjZOvWrYI1OLC+3HfffXLw4EEVDugLwu+//y4vvPCC3HvvvfqCtQkBosOT/kC43XzzzfqCBebPP/9UYZZYu9pIrDd8yRo2bFisGJ6SQOASCM+UU3bMu897HQxDVfqW4jrxOYGAI/79w+LasmVL/fdu/3CBf+8I586d0x9J4FAAP7ZkzZpVPvvsMylYsKB88MEHEhYWptZdrL3Zt2+flChRQsul5o2iJjXUWIYESIAESIAEApRA9uzZ1WKxbNkyyZMnj/46Grur33zzjQqPAwcOaDREBAKmneELBgKmlhw6dEjPE3vDlxJ8oUHIli2b1K5dW88hdrBmBb/Kwgq0YsUKeeKJJ/TLDcrgl12kYT4+RJAdIMQQPO0Ppp7ZAaJu/vz5ajFKqF07X+wjxs1AAk4hUP6enQHXVQiXevXqqSjBdNTYARbbI0eOqOCxPaXh3/iePXskQ4YMmhWfNwgQRGkRNZx+phj5RgIkQAIkQALBQQBTQiAyMH0Ma1OqVKkSZ2CwwvTo0UOnieHLSN68eTUdXozgEhovCKJevXrFKRf/Iv5ie1sQxc6HufWY5vbHH3+oqOnXr58moyy+0NjTwBBp/7LraX8wFc4Oa9askXz58umc/oTatfPFPkKEMZAACaSOAH78wHQzvPDZgR8VYociRYrI5s2bJUuWLDJkyBBNwr9x/Ahif95gvQ2ss1gDmJbAf8lpoceyJEACJEACJBBgBPBrJ341LVWqlC7eX7VqlVpm7G5iutpLL72kXyhwxLSPAgUKCBbZQ2hgnUqzZs30i4hdJrVHCCtYZjAVDv3CtBOshUHA1BWsq9m9e7dMmzZNp40h3tP+TJw4US0/EFD48tSqVSsVdIm1izYYSIAEvEPg5MmT6pwEU0AhXLCWDwFrbBDw2QLry5gxYwT/VpcvXy4tWrQQrGdbvHix4EcFTCGFoxLbcqMFU/FGUZMKaCxCAiRAAiRAAoFEILa1AZYaOAfAr6FYtA+PYy+++KJgGohtTcE0MKx7ef3113XRLsQFXrBywNlA9+7ddV1K/DHa5ePH4zp+Gq6xlwW8nOGLDZwZQHD8+++/8tZbb6mnNvyKC5H18MMP6/qezJkz65S2lPYH7UK0Ye0O1u08/fTTunYoqXbRL5tX/D6jPgYSIIGkCdj/bnDEv2u4k2/QoIHkz59fjh49qv+m8W8Qwc4L5x+2E4HbbrtNHn30UXUWgDKffvqp/uAR3/qbdC+uTg0z89g8d3twdT2MIYF0J4B/OPxzTvfbwA6QAAkEAIEzZ86oZQRunRHgbQgule0vGAl1EVPRYOlAvqJFiyaUJVVx+FxGvVjvgs0/4Z0Mv+jOnTtXvZ6VKVNGFw/DLTQ8ucGDGUJy/Tl79qwKIHtqCwRZ7ty53X1MrF2sOWJImAAsdPBc17RpU3eGg/O6m/tTQvJe09Edl5aTg+telqylb5G8lR92V7Pl01xSofUfEp4x7ffm0pkdsm/1ECnbabO7fvtk928tpGCZeyR7gXp2VJqOu5f1loL1Rkn24q0k8tx+2fnzdVKh1R9pqtMuHHnxqOxc2E0q3G+tfbPj/XFM6O8guXaxRgZr7PDvEG7lMS0UDkySCphyirV9mCKLKbNpDXQUkFaCLE8CJEACJEACAUYAXy7sRfzoWvHixZPtIb7sJ7WRXrIVJJIBQir2uh586UHAGp7evXurO1hYkeAuGhYmO3jSn9KlS9vF3MfE2nVn4AkJkIDXCMR2EACLa3KCBg3jxxNv/oBCUeO128mKSIAESIAESIAEUkoAU+Mw1x6bXuKLDRYY25allNSBL07YyA9T2xhIIBAIxERdlNMHEt641tP+RV867WmRkM9PURPyfwIEQAIkQAIkQAL+J4ApaFgHg1dqAqayYZ8bBhIIBAJhGbJJjhJt5cyJFV7rTs7SHbxWVyhURFETCneZYyQBEiABEghqAqNHjw7o8WU9HqMejwK5k7VvsTYUDOQ+sm+BSyBDlnxSvPX3gdvBEOgZRU0I3GQOkQRIgARIILgJDBo0SLp16xawg2wUVlHO79hh+mccuuj71V2143FEJrMUR/Pa53YJzefKDFdHyGcHV7R96W7Lio/97s6iJ+tW7BCKmrhMeEUCTiNAUeO0O8b+kgAJkAAJkEACBLDoPlDDignTpHaDSqZ7RliY/8PMfxIWYzxW4ojoaHMwu0yYOFUidro5honZ7yImXDQrkk0exMK7mRbVN1c1RuFANplsWpWleKw6Y1T9WOfx24eoYSABEnA2AYoaZ98/9p4ESIAESIAEnEEgCsIFggPvRqjYisQlShAH4RFmNu2LCQt35YU8QRmUtc5UyhhBY3SOFawsrlTksgKizRaA5mXaM9Fh0VbLCbavefkWCgQundltXEfn9MpQoyPPeqUeVuIdAhQ13uHIWkiABEiABEiABJIgEK2iwpUB2gN6w5Y4sKIYFRIOsaKnRsToiSV01Dpj0nUvMpRFiDTXsOyo/NEYc2bym3dLNsH2o1JJYyx5Y+UzEXHad8XyEOQEMuetLCcP/CmClzdCeEYJz5TLGzWxDi8QoKjxAkRWQQIkQAIkQAIkkAwBI2rwn5pozCEs3AgOI1xUo+jiGFtnQL2Yc9d0sRiIIXNuDqYQ0kwtem6uo1Ea6YiGINITFUaIj3ZljAlzWWwSa9/UwhD8BIo2eT/4BxnCI6SoCeGbz6GTAAmQAAmQgL8IqDgxosLSGeYYaQSIESm29QW6A1rFpVDMERcQMeZ/zWqLFlcWiCRdX2PSbTOMOYahTlwjqMjB1DVMQbMmniXYvpWb7yRAAg4mQFHj4JvHrpMACZAACZCAYwhgrYxRJ7CahKmFBVPFTIB4Mdd6jneID+TD/DRcmnQIEhUjmsuVZhKselAScZZoUT2DOrVCqwJ1KqB1mHwJtW+yM5BAqBLYs2ePzJw5U18zZszQDW2PHTvmOBwUNY67ZewwCZAACZAACTiPQHQUxIrpt3mLxgn0hg4DqgVrZ+xrc6nXLmcBKIPsVmaVLypYUA/StC4jlIzIcc1G0/wqhjQdaUY3mURkTbB97QffSCA0CFy+fFkgXmwhs3fvXmndurW+XnzxRSlXrpwjQVDUOPK2sdMkQAIkQAIk4DACxlKjE8EgLMwLIsVy6WzNFdPpZ4izh6XCxrbamEjXlDJb3CAj7DN2AZ3G5iqseVxJqnkQYRpIqn27WR5JIBgJrFy50i1iIGaaNGmiIubdd9+VRo2CY+NZippg/MvlmEiABEiABEggwAjERKFDsNJYxhWYaXTKGOaVqRhx+S4zZhW9NG/WpDLXQFAONWAtjTmqiwG11pgz1GUtlrHKaIRVPxJ1+plWk0j7riZ4SD8CR7e+b5xHZEpzB6IunUpzHcFQwf79++NYY3LlyiVt2rSRxx57TCZPniy4DrZAURNsd5TjIQESIAESIIEAJBBjLDUuWWJEicoTIzYQhXMsq7Gmp2Gljb0FjZYwFhbkg4iBnEFZlEA+LQqLjsagMise5W3po/YZFT1IdbVrH2O1j1SG9CFQ8PoXjVi95JXGce+zlr7ZK3U5qZKoqCj3mhhYYnbs2KEiBtPKnn/+ealQoYKThpOqvlLUpAobC5EACZAACZAACXhCAJoGskT/N0Il3CgSa2qYSVA9YlIRYQLEjB1U+KCkKQM5E+YSOVY9JpdOLbPK2SV1bQ0W3FgaRuu1xJCJw//x27cb4zFdCOSv2S9d2nV6o2up1TOQAABAAElEQVTWrIkjZBo0aKBTysaPHy833HCD04fncf8pajxGxgIkQAIkQAIkQAIeE4D3M/Of2lmMsLAW+btqMcoFrpghUGwtoim29caIE1sAuWrQiBijXsLDosyv/Ob3ec1gSsF8Y6w3CKp3VMXoVeLta26+kUBgEzh48GAcEZMtWzYVMY888oh88803kidPnsAegI97R1HjY8CsngRIgARIgARIwKUzXAtqjHwxAfIE77iCJcaKc81JU3GC9TNWsHKhADyjwdOZ5erMTC6zRYxWhjrDTY0wC2lmNKBBN+ZMtH1XMzyQQAARwFow20MZvJVt3bpVRQymlA0aNEgqVaoUQL1N/65Q1KT/PWAPSIAESIAESCDoCcREuawnV3SKy5KCoUO0WOJGQRirC/LDqqNTyVxTzGCMUWGDdCN4VLeYci49I7oYB/PcjOHGEkSY8IZCV+q2prNZUZYlR1vkGwkEBIF169bFETLXX3+9Cpk33nhDmjVrFhB9DNROUNQE6p1hv0iABEiABEjAEOjfv78MGzbM+d6KjAhRL2RGiVgSA9fWOUQHNtzUYAQLJqqp9QZHnY9m5I3mtepQV9AmhxZBVpwjr6u+MLMnDvJgSpuVDHlklYWVB3HWtd2+VhGUbw8//LBgrUXPnj2DcnxOH9Thw4fdIgZWmYwZM6qI6dq1q3z22WeSP39+pw/Rb/2HkwgGEiABEiABEiCBACXQsWNH3Qzv5ZdflsjIyADtZfLdUsuJMaLo0VhhcFTrDc6Nu2d4R4s2J+olDUYdI0zMjpnm5Uoz+aKxLgfXMLfgxK5HI00ZpEPQaH2x60e9qA/FzNEuZ444D+YwYsQI6devnxQrVkzeeeedYB6qY8Y2e/ZsGTJkiDRs2FDKly8v33//vdSuXVv++OMPnWI2ceJE6dSpEwWNh3eUosZDYMxOAiRAAiRAAv4kAC9GderUkVdeeUW/5EDcYEdwp4VoIzYgSqJVUBhxgX1rID6MQIHQgH6RSHNudJsKE+SF8FERgiMECASJda7lTZSKIdRj6o3WsuYIkWPy29oH1p6k2ncaS0/6W6JECXnmmWfk9OnTMnjwYClUqJCMHTvWkyqYN40E/v33X4FHsttvv11y5sypgiY8PFxGjx4tERER8vPPP0vv3r2latWqaWwptItT1IT2/efoSYAESIAEHEAA088Q8AUIoqZAgQIyatQouXTJO3t7+AUBLCIQJkaX4KjixogP6A+NVxFiBIvGId4kGJFjiSDEQ8BcETeIj442akZFD/JrBq3fEkUmb6SVR9tIqn2/AEi/RgYOHKjOFfD3c/ToUZ3OiGlNr732moqd9OtZcLZ87Ngxtb5gyh8sMe3btxeslbnvvvtk586dsmjRIhk5cqS0aNEiOAGk06i4piadwLNZ3xDQKQmmavtot2Jf20fE2+f2MXZc7HOm4xuIFRJikVAcctvx9jF2XGLnyeUN9vTYXAJ9rOzrlb9xf7EoXry4bNu2Tc6ePYsm1XKDX3oHDBig1wH/BmuJWcmi+8yYzhrJYd7MmhajVnQ1jWtJjeUJwKTFWvuiQggWHfUI4BqpOYfQsdbGmDg7Tb0JaAPqZACX2rI5Jtb+tkM7VSyqJQmCK94LfbTjsMmhfW4fY6fbcYF2BLUMGTII+n/mzBlcyquvvqriGNPThg8frnF8Sx2BuXPnut0tY/8YeChr06aNPP3001K9evXUVcpSHhGgqPEIFzMHOgF8YNtBXX66Luxz+4johM4Tioudl+nubx0J8iOrK39Xyf2tkFXKWSXHMnZ6MHPVL/9w9+UK+HKKaWgnT560owL6iKlk2EtGrSbunpo4E1SswGKDYKkQFSuQI5A8yIWXDh+ZkQf5zak6DXCVMTFWRnMwthsJM/vXQNDAnTOyJNb+ZdcXfUwJwnMERyzYxjFYXvCiZQviLFmyyMWLF+X+++/XqVBFihQBOQYPCGzatMktYrDAH1PHIGReeukladWqlQc1Mau3CFDUeIsk6wkIAvhljIEESIAEgo3A6tWrdZE3hEzWrFlVzDz++OOCaUVYIwF3rwEfjKiJUfGhSsQSGtppozZUdKjqsKy8yGIUizmYAGFjpeHK2FGMx+YrKYhTdYMDspmAVMvzGWwzCFZCYu1XLV5eer48WHMG49snn3yi1pnMmTOrs4lu3brJ0KFDpWTJksE4XJ+M6cSJE24vZdgzBj8oQMRgQf/7778vhQsX9km7rDTlBChqUs6KOUmABEiABEggXQhg/r1tMejVq5eKGad9iVJLjWoTa7pZGNbOGMmhogPTu9SUYuFFnK6tcUkSiBIrziSYE3UEYJltzKVOQNN05ENO26qlVhqt0rL2mERTPoH2NU9wvmHdFdZfnTt3Th588EF5/vnnpWzZssE5WC+Pav78+W4hs3z5chUxEDL4N1irVi0vt8bq0kqAoiatBFmeBEiABEiABHxIAFaaX375Rb0jYRdxx04VwkJ9Iyjce8yYaWSQGiptoFh0OhnSzbm5VsFjLZpRLYKcCG7tYy5hebEEDIQOKkEGK5/Wo+XRDjIjLeH2tVyQvk2YMEG958FdMHegT/omb9myxS1iMKWsQoUKKmTgqAPrY+JPdU26Nqb6mwBFjb+Jsz0SIAESIAES8IDARx99JHv37pWiRYt6UCrwssJSA+MKRIgVjMDQa5fegOAwa2AsuwviTD4omGiXWIHSUVFi5UcdmGIGFWRNMlM3AIg1L6usahqtyao1sfZRV7AGLFLv27dvsA4vTeOCm2tMJYOAwQvWLFhisDfU22+/rXv7pKkBFvYrAYoav+JmYyRAAiRAAiTgGYGg2TDRGEuiXZYTS6wY+REOUYLdJYwwUS1iriFI3O+4sq7V2qKSBxktAaNp6jhAi2heXTejAsoSN6g3TK04poZE27fKB+N727Zt0zysmMjzEnXJOw4poqMvprk/aakA7pRtIbN48WIVMbDC9OjRQzfATEvdLJu+BChq0pc/WycBEiABEiCBkCAQgz1ljCjRtTSuqWLw7RIWhp0zIUBw7pqO5hYqEDRWmi11YOmxZBCKWetj1KMapp2ZTJhshv/VIqT1QvqgIW0h4faRxJAggfBMueXotk/l6PZPE0xPTWTOCvekpliqymzfvl2tMLaQKV26tE4lw0aksMrAyx1DcBDgnQyO+8hRkAAJkAAJkEBAE4hR7WIsLBAeRmCoh2cVH+i2ER4aD+kCm4wRKyZC18kYsRJuxIllsTFHFT5QKDD9WNcqlNRxgNYERYMTqyGt3ZxC85i3hNs3mRgSJFC40TjByykBe/BgKpktYk6dOqXiBRtgjh07VkqUKOGUobCfHhKgqPEQGLOTAAmQAAmQAAmkggCEhgoLCBhLdKidBdYWCBATLLuLyaRmFeuo8gXiB6mmHBZrW+tz7EImBaYbZNfginfXYSJRCd4SaV+L8c2xBJYsWeIWMvBYBgsMXl9++aU6SXDswNhxjwhQ1HiEi5lJgARIgARIgARSQyDGeD9T0QJhYiqwZpxZAgQaRyM1AfLFyoNLS6tgDQ0KmWtVQMZCo+tmkNMEzGzTOvTKXFgl1b+aVo4oV60JtG9SGRxEYMeOHSpibIsMrC8QMc8995xMmzZNsB8PQ+gRoKgJvXvOEZMACZAACZCA3wlgc2QVGUZ96KoYiBLzn8oSyy2ZWmJUlhhNgvgYmGCseWMqgnTBP9LMXDa12EAZQaRYB1ObEU6uaWiWykEtJlHrutLeVe37nQYb9IQAvJJBwNivo0ePqoiBE4RXX31VSpUq5Ul1zBukBChqgvTGclgkQAIkQAIkEEgEYiKNuID4MP9Ze8lAtCDOiA1MC1OBY3qs1xAiCJadRsuYK3UMgLxINqJIPZ0ZUWNVE665MUUtRr2qobw5N4lh4bDsoC2Nuap95GQILALLli1zixiIGXgogzVm0qRJUq9evcDqLHsTEAQoagLiNrATJEACJEACJBDsBKJgVLFEBoSNBhyN8FBBg3frCrFqw1ETjHWuiUbQQOZgBhosMlY+E2FCjJmDhmvk1ulo5kzzmvfoKCNsMP0M5SByXDlRynqhHEN6Eti9e7d7cT9ETKFChVTI9OnTR3799VfJli1benaPbTuAAEWNA24Su0gCJEACJEACTiegHp0hIizlocrEstRgZPBKZqSGqhqTwWVRQVYVN640S8xYJGKMH2dcW/vbQLTYVWPtDqo3EXacUTOaL9H2rTr57j8CFy9eVEuM7aXswIEDbmvMqFGjpEyZMv7rDFsKCgIUNUFxGzkIEiABEiABEghwAlG2PcZYTIzYUOUB04nrHPYaWF90+piJs4/ICG9pWEODo2XPMbFQNG7VYplwNM2uTxWPlceatmZZaKx24rUf4OiCpXsrVqyIY41p3ry5CpkPPvhAGjRoECzD5DjSiQBFTTqBZ7MkQAIkQAIkEEoE1A2zKhlVLFAlZviWRIk2ggVzw8IhYPTUxOsJFv4jqxEkxtEAJIqKIJxhjxpMMLOK6tGy6phTUxfqtDw9m7oszWOyuoSQ2+RjtR9K98GfY927d697XQwsMvny5dN1Mb1795aff/5ZcuTI4c/usK0gJ0BRE+Q3mMMjARIgARIggYAgoKLEJSrMIcws5jdr/Y3QgCqxxIl5t4JLlODCnKoYQV5kNTEqTXDUYFSPaiKNtxSO5QFNJY/JZqQMVI3W4qoEdcZu36qJ72kkcPny5TgiZs+ePSpisMD/hRdekHLlyqWxBRYngcQJUNQkzoYpJEACJEACJEACXiKg+8qYunTjTWMpcXtDU0EDSwysNKpaLL0CawoujR6BtcZtXDFRiIY8gbyBKNI6zTUyqsCBElI1ZOW0vEJbVpkE20dZhlQRWLVqVRwhc8MNN6iQmTBhgjRu3DhVdbIQCaSGAEVNaqixDAmQAAmQAAmQgGcEIFqgNYw6CcP+M+YCwsRSKK5zy3RjR5k8rmSjTVDWVjaa26gXCB3N5HrH9DK19tiqx1WBrW8SbR/VMKSIwP79+90iBl7KcubMqSKmZ8+e8v3330uuXLlSVA8zkYC3CVDUeJso6yMBEiABEiCBdCDw6aefpkOrKWuyphST3WcirmR2i44rUcmepaRMYnnix8e/Trbx0M2ATVNtD2UQMdu3b3d7KRsyZIhUrFgxdOFw5AFFgKImoG4HO0MCJEACJEACnhMYMGCA54X8WOJkzEXJ26KR11rs+8ogGTvoFa/VV9trNQVHRWvXro0jZOrXr6/WmHHjxkmTJk2CY5AcRdARMA5C1KAbdAPjgEKPgO3uM/RGzhE7gUCM+bXz7M5DcnbXQffx3L6jcvHISYm6cElfGEfmvDklk3nhmDlfLj1mKZBbshUvKLkrXyPZShR0wnDZRxLwGYFZs2bJgw8+KF988YW0atXKZ+2EYsXNmjWTXbt2SZYsWdzWGCzyz5s3byji4JgdRoCixmE3jN1NnABFTeJsmOJfApFnzsvRJf/KsaUb5eiyjXJyzXYjZg5JjjJFJad5ZS9dRI85yxWXTLmzS4asmfWF5QGXT56RS66XfR559oJEbN0rpzfvkWgjgPLWKieFm11rXrWkcPPaEp6ZRnf/3mG2lp4E8MV74cKFggXp8+bNS8+uBF3bzz//vDzwwANSuXLloBsbBxT8BChqgv8eh8wIKWpC5lYH5EDPG6vLvt8W6+vw3DWSr05FKVC/qnlVkfzXV5IcpYsaF7KYyJ+2cPHYaTm+coscmbdWDs9bY15rVdwUvbGulH/4FslWrEDaGmBpEghgArDSdOzYUSIiInRB+pQpU2itCeD7xa6RgD8JUNT4kzbb8ikBihqf4mXlCRA49e8uI2IWqZA5uW6HlLi1oZRo30hfGXNmS6CE96OiLl5WcbP3p/my/eM/VNjUGPogp6l5HzVrDAACsNIsWLDAeEIzHtSM9zOs76C1JgBuDLtAAgFAgKImAG4Cu+AdAhQ13uHIWpImEBMZJf99+pe+zu09ogKmuBEyxdvVT7qgH1IvR5yTDaO+lE1jfxAImxrPP+iHVtkECfiHQGwrjd0i3AfTWmPT4JEEQpsARU1o3/+gGj1FTVDdzoAbDKaXbRr3g2z78Dcp2qqOlOvWTkp0CMyN5bD+Zt2Iz+XIwnVSc9j/tK8BB5QdIgEPCdhWmuzZs8vZs2clR44ccu7cOVprPOTI7CQQrATM7lcMJEACJEACiRGAmFn5zLvyc8lOgh3Rb175oTT9aUTAChqMI1fFktL4i8HS6JOBsmXCFFn0wCi5ePRUYkNkPAkEPAFYaTZs2KDraAYPHqz9xRGWGsQjnYEESCC0CdBSE9r3P6hGT0tNUN3OdB8MxMzGNyfLpje/lyr9OkvVfp0cu05l9aAPZYeZMtfgo/5S3Kz7YSABpxFo0KCBOgjo37+/ZMyYUdfTYF1NZGSkjBkzRqegLV261GnDYn9JgAS8SICixoswWVX6EqCoSV/+wdT61olTZd3wT6TMAzdK1We7BIVHsX1TF8mSR8YYgdZJqg+8L5huF8cS5AS+++47ueuuu1TM2EON/3kPcfPjjz9Kly5d7Cw8kgAJhBgBipoQu+HBPNz4D7lgHivH5hsC2A9m2aNvCBwAXDemlxSoF1x7NZzdeVCW9XxDshTKo1abDNmy+AYkayUBHxPg572PAbN6EnAgAa6pceBNY5dJgAS8T+DYP5tlWsPHJWuR/NJmzrigEzQghs0/W04fI1kK55Np9XsJxsxAAiRAAiRAAsFAgKImGO4ix0ACJJAmAnDRPK1BL6nSt5PUeaNXmupyQuHrxz4hVft3kemNnpDdk+c4ocvsIwmQAAmQAAkkSSBjkqlMJAESIIEgJ7DuhU/1i/1NiydIgQZVg3y0V4ZXtutNkv2awrLwvpd0uh0EHQMJkAAJkAAJOJUA19Q49c6x31cR4Bzrq5AwIhkC/zw+Tk5v2i1NfxwhmfPlTCZ3cCZHbNkrix8aLYWbXSu1X+kRnIPkqIKOAD/vg+6WckAkkGYCFDVpRsgKAoUAH3KBciec0Y8l3UYLHAM0mfyCMzrsw15ePnVW5t05TPJULSV133nahy2xahLwDgF+3nuHI2shgWAiQFETTHczxMfCh1yI/wF4MPzF/3tFoi9elhu+HeZBqeDOGhMdLfONsMmcP5c0nDQguAfL0TmeAD/vHX8LOQAS8DoBOgrwOlJWSAIkEMgElnR/TaIuXKKgiXeTwsLDpdmUlyT6cpSKm3jJvCQBEiABEiCBgCZAURPQt4edIwES8CaBxTrl7Lw0+W64N6sNqroafzFYshbNL7NufFYuR5wLqrFxMCRAAiRAAsFLgKImeO8tR0YCJBCLwJKHXpWocxcpaGIxSey03rt9JH+dSjK7bX+5ePRUYtkYTwIkQAIkQAIBQ4CiJmBuBTtCAiTgKwIQNJFnjIXme1poUsq49qs9pWjbujLn1oFy8cjJlBZjPhIgARIgARJIFwIUNemCnY2SAAn4iwDW0FyGoKGXM4+R13rxISl+cwMjbAbJhcMUNh4DZAESIAESIAG/EaCo8RtqNkQCJOBvAquemyiXT5+TphQ0qUZf84VuUvzWhpbF5tjpVNfDgiRAAiRAAiTgSwIUNb6ky7pJgATSjcDm8T/JwRkrpNEndE+c1ptQc/j/pHi7+jLvjqG6Limt9bE8CZAACZAACXibAEWNt4myPhIggXQnsOfn+bJ+5OfS+KuhkjFXtnTvTzB0oNbI7lKwflWZ13GoSExMMAyJYyABEiABEggiAhQ1QXQzORQSIAGRY/9skkX3vSSNvx4qeaqWJhIvErju9V6Sq2JJmd/5RS/WyqpIgARIgARIIO0EKGrSzpA1kAAJBAiBCwePy6L7R0ndCX2k2I11A6RXwdWNuhOelsy5s8uCe0YE18A4GhIgARIgAUcToKhx9O1j50mABGITWGgsNGXubyPlu98cOzpgz2Oi407jiomMCti+xu5Yg4+fk7DwcMFmpgwkQAIkQAIkEAgEwmJMCISOsA8kkFYCYWFhZqo//5zTytGp5Zc/9bbxdHZWGn06MGCHELFtn+z7bbEcnr1aTm3aJRFb9sbpa4ZsWSRb0fySp3oZyX99JSnSuo4UblorTp5Auph35/OSrUh+qfde30DqFvsSAgT4eR8CN5lDJAEPCVDUeAiM2QOXAB9ygXtvfN2z7ZP+kM1v/Sjtlk2U8CyZfN2cR/UfX7FFhcz+P5bK2d2HpET7Rrr3S56qpSR3Amt+IHzO/LdfDhnhA+9tEVv3StE210vR1tdL2QdvlIw5A8vxweybB5i1S6WkzptPeMSFmUkgLQT4eZ8WeixLAsFJgKImOO9rSI6KD7mQvO1yfOUWmVbvMWm7aIIUaFA1YCDs/3OZbH3vF4nYvEdK3GaEjBEzRVrU9rh/WCd0cOZKFUZ7fppnptbdIuV73Cr561TyuC5fFIi+eFlm3dRfCjWuIde+/IgvmmCdJHAVAX7eX4WEESQQ8gQoakL+TyB4APAhFzz3MqUjiYmKlmn1H5MKj94mFXreltJiPs13Ys12WTf8Ezm357BU7HW7lH/kVq+1B4Gz44vpsvGN76WocYRQ9ZnOkq92Ba/Vn9qKLp08I7PbPSclzCadNZ7vmtpqWI4EUkyAn/cpRsWMJBAyBChqQuZWB/9A+ZAL/nscf4RLHn5NMmTJLPXe7RM/ye/XUecuyvqXvpDNb/8ktV58SKr06+SzPsChAIQNXsVvri9V+3WWvNeW91l7Kan4/IHjZg+bIVL6nlZSpa/vxp6SvjBP8BPg533w32OOkAQ8JUDvZ54SY34SIIGAILB5/E9yeuPugBA02z78TaZWuF8unYiQDtu+8qmgAfywjBmk2oB75Y69kyV3ldIyp/0gWfG0cZQQcS7d7k22Yvml8ZdDZOPr38mub2alWz/YMAmQAAmQQGgSoKUmNO97UI6av9wF5W1NcFCH563V6U7t/pmonsISzOSHyItHT8nyJ9+Si0dOSc0XukmhJjX90OrVTcDr25ohH8vuH+bKtaMe1nU3V+fyT8zh+WtlZos+0mrmm6laQ+SfXrIVpxPg573T7yD7TwLeJ0BR432mrDGdCPAhl07g/dwsvsBPq9dLagzrqnvS+Ll5d3P7/1wqS3u8LuW6tjUL5Hu449Pz5Mii9bKy37uSq2JJqTv+ScmcL1e6dGf35DlG7I2XNnPGGUtSqXTpAxsNbgL8vA/u+8vRkUBqCFDUpIYaywQkAT7kAvK2eL1TC7qMkBylCst1Yx7zet0prRDuo9eN+FwafzFYit/SIKXF/JZv1XPvy65vZ6mwKdmxid/ajd0QpgfC1TaETea8OWMn8ZwE0kyAn/dpRsgKSCDoCFDUBN0tDd0B8SEX/Pd+wytfyaFZq6TV36+n22CXPzVeji3ZKI0+HxTQVoj9vy8R9LVkhxvMHjKPm4U4YX5ntmbwR+pyu+Vfr/m9bTYY3AT4eR/c95ejI4HUEKCjgNRQYxkSIAG/E8B0r01jJ0uDD5/1e9toEOtn5twyUC6fOmv2xHknoAUN+lvcuFe+Zc3HcunUGZne5Ek5vnwzov0asG9NtuIFZXG30X5tl42RAAmQAAmEHgGKmtC75xwxCTiOwPkDx2SZWb/S4INnJUeZon7v/7GlG2X6Db0l//WVpNFng9T7mN87kYoGM+bMJg0nDZDy3W6WaQ0flx2fT0tFLWkr0nDSc3Lx8ElZPfCDtFXE0iRAAiRAAiSQBAFOP0sCDpOcRYDTEZx1vzzpLVwWF6hXRWoO/58nxbyS9+CMFTL/zmFyvVl4X65bO6/UmR6VHF20QbCvzzV3NjUe0h7xaxfg3GFGi75S7n83SeWn7/Jr22wsOAnw8z447ytHRQJpIUBRkxZ6LBtQBPiQC6jb4bXOrBn6sZzasFOa/TzSa3WmtKI9P82X+XcNk6Y/jZBr7mia0mIBmw/72Cy6f5RkypVNGn811K/9PL1pt0xv3FsaGecKJczUOAYSSAsBft6nhR7LkkBwEuD0s+C8rxyVQwgcP35cPvnkE4mMjHRIj/3bzX2/LhK4B06PdTTwHrbkodHqlCAYBA3uXKZc2aX51FGS0RxntuwrFw6d8NsNhWtnOFdY3PUVgcBhIAESIAESIAFvEqCo8SZN1kUCHhLIkCGDdO/eXXLlyiVdunSRr776SiIiIjysJTizY0H+8iffVtfNWQrm8esg9/w0T5Y+PEaa//qKFG1zvV/b9kdj9Sf2k8ItasuM5n3kxOpt/mhS2yjRvpHUNPsLLf7fKxITGeW3dtkQCZAACZBA8BOgqAn+e8wRBjCBPHmsL+t79uyRm266SSZPniyI69Chg3z00Udy+PDhAO69b7uGzRtL3d1MXRL7tqW4tcM6tPCekdLMWDQKN6sVNzGIrrA+qUq/Tips9v+x1G8jw5qaAvWryiJjsWEgARIgARIgAW8R4Joab5FkPelOwKlzrOP3++zZszJ16lT3q3HjxipyIHRKly6d7pz90YHtH/0u2z78TW5a+p4/mnO3cWDaP7Kgy4tyw7fDpHi7+u74YD5REXfvSHWEUL77LX4b6pxbBkj+upWl1ojufmuTDQUPgfifm8EzMo6EBEggtQQoalJLjuUCjoBTH3JJ9Ts6OlrFzS+//KLHatWquQVO5cqVA+4eeKNDp7fskT+vfUR3oi/QoKo3qkxRHdjUc/bNA6TJ5OF+tw6lqIM+zHR85RaZf8cwqfJMZ6n81J0+bOlK1RePnFI32TWGPCBljVc0BhLwhEBSn5ue1MO8JEACwUOAoiZ47mXIj8SpDzlP+v3XX3+5LThFixZ1C5zatWsHzf2ffVN/KXpjXan6bBe/jenI/LUy22ys2fCTAWbKW3O/tRtIDZ3evFvmdXxeBUb1gff5pWtHl/wrf5v9f9rMfUsKNanplzbZSHAQ8ORzMzhGzFGQAAkkR4CiJjlCTHcMAac+5FLb77lz57oFTubMmd0Cp1GjRo65Z/E7uv6lL+TYsk3qoSt+mq+uT/27S2a26it1xj4hZe5t7atmHFHvuT2HZd4dz0vxWxqaaWEP+aXPO7/8W9YO/0TaLnxHshbN75c22YjzCaT2c9P5I+cISIAEEiNAUZMYGcY7joBTH3Le6PeyZcvc09TOnTvnFjgtW7Z0zH08PG+tzO0wWG5Z87HkKF3EL/2+ePSUzDCujSs+eptU6n2HX9oM9EbAZM6tA1XY+Guz03UvfiZHF66XltPHBDoe9i9ACHjjczNAhsJukAAJeIkARY2XQLKa9Cfg1Iect/u9du1atwVn7969boFzyy3+WwSemr+GP8w6mqrPdpayD7ZNTfFUlZnZqp8UalpTar3oH6tEqjqZDoUuHD4hc8x0vJIdm0iNoQ/6pQdw85wxe1ap915fv7THRpxNwNufm86mwd6TAAmAAEUN/w6ChoBTH3K+7PfWrVvdAgdiBx7U7FemTJkC5t6v6j9RLh47LQ0nPee3Pi168GXJlDMbv0QnQvz8gWMqbEp3aSnV/LTGZnrj3nLNXc2kqnFYwEACSRHw5edmUu0yjQRIIHAJcJ+awL037BkJpJlAxYoV5ZlnnhGsv1m3bp00aNBAPvzww4Da7PPgzJWy86sZUueNXmkeb0orWDf8U7l45CQFTRLAshUrIM1/e1l2fj1T/n31myRyei+p0eeDZONr38jeKQu8V2kQ1jRr1ix55JFHgnBkHBIJkAAJpJ4ALTWpZ8eSAUbAqb/cpUe/jx496rbgYE+c9u3buy04hQsX9uud/bN2D6n63D1S5j7/LNLf8fl0WT/yc7lx4duStXA+v47ViY2d3XVI19iU69bOLx7pDkxbJgs6v2juzzuSt0ZZJyLzep/XrFkjM2fOFIgZvODtcPHixXLmzBnJkSOH19tzQoXp8bnpBC7sIwmEMgGKmlC++0E2dqc+5NK73+m52efqQR/K+X1HBb/Q+yMcXbxB90aBp62Cjar7o8mgaOPMjgM6Fa1ir9v9so/NlglTZPvHfxiPaG9LhmxZgoKhJ4PYs2ePW8BAxGTPnl1atWolrVu31mP+/PklvT83PBmPL/KG+vh9wZR1koDTCVDUOP0Osv9uAk59yAVSv+3NPmG9watq1apuC463N/s8PHeNzO/0grTf8IlkKZTXfR99dXLh0AnBmo1rX+oupUPcdXNqGJ/574DMavOMVBt0v1TocWtqqvCozMp+E+Tc3iPS5PsXPCrnxMzwWAjxYltj9u/fr+IFQgYvTCONHwLpcyN+3/xxHerj9wdjtkECTiNAUeO0O8b+JkrAqQ+5QO63Lzf7/Kvuo1L56bv85u0Mm3oWbFxdag7vlujfEBOSJnBi1VaZdeOzUndCH4EDAV+HuR2GSJ7qZaT2Kz183ZTf61+0aJHbGjNnzpw4lhisfUsuBPLnRnJ990Z6qI/fGwxZBwkEGwGKmmC7oyE8Hqc+5JzSb29u9rlm6Mdy1kxpavzVUL/8xf7z+FiJPHPeTHMb7Jf2grkRWNggbJpNHSXF29X36VAvnTwjf9/QW6r06yzlHw5sl+TJgdi8ebPbEgOrTJkyZeJYY7JmzZpcFXHSnfK5EafTXrwI9fF7ESWrIoGgIUBREzS3kgNx6kPOif1eunSp/PrrrzpFDYuVb7/9dp2mlpLNPo8sWGc22Rwit5ppZ/Cw5euwefxPsuu7Wbpjva/bCpX69/26SBbcM0LazBknBepV8emwj6/YotMGW057TYq0qO3TtrxZ+ZEjR9yWGIiYy5cvxxExxYsXT1NzTvzcSNOA4xUO9fHHw8FLEiABQ4Cihn8GQUPAqQ85p/bb/sPxdLPPaQ0fl4qP3iblHrrZrsJnx8NzVsuc9oPkpmXvSZ5qZXzWTihW/N8nf8r6l740wmasZL/Gtx7zdn03W9YM/lDazH1LspcsFJC4sR7NXhMDEfPvv//GETE1a9b0ar+d/rmRVhihPv608mN5EghGAhQ1wXhXQ3RMTn3IObXfCf2ZJbfZ57oXPpVTG3dJk++GJ1Tcq3GXTkTItPq9pNaIh+gYwKtkr1S24eWvZP/vS6S1sdiEZ8pwJcEHZ+tHfiGw8sFiEyhh5cqVbmsMBE39+vXdQqZ58+Y+7WYwfW6kBlSojz81zFiGBIKdAEVNsN/hEBqfUx9yTu13cn9acEtrT1HDQuhuTW6RZgvPyI2rP5BClcskVzzN6fPvHi65KpSQ2qN7prkuVpA4gRVPvS3n9h+Vpj+8mHgmL6Us6PKiWoXqvO6/jVpjd33nzp1uEQNrTN68ed0iBu6W8+TJEzu7T8+D9XMjpdBCffwp5cR8JBBKBChqQuluB/lYnfqQc2q/PflzwmaffzV6QlbmjJBxa/7y+WafG0Z/LUfmr5UWv4/2pJvMm0oC2Cwza+G8Uvedp1NZQ8qKwdnDtAa9pGr/ewSbgfo6REREuEUMLDH4O7bdLONYrlw5X3ch0fpD4XMj0cGbhFAff1JsmEYCoUqAoiZU73wQjtupDzmn9tuTP6H1L30hJ1ZulaY/jRBfb/YJ71xzbx8iN6/8UHKWK+ZJN5k3lQRizHqSGS36SLG29aTG0AdTWUvKih1d8q/xiPak3LT0Xclft3LKCnmQa/78+W4hA7fLsUVMvXr1PKjJt1lD4XMjKYKhPv6k2DCNBEKVAEVNqN75IBy3Ux9yTu13Sv+E4L3q76ZPqbeznGXjioyoqCidovbLL7/osUqVKupFDd7UUrPZZ/SlSPnzuh5SffD9Uub+NintIvN5gcD5fUdV2FQbeJ/P3S9v/+h32fz2zypsMmTNnKbeY0E/ppLZi/wrVaoUR8hkypQpTfX7qnCwf24kxy3Ux58cH6aTQCgSoKgJxbsepGN26kPOqf1O6Z8RfsHHRo0Ve92ebJG0bva59JExgi+5vp4GlexAQjQDBCzud5Nvh0nxWxv6lMKKp9+Ri8dOSeMvh3jUzsGDB92WGIgZBFhjsCYGxyJFinhUX3plDvbPjeS4hvr4k+PDdBIIRQIUNaF414N0zE59yDm13yn5M/oXa1sWb5Dmv4xKSfY4eTzd7BMuhre8M0XarXg/Tj288C+BfcYb2kLsYTN3nOSvU8mnjc9s/YwUu/F6gXUosYD9YWJbYrZt2xbHElOtWrXEigZ0fDB/bqQEfKiPPyWMmIcEQo0ARU2o3fEgHq9TH3JO7Xdyf0onVm9Tl8q3bvhUclUskVz2JNPjb/bZoUMH3fDT3uzztHET/ed1PY1r4bFSsKEzv6QmBCAmMkrCMvrWVXJC7aY1DtPD/n3tW93DJlvxgmmtLtHyZ3ceVMcBDT5+Tkq0b+TO988//8SxxjRu3NhtjWnSpIk7n5NPgvVzI6X3JNTHn1JOzEcCoUSAoiaU7naQj9WpDzmn9ju5P6dZbZ6RkrffIJWevDO5rB6lJ7TZZ6vF56VWt/ZSpW8nj+pK78xn/tsvJ1Ztk+OrtprjVjm9aY9EnjknFw6fdHctPEsmyVGqiGQtkk/yVC0tuSqV1I1EC91QXTLlyenOF2gncA5xcPpy3cMmLDzMZ93b99tiWdRttJx6tqXMXLNUxUzhwoXjWGNy5crls/bjV3z84Cm5dOFy/Og0XWfJllnyFckdp45g/dyIM8gkLkJ9/EmgYRIJhCwBipqQvfXBN3CnPuSc2u+k/oI2vv6dHJq9yuculbHZ5+xer8nhtVvljctr1MkArDh4BeoC79Obdsuu72bLnp/nGwFzXvJWLyv56lSQfLUrSt4aZQSWjQzZsrjxRl24JJeOR0jE1r1yevNuI3x2y8m1/8mRRRsk33UVpGSHG6R4u/qS99ry7jKBcrK891ty4egpXWPjzT6dPHkyjiWmzt5waZCjpOR8uYuKmdKlS3uzOY/qmjJhhpw9fV4yZc7oUbnEMl+6eFnyFsot7Xu0iJMlGD834gwwmYtQH38yeJhMAiFJgKImJG97cA7aqQ85p/Y7sb+iU2Yq2B81HjLezj6V3FVKJZbNK/H4lf6fXmPl5lUfyuHzp2Xq1Kn6wnocW9zAk5o/f6lPaGAxUdGy4/NpsvOrGXJyw04pc18bKXV3MynYqHpC2VMcd/Dv5bLvj6Wy79dFEp4po07BKmEW6BduUTvFdfg645xbB0n+6ytJrREPpakpbOCKtTF4LV++PI4lpk6dOrLogVGStWh+Sa+NOe3BTXlnhpSuVlIKFM1rR6XpeHjvMTm487C079kyTj3B9rkRZ3ApuAj18acAEbOQQMgRoKgJuVsevAN26kPOqf1O7C9p7m2DpUjL2lKlX+fEsngl/uKx0+q+uZ7Z8LFEh8Zx6sQmibbAwbF9+/ZukYOpSf4KEDMbx3xrHBj8LPnrVVE306Xubu6T5o8v3yxYpA8rUDYzVa3i47dLqU4tfNKWJ5ViKt30ho/LtaMekdL3tkpx0XXr1rlFDIRM9erV4wiZ8PDwOHXBovVX3Uel2nP3StmubeOk+fOCosY/tIPtc9M/1NgKCQQ3AYqa4L6/ITU6pz7knNrvhP64tk/6U/6b9IfcuODthJK9GregywjdXLP2Kz2SrNfXm30m1jgWy68f9aUKvEpP3KHWisTyejsewmbre79IZMQ5qdznbin7YPp9ycfYsCHq7HbPSdvFE8w0uwoJDnffvn1xREzmzJnjiJhChQolWC525JGF6wVrudotf1/yVC8TO8lv5xQ1/kEdTJ+b/iHGVkgg+AlQ1AT/PQ6ZETr1IefUfsf/w8K6j1+rdJVmP42QQk1qxk/26vXmcT/InikLjHetcR7Vi80+bQvOr7/+Kmnd7DOhxvf9vlg2jPxCMufPLVWfu0eKpONUsIMzV8raYZMkc+4cUtNM/ypgrEXpFbZOnCrbPvhNbloyQcIzZ5ILFy7EETG7du2KI2JSs/kqxrZ5/I+y+/s5fhHWCbGkqEmIivfjguVz0/tkWCMJhC4BiprQvfdBN3KnPuSc2u/4f0DLHn1DMubK7vM1DceWbZK/mz6p62jyVCsTvxseXad1s8/YjUHUrRr4vhyevVpqvfSwbjgaOz09zzH9be2wT6T8w7dIzWH/M/cpW7p05/fOQ2T/lv/ku4JHVNC0aNHCLWTgdtlbYfH/XpHMeXPJ9W/19laVKa6HoibFqNKUMVg+N9MEgYVJgATiEKCoiYODF04m4NSHnFP7HftvZf+fS2V57/HSftPnZsG6b/dVmdH8abNm4ib9gh67D2k993Szz9jtYaH+P8bTF9awXDe6Z0DuLXPp+GkVNrt/mGsW7XeXCj3bxx6CT87hnc5e3D9z5kwpWbKkPHailBRqVktufn+wZM+e3Sft6vqa6836moFmfY2fp95R1Pjkll5VaTB8bl41KEaQAAmkiUDclZZpqoqFSYAEQpXA6oEfSu3RPXwuaP599RvJlDen1wUN7lvz5s3ljTfeEHwRnzRpkmAhes+ePaVcuXLSp08fmT17doK3d82Qj4yge0vgsACetwJ1s0xMh6tr+tjUTA/c/f1smdGijxyetzbBMaU28tixYzJ58mTp1auXYPpYq1atZNGiRXLLLbfI6tWr9dV14ceSYfZmOfbX8tQ2k2y5DFkzS/33+8myR9+UU//uTDY/M5AACZAACTifAC01zr+HHIGLgFN/uXNqv+0/vHUvfKp7qDT+aqgd5ZPjyXX/yZ91ekp74yoaG1D6KyS02SfcRTcqUVmWPzFOspcqLPXe7WumO+X0V5e80s5/n02T5U+OlxpDHzQew+5JdZ2xLTFgBSFjv6699toE64Ur6vl3D5e2S97VDUUTzOSFyM1vmfU1xjJ14/zxXqgtZVXQUpMyTmnN5fTPzbSOn+VJgASuJkBRczUTxjiUgFMfcrH7/ePkuXLwwHGv34ESJQpKx7uaer3eE6u3yfTGvXXaWQ7z5d6XYfZNz0nxm+urNy9ftpNU3bDiwNHA9om/SpNtYbKxQT6p3f/+gN7sM6nxRGzfJ8sfHycZsmc1wqyPZCtWIKnsmgaLiy1kcKxdu7a0bt1ahUzLlnH3Ukmqss3jf5Jd386UtosmJJUtzWmLu5r1NfnN+ppxcdfXrBnysXEz/XCa649fAUVNfCK+uY79uembFlgrCZCA0whw+pnT7hj7G9QEli/bLFGRIrlz5/baK/JyjKwwe5j4Iqwe+IGZdtZTfC1o4NEqJiYmXQUN+FWsWFGa78godxSpKXX+ekmKPthaPvjgA93cs3PnzvLll1/K6dOnfYHaJ3XmKl9CWk4bI/muLS/TGvQy+9wsvqqdPXv2yKeffipdu3bVNTH33HOPbNu2Tbp16yZ79+7V6WUjR44UTwQNGqn81J2Sq+I1sqLPO1e16c2I+u8/Iwf/XiE7vpjurhZ7HO2ePFuiL152x/GEBEiABEjA2QQyOrv77D0JBB+BCpVKSYkS3rN67Nl9UI4e9b71Z9v7v+qXQnw59WWI2LZPVj070ew9MtGXzSRbN74AL7x3pIQZRwht5r0lYWbNTZWbbpAnnnjC8LU2+/zhhx/0y396bfaZ7CASyVDzhW66Oeii+16SaiO6yX/lsritMfv373dbYoYNGyYVKiS8z0wiVScZXf+9vvLn9T1l5zczpcy9rZPMm9rEDNms9TWz2vY3ewVVljzVSssOM/XuzPb9qa2S5UiABEiABAKQAC01AXhT2CUSCHQCFw6dENtK4+u+rnr2Pan54kOSt1Z5XzeVaP1ndxzUhfVYP9Pku+EqaGJnLliwoHTv3l2mTJkiERERcu+99wq8fZUtW1ZuvPFGefvttwX7sARqWLhwoUxa+bd8W+ms/N5njCx4epwULlxYrVBHjhyRb7/9Vp0meFPQgEWG7FmknhE2//Qa61ORgX2TsEkr3I4jbDCbosL9+Im1/+k130iABEiABJxPgKLG+feQIyABvxNYM/RjqdirgxRoUNWnbWOzRkwVqj7oPp+2k1TlWDc0o8XTUvKOplety0ioXI4cOVTUfPPNNzoV7fHHH5eVK1dKnTp1pGnTpvLaa6/Jpk2bEirqtzi0/+6778rdd98t+fPnlyeffFL7+siI56TXgd+lXeW60nJLuDRo0MDnfcLmpNUH3a/CxpeNVX76LslZtpj83expibp0WWKiouXkuu2+bJJ1kwAJkAAJ+JEAp5/5ETabIoFgIHBwxgrB67atX/p0OOf2HZFV/d+TVtNf92k7SVV+0vySP/e2wVJjWFep0KN9UlkTTMuQIYPccccd+kIGe7PPNm3aSNGiRdXBADypYbG9L8Phw4fd08mwuD8yMlIX9nfs2FHGjx8vxYsXj9N8yz9flWU935CZLftK46+HpsiBQJwKPLyoNuBeObZso6x9fpLUGtk9TukNr3yloidOZAovcP/O/LdfIEyPLt6glpkLB11TMcNEjpu1ZuW735LC2piNBEiABEggkAnQUhPId4d9I4EAJAArzbUvPSzhGTP4tHdYR1O5z90+twYlNoiT63fInNsGqcvj1AiahOpt166dWkiwwB574pw6dUo6deok1atXl0GDBsnixVcv1E+onuTioqKi5O+//9Y6YW0pX768TiGrUaOGTpHbuXOn7sXzwAMPXCVo7Lrrf/CMFGl1ncxo+rQRHL63LGEa2n+f/Cn7frvC4NKJM8ZDWsL7A9n9TOqYtUg+OTB9uawf+YXuyeMWNCgUI3J06cakijONBEiABEjAQQQoahx0s9hVEkhvApvGTpashfNKmfvb+LQre6csMFODdkgts5YmPQI2bISFpvrA+6TCo7f5pAup3ewzsc6sWLFCxowZIzfffLNkz55dRowYIZkzZ9bpbljng/U+Tz31lEDYpDTUeL6rVB/6gJmy9ZTs+Xl+SoulKl/Wwvnc62suHD6pdez6Zoac3rQ7VfWhEEQNXFXfsf8HvY9h4WGCjTntELFlr33KIwmQAAmQgMMJcPqZw28gu08C/iJwfv8xWTt0ktlXxLcueDEeTEO69qW405D8Nc7Tm/fI3PaDpeqzXcy6odv90iysKXiNGjVK7M0+BwwYoC6TMT0Nr1tuiTtNCtaW2PvF5MuXT6eU9ezZU60yefLk8Urfy3VrJ9lLFpKF94yQy6fOCq59FUrc1litQnAc0PTHF2Xdi59JeOaMAvGRlg1X//phhUQUvEakfw8Jn/ePhC1ZbbwUhEuk8Wj3RX8zjTJPLo+HVLluWanfrpbH5ViABEiABEjANwQoanzDlbWSQNARwLQzLLbOa/Y08WVY/9IXkqd6GSnZsYkvm0mw7tNb9sicWwdJlWc6S6UnOiaYx9eRtWrVEryGDh0q9mafr776qtx///1St25dtb7AkxrcSLdq1Upf2CcGntZ8FYq2uV5a/PGqzO0wRGIio6T8I7f6qildUwP3y3PN1L/IcxclzIiPkxt2pEnURJw4KzUbV5asObKK3NFILh8/LYc++00OT54plYrlkjw3XOvRePZvPyjnz1z0qAwzkwAJkAAJ+JYARY1v+bJ2EggKAgem/SOH567xuXMA7EkDK42vnRAkdFPQNiw0lZ+8I90ETfx+YbPPZ555Rl/YBHPq1KnSu3dv+eeff1TgxM/vy+sC9asIHAjM7TBYoi9HetWKdf7AMTm1Yae+sH7n7I4DgvuBEGbWbp0y65uuMd7n0hIgaLLnMqIGwRzzDOsupXveLod+mC3Z23nm5S1T1kwSHR1t1cV3EiABEiCBgCDANTUBcRvYCRIIbAJrn4dzgO5mfxbjMsqHwfZ+latCCR+2cnXV8JA1t/0gdVMNa1QghmuuuUY3+kTfYLFJj5DvugoqbDaO+U62TJhyVRewd1FqAtx2o77Vgz6UXd/Ndgsa1AXLkK8W9GcpWkBK9b47NV1mGRIgARIggQAjQFETYDeE3SGBQCOw8Y3vJVvxglLaRzu+2+O1nQPUGPqgHeWX4/kDx9VCAw9nVfp28kubTm4kT42y0nL6GNk45lvZPunPOEPZ8+M840L5QJy4lFzkNXU2+3mktF08QUrc1kg35QwLv/J4gqWGgQRIgARIgASSInDlqZFULqaRAAmEJIFze48Y5wAfSy3jwtnXIT2cA2ADxgWdX5CyXdvqOhpfjzFY6oclrekPL8rKfhNkz0/zdFjY8wUWl8NzzSL8VIZ8Zr0WxE2bOeOk2E31JKOZMgbr4NndhyUm2vhgZiABEiABEiCBRAhQ1CQChtEkQAIicA4AL2D4Jd2XIb2cAyy8d6Tgi3Q147qZwTMC+etWNh7KRsj8u4bLwZkrZfvHf8rliHNG5KTd9XOBelWMY4LR0nLaGCnS8jp1I441NwwkQAIkQAIkkBgBOgpIjAzjSSDECez/c6kcXbRBGm0Z6FMS6eUcYMVTb5tf/6Ol7jtP+3R8wVx50dZ11GKz4O7hEnXpsq5/OTRrVYqHvOvffbLoN2PZScoIc2MrkXK75Y9Bn0tY0+TXEoWZZV+3P95GsuXMkuJ+MCMJkAAJkIDzCVDUOP8ehuQI9u/frzuyDxkyRPLnz38Vg+PHj+ueH/AcVbx48avSQzXix8lz5aBZQ5KSkPv1b+VC6+tlwvifk81eokRB6XhX6rxTpYdzgA2vfCXHV2yRNnPHJTs2ZkiYwKWTZ+Tg9OW6KSe8oUWbPV8QwjJlkMPz1kjhZsm7Sb54/rJkzZZZKtUpl3AjdmyTKvZZssel01arWE02IzOQAAmQAAkEFQGKmqC6naEzGAgV7JZetWpVGThwoPTt29c9+LFjx8ro0aOle/fuFDRuKtbJ8mWbpVixQpIvf+54KVdfht3eTLJeX0VcTnCvzuCKOX7slKww6ylsUXPw4HGZP3dtovljJ0T/s0miF66XjB2bysbv5sROSvC8eYtrpbDZJT4tYde3s2T7R7/rug24C2bwjMDOr2fK7h/myr6pCyVroXxy/pARyTFXTC2RZy/I/j+WpkjUoOWMZnPNXPlyeNaJJHKHx3IwkEQ2JpEACZAACQQZAYqaILuhoTScwYMHy7hx42TYsGFqlcHYCxYsKBcvXpTIyEhBOsPVBCpUKiUlShS+OiF+zLWV4sckeL1n90GzEeQV688hYwmaPWOlVKue/Cadmc5HitzWVC4fOJVg3bEj16/fJlWrlU6TqDmxepss/t9oaTXjdcl+TQoYxO4Az5VAmftaC16XT5+VnV/OkK3v/SJndh5USw0sNnDBvOfn+VJ7dE8SIwESIAESIAG/EaCo8RtqNuRtArly5dJNCWGZOXbsmOAXWhyzZ8+u8UhnSB8C+QvkkabN6yTfeEryuGrZv/9w8vUlkSP6cpQs6f6aXP9WbynctFYSOZmUEgKZcueQio/frq8Tq7bJ9k/+lB2fT9Oi53YdknP7jkp2My2RgQRIgARIgAT8QYCixh+U2YbPCAwYMEDX1qABe4dvHBHPQAKxCSx9+FUpdEMNqfhYh9jRPE+EQMSJs7Jnc8r3nMl+381S3bxOzl4hx39bKMte+VYKP9DuqtrLX1tKsph1NAwkQAIkQAIk4E0CFDXepMm6/E4gtrXm3LlzaqXB+hpaafx+KwK6wX9f/UbO7T0qrT/nlMSU3qjjB07KP9PWS6GSVzviSLKOwsUkvPvdErFjn5zbsD9O1gP/HZZi5QpT1MShwovUEIiJtY4rNeVZhgRIIPgIUNQE3z0NuRHFt9bQShP8fwKHDp2QeXPWpGig0Su3SNTEqZJx1CMyOQXOCJoZZwRF0uiMIEUdc0Cm3AVySo1GKVtbddVwEih34lDya6euqocRJEACJEACJJACAhQ1KYDELIFNwLbWTJw4UR577DFaaQL7dnmld4eMh7VZf6+Q6jUqJFtfptMXRe67SS5Hmg1MknFIsME4I6hc5RqKmmSpMgMJkAAJkAAJBBYBiprAuh/sTSoJ9OvXT8aPHy84MoQGAV84Izhw4EhowOMoSYAESIAESCDICFDUBNkNddJwwrD1t5dDgQIFvFoj5217FScrIwESCFECH3R/Fo2x9AAAMzhJREFUOeBH3nMS19wF/E1iB0kgCQIUNUnAYZLvCSxfvtz3jaSyhbp166ayJIuRAAmQAAnEJ9D1ibYSZvZpjcHvWVjob444hJsT3b4Vie5gYk1ijKuAfQzTPFb+cFPKKhHmqgHxiDHX5nClNteZ+SHNVd1V7X/27nR3yzwhARJwJgGKGmfeN/aaBEiABEiABBxFICbKFiExkB1u0REdFm1EhnV9xX4fbQkUFSLID5Fi8unRvBl1Em3KID4a8ciHIxRTjCkb7spozwhweUuz5E0C7ZvsDCRAAs4mQFHj7PvH3pMACZAACZCAIwjERBsxYcSIShQID9NrFTEQHuZaD1fMKzomSB1TTDPGmAzhsN64S1p1IKNlgbEKo05tC5cmf7QROOEqmpJoH5UwkAAJOJoARY2jbx87TwIkQAIkQAIOIRAFm4qRHLDMmKCaQ09U5ljCRVMwTcxIl3AjaUwmteHYAkVVkBWHKAS1+kAkoWqUc+WJgZAxaicsCm2Z3Ob/xNq3auI7CZCAkwlQ1Dj57rHvJEACPiXwXL/3ZNfOgz5tw9PKO98xTLrcOdzTYinKX7pMUXntzV4pystMJOApAVhPVGRglliswnpuhIjRJRpgzcFpWCSkCP5zqRTE4dSIlWiIFVMQAgbCx7ow5+bUesOJkTDGTOOenqb5TbmE2kd2BhIgAUcToKhx9O1j50mABHxJINp8CXu4xx1SpKh3ver5ss+prfvQwWMyfdqi1BZnORJIlgBEDcQHLChQIphOpiLFlHQlaR2QMQiwqkDDwFJjxcHygqImxRRUMeNOQc74AW3YCsZVayLtxy/JaxIgAecRoKhx3j1jj0mABEiABEjAcQTwI4FaV8waFxwhW2KiXWLEXNunSDEzz1S8XLHSxBgvaaqF4ggb5EVwSRaXxcaSQfCqplYak65T1HA07cCJwFXtoxIGEiABRxOgqHH07WPnSYAESIAESMAhBMyaGlhaRNe4QKDAUgOVYV4w2eicM5OOKBMPQaOOASBwtBgy2ILEnJhLnYamsebN1Id8Ya41O5rbVbdOaNN6TYaE2rfr4JEESMCxBPDDB0OAE+jWrZv07t3bJ72cMmWKrFmzxid1s1ISIAESIAESsAnAUgMhoq6djXtniYalBi8jYHCNxf44N3GaF44FYqJMmimkL1OTq45ok9+qzyprsply5s2UVdEC99FaN+JxjqTE27f7GAzHtD7XL1y4IBMmTJAzZ84EAw6OIYQIUNQ44Gb3799fnnzySZ/0dNy4cfL333/7pG5WSgIkQAIkQAJuAhAWkUa4QL/gZQsb1TOWkFHBAxGiIiXWUQWJKQsx4y6Ha1RqV2haMufRRsFEQ9BovijrHGInifbdfQyCk7Q+1yMiIvSH1OPHjwcBDQ4hlAhw+pkD7vZPP/0k2bJlk8qVK0ujRo3kvvvukw8//FBOnDghPXr0kGHDhskff/whX3/9tWTPnl2mTp0q5cqVkw8++EBq1KghgwcPlnz58gnEEcKgQYOkWLFicvr0aVm+fLls2bJFihQpIg8++KADaLCLJEACJEACTiQAywlCmBEbRoZogHhRtWEiMDMNi13wn3sNjInSvEiEdkEeo4gwW82Oj1GFZOJR1kRiPQ6CtoL5bjrFzVzjaEKC7WtK4L19//33+ozfv3+/3HDDDfLee+9JmTJlUvxcX716tWTJkkWWLFki69evl/bt28s777yj3xXq1q0rkyZNklq1aunAr7/+evniiy/kkUce0et27drJrFmzpGjRooEHhj0igQQI0FKTAJRAi9q2bZvs2LFDu4WpYi+99JIMHz5cOnTooMe9e/fK4cOH5auvvpLz58/rMWfOnPLss89qGZTdt2+fe1j2defOnVX8oJ7mzZu703lCAiRAAiRAAl4nADGjFhTLumJbZWBdgTDB9DBYWNSiYs7V6uIqI8a9c7SxymgZk1c9qSGviUc+k6hxuk8N6sPL5IfVBufRUDtJtO/1sXqhQjzv8SMmns+///67REZGSqdOnZSV/Ry3m7Gv4z/XN27cKK+88op06dJFf+jEj57ffPONFoPggVXGDrg+d+6c/vCJuOeff15/ELXTeSSBQCdAS02g36EE+jdmzBi566675I477tBfWTZv3qy5YM2BBSdr1qwqVqpWrZrknNhKlSpJ/vz5pUKFClKqVKkEWmIUCZAACZAACXiHAIQL1raoswA9MVYT8591bUQHzrUpk0nPTX4rh+bBlWWlMV7NzKn6ODMmG/ULACuNu26rv5bBxqrLZNa6r+RB5ljtW0UC6v3TTz+Va6+9Vt5//33t15tvvqlWFQiYxEJCz3UIoUcffVSL4PvCb7/9Jg8//HBiVUjDhg01DZYhWHkYSMApBGipccqditXPsmXL6lV4eLjAInPx4kW9hkkaggahdOnS+qvOihUr9Dr22+XLl2Nf8txHBJJ68PioSVZLAiRAAgFLAJYTy4JipEqk6SasKUZl2PHRUCouKwwsKxAg1rU5wCqDqWrmAIsNymp+WF9MRvgIUOuNplnptqMA5LOsPIm3H4jQ8AypX7++u2vly5fX80OHDrnj7JOknuv4gdMOqGP+/Pn2pfsYFWUsXbBmMZCAgwlQ1Djw5kHMJBSwRsYOGzZsEHxIYe0MNinDuR127dpln/LoQwITJ07UKYAnT570YSusmgRIgATSl8DIkSMFHrOSCxAXYTq9DNPCXJYVI24sQWJK63QyLPI3566pYnAKoOIE089MgrX4H1nNBpwuARSjU9BsIQORYwkeFVAoY9q1p7Ql1n5yfU+P9OrVq8uePXvcTW/atEl/uLzuuus8eq7H/m6AKW1YY2sH+7sBvhdQ1NhUeHQqgYS/HTt1NCHeb6yb+fnnn+Xs2bMyfvx4FTSw6lxzzTUyd+5c/XCcNm2arFq1yk0qQ4YMQg8nbhxePYFDBqxzghOGgQMHCsWNV/GyMhIggQAhgC/ZNWvWFPyQk1SAUwAVMLZQ0XUwRozAWqOCBWIFAsRy46wCBtYdzW/ECo4qZCyhEm0EkWWNgRBypePoEjnqJQ2WG9Sh6Ym3n1S/0yvttttuk3nz5snMmTO1C59//rk0a9ZMhY0nz/UffvhBDh48KFu3bpUff/xRWrZsqfVh2vnkyZN1Xc3YsWPdw8T3AgR+N3Aj4YlDCFDUOOBGwdJiW2dwHjvg2o4rUKCAPP7447pOBt7QPv74Y8mUKZPcf//96igAU9Kw303t2rXdVbRu3VoXEcb+QHMn8iRNBPLmzasLLjEnGSKT4iZNOFmYBEggQAnAoxaeP88995x+zr311lsJ9jTMqBqdKgYdA4HimjKm089soeO2sliCxW3RgdiBoHGJHPVg5hJCJtpYgEyaudZpZpoPVqEY3d7GJGh8Uu0n2OF0jmzQoIHgGd2mTRvJnTu3/kiGxfsInjzXsd62jJmejmloefLkUWdDqOOJJ57Q/Whgufnvv//Uyyq+T2CtLaa9Qazu3r0bWRlIwBEE6CjAAbcJiwXtACtM7ACvZwjIU7JkScEaGnhLq1ixolsIwV0j5uDCJWR8hwBw99yzZ0/9oItdL88TJ5CUiT5+GkQkvNUdOXJEK4S4gYDs27evutjGFwEGEiABEnA6gREjRsjdd9+tnjiHDh0qL774olqo+/XrJxkzWl81YKUxykRfeNdzdbmMH+uM0jGr+fVnO0ulmJxWLjtNr/CGn2PNEenqrdkUijH1mO/jWoeZfIYTE2kizP9WzXYsKrBrRiXIowW1SCC9QWBg9gWmoJ06dUq3dcAPlQgpfa5jH7r//e9/utcdtoHAj5t2eOaZZ3RbCKzLLVSokB2tx6VLl8qxY8dUrMZJ4AUJBDABipoAvjmp6RrMxtjPJn7AQyW+oLHzFCxY0D7lMR4B2woWOzqhODs9oTQIHdwXzF2Gy20EeKnDjs14qDCQAAmQQGoIYHE41pbgsyX2K6VxKJPSvAnli18e1mjsQm/vRA+hgx91sL1APrPpJtbJ6F4yZrCQEZAXsL6oplB9oTJF18pEq87QHG4JguxaKsokIr8RN6p/cK4R5t0lbhCv+9IYaw2kEurTbWrgJc3UclX7WndgvmGqGV7xgyfPdVh68IofEoqz8/BHN5sEj04hQFHjlDuVTD9hJn7ssceSycVkTwnEt7x4Wh75IRrxixcCNkfFlwNME8QvmDD74xdNBhIgARLwlAA+T/CDSewXpirHvsZ5QnF2noTS4sfFv7bLxq8b/UdeiB0EHOFAACInd1QWXfdiiwkVHBAglhwxAsSkqAAxFhVXJhUhZuoYVA/y6zXyIx3HSDujJW7U6GLio1GvUTWoE/WbFTVqrrHkDUq6BE+s9lFjMIYHHngg0R80g3G8HFNoE6CoCZL7D1/2eDEEFoFx48apy21bzEDIDBgwQF1xB1ZP2RsSIAGnEUjKja+/x4L9Tz755BMVMpkzZ5ZLly7p1OYhQ4ZI4cKF5YPuLxslYeQFLCiwk5iTsHBLgKjZxKyVgaUbdhSIDuSyA35cUnkCoYKpZ1g/Yw7IjQDrjE5JQzzqwFobl6DRnKp2XOLIFEmwfa0p+N6weScDCYQKAYqaULnTHKffCcBzDHZyxi7QmH5BMeP3W8AGSYAE/EQAn3WYDgXrTLdu3QTrauJPmYI3Msu2gqMRNFHh5mjEBpSOihEcLdGh6abvJhpayJy4BAymnqksQY4r4gaOByB8rADlAguNqzxEEZqBtUdLJ9C+q2QoHSCK7TU6oTRujjV4CeA3D4YgIYAHCRamMwQGgZdffll3bYaTAOzjgI1SGUiABEgg2Ajs3LlTvvnmG3UUAIvN+++/f5Wg0THDkmJ7OcMcM5cnM2gadbmMI9bdwKJj8qpFxrhnxlQy22Uz3D1jE85oI540D+qDoNE4nJuy2oYp70rTeuz6NA31x23fqfcE0/uwPtNex5TScWBrB3jojB9+//13KVq0aPxoXpOAIwjQUuOI25SyTvbv39/tZSZlJZjLlwQw1ax48eK+bIJ1kwAJkEC6E3j11Vd1/7Nq1aol2RfbUoNM0cZ0ArGCYK18cVlSEGUEiFpU1Exj4jWXlY4FN2FqdnFdm0TMLtPpbKaUez2OlkICgslkTiFk7Jj47Vv5nPceERGhP2ZiTxtv/HAGN9Lfffed80CwxyRgCNBS44c/g6+//lo3JqtXr56MGjVKbr/9dm0V55hv3LFjR3XxiznITz31lJQrV07wcIDPf4R3331X7rjjDj3H2/bt29V/PPzKxw4//fST/PrrrxrVqFEjgaUAe9LA9SM238KCQXinadu2rXtTrfXr18udd96pc56bN2+u7iPtOhPrN+Y34yFWqVIlfcHDjTcW1NvtBsuRgiZY7iTHQQIkkBSB9957T59ZSeXRNKx1UYuJmQtmvKFhWpluyKmWGXPhsrCYbG7LDPa1saw45qibbbqsNqjLZXVBOdU5qFvPjcXG1GEqcbVntXPl2iTGaz/ZvpsMcH385JNPStmyZaVDhw66DxnWTSLAGcw999yjP2Q1btxY4EoZYcGCBfrMx2bMmI6H5zE21ERI6lmK5/Hbb7+t3x2QP7Fntf19ol27drrBZmL9QHtffvmlto/vBdgGIqGwZcsWfb4jbdiwYerQBvsQoe8YA76P2N9R7E1BE/vugjqw4Sf22alQoYLWBUYrV65EkrJp2LChbhTeqVMndQeuCXwjgVQSoKhJJbiUFsP+MA8++KDgH+xDDz0k+ADEhxwCNrWC8MC8VogWmJCnTp0qb775prz22mvyzjvvyIwZM6ROnToyZcoUgYkfAeenT5/WDxaNcL1hf5odO3bo1Zo1a/TDp0+fPvohi/ZhnkadSMPGnAjYowbeuCCImjRpol658MGdVL/hjhjzp/HhjiP2XrE/2LVSvpEACZAACZBAPAIqTszzRjfUNPpDp4XBWuMSM5boiHJtpAlhYgkXa5oaRICqHWuKmREwOlVNhYupU/NaIkbLoR1kx3Q0k1enr6EM4k2baiTCtav9eF1N8BLPzR9//FGf2xA2o0ePlk2bNmneLl266B5xEHg33nijQAjgh0fsL4PnOp67EydOFGzGjPWVCEk9S9euXas/bGLzTfyAmNizGkIDAZtywptmYv3Aj6Fdu3YViIhevXrJ999/r+Xiv2Evm+XLl2v0rl27dF81bMSJ9jHe119/XfBDJsZvt53YdxdU0qNHD4HjCPyIi3phBUIb2DcPP7DWrFlTPv/8c42zBVr8PvGaBFJKgNPPUkoqlfn+/PNPadWqlf7igSqweBybL9qhRo0agjmsCPiHjw+cunXrqjWmWLFisnr1at3LBBtm/fLLL/L000/rESIluYAPEWy6hR2Ep02bJtjlGfXgAxa/niBAmLRs2VJy5Mihv5JAZB08eFBmz56daL/xod29e3ctizrWrVsnkydPVmsTrhlIgARIgARIID4BXfuCaWAQNCa4lvKbqWFm0b+JjDZH4xDNLPA3U9M0B5wBmHxmgT/SEadl7TlkJlFdQSMX3DMjnxEy5t3kdbkaMHkhaHQmm8lmH1F97PZxnVzAs/qFF16Qe++9V19z5szRIvhBEVaLRYsWCWZJ4Ms5ZkfgWYuNsLEY/9tvv9V9YuA4Bs9PhOSepRANsJYgJPasxncGhBtuuEE36UysH/h+UaVKFfnggw80P8RWSrYTuPXWW7UPEI3YcwjbEWDWB/a3wfcLBIw5oe8umJ0CJvhOkT9/fp1hYu+j99lnn+l2B+gPvN5hZgO+D+3bt09KlCih9fKNBDwlQFHjKTEP80+fPl0/SOxi9geQfQ0ztR3g9hd7zSxbtkyFCD78EPAPvnPnzvoBCfeMCxcuTJFlBL+kIGTLlk1/wbF3EsaHm133uXPnBB88+CCJ7akmqX7jFx+ILds6g4dN+fLltS2+kQAJkAAJkEBCBHTqmUkw2kLfrc2KYUUxSsSSLCpIIEl0nYzlv0ynltkiBUdXVq3DVZM52HUYy4zJosIGDZlzRODaajex9lFT4gHPzFmzZsnAgQPdmeznOUQNAp7n1phMG+a5iBkPEDX4Qm9vcokfGbG4HyG5Z2ns7weJPau1ov+3dy5AUlRXH7+7vFaWlQVkeQSBPAAFiQgIAil5KBopkJjAp5UEKzGWVBSTUkuTmGhRfCYmWDGalBXDh8aEkqq8yojEMpVogYhAokQwUBgtwYBAeIX3Q15f/89MDzPLzuyw0z3TPfO7Vc3MdN++99xfLzP973Puucl/ctmhB5np7UmI5FP8+witP6R7B62Jp5J+H5Ht3kUPRzV2bSryOMmbpCJbN2/ebGsq6bN4qezYsQNRYyT4pyUECD9rCbVzOEeu5k3JsDGdpicW6cX/AtQ+rS4vASKXteJi9VTFL3IpK652wYIFJiAUktZc0cJofknvx9+nL1w9ddGmcLZly5b5h8xFns1uZUyR+1nnaNOXk55CUSAAAQhAAALZCFgYmIWQeTewCglLZiozPeJ9tnA0bzK/hZUpJM3LaGbzZrx6fsiYhY95z/vkfZEY0qtV9F5Pe5nRlIzA2vGyplldtZOsl7P/bEYn9ytdtX5TN27cmKrp/577WcQ078X/XdTDSYV5qaT/FqdO9t4091sqIaGS67faKiT/yWWHHjxu2bIlVV1zZ/Ip2WzXub4QyXbvIuGjexklM1A5cuSIhePpvWzV3B6fl6JY5GVqLtmEzqVAIBsBRE02MgHt19OQpUuXWjiXvCGPPPJI1pb1hEJek969e9skQ6VcTDzBcm7YsGEWOqbc/xI4QZS9e/faAmnXXXediRjN5VFRn7nsHjdunCUU0JeVNs0Z8l3aQdhFGxCAAAQgUH4EzFOTnOwvoWHiQ4IlTXSc9pSMHfPFicSKp1O8BXDOTO6X2pGY8ZpIpHBOih8TNsl5OF6b0k+Jep7vJzm3xmXpPx/a+l3UvBrNh1VIt8LLVRQ21aVLFzd//nwTMCtXrnRXXnmlU3rrXCXf39Jcv9W+6JAoyGWHQuIU5fHSSy+ZSNI8lqBKtnsXeXUkBjUPR/NolBjJv6fR2DVvaMWKFU7iTfOIlUTAH09QttFOZRFA1IR8vRU7e8cdd9h/Vrle5YbV0wu/+E9i9FlPOzSRX08wlAVt2rRpFvPqe0wUgqYnHRIRTRV5Y/z20j0zep/+2T9Xsa1qUykcZdeuXbssQ4kmE+ayW8kB9MWkJz/a5BbXOiwUCEAAAhCAQFYC8pp4SkPeF3lUzAvjaROtMWPJAiRwPNEhsXLKqydPTpXqeWLFc8KYZyDhxVEdnZ8QRvLWyGsgrSMFZHW8dv01a06qXa+O9ZGtf+/U5ooyfymDqDJ5fe1rX7NMYvo9VypliR1tCq+69tpr7TdUCQOaKv7vca7fUr+Ozs/1W63fbk3kl4CQsMlmh0LllFFNDzF79eplUSHpfaTb6e/Xq/8+/bje617Dv9/Idu+ipEPKuLZ48WKbP6NkCYpGETOloJ45c6YlC9AYlI1N82wkgigQaCkB/npaSi7P8/SkRk8kFK6lLwB5NDSBUEULlKUXiQmlV9ZTD6VMVFGGECUMUNGXgdqSOGqqpKdoPHToUKqKvmAlWPyiLz2/KBOJ4lr1pawvY6Vm1ATCXHZrEp9SMipGVz8k6WFyfru8QgACEIAABDIIyHviaQvLBmCTZrzP3o2zdiUO+NNlbI+3U+vOSLiogoomyHjneP9aO/poRXsS82YSr54YSlR1Vco84JXTXn9ea9n7t1q5/1GotX7L5eWoqalxkyZNSoVLyROicDT9duo321/AUhPtFaXhF/2G+wtl5votlUBJL9l+q1Vn1apVFjUhb5EiPZqyQ/cfEhcag+4lsk3Gl70Kd1NJv6fQZz+MTO+VuUyhYyrZ7l3q6ursQaxC29W/RM4FF1yQYiaRqEQI27Zts/sI2UWBQCEEEDWF0MvjXD2RkFBRAoCuXbu6H//4x5baMNupEhfpC2gpI4i+CJQFRU8xtAVd0hMEyF7ZKXd3Lrv1BeVnMQnaHtqDAAQgAIHyI2DhZ96wTp/0FIc8JnrxXqtN2CRUiEkQKRKJEKvj7Tld7WmVhDfGVtdL6BRbvFNJBRJiR24avU8etHee0PHm1tg+UzneW31qov/Ekdz/as7MrFmzLL2xIigkJhRd4RdNmPcn0vv7mns9l9/Spn6r/fYlaPySyw55mcIoTd276KGnlnx49tlnzXulB7rjPFGXbqvEny8Aw7CLNiuLgPdNQQmTgDKfKJOYUjrqaYS8JMr3fi5FX3qKM1XaZOW+L0YJwu5i2EkfEIAABCAQDwIKAbNQMc2P8W54Pc1iXhjNoVGo2ClLEuAdkhDx9llyANWRW0YhZgoh06KZOl1tSZx4xxOJAHRKMkxN4W3JNi0szTvN6uu4t51uov98CCosXKHWGzdutDA0eSD8qIp8zq+0Ogpd07o+8uqsW7fOwt21zh4FAmERwFMTFtm0dpU/XltLiwRRrgQDLW23ufMKtbu59jkOgagTqK6uck/933NRNzMw+/r07R5YWzQEgbMIeGLDPC7yqEh0eK/mWzHPjPdJoWaeh8aTHSl/SzJoLNGU1fOqeEom4ZNRGyqJdrRTIibRprpKHNU6N1VyC1lVte29b9x/4mjOf5XNVMsqaKPkR0Depbvuuiu/ytSCQIEEEDUFAuR0CECgfAnMfTSRkjVKI9TTT924USAQNwKWGMAzWuLF5tIovCw5CBMdCjHT8eS+RHiaxE5yrzwtdix5VvL/gomYMy0l3yXES+Lf5Hwb7zRrqYn+k13yAgEIxJgAoibGFw/TIQABCEAAAnEhYKFgkhUJZZJUL57sMKXhCQ7tNwHji5ukgDcPjYSQL3hsyr9VNQeMGjBBlJA3CekiKgkPjaRQYlpOUtw01X9cIGInBCCQlQCiJisaDkAAAhCAAAQgEBQBW3/Ga0waRkrGtIwEi/fOvI92QMLD1E2inkROsq6XCs3Ei/w7ybOsMc+Bk/TuWANeezqqF18cee+1GKcJJjsl1WYiZbF/np3FPxCAQEwJIGpieuEwGwIQgAAEIBAnAlqbxsLMlKJIOkKiw1ckno6RN8UOeO6Xau+YEgWkive52qsgQSNJY3NnktoleZZVNadOUgSpOV8ASejYmXLtNNV/qiPeQAACcSWAqInrlSsTu4cPH14mI2EYEIAABCCQi8Bru7blOswxCEAAAgURQNQUhI+TCyHAZOdC6HEuBCAAgfgQuO3p++NjLJZCAAKxJICoieVlw2gIQGDP7n1u2dLVgYJQmxQIQAACEIAABOJHAFETv2uGxRCoeALdund2EyYOC5xDtx7DnNqmQAACEIAABCAQLwKImnhdL6yFAAQ8At26dXLTbxwHi5AJ7N990K1b+a/Aejl6+FhgbdEQBCAAAQhAIJ0AoiadBu8hAAEIQMAIdO5R74ZfMyhQGr0v7uHa19UE2iaNQQACEIAABEQAUcPfAQQgAAEInEWgrlOtGzSq31n72QEBCEAAAhCIIgFETRSvCjZBIOYEQpnEv2d/zKlgPgQgAAEIQAACYRFA1IRFlnYhUKEEuvXo7MZfPTTw0WsSf0NDfeDt0iAEIAABCEAAAvEngKiJ/zVkBBCIFIHuXvYwJvFH6pJE2pjjH51wB/YcDMzGUye9pekpEIAABCBQcQQQNRV3yRkwBCAAgWgQaNe+rfvo6HH39orgMqzVdjzPVbWqjsYAsQICEIAABIpGAFFTNNR0BAEIQAAC6QT6XNzTaaNAAAIQgAAECiXA46xCCXI+BCAAAQhAAAIQgAAEIFBSAoiakuKncwhAAAIQgAAEIAABCECgUAKImkIJcj4EIAABCEAAAhCAAAQgUFICiJqS4qdzCEAAAvkR2Lx5s3viiSes8htvvJHfSdSCAAQgAAEIVAgBEgVUyIVmmBCAQPwIvPvuu27RokW2rV271g0fPtxNmjTJfeUrX3G7du1yEyZMsO2qq65yH//4x+M3wCJafPTwMVdVFUyHx4+dcK3a8EwwGJq0AgEIQCAYAoiaYDjSCgQgAIFACEi8+EJmy5Yt7vrrr3ff+ta3TMykd7Bp0yb3yiuv2Pbggw+6Tp06pUSOxE7Hjh3Tq1f0+w4d27u1r20IlMGA4X0DbY/GIAABCECgMAKImsL4cTYEIACBggmsWrUqJWQOHz5sQuZHP/qRGz9+fNa2+/bt62655RbbVOnNN980gTNv3jx30003uREjRqREztixY7O2UwkHbrhzYiUMkzFCAAIQqGgCiJqKvvwMvtIIKPxmxfI1rra2JrChHzx4JLCwnsCMikFDS5YscS+88IKJmbZt25qQkSAZNWpUi6wfNmyY03bvvfe6kydPprw49913n1u/fr1TiJofrnbJJZe0qA9OggAEIAABCESVAKImqlcGuyAQAoFp/zPO7d9/KPCWO9Z3CLzNcmzwpZdeSnlkunfvbkLmd7/7nRsyZEigw23VqpWbOHGibWp4x44dKZHz05/+1J04cSIlcCR0evZkAcxALwCNQQACEIBA0QkgaoqOnA4hUDoCQ4f3L13nFdizPCb+/Bi9Dhw40E2ZMsX99a9/dRdddFHRiDQ0NFhImsLSVDZs2GAi549//KP7xje+4RTKlu7JadeuXdFsoyMIQAACEIBAEAQQNUFQpA0IQAACSQKHDh3KEDKjR482j8zs2bNdnz59IsFJgkrb7bffbvYsX77cRM7cuXPd5MmTM7w4I0eOjITNGAEBCEAAAhDIRQBRk4sOxyAAAQjkQUDpldM9MhIGylr2+OOPO3lJol7GjBnjtD3wwANOoszPqnbbbbe5rVu3ZnhxPvWpT0V9ONgHAQhAAAIVSABRU4EXnSFDAAKFE9BimL6QefXVV03ETJ8+3S1YsMDV1dUV3kGJWqitrbUQOYXJqWicL7/8sgmdOXPmuA4dOmR4cjp37lwiS+kWAhCAAAQgcIYAouYMC95BAAIQyElAi2E+//zzlrVM68nIGyNvxuLFi12bNm1ynhvXgxdeeKEt9qkFP1XeeustEzjPPPOMu/nmmy3JgT8fJ1cKajuZfyAAAQhAAAIhEUDUhASWZiEAgfIgkO9imOUx2uZHoUxt2u6++26r7Ieq3X///U6s/LTRer300kubb5AaEIAABCAAgQAIIGoCgEgTEIBAeRFoyWKY5UUg/9H4Iuahhx5yu3fvTs3HefLJJ50WEvWPy5vTq1ev/BumJgQgAAEIQOAcCCBqzgEWVSEAgfIlsHTp0tQcmSAWwyxfUtlH1qVLF6d5RdpUFK4nT86LL77o7rnnHhM1vsjRa/v27bM3xhEIQAACEIDAORBA1JwDLKpCAALlRaBYi2GWF7X8R9OvXz+nbebMmXbSypUrTeQ89thjNh9p3LhxKU+OUl9TIAABCEAAAi0lgKhpKTnOgwAEYkegqcUwNdlf2b0GDBgQu/HEzeArrrjCadP8m6NHj6ZC1WbNmuU++OCDlMCRF4frEberi70QgAAESksAUVNa/vQOAQiETCAOi2GGjCCSzdfU1LhJkybZJgM//PDDlMj54Q9/6BQCmB6q1rVr10iOA6MgAAEIQCAaBBA10bgOWAEBCARIIO6LYQaIIjZNfexjH3MzZsywTUa//fbbJnIWLlzobr31Vjdo0KAMkVNdXR2bsWEoBCAAAQiETwBREz5jeoAABIpAoFwXwywCukh2MXjwYKftm9/8ptm3ZMkSEzmzZ892kydPzhA4Q4cOjeQYMAoCEIAABIpHAFFTPNb0BAEIBExA2bUWLVpkW6Ushhkwwtg0p6QC2ubMmeP27t2bClX78pe/bJ/9BUAVstanT5/SjavKufWr3nVt2gbz8/rRseOuvuv5pRsPPUMAAhCICYGq016Jia2YCYGyJFBVVeX8/4b33zfPtWrV2tXW1gQ21oMHj7iqqtPufx++NbA2S9lQU4tharK/5mdQKpPA+++/b8ke/IVAGxoaMjw5dXV1RQOzZ/s+99HR44H21+68tq5Tt0xhk/69EWhnNAYBCEAgpgQQNTG9cJhdPgTSb05Wv/Evt3//ocAH17G+g7tsaL/A2y1Wg00thikhM378+GKZQD8xIvD3v/895cmR0FG6aHlw5M35zGc+E6ORZDc1/Xsjey2OQAACEKgcAoiayrnWjDSiBLg5afrC+IthPv/8865du3a2romEzKhRo5o+gb0QaILA8ePHTeAobbcEznvvvZfhxRk4cGATZ0V/F98b0b9GWAgBCBSXAKKmuLzpDQJnEeDm5AySphbDlJAZMmTImUq8g0ABBLZv357hxVFTvhdHr926dSug9eKdyvdG8VjTEwQgEA8CiJp4XCesLGMClXxzkm0xTAkZFl8s4z/6CA1t/fr1GZ6c/v37Z3hy2rRpEyFrz5hSyd8bZyjwDgIQgMAZAoiaMyx4B4GSEKi0m5P0xTAVWjZmzJhUaFlJs1aV5OrTadQILFu2LOXJef311zMEzuWXXx4ZcyvteyMy4DEEAhCILAFETWQvDYZVCoFKuDnJthimPDLKVEWBQBQJHDhwICVwNCdHf8cKUfO3T3ziEyUzuxK+N0oGl44hAIFYEkDUxPKyYXQ5ESjXm5OmFsOUiNFWzBS75fS3wlhKS2DTpk0pkaOkA/X19SmBo8xqHTt2LJqB5fq9UTSAdAQBCJQdAURN2V1SBhQ3AuV0c9J4McypU6e6KVOmmJCJ6tyEuP29YG90CKxevTolcuTJGTFiRErkjB07NlRDy+l7I1RQNA4BCFQMAURNxVxqBhpVAnG/OWExzKj+ZWFXMQmcOnUqYwFQJSDww9T0Onjw4EDNifv3RqAwaAwCEICARwBRw58BBEpMII43JyyGWeI/GrqPPIGdO3emvDgKVdN6Oekip2fPngWNIY7fGwUNmJMhAAEINEMAUdMMIA5DIGwCcbk58RfDXLRokWvbtq3zQ8tYDDPsvxDaLwcC77zzToYnp2/fvhkip6am5pyGGZfvjXMaFJUhAAEIFEAAUVMAPE6FQBAEonxzwmKYQVxh2oDA2QSULloeHG1LliwxgaNkA/LmjBw58uwTGu2J8vdGI1P5CAEIQKAoBBA1RcFMJxDITiBKNyeaF6C1Y+SN0TZw4MDUGjIshpn9GnIEAoUQOHz4sIkbJRuQyNm6dWuGF6dfv35nNR+l742zjGMHBCAAgRIQQNSUADpdQiCdQKlvTtIXw5SQGT16dErIsBhm+pXiPQSKQ0Dp0H0vjl7bt2+f4cnp3LmzK/X3RnFI0AsEIACB/AkgavJnRU0IhEKgFDcnLIYZyqWkUQiEQmDNmjUZ83GGDBniVqxY4Q4ePOhqa2tD6ZNGIQABCMSNAKImblcMe8uOQLFEDYthlt2fDgOqUALy3ixcuNDNnz+/QgkwbAhAAAJnE0DUnM2EPRAoKoEwRU1Ti2Fef/31Fl7WunXroo6TziAAAQhAAAIQgEBYBBA1YZGlXQjkSSBoUcNimHmCpxoEIAABCEAAAmVDAFFTNpeSgcSVQBCihsUw43r1sRsCEIAABCAAgSAIIGqCoEgbECiAQEtFDYthFgCdUyEAAQhAAAIQKCsCiJqyupwMJo4EzkXUsBhmHK8wNkMAAhCAAAQgEDYBZgqHTZj2IVAAAS2GqbVj/AUx/cUwtUgfi2EWAJZTIQABCEAAAhAoKwJ4asrqcjKYOBJo7KnJthjm1KlTXe/eveM4RGyGAAQgAAEIQAACoRJA1ISKl8Yh0DwBiZqdO3eaR0ZeGW2TJ0+2tMtKv9zQ0NB8I9SAAAQgAAEIQAACFUwAUVPBF5+hl57Avn37XH19vaupqUmJGAmZurq60huHBRCAAAQgAAEIQCAmBBA1MblQmFmeBPbs2WPzZWbMmOFYDLM8rzGjggAEIAABCEAgfAKImvAZ0wMEIAABCEAAAhCAAAQgECKB6hDbpmkIQAACEIAABCAAAQhAAAKhE0DUhI6YDiAAAQhAAAIQgAAEIACBMAkgasKkS9sQgAAEIAABCEAAAhCAQOgEEDWhI6YDCEAAAhCAAAQgAAEIQCBMAoiaMOnSNgQgAAEIQAACEIAABCAQOgFETeiI6QACEIAABCAAAQhAAAIQCJMAoiZMurQNAQhAAAIQgAAEIAABCIROAFETOmI6gAAEIJBJYPfu3e6dd95xJ0+ezDzAJwhAAAIQgAAEWkQAUdMibJwEAQjEkcCePXtcVVWVW7p0aYb5Dz/8sLv44ott30MPPWR1fv/732fUGTt2rPv+97+fsa/xh6NHj7onnnjCHTx4sPEh+7xu3To3YsQId8EFF7jBgwe7+vp6d9NNN7kDBw40Wb+YO//5z3+6xmMuZv/0BQEIQAACECiEAKKmEHqcCwEIlAWB06dPO20q/utdd92VIU5OnTrV7FglTmbNmuUknhqXvXv3ugkTJrh+/fq5//znP+7QoUPuz3/+s3vllVfc17/+9cbVi/5ZQu+RRx4per90CAEIQAACEAiCAKImCIq0AQEIlBWByy+/3LVv397Nnj27yXEpfEwelp49e7rRo0e7v/zlL1Zv6tSp9vrZz37Wbd++PePcxx57zLVr1849/fTTrqGhwbVp08bOfeaZZ6wvv/Jrr73mrrjiCtejRw83ffp0t2PHDjv04IMPugceeMBNmjTJzp88ebLbt2+fHctmz9/+9jenenPmzHEDBw60ur/5zW/cqFGjrP1p06a5Dz74wK1atcrJWyVvzYwZM6zeb3/7W3fRRRe5888/31133XVu06ZNtl/equ9+97vuc5/7nJPwo0AAAhCAAASiQABRE4WrgA0QgECkCEh8/OxnP3OPP/643eg3Nu7GG2907733nvv5z3/uJk6caMLh/fffd9/5znesqsRHp06dMk576623nELY1LbKiRMn3LFjx9xVV11lfclDtHXrVnfNNddYaNqvf/1r99///tf5QkniQ6FxY8aMsTC45cuXm0BSW9ns2b9/v/vTn/7kFixYYN4g9XfnnXe6z3/+8+4Pf/iDCaYf/OAHbsCAAe4LX/iCu/DCC02orFmzxn3xi180e3W+bJXAko3//ve/nc45fvy4u+GGG9Q9BQIQgAAEIFByAq1LbgEGQAACEIggAYkLCYrbb789Yw6OxMzLL7/sXn/9dfN4qI7moixatMh96UtfspFIePjixR/ali1bzAPjf5Y3R+34RUJCAkLzbebNm2fzeuQJuuSSS9yHH35o1eR1kZdEReFiSjaQyx6dq/LCCy+Y12Xnzp1OHiMJFnmS+vfv7yS2NLdH71euXOmGDh1qwubSSy91v/jFL+z8Rx991H360592GzdutM9qV7ZSIAABCEAAAlEhgKiJypXADghAIHQCCqVq27atzWdJ7+zIkSOua9eu6bvs/U9+8hNLICCviV8kIlQUdqakAyryYGieTK7Sq1cvEw1+nV/+8pfu8OHDbvPmzebt0X61rc+tWrWyav78Hj8ErW/fvrZf/2gssjuXPRIf8hgpjEylrq7Ovfnmm+6OO+6wviWgZFfjIvGihAZ++eQnP2lv/TFq7BQIQAACEIBAlAgQfhalq4EtEIBAqARat25tE/VXr16d0Y+ykvlzTtIPKBzre9/7nrv33nstFEzH5NVQ0fwThXdp09yV5ib7S2D84x//SM2DUdsK+5L3xC9qe8iQIal2lXBA3hzfNl/s+PUlepqzxxdeOue5554z78uLL75ooubuu+/2m8p4HTRokIkrf+eGDRtcTU2Nu+yyy2xXept+HV4hAAEIQAACpSSAqCklffqGAASKTkCT8DUXRsJGnpKFCxe6xYsXZ4SGpRulG/8uXbo4CR8ViRN9nj9/vnlUFLJ15ZVXWiiYLzqayn6muSy1tbXuq1/9qlMomrKhPfnkk+6ee+5JdTdu3Di3du1at2LFClddXe3mzp1rCQn8dlMV097ksietmr3VvB95ZoYPH27zaX71q1+l1spRH7JJQmnKlCnu1VdfTYXHyVOlMUrYUCAAAQhAAAJRJICoieJVwSYIQCA0Apr8rzVpdGPviwzNm5HYUJEXIt0ToXA1JQ3wj3Xo0ME99dRTtim069prr3W33HKLhZB17tzZwrbk0dCE+vTSrVs3m3uj8C95aVRXXqBvf/vb5omRiJGYmDlzpiUL0HFlRpPwkIepsV1+27nsaXzOzTffbMkJJMrkJVKK6fXr11tCBGVE8+f9jBw50hIYXH311Rbm9uyzz1rmNb9P2UqBAAQgAAEIRIlAlfdULrE4Q5SswhYIQAACIRNQOmSlKdZ8k8aT+vPpWl4eTdRX6uXu3btnnKIUyxIOTRWtd6M5K3rVmjVNFU3i37Ztm9l23nnnNVXlrH257EmvrK982a15MkorrQxrGr9SWPuLhkooqWh+jzhJAKkuBQIQgAAEIBBVAoiaqF4Z7IIABCAAAQhAAAIQgAAE8iJADEFemKgEAQhAAAIQgAAEIAABCESVAKImqlcGuyAAAQhAAAIQgAAEIACBvAggavLCRCUIQAACEIAABCAAAQhAIKoEEDVRvTLYBQEIQAACEIAABCAAAQjkReD/AQjcJqYdowX2AAAAAElFTkSuQmCC"}}},{"cell_type":"markdown","source":"## I. Imports/Globals","metadata":{}},{"cell_type":"code","source":"import os\nfrom glob import glob\nimport numpy as np\nimport copy\nimport random\nimport time\n\nimport pytorch_lightning as pl\nimport torch\nfrom torch.utils.data import DataLoader\nfrom torch.utils.data import Dataset\nimport torch.nn as nn\n\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nimport cv2\n\nfrom torchvision import transforms\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\nimport torchmetrics\nfrom torchmetrics.functional import peak_signal_noise_ratio as psnr\nfrom torchmetrics.functional import structural_similarity_index_measure as ssim\nfrom torchmetrics.functional import multiscale_structural_similarity_index_measure as msssim\n\nprint(f'PyTorch version: {torch.__version__}')\nprint(f'Pytorch Lightning: {pl.__version__}')\nprint(f'Pytorch Metrics: {torchmetrics.__version__}')","metadata":{"execution":{"iopub.status.busy":"2022-08-06T05:58:42.320722Z","iopub.execute_input":"2022-08-06T05:58:42.321447Z","iopub.status.idle":"2022-08-06T05:58:48.681889Z","shell.execute_reply.started":"2022-08-06T05:58:42.321352Z","shell.execute_reply":"2022-08-06T05:58:48.679714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Config <a id='config'></a>\nWe use most of the same hyperparameters as the original Pix2Pix paper <a href=\"#ref1\">[4]</a>, \nnamely: `image_size` = 256, `learning_rate` = 0.0002, the Adam solver, adversarial loss functions.  \n\nWe experimented with two parameters: the generator's *L1* loss weighting function `lambda` (= 100 and 200) and\nthe `batch_size` (= 1 and 4). In the limited number of experiments we observed, `lambda`=100 and `batch_size`=4 gave best results.","metadata":{}},{"cell_type":"code","source":"cfg = dict(\n    seed = 2022,\n    tile_data_dir_old = \"../input/hubmap-256x256/train/\",\n    tile_data_dir_2022 = \"../input/hubmap-2022-256x256/train/\",\n    num_images = 2700,\n    image_size = 256,\n    \n    num_epochs = 51,\n    batch_size = 4,\n    lr = 2e-4,\n    display_step = 10,\n    adversarial_criterion = nn.BCEWithLogitsLoss(),  \n    recon_criterion = nn.L1Loss(), \n    lambda_recon = 100,   # the original paper lambda = 100\n)\n\ncfg['train_dir'] = cfg['tile_data_dir_2022']","metadata":{"execution":{"iopub.status.busy":"2022-08-06T06:09:59.971129Z","iopub.execute_input":"2022-08-06T06:09:59.971487Z","iopub.status.idle":"2022-08-06T06:09:59.977839Z","shell.execute_reply.started":"2022-08-06T06:09:59.971456Z","shell.execute_reply":"2022-08-06T06:09:59.976884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## II. Data\n\nThe Pix2Pix GAN is robust and generalizes well when trained. The Pix2Pix authors showed good results could be obtained with small datasets of 91, 400 or 1096 images trained over 200 epochs or large datasets (1.2 million images -- ImageNet) trained in as little as 6 epochs. \n\n> Facades: 400 training images trained for 200 epochs, batch size 1   \n> Maps↔aerial photograph: 1096 training images scraped from Google Maps, trained for 200 epochs, batch size 1   \n> BW↔color photograph: 1.2 million training images, trained for 6 epochs, batch size 4  \n\nWith histopathology and radiology data, authors have typically used 3000-10,000 image tiles to train the GAN network.\n\n**GAN training data**   \nThe training images are from the [Human Protein Atlas (HPA)](https://www.proteinatlas.org) database. They are stained with antibodies visualized with 3,3'-diaminobenzidine (DAB) and counterstained with hematoxylin.\nSince the 3000x3000 pixel HPA images are very large they been split into 256x256 tiles (made available by Kaggle user [The Devastator](https://www.kaggle.com/thedevastator) and [this notebook](https://www.kaggle.com/code/thedevastator/converting-to-256x256)). \nFor this run we use 2,700 training images; this can be increased or decreased based on time/compute/fidelity tradeoffs.\n \n**Preprocessing**\n1. the input image tiles (of whatever size) are resized to 256x256 as per the Pix2Pix algorithm requirement\n2. grayscale/color image pairs are generated from the H&E stained images   ","metadata":{}},{"cell_type":"code","source":"class HuBMAPDataset(Dataset):\n    def __init__(self, base_dir, transform=None):\n        self.base_dir = base_dir\n        self.list_files = glob(os.path.join(self.base_dir, \"*.png\"))[:cfg['num_images']]\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.list_files)\n\n    def __getitem__(self, index):\n        img_path = self.list_files[index]\n        img = cv2.imread(img_path)\n        color_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n        # convert to 3-channel grayscale\n        gray_image = cv2.cvtColor(cv2.cvtColor(color_image, cv2.COLOR_RGB2GRAY), \n                                  cv2.COLOR_GRAY2RGB)\n       \n        if self.transform is not None:\n            transformed = self.transform(image=color_image, image0=gray_image)\n            color_image = transformed[\"image\"]  # real image/target\n            gray_image = transformed[\"image0\"]  # conditioned image/input\n      \n        return color_image, gray_image","metadata":{"execution":{"iopub.status.busy":"2022-08-06T05:59:02.387509Z","iopub.execute_input":"2022-08-06T05:59:02.387889Z","iopub.status.idle":"2022-08-06T05:59:02.396566Z","shell.execute_reply.started":"2022-08-06T05:59:02.387856Z","shell.execute_reply":"2022-08-06T05:59:02.395288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class HubMAPDataModule(pl.LightningDataModule):\n    def __init__(self, data_dir=cfg['train_dir'], batch_size=cfg['batch_size']):\n        super().__init__()\n        self.save_hyperparameters()\n        \n        \"\"\" Transform\n        This transform pipeline is applied to the grayscale and color image pair. It will:\n         - resize original input size of both images to 256\n         - augment/flip the images with p = 0.5\n         - scale the pixel values to [-1,1]\n         - convert the images to tensors     \n        \"\"\"\n        self.both_transform = A.Compose(\n                [\n                    #A.Resize(width=cfg['image_size'], height=cfg['image_size']),   # default INTER_LINEAR interpolation\n                    A.HorizontalFlip(p=0.5),\n                    A.VerticalFlip(p=0.5),\n                    A.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5], max_pixel_value=255.0,),\n                    ToTensorV2(),\n                ], additional_targets={\"image0\": \"image\"},\n        )\n        \n\n    def train_dataloader(self):\n        self.train_dataset = HuBMAPDataset(base_dir=self.hparams.data_dir,\n                                           transform=self.both_transform)\n        return DataLoader(self.train_dataset, batch_size=self.hparams.batch_size, shuffle=True)\n","metadata":{"execution":{"iopub.status.busy":"2022-08-06T05:59:13.459678Z","iopub.execute_input":"2022-08-06T05:59:13.460049Z","iopub.status.idle":"2022-08-06T05:59:13.468153Z","shell.execute_reply.started":"2022-08-06T05:59:13.460017Z","shell.execute_reply":"2022-08-06T05:59:13.467027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Sanity Check\n\n# data_module = HubMAPDataModule(data_dir=cfg['train_dir'], batch_size=cfg['batch_size'])\n# dataloader = data_module.train_dataloader()\n# color, gray = next(iter(dataloader))\n\n# print('Input Shape {}, {}'.format(color.size(), gray.size()))","metadata":{"execution":{"iopub.status.busy":"2022-08-06T03:12:13.026663Z","iopub.execute_input":"2022-08-06T03:12:13.027736Z","iopub.status.idle":"2022-08-06T03:12:13.058144Z","shell.execute_reply.started":"2022-08-06T03:12:13.027701Z","shell.execute_reply":"2022-08-06T03:12:13.057391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Data Visualizations","metadata":{}},{"cell_type":"markdown","source":"#### Original images","metadata":{}},{"cell_type":"code","source":"def visualize_original_images(dir, sample=10):\n    # display 10 images\n    fig = plt.figure(figsize=(15, 5))\n    train_imgs = os.listdir(dir)[:cfg['num_images']]\n    train_imgs = glob(os.path.join(dir, \"*.png\"))\n    for idx, img in enumerate(np.random.choice(train_imgs, sample)):\n        ax = fig.add_subplot(2, sample//2, idx+1, xticks=[], yticks=[])\n        im = Image.open(img)\n        plt.imshow(im)","metadata":{"execution":{"iopub.status.busy":"2022-08-06T05:59:22.700361Z","iopub.execute_input":"2022-08-06T05:59:22.700778Z","iopub.status.idle":"2022-08-06T05:59:22.712475Z","shell.execute_reply.started":"2022-08-06T05:59:22.700744Z","shell.execute_reply":"2022-08-06T05:59:22.711514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"visualize_original_images(cfg['train_dir'], 10)","metadata":{"execution":{"iopub.status.busy":"2022-08-06T05:59:26.292580Z","iopub.execute_input":"2022-08-06T05:59:26.293212Z","iopub.status.idle":"2022-08-06T05:59:27.104563Z","shell.execute_reply.started":"2022-08-06T05:59:26.293176Z","shell.execute_reply":"2022-08-06T05:59:27.103613Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Note the intensity and color variations in the images (the data is acquired and digitized from different sources prepared with different protocols at a variety of resolutions.)","metadata":{}},{"cell_type":"markdown","source":"#### Augmented color/image pairs\n\n#### - Augmentations","metadata":{}},{"cell_type":"code","source":"# from https://albumentations.ai/docs/examples/pytorch_semantic_segmentation/\n\ndef visualize_augmentations(dataset, idx=0, samples=4):\n    dataset = copy.deepcopy(dataset)\n    dataset.transform = A.Compose([t for t in dataset.transform \n                                   if not isinstance(t, (A.Normalize, ToTensorV2))])\n    figure, ax = plt.subplots(nrows=samples, ncols=2, figsize=(10, 12))\n    for i in range(samples):\n        color_image, gray_image = dataset[idx]\n        ax[i, 0].imshow(color_image)\n        ax[i, 1].imshow(gray_image)\n        ax[i, 0].set_title(\"color\")\n        ax[i, 1].set_title(\"gray\")\n        ax[i, 0].set_axis_off()\n        ax[i, 1].set_axis_off()\n    plt.suptitle('Augmented images', y=1.0, fontsize=18)\n    plt.tight_layout()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-06T05:59:32.669337Z","iopub.execute_input":"2022-08-06T05:59:32.670282Z","iopub.status.idle":"2022-08-06T05:59:32.678972Z","shell.execute_reply.started":"2022-08-06T05:59:32.670237Z","shell.execute_reply":"2022-08-06T05:59:32.677790Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"both_transform = A.Compose(\n    [\n        #A.Resize(width=cfg['image_size'], height=cfg['image_size']),   # default INTER_LINEAR interpolation\n        A.HorizontalFlip(p=0.5),\n        A.VerticalFlip(p=0.5),\n        A.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5], max_pixel_value=255.0,),\n        ToTensorV2(),\n    ], additional_targets={\"image0\": \"image\"},\n)\n\ntrain_dataset = HuBMAPDataset(base_dir=cfg['train_dir'], transform=both_transform)\nvisualize_augmentations(train_dataset, idx=52)","metadata":{"execution":{"iopub.status.busy":"2022-08-06T05:59:36.599636Z","iopub.execute_input":"2022-08-06T05:59:36.600067Z","iopub.status.idle":"2022-08-06T05:59:37.263340Z","shell.execute_reply.started":"2022-08-06T05:59:36.600031Z","shell.execute_reply":"2022-08-06T05:59:37.262145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### - Dataloader images (after augmentation)","metadata":{}},{"cell_type":"code","source":"# visualize dataloader images (after augmentation)\n\ndata_module = HubMAPDataModule(data_dir=cfg['train_dir'], batch_size=4)\ndata_loader = data_module.train_dataloader()\n\nsamples = 4\ncolor, gray = next(iter(data_loader))\nfigure, ax = plt.subplots(nrows=samples, ncols=2, figsize=(10, 12))\nfor i, (color, gray) in enumerate(zip(color, gray)):\n    ax[i, 0].imshow(color.permute(1, 2, 0).numpy())\n    ax[i, 1].imshow(gray.permute(1, 2, 0).numpy())\n    ax[i, 0].set_title(\"color\")\n    ax[i, 1].set_title(\"gray\")\n    ax[i, 0].set_axis_off()\n    ax[i, 1].set_axis_off()\nplt.suptitle('Augmented images', y=1.0, fontsize=18)\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-06T05:59:42.689046Z","iopub.execute_input":"2022-08-06T05:59:42.689979Z","iopub.status.idle":"2022-08-06T05:59:43.368595Z","shell.execute_reply.started":"2022-08-06T05:59:42.689944Z","shell.execute_reply":"2022-08-06T05:59:43.367431Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## III. Model\n\nPortions of the Pix2Pix [Pytorch Lightning implementation](https://colab.research.google.com/github/LibreCV/blog/blob/master/_notebooks/2021-02-13-Pix2Pix%20explained%20with%20code.ipynb) below is from Aniket Maurya.","metadata":{}},{"cell_type":"code","source":"class UpSampleConv(nn.Module):\n\n    def __init__(\n        self,\n        in_channels,\n        out_channels,\n        kernel=4,\n        strides=2,\n        padding=1,\n        activation=True,\n        batchnorm=True,\n        dropout=False\n    ):\n        super().__init__()\n        self.activation = activation\n        self.batchnorm = batchnorm\n        self.dropout = dropout\n\n        self.deconv = nn.ConvTranspose2d(in_channels, out_channels, kernel, strides, padding)\n\n        if batchnorm:\n            self.bn = nn.BatchNorm2d(out_channels)\n\n        if activation:\n            self.act = nn.ReLU(True)\n\n        if dropout:\n            self.drop = nn.Dropout2d(0.5)\n\n    def forward(self, x):\n        x = self.deconv(x)\n        if self.batchnorm:\n            x = self.bn(x)\n\n        if self.dropout:\n            x = self.drop(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2022-08-06T05:59:59.883004Z","iopub.execute_input":"2022-08-06T05:59:59.883692Z","iopub.status.idle":"2022-08-06T05:59:59.891767Z","shell.execute_reply.started":"2022-08-06T05:59:59.883656Z","shell.execute_reply":"2022-08-06T05:59:59.890733Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DownSampleConv(nn.Module):\n\n    def __init__(self, in_channels, out_channels, kernel=4, strides=2, padding=1, activation=True, batchnorm=True):\n        \"\"\"\n        Paper details:\n        - C64-C128-C256-C512-C512-C512-C512-C512\n        - All convolutions are 4×4 spatial filters applied with stride 2\n        - Convolutions in the encoder downsample by a factor of 2\n        \"\"\"\n        \n        super().__init__()\n        self.activation = activation\n        self.batchnorm = batchnorm\n\n        self.conv = nn.Conv2d(in_channels, out_channels, kernel, strides, padding)\n\n        if batchnorm:\n            self.bn = nn.BatchNorm2d(out_channels)\n\n        if activation:\n            self.act = nn.LeakyReLU(0.2)\n\n    def forward(self, x):\n        x = self.conv(x)\n        if self.batchnorm:\n            x = self.bn(x)\n        if self.activation:\n            x = self.act(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2022-08-06T06:00:08.587432Z","iopub.execute_input":"2022-08-06T06:00:08.588342Z","iopub.status.idle":"2022-08-06T06:00:08.597284Z","shell.execute_reply.started":"2022-08-06T06:00:08.588304Z","shell.execute_reply":"2022-08-06T06:00:08.596171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### UNet generator","metadata":{}},{"cell_type":"code","source":"class UNetGenerator(nn.Module):\n\n    def __init__(self, in_channels, out_channels):\n        \"\"\"\n        Paper details:\n        - Encoder: C64-C128-C256-C512-C512-C512-C512-C512\n        - All convolutions are 4×4 spatial filters applied with stride 2\n        - Convolutions in the encoder downsample by a factor of 2\n        - Decoder: CD512-CD1024-CD1024-C1024-C1024-C512 -C256-C128\n        \"\"\"\n        \n        super().__init__()\n\n        # encoder/donwsample convs\n        self.encoders = [\n            DownSampleConv(in_channels, 64, batchnorm=False),  # bs x 64 x 128 x 128\n            DownSampleConv(64, 128),  # bs x 128 x 64 x 64\n            DownSampleConv(128, 256),  # bs x 256 x 32 x 32\n            DownSampleConv(256, 512),  # bs x 512 x 16 x 16\n            DownSampleConv(512, 512),  # bs x 512 x 8 x 8\n            DownSampleConv(512, 512),  # bs x 512 x 4 x 4\n            DownSampleConv(512, 512),  # bs x 512 x 2 x 2\n            DownSampleConv(512, 512, batchnorm=False),  # bs x 512 x 1 x 1\n        ]\n\n        # decoder/upsample convs\n        self.decoders = [\n            UpSampleConv(512, 512, dropout=True),  # bs x 512 x 2 x 2\n            UpSampleConv(1024, 512, dropout=True),  # bs x 512 x 4 x 4\n            UpSampleConv(1024, 512, dropout=True),  # bs x 512 x 8 x 8\n            UpSampleConv(1024, 512),  # bs x 512 x 16 x 16\n            UpSampleConv(1024, 256),  # bs x 256 x 32 x 32\n            UpSampleConv(512, 128),  # bs x 128 x 64 x 64\n            UpSampleConv(256, 64),  # bs x 64 x 128 x 128\n        ]\n        self.decoder_channels = [512, 512, 512, 512, 256, 128, 64]\n        self.final_conv = nn.ConvTranspose2d(64, out_channels, kernel_size=4, stride=2, padding=1)\n        self.tanh = nn.Tanh()\n\n        self.encoders = nn.ModuleList(self.encoders)\n        self.decoders = nn.ModuleList(self.decoders)\n\n    def forward(self, x):\n        skips_cons = []\n        for encoder in self.encoders:\n            x = encoder(x)\n\n            skips_cons.append(x)\n\n        skips_cons = list(reversed(skips_cons[:-1]))\n        decoders = self.decoders[:-1]\n\n        for decoder, skip in zip(decoders, skips_cons):\n            x = decoder(x)\n            # print(x.shape, skip.shape)\n            x = torch.cat((x, skip), axis=1)\n\n        x = self.decoders[-1](x)\n        # print(x.shape)\n        x = self.final_conv(x)\n        return self.tanh(x)","metadata":{"execution":{"iopub.status.busy":"2022-08-06T06:00:17.329666Z","iopub.execute_input":"2022-08-06T06:00:17.330024Z","iopub.status.idle":"2022-08-06T06:00:17.341831Z","shell.execute_reply.started":"2022-08-06T06:00:17.329993Z","shell.execute_reply":"2022-08-06T06:00:17.340819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### PatchGAN discriminator <a id='PatchGAN'></a>\nThe basic idea of the PatchGAN discriminator model is to classify an 𝑁×𝑁 region in the 𝑀×𝑀 input image (𝑁<𝑀) as ’real’ or ’fake’,  In our case, 𝑀=256 and 𝑁=70. The output of the discriminator model is a map with 16×16 values scaled using a sigmoid activation function. These 16 values are combined to give the probability of the entire input image being ’real’ or ’fake’.  ","metadata":{}},{"cell_type":"code","source":"class PatchGANDiscriminator(nn.Module):\n\n    def __init__(self, input_channels):\n        super().__init__()\n        self.d1 = DownSampleConv(input_channels, 64, batchnorm=False)\n        self.d2 = DownSampleConv(64, 128)\n        self.d3 = DownSampleConv(128, 256)\n        self.d4 = DownSampleConv(256, 512)\n        self.final = nn.Conv2d(512, 1, kernel_size=1)\n\n    def forward(self, x, y):\n        x = torch.cat([x, y], axis=1)\n        x0 = self.d1(x)\n        x1 = self.d2(x0)\n        x2 = self.d3(x1)\n        x3 = self.d4(x2)\n        xn = self.final(x3)\n        return xn","metadata":{"execution":{"iopub.status.busy":"2022-08-06T06:00:26.032326Z","iopub.execute_input":"2022-08-06T06:00:26.032937Z","iopub.status.idle":"2022-08-06T06:00:26.040675Z","shell.execute_reply.started":"2022-08-06T06:00:26.032903Z","shell.execute_reply":"2022-08-06T06:00:26.039376Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Utils","metadata":{}},{"cell_type":"code","source":"# https://stackoverflow.com/questions/49433936/how-to-initialize-weights-in-pytorch\ndef _weights_init(m):\n    if isinstance(m, (nn.Conv2d, nn.ConvTranspose2d)):\n        torch.nn.init.normal_(m.weight, 0.0, 0.02)\n    if isinstance(m, nn.BatchNorm2d):\n        torch.nn.init.normal_(m.weight, 0.0, 0.02)\n        torch.nn.init.constant_(m.bias, 0)\n\n        \ndef display_progress(cond, real, fake, current_epoch, path, figsize=(10,5)):\n    \"\"\"\n    Save cond, real (original) and generated (fake)\n    images in one panel \n    \"\"\"\n    \n    cond = cond.detach().cpu().permute(1, 2, 0)   \n    real = real.detach().cpu().permute(1, 2, 0)\n    fake = fake.detach().cpu().permute(1, 2, 0)\n    \n    images = [cond, real, fake]\n    titles = ['input','real','generated']\n    print(f'Epoch: {current_epoch}')\n    fig, ax = plt.subplots(1, 3, figsize=figsize)\n    for idx,img in enumerate(images):\n        ax[idx].imshow(img)\n        ax[idx].axis(\"off\")\n    for idx, title in enumerate(titles):    \n        ax[idx].set_title('{}'.format(title))\n    plt.savefig(path)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-06T06:00:40.935250Z","iopub.execute_input":"2022-08-06T06:00:40.935606Z","iopub.status.idle":"2022-08-06T06:00:40.946875Z","shell.execute_reply.started":"2022-08-06T06:00:40.935573Z","shell.execute_reply":"2022-08-06T06:00:40.945680Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Pix2Pix Lightning module","metadata":{}},{"cell_type":"code","source":"class Pix2Pix(pl.LightningModule):\n\n    def __init__(self, in_channels, out_channels, learning_rate=0.0002, lambda_recon=100, \n                 epoch_decay=100,  display_step=10):\n\n        super().__init__()\n        self.save_hyperparameters()       # can be later accessed via self.hparams\n        \n        self.display_step = display_step\n        self.gen = UNetGenerator(in_channels, out_channels)\n        self.disc = PatchGANDiscriminator(in_channels + out_channels)\n\n        # intializing weights\n        self.gen = self.gen.apply(_weights_init)\n        self.disc = self.disc.apply(_weights_init)\n\n        self.adversarial_criterion = cfg['adversarial_criterion']   # nn.BCEWithLogitsLoss()\n        self.recon_criterion = cfg['recon_criterion']               # nn.L1Loss()\n        \n       \n    def _gen_step(self, real_images, conditioned_images):\n        # Pix2Pix has adversarial and a reconstruction loss\n        # adversarial loss\n        fake_images = self.gen(conditioned_images)\n        disc_logits = self.disc(fake_images, conditioned_images)\n        adversarial_loss = self.adversarial_criterion(disc_logits, torch.ones_like(disc_logits))\n\n        # reconstruction loss\n        recon_loss = self.recon_criterion(fake_images, real_images)\n        lambda_recon = self.hparams.lambda_recon\n        gen_loss = adversarial_loss + lambda_recon * recon_loss\n \n        return gen_loss\n\n    def _disc_step(self, real_images, conditioned_images):\n        fake_images = self.gen(conditioned_images).detach()\n        fake_logits = self.disc(fake_images, conditioned_images)\n\n        real_logits = self.disc(real_images, conditioned_images)\n\n        fake_loss = self.adversarial_criterion(fake_logits, torch.zeros_like(fake_logits))\n        real_loss = self.adversarial_criterion(real_logits, torch.ones_like(real_logits))\n        disc_loss =  (real_loss + fake_loss) / 2\n \n        return disc_loss\n\n    \n    def lr_lambda(self, epoch):\n        epoch_decay = self.hparams.epoch_decay\n        fraction = (epoch - epoch_decay) / epoch_decay\n        return 1 if epoch < epoch_decay else 1 - fraction\n    \n    def configure_optimizers(self):\n        # define the optimizers \n        lr = self.hparams.learning_rate\n        gen_opt = torch.optim.Adam(self.gen.parameters(), lr=lr)\n        disc_opt = torch.optim.Adam(self.disc.parameters(), lr=lr)\n        \n        # define the lr_schedulers \n        gen_sch = torch.optim.lr_scheduler.LambdaLR(gen_opt, lr_lambda = self.lr_lambda)\n        disc_sch = torch.optim.lr_scheduler.LambdaLR(disc_opt, lr_lambda = self.lr_lambda)\n        return [disc_opt, gen_opt], [gen_sch, disc_sch]\n\n    # the optimizer index is used to index multiple (here two) optimizers\n    def training_step(self, batch, batch_idx, optimizer_idx):\n        real, condition = batch\n\n        loss = None\n        if optimizer_idx == 0:\n            loss = self._disc_step(real, condition)\n            self.log('PatchGAN Loss', loss)\n        elif optimizer_idx == 1:\n            loss = self._gen_step(real, condition)\n            self.log('Generator Loss', loss)\n            \n        \n        if self.current_epoch%self.display_step==0 and batch_idx==0 and optimizer_idx==1:\n            fake = self.gen(condition).detach()\n            display_progress(condition[0], real[0], fake[0], self.current_epoch, \n                             path=\"/kaggle/working/img_{}\".format(self.current_epoch))\n            print(f'PSNR: {psnr(fake[0], real[0])}')\n            print(f'SSIM: {ssim(fake[0][None, :], real[0][None, :])}')\n            print(f'MS-SSIM: {msssim(fake[0][None, :], real[0][None, :])}')\n           \n        return loss","metadata":{"execution":{"iopub.status.busy":"2022-08-06T06:10:19.231769Z","iopub.execute_input":"2022-08-06T06:10:19.232156Z","iopub.status.idle":"2022-08-06T06:10:19.247887Z","shell.execute_reply.started":"2022-08-06T06:10:19.232098Z","shell.execute_reply":"2022-08-06T06:10:19.246930Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## IV. Training","metadata":{}},{"cell_type":"code","source":"pl.seed_everything(cfg['seed'])\ndata_module = HubMAPDataModule(data_dir=cfg['train_dir'], batch_size=cfg['batch_size'])\npix2pix = Pix2Pix(3, 3, learning_rate=cfg['lr'], lambda_recon=cfg['lambda_recon'], \n                  epoch_decay=100, display_step=cfg['display_step'])\ntrainer = pl.Trainer(max_epochs=cfg['num_epochs'], gpus=-1)\ntrainer.fit(pix2pix, data_module)","metadata":{"execution":{"iopub.status.busy":"2022-08-06T06:10:25.438931Z","iopub.execute_input":"2022-08-06T06:10:25.439300Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Start tensorboard.\n# %reload_ext tensorboard\n# %tensorboard --logdir lightning_logs/","metadata":{"execution":{"iopub.status.busy":"2022-08-02T07:18:57.143710Z","iopub.execute_input":"2022-08-02T07:18:57.145388Z","iopub.status.idle":"2022-08-02T07:18:57.166544Z","shell.execute_reply.started":"2022-08-02T07:18:57.145230Z","shell.execute_reply":"2022-08-02T07:18:57.165338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## V. References \n\n<a name=\"ref1\"></a>[1] [Hyungjoo Cho et al. 'Neural Stain-Style Transfer Learning using GAN for Histopathological Images.' ACML (2017)](https://arxiv.org/pdf/1710.08543.pdf)  \n<a name=\"ref1\"></a>[2] [M Tarek Shaban et al. 'StainGAN: Stain Style Transfer for Digital Histological Images'](https://arxiv.org/pdf/1804.01601.pdf)    \n<a name=\"ref1\"></a>[3] [Pegah Salehi et al. 'Pix2Pix-based Stain-to-Stain Translation: A Solution for Robust Stain Normalization in Histopathology Images Analysis'](https://arxiv.org/pdf/2002.00647.pdf)  \n<a name=\"ref1\"></a>[4] [Phillip Isola et al. 'Image-to-Image Translation with Conditional Adversarial Networks.'](https://arxiv.org/pdf/1611.07004v3)  \n<a name=\"ref1\"></a>[5] [BenTaieb, A., Hamarneh, G. 'Adversarial stain transfer for histopathology image analysis.' IEEE Transactions on Medical Imaging (2017)](http://www.sfu.ca/~abentaie/papers/TMI2017.pdf)  ","metadata":{}},{"cell_type":"markdown","source":"**Author: Meena Mani**   \n**Date: August 2022**","metadata":{}}]}