├── 5-Oct ├── data │ ├── 2x3_matrix.jpg │ ├── 2x3_matrix_raw.jpg │ ├── GP_PXL_20240926_003004774.jpg │ ├── PXL_20241002_015409987.NIGHT.jpg │ ├── RGB_color_space.png │ ├── hsv.webp │ └── xray.jpg ├── delete_temp.py ├── image_processing_1.ipynb ├── image_processing_2.ipynb ├── image_processing_3.ipynb ├── installation.txt └── requirements.txt ├── 6-Oct ├── DL_1.ipynb ├── DL_2.ipynb ├── Pytorch_Basics.ipynb ├── data │ ├── Cancer_Data.csv │ └── images │ │ ├── car │ │ ├── car_1.jpg │ │ ├── car_10.jpg │ │ ├── car_2.jpg │ │ ├── car_3.jpg │ │ ├── car_4.jpg │ │ ├── car_5.jpg │ │ ├── car_6.jpg │ │ ├── car_7.jpg │ │ ├── car_8.jpg │ │ └── car_9.jpg │ │ ├── dog │ │ ├── dog_1.jpg │ │ ├── dog_10.jpg │ │ ├── dog_2.jpg │ │ ├── dog_3.jpg │ │ ├── dog_4.jpg │ │ ├── dog_5.jpg │ │ ├── dog_6.jpg │ │ ├── dog_7.jpg │ │ ├── dog_8.jpg │ │ └── dog_9.jpg │ │ └── person │ │ ├── person_1.jpg │ │ ├── person_10.jpg │ │ ├── person_2.jpg │ │ ├── person_3.jpg │ │ ├── person_4.jpg │ │ ├── person_5.jpg │ │ ├── person_6.jpg │ │ ├── person_7.jpg │ │ ├── person_8.jpg │ │ └── person_9.jpg └── requirements.txt └── README.md /5-Oct/data/2x3_matrix.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/5-Oct/data/2x3_matrix.jpg -------------------------------------------------------------------------------- /5-Oct/data/2x3_matrix_raw.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/5-Oct/data/2x3_matrix_raw.jpg -------------------------------------------------------------------------------- /5-Oct/data/GP_PXL_20240926_003004774.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/5-Oct/data/GP_PXL_20240926_003004774.jpg -------------------------------------------------------------------------------- /5-Oct/data/PXL_20241002_015409987.NIGHT.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/5-Oct/data/PXL_20241002_015409987.NIGHT.jpg -------------------------------------------------------------------------------- /5-Oct/data/RGB_color_space.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/5-Oct/data/RGB_color_space.png -------------------------------------------------------------------------------- /5-Oct/data/hsv.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/5-Oct/data/hsv.webp -------------------------------------------------------------------------------- /5-Oct/data/xray.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/5-Oct/data/xray.jpg -------------------------------------------------------------------------------- /5-Oct/delete_temp.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | 4 | temp_dir = './temp/' 5 | 6 | # Check if the directory exists 7 | if os.path.exists(temp_dir): 8 | for filename in os.listdir(temp_dir): 9 | file_path = os.path.join(temp_dir, filename) 10 | 11 | try: 12 | if os.path.isfile(file_path) or os.path.islink(file_path): 13 | os.unlink(file_path) 14 | elif os.path.isdir(file_path): 15 | shutil.rmtree(file_path) 16 | except Exception as e: 17 | print(f'Failed to delete {file_path}. Reason: {e}') 18 | else: 19 | print(f'The directory {temp_dir} does not exist.') 20 | -------------------------------------------------------------------------------- /5-Oct/image_processing_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# What is an Image?\n", 8 | "\n", 9 | "An image is a two-dimensional array of pixel values where each pixel represents the color information at a specific point. Images can be grayscale (where each pixel is a shade of gray) or color images, where each pixel is represented by three or four values corresponding to the primary color channels (e.g., RGB).\n", 10 | "\n", 11 | "- Digital Image: Stored as a matrix of pixel values.\n", 12 | "- Color Image: Each pixel is represented by a tuple (e.g., (255, 0, 0) for red in RGB)." 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 1, 18 | "metadata": {}, 19 | "outputs": [], 20 | "source": [ 21 | "from PIL import Image" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "## Creating RGB image with PIL" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 2, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [ 37 | "# Create image with orange color\n", 38 | "image = Image.new(\"RGB\", (100, 100), (255, 100, 0))" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 4, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "name": "stdout", 48 | "output_type": "stream", 49 | "text": [ 50 | "\n" 51 | ] 52 | } 53 | ], 54 | "source": [ 55 | "print(image)" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 15, 61 | "metadata": {}, 62 | "outputs": [ 63 | { 64 | "name": "stdout", 65 | "output_type": "stream", 66 | "text": [ 67 | "\n", 68 | "(100, 100)\n", 69 | "RGB\n", 70 | "3\n" 71 | ] 72 | } 73 | ], 74 | "source": [ 75 | "print(type(image))\n", 76 | "\n", 77 | "print(image.size)\n", 78 | "\n", 79 | "print(image.mode)\n", 80 | "\n", 81 | "print(len(image.getbands()))" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 6, 87 | "metadata": {}, 88 | "outputs": [], 89 | "source": [ 90 | "image.show()" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "## Creating B/W or gray-scale image with PIL" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 7, 103 | "metadata": {}, 104 | "outputs": [], 105 | "source": [ 106 | "# Create image with orange color\n", 107 | "image_bw = Image.new(\"L\", (100, 100), (100))\n" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 8, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "name": "stdout", 117 | "output_type": "stream", 118 | "text": [ 119 | "\n", 120 | "(100, 100)\n", 121 | "L\n", 122 | "('L',)\n" 123 | ] 124 | } 125 | ], 126 | "source": [ 127 | "print(type(image_bw))\n", 128 | "\n", 129 | "print(image_bw.size)\n", 130 | "\n", 131 | "print(image_bw.mode)\n", 132 | "\n", 133 | "print(image_bw.getbands())" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 9, 139 | "metadata": {}, 140 | "outputs": [], 141 | "source": [ 142 | "image_bw.show()" 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "metadata": {}, 148 | "source": [ 149 | "## Creating RGB image with Numpy and OpenCV" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": 11, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [ 158 | "import numpy as np\n", 159 | "import cv2" 160 | ] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "execution_count": 12, 165 | "metadata": {}, 166 | "outputs": [], 167 | "source": [ 168 | "# Create a blank image with black pixels\n", 169 | "image_opencv = np.zeros((500, 500, 3), np.uint8) " 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 13, 175 | "metadata": {}, 176 | "outputs": [], 177 | "source": [ 178 | "# Fill the image with orange color (BGR values)\n", 179 | "image_opencv[:] = (0, 100, 255)" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 14, 185 | "metadata": {}, 186 | "outputs": [ 187 | { 188 | "name": "stdout", 189 | "output_type": "stream", 190 | "text": [ 191 | "(500, 500, 3)\n", 192 | "500\n" 193 | ] 194 | } 195 | ], 196 | "source": [ 197 | "print(image_opencv.shape)\n", 198 | "\n", 199 | "print(len(image_opencv))" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 16, 205 | "metadata": {}, 206 | "outputs": [], 207 | "source": [ 208 | "# Display the image\n", 209 | "cv2.imshow('Orange Image', image_opencv)\n", 210 | "cv2.waitKey(0)\n", 211 | "cv2.destroyAllWindows()" 212 | ] 213 | }, 214 | { 215 | "cell_type": "markdown", 216 | "metadata": {}, 217 | "source": [ 218 | "# Creating BW image with Numpy and OpenCV" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": 24, 224 | "metadata": {}, 225 | "outputs": [], 226 | "source": [ 227 | "image_opencv_bw = np.zeros((500, 500, 1), np.uint8) \n", 228 | "image_opencv_bw[:] = (0)" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 25, 234 | "metadata": {}, 235 | "outputs": [ 236 | { 237 | "name": "stdout", 238 | "output_type": "stream", 239 | "text": [ 240 | "(500, 500, 1)\n" 241 | ] 242 | } 243 | ], 244 | "source": [ 245 | "print(image_opencv_bw.shape)" 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "execution_count": 26, 251 | "metadata": {}, 252 | "outputs": [], 253 | "source": [ 254 | "# Display the image\n", 255 | "cv2.imshow('grey_scale Image', image_opencv_bw)\n", 256 | "cv2.waitKey(0)\n", 257 | "cv2.destroyAllWindows()" 258 | ] 259 | }, 260 | { 261 | "cell_type": "markdown", 262 | "metadata": {}, 263 | "source": [ 264 | "## Creating RGBA Image PIL\n", 265 | "\n", 266 | "- RGB: Red, Green, and Blue channels, with each pixel representing a combination of these three colors.\n", 267 | "\n", 268 | "- RGBA: Adds an Alpha channel to RGB, representing transparency.\n", 269 | "\n", 270 | "- Grayscale: A single channel representing shades of gray.\n", 271 | "\n", 272 | "- CMYK: Used in printing (Cyan, Magenta, Yellow, Black)." 273 | ] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": 27, 278 | "metadata": {}, 279 | "outputs": [ 280 | { 281 | "name": "stdout", 282 | "output_type": "stream", 283 | "text": [ 284 | "(100, 100)\n", 285 | "RGBA\n", 286 | "('R', 'G', 'B', 'A')\n" 287 | ] 288 | } 289 | ], 290 | "source": [ 291 | "# Create image with orange color\n", 292 | "image = Image.new(\"RGB\", (100, 100), (255, 100, 0))\n", 293 | "image_rgba = image.convert(\"RGBA\")\n", 294 | "\n", 295 | "print(image_rgba.size)\n", 296 | "\n", 297 | "print(image_rgba.mode)\n", 298 | "\n", 299 | "print(image_rgba.getbands())\n", 300 | "\n", 301 | "image_rgba.show()" 302 | ] 303 | }, 304 | { 305 | "cell_type": "markdown", 306 | "metadata": {}, 307 | "source": [ 308 | "## Convert to RGB from BGR Image OpenCV" 309 | ] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": 28, 314 | "metadata": {}, 315 | "outputs": [], 316 | "source": [ 317 | "# Convert BGR to RGB\n", 318 | "image_rgb = cv2.cvtColor(image_opencv, cv2.COLOR_BGR2RGB)\n", 319 | "\n", 320 | "# Display the image\n", 321 | "cv2.imshow('BGR to RGB', image_rgb)\n", 322 | "cv2.waitKey(0)\n", 323 | "cv2.destroyAllWindows()" 324 | ] 325 | }, 326 | { 327 | "cell_type": "code", 328 | "execution_count": 29, 329 | "metadata": {}, 330 | "outputs": [], 331 | "source": [ 332 | "# Convert BGR to RGB\n", 333 | "image_bw = cv2.cvtColor(image_opencv, cv2.COLOR_BGR2GRAY)\n", 334 | "\n", 335 | "# Display the image\n", 336 | "cv2.imshow('BGR to GreyScale', image_bw)\n", 337 | "cv2.waitKey(0)\n", 338 | "cv2.destroyAllWindows()" 339 | ] 340 | }, 341 | { 342 | "cell_type": "markdown", 343 | "metadata": {}, 344 | "source": [ 345 | "## OpenCV doesn't directly support adding an alpha channel to an image, you can achieve this by creating a new image with 4 channels (BGRA) and copying the original image data into it" 346 | ] 347 | }, 348 | { 349 | "cell_type": "code", 350 | "execution_count": 30, 351 | "metadata": {}, 352 | "outputs": [], 353 | "source": [ 354 | "# Create a new image with 4 channels (BGRA)\n", 355 | "bgra_opencv = np.zeros((image_rgb.shape[0], image_rgb.shape[1], 4), dtype=np.uint8)" 356 | ] 357 | }, 358 | { 359 | "cell_type": "code", 360 | "execution_count": 31, 361 | "metadata": {}, 362 | "outputs": [], 363 | "source": [ 364 | "# Copy the original image data into the BGR channels\n", 365 | "bgra_opencv[:, :, :3] = image_rgb" 366 | ] 367 | }, 368 | { 369 | "cell_type": "code", 370 | "execution_count": 32, 371 | "metadata": {}, 372 | "outputs": [], 373 | "source": [ 374 | "# Set the alpha channel to 255 (fully opaque)\n", 375 | "bgra_opencv[:, :, 3] = 255" 376 | ] 377 | }, 378 | { 379 | "cell_type": "code", 380 | "execution_count": 33, 381 | "metadata": {}, 382 | "outputs": [ 383 | { 384 | "name": "stdout", 385 | "output_type": "stream", 386 | "text": [ 387 | "(500, 500, 4)\n", 388 | "500\n" 389 | ] 390 | } 391 | ], 392 | "source": [ 393 | "print(bgra_opencv.shape)\n", 394 | "\n", 395 | "print(len(bgra_opencv))" 396 | ] 397 | }, 398 | { 399 | "cell_type": "code", 400 | "execution_count": 34, 401 | "metadata": {}, 402 | "outputs": [], 403 | "source": [ 404 | "# Display the image\n", 405 | "cv2.imshow('BGR to BGRA', bgra_opencv)\n", 406 | "cv2.waitKey(0)\n", 407 | "cv2.destroyAllWindows()" 408 | ] 409 | }, 410 | { 411 | "cell_type": "markdown", 412 | "metadata": {}, 413 | "source": [ 414 | "# Image Types\n", 415 | "\n", 416 | "| Abbreviation | Description | File extensions |\n", 417 | "| ------------- | ------------- | ------------- |\n", 418 | "| JPEG | Joint Photographic Expert Group image.Good choice for lossy compression of still images | .jpg, .jpeg, .jfif, .pjpeg, .pjp |\n", 419 | "| PNG | Portable Network Graphics. Lossless compression, supports transparency (RGBA). PNG is preferred over JPEG for more precise reproduction of source images, or when transparency is needed. | .png |\n", 420 | "| HEIC | New format, efficient compression with higher quality (used by iPhones). | .heic |\n", 421 | "| GIF | Graphics Interchange Format. Good choice for simple images and animations. | .gif |\n", 422 | "| TIFF | Tagged Image File Format. Brain MRI images on kaggle. | .tif, .tiff |" 423 | ] 424 | }, 425 | { 426 | "cell_type": "code", 427 | "execution_count": 35, 428 | "metadata": {}, 429 | "outputs": [], 430 | "source": [ 431 | "import os\n", 432 | "\n", 433 | "def print_file_size(file):\n", 434 | "\n", 435 | " File_Size = os.path.getsize(file) # returns bytes\n", 436 | " File_Size_KB = round(File_Size/1024,4)\n", 437 | "\n", 438 | " print(\"Image File Size is \" + str(File_Size_KB) + \"KB\" )" 439 | ] 440 | }, 441 | { 442 | "cell_type": "markdown", 443 | "metadata": {}, 444 | "source": [ 445 | "## Save an PIL image in different formats" 446 | ] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": 36, 451 | "metadata": {}, 452 | "outputs": [ 453 | { 454 | "name": "stdout", 455 | "output_type": "stream", 456 | "text": [ 457 | "Image File Size is 0.8066KB\n", 458 | "Image File Size is 0.8047KB\n", 459 | "Image File Size is 0.2832KB\n" 460 | ] 461 | } 462 | ], 463 | "source": [ 464 | "image.save(\"./temp/image_SAVE_95.jpg\", quality=95) # JPG with high quality\n", 465 | "print_file_size(\"./temp/image_SAVE_95.jpg\")\n", 466 | "\n", 467 | "image.save(\"./temp/image_SAVE_50.jpg\", quality=50) # JPG with high quality\n", 468 | "print_file_size(\"./temp/image_SAVE_50.jpg\")\n", 469 | "\n", 470 | "image.save(\"./temp/image_SAVE.png\") # PNG with lossless compression\n", 471 | "print_file_size(\"./temp/image_SAVE.png\")" 472 | ] 473 | }, 474 | { 475 | "cell_type": "markdown", 476 | "metadata": {}, 477 | "source": [ 478 | "## Save an OpenCV image in different formats" 479 | ] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "execution_count": 37, 484 | "metadata": {}, 485 | "outputs": [ 486 | { 487 | "name": "stdout", 488 | "output_type": "stream", 489 | "text": [ 490 | "Image File Size is 4.6162KB\n", 491 | "Image File Size is 4.6133KB\n", 492 | "Image File Size is 4.6113KB\n", 493 | "Image File Size is 2.3369KB\n", 494 | "Image File Size is 734.1504KB\n", 495 | "Image File Size is 1.4072KB\n" 496 | ] 497 | } 498 | ], 499 | "source": [ 500 | "cv2.imwrite(\"./temp/imagecv_SAVE_100.jpg\", image_rgb, [cv2.IMWRITE_JPEG_QUALITY, 100]) # By default is 95\n", 501 | "# The value can be between 0 to 100, where 100 produces the highest quality and 0 produces the lowest quality.\n", 502 | "print_file_size(\"./temp/imagecv_SAVE_100.jpg\")\n", 503 | "\n", 504 | "cv2.imwrite(\"./temp/imagecv_SAVE_50.jpg\", image_rgb, [cv2.IMWRITE_JPEG_QUALITY, 50])\n", 505 | "print_file_size(\"./temp/imagecv_SAVE_50.jpg\")\n", 506 | "\n", 507 | "cv2.imwrite(\"./temp/imagecv_SAVE_0.jpg\", image_rgb, [cv2.IMWRITE_JPEG_QUALITY, 0])\n", 508 | "print_file_size(\"./temp/imagecv_SAVE_0.jpg\")\n", 509 | "\n", 510 | "cv2.imwrite(\"./temp/imagecv_SAVE.png\", image_rgb) # bydefault, compression is set to 3\n", 511 | "print_file_size(\"./temp/imagecv_SAVE.png\")\n", 512 | "\n", 513 | "cv2.imwrite(\"./temp/imagecv_SAVE_0.png\", image_rgb, [int(cv2.IMWRITE_PNG_COMPRESSION),0]) # bydefault, compression is set to 3\n", 514 | "print_file_size(\"./temp/imagecv_SAVE_0.png\")\n", 515 | "\n", 516 | "cv2.imwrite(\"./temp/imagecv_SAVE_9.png\", image_rgb, [int(cv2.IMWRITE_PNG_COMPRESSION),9])\n", 517 | "# The value can be between 0 to 9, where 9 produces the highest compression with more time to save images into the file.\n", 518 | "print_file_size(\"./temp/imagecv_SAVE_9.png\")" 519 | ] 520 | }, 521 | { 522 | "cell_type": "markdown", 523 | "metadata": {}, 524 | "source": [ 525 | "## EXIF Details\n", 526 | "\n", 527 | "Metadata in images, like camera settings, date, etc." 528 | ] 529 | }, 530 | { 531 | "cell_type": "code", 532 | "execution_count": 38, 533 | "metadata": {}, 534 | "outputs": [], 535 | "source": [ 536 | "from PIL import Image, ExifTags" 537 | ] 538 | }, 539 | { 540 | "cell_type": "code", 541 | "execution_count": 39, 542 | "metadata": {}, 543 | "outputs": [], 544 | "source": [ 545 | "image = Image.open('./data/GP_PXL_20240926_003004774.jpg')\n", 546 | "exif_data = image._getexif()" 547 | ] 548 | }, 549 | { 550 | "cell_type": "code", 551 | "execution_count": 40, 552 | "metadata": {}, 553 | "outputs": [ 554 | { 555 | "name": "stdout", 556 | "output_type": "stream", 557 | "text": [ 558 | "ImageWidth: 2268\n", 559 | "ImageLength: 4032\n", 560 | "GPSInfo: {16: 'M', 17: 268.0}\n", 561 | "ResolutionUnit: 2\n", 562 | "ExifOffset: 244\n", 563 | "Make: Google\n", 564 | "Model: Pixel 4a\n", 565 | "Software: HDR+ 1.0.540104767zdr\n", 566 | "Orientation: 1\n", 567 | "DateTime: 2024:09:26 06:00:04\n", 568 | "YCbCrPositioning: 1\n", 569 | "XResolution: 72.0\n", 570 | "YResolution: 72.0\n", 571 | "ExifVersion: b'0232'\n", 572 | "ComponentsConfiguration: b'\\x01\\x02\\x03\\x00'\n", 573 | "ShutterSpeedValue: 6.64\n", 574 | "DateTimeOriginal: 2024:09:26 06:00:04\n", 575 | "DateTimeDigitized: 2024:09:26 06:00:04\n", 576 | "ApertureValue: 1.58\n", 577 | "BrightnessValue: 2.35\n", 578 | "ExposureBiasValue: 0.0\n", 579 | "MaxApertureValue: 1.58\n", 580 | "SubjectDistance: 4294967295.0\n", 581 | "MeteringMode: 2\n", 582 | "Flash: 16\n", 583 | "FocalLength: 4.38\n", 584 | "ColorSpace: 1\n", 585 | "ExifImageWidth: 2268\n", 586 | "SceneCaptureType: 0\n", 587 | "OffsetTime: +05:30\n", 588 | "OffsetTimeOriginal: +05:30\n", 589 | "OffsetTimeDigitized: +05:30\n", 590 | "SubsecTime: 774\n", 591 | "SubsecTimeOriginal: 774\n", 592 | "SubsecTimeDigitized: 774\n", 593 | "ExifImageHeight: 4032\n", 594 | "SensingMethod: 2\n", 595 | "ExposureTime: 0.010013\n", 596 | "ExifInteroperabilityOffset: 949\n", 597 | "FNumber: 1.73\n", 598 | "SceneType: b'\\x01'\n", 599 | "ExposureProgram: 2\n", 600 | "CustomRendered: 1\n", 601 | "ISOSpeedRatings: 183\n", 602 | "ExposureMode: 0\n", 603 | "FlashPixVersion: b'0100'\n", 604 | "WhiteBalance: 0\n", 605 | "LensMake: Google\n", 606 | "LensModel: Pixel 4a back camera 4.38mm f/1.73\n", 607 | "DigitalZoomRatio: 0.0\n", 608 | "FocalLengthIn35mmFilm: 27\n", 609 | "Contrast: 0\n", 610 | "Saturation: 0\n", 611 | "Sharpness: 0\n", 612 | "SubjectDistanceRange: 3\n", 613 | "CompositeImage: 3\n" 614 | ] 615 | } 616 | ], 617 | "source": [ 618 | "# Pillow doesn't provide a built-in way to directly modify EXIF data.\n", 619 | "\n", 620 | "for tag, value in exif_data.items():\n", 621 | " tag_name = ExifTags.TAGS.get(tag, tag)\n", 622 | " print(f\"{tag_name}: {value}\")" 623 | ] 624 | }, 625 | { 626 | "cell_type": "markdown", 627 | "metadata": {}, 628 | "source": [ 629 | "The 8 EXIF orientation values are numbered 1 to 8.\n", 630 | "\n", 631 | "- 1 = 0 degrees: the correct orientation, no adjustment is required.\n", 632 | "- 2 = 0 degrees, mirrored: image has been flipped back-to-front.\n", 633 | "- 3 = 180 degrees: image is upside down.\n", 634 | "- 4 = 180 degrees, mirrored: image has been flipped back-to-front and is upside down.\n", 635 | "- 5 = 90 degrees: image has been flipped back-to-front and is on its side.\n", 636 | "- 6 = 90 degrees, mirrored: image is on its side.\n", 637 | "- 7 = 270 degrees: image has been flipped back-to-front and is on its far side.\n", 638 | "- 8 = 270 degrees, mirrored: image is on its far side." 639 | ] 640 | }, 641 | { 642 | "cell_type": "code", 643 | "execution_count": 41, 644 | "metadata": {}, 645 | "outputs": [ 646 | { 647 | "name": "stdout", 648 | "output_type": "stream", 649 | "text": [ 650 | "{'0th': {256: 2268, 257: 4032, 271: b'Google', 272: b'Pixel 4a', 274: 1, 282: (72, 1), 283: (72, 1), 296: 2, 305: b'HDR+ 1.0.540104767zdr', 306: b'2024:09:26 06:00:04', 531: 1, 34665: 244, 34853: 979}, 'Exif': {33434: (10013, 1000000), 33437: (173, 100), 34850: 2, 34855: 183, 36864: b'0232', 36867: b'2024:09:26 06:00:04', 36868: b'2024:09:26 06:00:04', 36880: b'+05:30', 36881: b'+05:30', 36882: b'+05:30', 37121: b'\\x01\\x02\\x03\\x00', 37377: (664, 100), 37378: (158, 100), 37379: (235, 100), 37380: (0, 6), 37381: (158, 100), 37382: (4294967295, 1), 37383: 2, 37385: 16, 37386: (4380, 1000), 37520: b'774', 37521: b'774', 37522: b'774', 40960: b'0100', 40961: 1, 40962: 2268, 40963: 4032, 40965: 949, 41495: 2, 41729: b'\\x01', 41985: 1, 41986: 0, 41987: 0, 41988: (0, 1), 41989: 27, 41990: 0, 41992: 0, 41993: 0, 41994: 0, 41996: 3, 42035: b'Google', 42036: b'Pixel 4a back camera 4.38mm f/1.73'}, 'GPS': {16: b'M', 17: (268, 1)}, 'Interop': {1: b'R98'}, '1st': {256: 283, 257: 504, 259: 6, 274: 1, 282: (72, 1), 283: (72, 1), 296: 2, 513: 1147, 514: 17898}, 'thumbnail': b'\\xff\\xd8\\xff\\xe0\\x00\\x10JFIF\\x00\\x01\\x02\\x00\\x00\\x01\\x00\\x01\\x00\\x00\\xff\\xdb\\x00C\\x00\\r\\x10\\x14\\n\\x1c\\x05\\x03\\x17\\x18\\x04\\x04\\x13\\x17\\x13\\x06\\x0e\\x12\\x17\\x17\\x12\\x11\"\\x1f\\x18\\x19\\x1a\\x1e#,(%%#$\\'\\'&*-,*.35208/&(8987<@<.4@7877\\xff\\xdb\\x00C\\x01\\x0e\\x0e\\x0e\\x1d\\x16\\x18&\\x1d\\x1f\\'8-(,;89988:::989:;><;:;<<>==>>>>>=>>>>>?>>>?>>\\xff\\xc0\\x00\\x11\\x08\\x01\\xf8\\x01\\x1b\\x03\\x01\"\\x00\\x02\\x11\\x01\\x03\\x11\\x01\\xff\\xc4\\x00\\x1f\\x00\\x00\\x01\\x05\\x01\\x01\\x01\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\xff\\xc4\\x00\\xb5\\x10\\x00\\x02\\x01\\x03\\x03\\x02\\x04\\x03\\x05\\x05\\x04\\x04\\x00\\x00\\x01}\\x01\\x02\\x03\\x00\\x04\\x11\\x05\\x12!1A\\x06\\x13Qa\\x07\"q\\x142\\x81\\x91\\xa1\\x08#B\\xb1\\xc1\\x15R\\xd1\\xf0$3br\\x82\\t\\n\\x16\\x17\\x18\\x19\\x1a%&\\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xff\\xc4\\x00\\x1f\\x01\\x00\\x03\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\xff\\xc4\\x00\\xb5\\x11\\x00\\x02\\x01\\x02\\x04\\x04\\x03\\x04\\x07\\x05\\x04\\x04\\x00\\x01\\x02w\\x00\\x01\\x02\\x03\\x11\\x04\\x05!1\\x06\\x12AQ\\x07aq\\x13\"2\\x81\\x08\\x14B\\x91\\xa1\\xb1\\xc1\\t#3R\\xf0\\x15br\\xd1\\n\\x16$4\\xe1%\\xf1\\x17\\x18\\x19\\x1a&\\'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xff\\xda\\x00\\x0c\\x03\\x01\\x00\\x02\\x11\\x03\\x11\\x00?\\x00\\x9e\\x8a^\\xd4z\\xf1^\\x99\\xc4%\\x14\\xb4\\xbd\\xa8\\x10\\x9d\\xa8\\xa5\\xa2\\x90\\xc4\\xa2\\x96\\x8a\\x06\\x1d\\xa9h\\xa5\\xed@\\x82\\x8a^\\xd4\\xb4\\x00\\x83\\xa1\\xfa\\xd2\\xd2\\xf6\\xa5\\xa0\\x04\\xa5\\xa5\\xedK\\xda\\x80\\x13\\x1cR\\xd1\\xebK\\xda\\x80\\x1b\\x8aLS\\xe9q@\\x0c\\xc5.)\\xdcQ@\\r\\xa4=G\\xd2\\x9cz\\x8f\\xa5%\\x007\\x1e\\xd4c\\xe54\\xfaC\\xd0\\xd2\\x19\\t\\x1dj\\x12*\\xc1\\xa8H\\xeb@\\xc8\\x08\\xfb\\xdcTdsS\\x1e\\xb4\\xdcs@\\x11c\\x9e\\x94b\\xa4\\xc5\\x18\\xf6\\xa0Dx\\xf6\\xa3\\x14\\xfcRb\\x90\\xc6\\xd1N\\xa2\\x80-\\xd1KEQ!\\xda\\x8a(\\xa0AE-\\x14\\x0c(\\xa5\\xedK\\xda\\x80\\x13\\xb5/j;\\xd1\\xda\\x80\\x16\\x8a){\\x1a\\x00\\x07C\\xf5\\xa7v\\xa6\\xf6\\xa7v\\xa0\\x05\\xedK\\xf8Rv\\xa5\\xa0\\x02\\x97\\xb5%/j\\x00){RR\\xf6\\xa0\\x02\\x90\\xf5\\x1fJZ1@\\r\\xa5\\xedK\\x8a?\\nC\\x12\\x90\\xf44\\xea\\x0fC@\\x10\\x9e\\xf5\\x11\\xefS\\x11\\xc1\\xa6c\\x83@\\x10`\\xe7\\xa57\\x1e\\xd5.9\\xe9HG#\\xe9Hdx\\xa4\\xc5>\\x90\\xf44\\x00\\xc3\\x8c\\x8f\\xa57\\xbd/sI\\xde\\x80\\x10\\xf5\\x1fJJu\\x18\\xa0\\x0btR\\xfe\\x14U\\x12%\\x14\\xb4P\\x02b\\x96\\x8a^\\xd4\\x00\\x0e\\x87\\xebKE\\x14\\x00QK\\xda\\x8a\\x00;R\\xd1K\\xda\\x80\\x0e\\xd4\\xbd\\xa8\\xeciGJ\\x00\\x07C\\xf5\\xa5\\xa5\\xedE\\x00\\x1d\\xa8\\xa5\\xa2\\x80\\x0cQK\\xda\\x96\\x80\\x13\\xb5\\x14\\xb4P\\x02Rw\\xa7\\xf6\\xa4\\xfc)\\x0cm!\\xea>\\x94\\xfc{Rb\\x80#\\xefHG\\x1d*B9\\x1fJi\\x1c\\x8e(\\x02\\x1cpx\\xefL\\xeejr*3\\xfcT\\x01\\x11\\xea)\\xa6\\x9cz\\xd3OU\\xa423\\xd6\\x8aq\\xebJ\\x07\\r\\xc7z\\x00n(\\xc5?\\xd3\\x8a?\\n\\x00\\x96\\x8am(\\xe8~\\xb5D\\x8bK\\xda\\x8e\\xd4\\xb4\\x00\\x94\\xb4R\\xf6\\xa0\\x04\\xa5\\xedKE\\x00%/\\xe1K\\xda\\x96\\x80\\x12\\x97\\xb5\\x14\\xb4\\x00R\\xf6\\xa3\\xb5/j\\x00;R\\xd1K\\xda\\x80\\x0e\\xd4\\xb4R\\xf6\\xa0\\x03\\xb5\\x14R\\xf6\\xa4\\x02R\\xf6\\xa5\\xfc(\\xa0bQKG\\xe1@\\r\\xefE;\\x14P\\x031\\xd2\\x90\\xf5\\xa7w\\xa4#\\x91\\xf4\\xa0\\x06\\x1e\\x95\\x11\\x1djc\\xd0\\xd4\\'\\xbd\\x00Dz\\xd3H\\xe4q\\xda\\x9f\\x8e\\xb4\\x84\\x1c\\x8f\\xa5 #\\xc5(\\x1c\\x1f\\xad.\\x0e\\xe1\\xf4\\xa9\\x00\\xe4q\\xda\\x81\\x8c\\xc5\\x18\\xa9\\xb6\\xfbQ\\xb7\\xda\\x80!\\xa5\\xa2\\x97\\xb5Q :\\x1f\\xad:\\x9bJ:\\x1f\\xad\\x00;\\xb5\\x14v\\xa5\\xa0\\x02\\x97\\xb5%(\\xe8~\\xb4\\x00\\xbd\\xa9h\\xa5\\xed@\\x07j^\\xd4v\\xa5\\xa0\\x04\\xa5\\xa2\\x97\\xb5 \\x0e\\xd4\\xa3\\xa1\\xfa\\xd0:\\x1f\\xad;\\xb5\\x00%/jZ(\\x18R\\xf6\\xa3\\xb5/j\\x00JN\\xf4\\xecRb\\x80\\n^\\xd4v\\xa5\\x1d\\x0f\\xd6\\x80\\x12\\x8e\\xfd)\\xdf\\x85\\x1f\\x85\\x00G\\xf8Rc\\xda\\xa4\\xc7\\xb5\\x18\\xa0\\x08\\x88\\xe2\\xa2#\\xe6\\xed\\x003\\x03\\x8e)G^\\x94\\xe3J\\x01\\xc0\\xe9\\xd2\\x80\"8\\xcbq\\xda\\xab\\xb3\\x80\\xc7\\x8e\\xd5$\\x87\\x01\\xf9\\xefY\\xcc\\xc7\\xcdn{\\xd0\\x05\\x9d\\xc7uH2H\\xa8#\\x1f{\\xe9V\\xd4t\\xe0t\\xa0\\x00\\x0e\\x07\\x1d\\xeaQ\\xd0qI\\xdf\\xb5?\\x03=h\\x00\\xe2\\x8e7\\x0eEG:H\\xdav\\xaa\\xa9~cf\\xb7`\\xae\\x07*}{t\\xfa\\xd7\\r,\\x1e(\\xb7\\xf3Jk\\x1a\\xac\\x8a9&7\\'\\x1fU<\\xfeY\\xfa\\xd4\\xb7b\\x94nw\\xe4\\xf4\\xe9\\xd2\\xa2\\xee\\xf5\\xcfi\\x97\\xd2\\xb5\\x81\\xfbV\\xa7h\\x8ef\\xc2\\x07M\\x84\\xaf\\xaep\\x01\\xfc9\\xad\\xf0\\xcb\\x81\\xca\\x9c\\x8c\\xe6\\x98\\x9a\\xb0\\xec\\xff\\x00\\xb5\\xda\\x8c\\xff\\x00\\xb7Q\\x93\\x96<\\x8aM\\xbc\\x9f\\x9a\\x81\\x18\\xe0\\xf0i\\xd9\\x15\\x1d-X\\x87\\xf1\\xcdDH\\xf9\\xa9y\\xe2\\x90\\x8e(\\x19\\t\\xfb\\xc2\\x93\\xf1\\xa7\\x91\\xc3T]\\xe9\\x00\\xf0j\\xccd|\\xbc\\xd5A\\x9c\\xd4\\xa0\\x9fZ\\x00\\xd3\\r\\xc2\\x8ak\\x0eZ\\xaa\\xa3\\x1d\\xcb\\xcd[\\x04\\xed\\x1c\\xd0\\x04$\\x1aN~Z\\x9f\\xe4\\xdc\\x06)\\x1c(A\\xc5\\x00A\\xbb\\x9e\\xb4\\xa1\\x86z\\x8a\\x81\\x88\\xf3\\x0f4\\xdd\\xdd9\\xa0\\x0b\\xc0\\xf4\\xe4S\\xf8\\xdc\\xbf0\\xe9U\\x15\\xc6>\\xf5!~:\\xf7\\xa0\\r%\\xc7\\x1c\\xadX\\x1bq\\xf7\\xc5e\\xc6\\xc3+\\x92js#\\x15\\x1f9\\xa0\\x0b\\xe1\\xe2\\xe4\\x06\\xfa\\xd4-)\\xf3\\x00T_\\xaf\\xb5U\\x0c\\xa1\\x06_\\xbdD\\xd2.[\\xe5\\xa2\\xc0ho;S\\x95\\xebN\\x12\\x0f\\x98l\\xe6\\xb1\\x0c\\x8f\\x93\\xfb\\xd3\\xd6\\xac\\xc6\\xed\\xe5\\x13\\xe6\\x9e\\x94X\\r\\x00\\xee\\x19\\xfa\\xd4\\xa1\\xf2\\x8d\\x84\\xedY\\xe2S\\x821\\xd7\\x8a\\xb1\\x19\"\\'\\xe9\\xd6\\x95\\x80\\xaf37\\xcf\\xf3ul\\xd5`z\\xe4\\xd5\\xc9\\x07\\xc8\\xc7`\\xaa?\\xdf\\xf9\\xa8\\x02\\xc2\\xb1\\x00\\xf3V\\x91\\xce:\\x0e\\xb5A1\\xbb\\xadZC\\xfb\\xc4\\xf9\\x850/\\x802\\x0f\\x9c:R1\\x1c\\xf0zTY;~\\xf0\\xa4\\x04\\xee\\xeb\\xde\\x90\\x12)m\\x83$\\xf5\\xa61\\xe7\\xafzR\\xc3l\\x9f0\\xaa\\x8c\\xe3/\\xf3/Z\\x00s\\x88\\xda\\x19\\x03C\\x03/p\\xc3 \\xfds\\xc5g\\x9b{`\\xceb\\xbc\\xd4\\xad\\xces\\xfb\\x97\\xc2\\xff\\x00\\xdf\\x07+\\xff\\x00\\x8e\\xfe4\\xf6q\\xb8\\xf3Q\\x86%\\xbe\\xf5\\x001\\xe6\\xd5b\\x8aF\\xfb>\\x9ft\\xa0d\\xed_.L}9\\x07\\xf2Z\\xa5\\xfd\\xb3i\\x93\\xff\\x00\\x12Mw\\xf2\\xad\\x91\\x92\\x87\\x91\\xd3\\xf5\\xaeF\\xfa\\x15>\"\\xd7\\xc8\\xd3\\xadH.\\xbf\\xc1\\xec*Z)5\\xd4\\xe8\\x89\\xe4r:P\\x0f5\\x16isVI>x\\xa8\\xfb\\xd3Cp~\\xb4n\\xa0\\x00\\xe7\\xf4\\xa6z\\xf1O\\xc8\\xa4\\xa0\\x04\\xfc)GC\\xf5\\xa2\\x8e=\\xa8\\x01\\xe1\\xb1\\xdf\\xbdN\\xaey\\xe4U_Zr\\xf5\\x1c\\xd0\\x05\\xf58u\\xce\\xda%u)\\xc6*\\xbe~\\xef4\\xd3@\\x107\\xdej\\x8b\\x9ey5c\\x03\\x06\\x99\\x8e\\xb4\\x01\\x18\\xce\\x7f\\x8a\\xa5\\x19\\xc8\\xeb@\\x1f7J\\x93\\x1d\\xf1\\xde\\x80\\x13<\\x8f\\xa5?w+\\xcfj\\x8c\\x9f\\x98qM\\'\\x8f\\xc6\\x98\\x0ff\\xe4\\xf3Q\\x13\\xc1\\xe6\\x93\\xb9\\xa0\\x0eE\\x004g5a\\t\\xfe\\xf53\\x1d*`?wH\\tr\\xbc\\x1d\\xe6\\xa5\\x12\\r\\x9c\\x13T\\xfb\\x1e{\\xd2\\xf7J\\x00\\xb8]\\x8c\\x07\\x9e\\xd5Pg2R\\x96\\xe2\\xa3\\xdd\\xc1\\xe6\\x80$\\xc9\\xdd\\xd6\\xa5V\\xf9\\x97\\x9a\\xa7\\x93\\xbb\\xadH\\t\\xdc9\\xa0\\r\\x15|\\x91\\xcd9\\x98\\x88\\xdc\\xe4\\xd5tS\\x8c\\xf1S\\x12<\\x9c\\x1d\\xbd)\\x01X\\xc8\\xc5\\x9b\\xadB\\xd9\\xc9\\xebSm\\xe5\\xb8\\xefM+\\xc7J\\x00\\xa2\\xc4\\xe5\\xba\\xf5\\xa5\\x0f\\xca\\xd3\\x9dy\\xa2\\xa6\\xdf\\xe4\\xd2n7\\x7f\\xb6F\\xdf\\xd0\\xe6\\x93\\x9aEr\\xb6n\\x01\\xca\\xf3N#\\xa7=\\xab\\x9b:\\x8d\\xe6\\xc8\\xb1\\xa7\\xe9\\xa3\\x1c\\xe4\\xe4\\x8f\\xe6?\\x9dVk\\xbdA\\xb7\\x7f\\xc4\\xd2A\\xcfD@?\\xcf\\xe7S\\xed\\x10\\xd4\\x19\\xd6\\xf1\\x83\\xc8\\xaa\\x93\\xdeYG\\x03\\x03\\xa8F\\xc4\\xe4b2\\x0b\\x0e;\\xe3\\x81\\xf8\\xd7&\\xc6v\\xdcZ\\xee\\xed\\xf9\\xfe&\\xcf\\xf55\\x17\\xca3\\xfb\\xd8\\x17\\x8e\\xe6\\xa5\\xd4\\xf2\\x1f\\xb3;\\xa8\\xa5\\x81\\xe0\\x0c\\x97(\\xc0\\xfey\\xf7\\x1d\\xa9\\xe7\\xa1\\xe4W\\x13\\x1b\\xca\\x8dn\\xe9v\\xcaB\\xf5\\x1c\\x83\\xecEtV\\x97-$Z\\x86m\\xc2\\xb2\\xed$\\x8f\\xbaA\\xf6\\xedU\\x19\\xdc\\x99F\\xc6\\x8e~V\\xfa\\xd33\\xcd4\\x9eO4\\x95d\\x8f\\x1djU\\xce\\xe4\\xa8W\\x1b\\x80\\xad(c\\x04/N\\x94\\x86*\\xe7o~\\x94\\xe0\\x0eOZ\\xb5\\xe5\\x9c\\x81\\x8a\\xb0\\xb1\\x1c\\xaf\\x1f\\xc3J\\xe0g\\x10w\\x0e;SO\\xdd<\\n\\xd1t\\xc1\\x1f-fH\\x1b|\\xdf!\\xe1\\xb1J\\xe0D@%\\xb8\\x14\\x98@\\xb2\\x13$@\\x05\\xe4\\x9cqM\\xf9\\xb77\\x06\\xab\\xdd\\xba&\\x91v[Q\\xf2\\xc60~\\\\\\x93\\xc7A\\xef\\xe9C\\x02\\xbc\\xf7\\xfaj@O\\xf6\\x8c/\\xce\\x00\\x8c\\x82O\\xeb\\xfd+\\x05\\xb5IL\\xd3\\x91\\xa6\\xa8\\x05\\xb8\\x05\\x86\\x7f\\xf4\\x1a\\xc2p\\xefz\\x02\\xda\\xb9$t\\x1c\\xe3\\xea}jQk\\x7f\\xb5\\x7f\\xe2\\x9e\\xd4\\x0f\\xbe\\xda\\xc6Ud\\xf66\\x8c\\x12\\xdc\\xf4 9\\xa9\\x95F\\rF\\x0f\\xcb\\xf8\\xd3\\x8185\\xd0b<\\xaf^;\\xd4{NO\\xcbR\\xabsO\\xdd\\xc1\\xe0P\\x05m\\xa7\\xfb\\xb4m>\\x95l\\x11\\xb4\\xf0)\\x99\\x19=(\\x02\\xb6\\xd3\\xe9F\\xd3\\xcf\\x15g\\x8cv\\xa7\\xa8]\\xc3\\xa5\\x00T\\ny\\xf9{Q\\xb1\\xb0x\\xad@\\x8b\\xe8*_-q\\xde\\x8b\\x81\\x87\\xb1\\xb9\\xf9M8F\\xfcpz\\xd6\\xc1\\x8e,\\x8e;R|\\x98 \\xf5\\xa5p0\\xees\\x1e\\x95\\xaa\\xb8\\x89IX\\xb2\\x01\\xce9\\xe2\\xb9\\x86\\xbb\\xd4\\x1ah\\x0f\\xda\\xad\\x93\\x92p\\x83\\xf9\\xe4Wkw\\n\\xc9\\xa4\\xeb1\\x89\\xc2\\x16\\x8f\\x19\\xc6\\x7fN?\\x9dp\\x97V\\x97\\xf1\\x15&k\"\\x86B\\xbb\\x93\\x9c\\xe7\\xd8\\xf3Q6\\xcb\\x8a\\x06\\x9e\\xf9\\xb7g\\\\\\xd4\\x8f=\\x15\\xb0?!U\\xc8\\xe4\\x92\\xc9\\xd7\\xb9\\xe6\\xaa?\\x9b\\x99\\x7f\\xd2g \\x1cu\\xa4E\\x90\\xc8B\\xd9\\xdc3z($\\xfeU\\x8f35\\xb2-\\x17\\x84+\\xff\\x00\\xa4\\xa1\\xfaT~d|b9\\xeat\\xb3\\xd4\\xce1\\xa0^\\xf2?\\x88m\\xfed\\x7f:\\xb9\\x1e\\x99\\xa8\\x1cf]1>\\xad\\x93\\xfa\\x7f\\x8d\\x1a\\xf6\\x0b\\xa3,\\xc9\\xc3b\\xde1Q\\x16\\x97\\xe6\\xfd\\xf0\\x1c\\x1e\\x82\\xbaT\\xd2O\\xf1k\\xf2\\x9fe\\x8f\\x1f\\xa9\\'\\xf9U\\xb4\\xd3t\\xdd\\xc9\\x98\\xf5\\x17\\xe9\\xf7\\x9f\\xfa\\x00)\\xf21s\\xa3\\x91d\\x7f \\x93wpx\\x1d\\xea\\xb8\\r\\x98\\xff\\x00v\\xc7\\'\\x1crkRP\\xa2}P\\x04P\\x05\\xc3\\x80=\\x005\\x04C\\xfe&\\xfe\\x1e\\xe3\\xfe_b\\xff\\x00\\xd0\\x85KHw\\x1f\\x1d\\xb6\\xa4q\\xb7G\\xd4\\xc7\\xfb\\xc0\\x80\\x7f\\xef\\xa3\\x8a\\xde\\xb1\\x8a\\xe5\\x1bR2[@\\xbb\\xa3P\\x00`\\x7f\\x95l\\x91\\xf7\\xb8\\xeei\\x98<\\xf1]\\x11\\xa6\\xa2e)\\\\a\\xceOZ\\x07\\xf5\\xa7\\xed?\\xdd4\\xe5C\\xbb\\xa1\\xab r\\x8f\\xb9\\xcdj@\\xaf\\x84\\xc4\\xdd\\xbaUX\\xd3\\x80N+V\\x13\\x00D$\\xc9Sq\\x96P0X\\xf2;\\xd5\\xd5+\\xe5\\xf4\\xaa\\xc5\\x81\\x82c\\xe6\\x0cc\\xbdD\\xae\\xc1\\xd7\\xb8\\xa9`\\\\\\x91\\x01\\xb7b1\\xc5e4R\\xfc\\xff\\x00\\xe8\\xd5\\xaa$V\\x8eO\\x93o\\x1dj\\'`\"`\\xa9!\\xe3\\x93I\\x0c\\xccd\\x8cB\\x0e\\xd1\\x9cV-\\xdcQK\\r\\xc2\\x95P|\\xa6\\n\\xdc\\xf0O\\xf8\\xff\\x00J\\xd5\\x98\\xb3\\x12G\\x99\\xd6\\xaa\\x04 \\xb6CU\\xa4+\\x9c\\xeczq[\\xdd(\\x8dB-\\xa3\\x1b\\x86\\x0eOO\\xe6:\\xf6\\xfd*ir.\\xeeA\\xf1\\xbf\\x86\\xd4\\x8c\\x02\\xadn\\xa4\\x8e:}=3\\xce+o\\x8c\\xf6\\xeb\\xf8~5\\x8f,wf\\xf2\\xf4\\x8dz\\xf5F\\xfe\\x8b\\x06@\\xfaQ\\xca\\x83\\x99\\x97\\xc1\\xe0\\xfdi\\xc3\\xa8\\xa8\\x01\\xe6\\xa5\\x07\\xa5P\\x89\\x87QRzT \\xf2)\\xf9\\xf9E\\x00?\\x8d\\xa7\\x9a\\x8c\\x9fzny<\\xd2\\x7f\\x10\\xe7\\xb5\\x00J3\\x81V\\x10\\xe3\\x1cUu\\xeb\\xd6\\xa4\\xc8\\ny\\xa0\\r\\x04#\\x03\\x8as\\x11\\x95\\xe6\\xa8\\xac\\xbf#t\\xa6\\x19N\\xe7\\xf9\\xa9\\x01y\\x8f\\xc9\\xf7\\xea!\\x9c\\xfd\\xe3T<\\xc6\\xc9\\xf9\\xcd8HF~j,\\x05\\xa68\\x0f\\x93\\xda\\xb0ul\\x7f`Zt\\xe7QO\\xe4kH\\xb9.\\xa75\\x93\\xab0\\xfe\\xc2\\xd29\\xff\\x00\\x98\\xa2\\x7f\\xe8-D\\x96\\x83[\\x9c\\x99\\x00\\xb4\\x9cw\\xad\\xfd\\x19\\x01\\xbe\\xf1/\\x1f\\xf2\\xec\\x9f\\xce\\xb0\\xf20y\\xeek\\xa5\\xd0\\xb6}\\xa7\\xc5\\xd9\\x91\\x7f\\xd4\\xc5\\xfc\\xcda\\x1d\\xcd\\xa7\\xb1\\xbb\\xb7\\xf7\\x87\\x91JA\\n\\x0e\\x07ZV\\xdb\\xe7\\xe48\\xedVcFa\\xd0\\xf4\\xad\\x99\\x89[\\x93\\x18\\xe2\\xa2\\x18\\xf3W\\xeb[+\\x14b\\xdeO\\xdd\\x83\\xf2\\xf4\\xaa\\x8e\\x8a\\x1a3\\xf2z\\xd2\\xb8X\\xf3IH\\xfbn\\xab\\xcf\\xfc\\xbd?\\xf3\\xa7B\\xbf\\xf17\\xf0\\xc7_\\xf9\\t\\xc1\\xff\\x00\\xa1\\nG\\x03\\xed\\x97\\\\\\x0en\\x1f\\xf9\\xd4\\xb0/\\xfcO<\\'\\xc7\\xfc\\xc5 \\xff\\x00\\xd0\\x85b\\xb76;\\xd1\\x1c_\\xba\\xcb\\x9e\\x83\\x8ay\\x8e>~Q\\xd2\\xa4\\x8c\\x12[\\x91\\xd2\\x95\\x80\\xdc\\x06\\x063\\x8a\\xdc\\xc4\\x85P\\x16lG\\x9e}*\\xd2\\xc2\\x9c|\\x8d\\xd2\\xa4\\x8c\\xa2\\x18p\\x81\\x89\\xcf^\\x95\\x0c\\t\\xc1\\xc8\\xe2\\xa5\\xb1\\x91\\xf9)\\xb3;\\x8eE?d\"\\x19\\x7fxr;S\\xf7\\xe4c*3/&\\x98\\xea|\\xb6>a\\x00\\xd1p\\xb1U\\xe5\\x8dC}\\xe6\\xe7\\xa50\\\\\\xc4F<\\x84\\x06\\xa0\\x99P#|\\xecI9\\xac\\xf6\\r\\xbe>\\xbf{\\x15I\\x12n\\x0b\\x90\\x02\\x0f\\x93\\x8ejf\\xb8\\x06%\\xf9\\xa1\\xe9\\xe9\\\\\\xd0-\\x97\\xeb\\xd4\\x7f*Ie\\xbbXm\\x84zg\\x98X\\x9e\\xa7\\n\\xb8\\x19$\\xf1\\xdf\\xa7Z-`6\\x99\\xd0\\x96\\xf9\\xc7^\\xd5Zi\\xad\\xd2\\xda\\xf1\\x9ax\\x8a\\xaa\\x1e\\xe0\\x1f\\xc3\\x9e\\xb5\\xcd\\xc8\\xbe${\\x9b<\\xdc\\xe9\\xd0\\xa8\\x94\\xa9\\xd8\\xc7$\\x13\\xdcg\\x93\\x8e\\x9f\\xe4\\xd0l\"\\xfb\\n\\xb4\\xba\\xf4j\\xe2\\'-\"\\x80\\x17ny\\xe0\\xf4\\xeb\\xcf\\xd2\\xa5\\xcb\\xc8\\xa5\\x11\\x1fU\\xb71\\xbf\\x97\\xa5\\xdf\\x16(v\\x87\\xc0\\x07\\xeb\\xcf\\xf25\\x8c\\xda\\x96\\xa8f\\x9b\\xfe&\\xbb9\\xfb\\xab\\x1a\\x90?0O\\xebQ\\xbcVf;\\xacx\\xa3L\\x1eY*\\xb9C\\x99\\x00\\xe8x\\x07\\x19\\xfaUU1\\x88\\xd0\\x7fg\\xc0}\\xfc\\xc5\\xfe\\xb8\\xac\\\\\\x99\\xaa\\x8a;\\xb0\\x1b\\xfb\\xc8jQ\\xb7#\\x83\\xf8\\xd6LW\\xf6l\\xc8\\x1ai\">\\x92p?>\\x95\\xa8\\xad\\x19\\x8d0\\xc8A\\x1dA\\xe0\\xd7Jw\\xeaaf\\x89\\x860y\\x14\\x87\\xef\\x0e;S{\\x0c\\x17\\xa5\\x07\\xaf\\x02\\x98\\tJ3\\x83\\xcd0\\xbc_jE\\xfbE\\xbe\\xe2\\x84\\xed-\\xce>\\x94\\xbc\\xfa\\x9a\\x00\\x90}{R\\x16\\xeb\\xcdD]C\\x853\\xc2\\t\\x19\\xc1<\\xd3pr\\xdfZ\\x04<\\xb7\\x07\\x9a\\x8fw=h\\xda\\xc7\\xb1\\xa4\\xd8\\xc3\\x1c\\x1a\\x00M\\xde\\xf4\\xbb\\x8f\\xad!S\\x9e\\x86\\x80\\xad\\x9e\\x86\\x98\\x0fV\\xeb\\xcfz\\xcd\\xd50t\\xad\\x1b\\xe6^/s\\xfa\\x1a\\xd3\\nx\\xe2\\xb2uPE\\x9e\\x83\\xff\\x00_\\x06\\xa6{\\x15\\x1d\\xcc<)U\\xe4V\\xde\\x90\\x0f\\x9d\\xe3\\x0cg\\xfd\\\\_\\xfb5`\\x8c\\xf9k]\\x16\\x8f\\x9cx\\xbb\\xfe\\xd8\\x0f\\xfd\\n\\xb1\\x81\\xac\\xf66\\xfe}\\xe7\\xafSZp\\x12!\\xfb\\xdd\\xaa\\xb0PB\\x92\\xe7\\x9a\\xb4\\xbc)\\x02<\\x92\\xbd1Z\\\\\\xcc\\x9d\\xe4\\x1b\\x1co\\x19#\\x1dk1\\xcf\\xefy\\x9b<\\xd2\\xcb\\x1c\\xde`\\xcb\\x8eA8\\xa4\\x11\\xb7\\xee\\xb2\\x13\\xa84\\x80\\xf3\\xc1\\xff\\x00\\x1fRr\\x7f\\xd6\\xb5Z\\xb7\\xff\\x00\\x90\\xff\\x00\\x84\\xbf\\xec\\'\\x07\\xfe\\x84*\\xa2\\xe7\\xcc\\x8f\\xe6?x\\xd5\\xab`\\x7f\\xb7\\xbc-\\xc8\\xc7\\xf6\\x9c?\\xfa\\x10\\xac\\xd1\\xa3;\\xa7\\x92\\x18\\xf6\\x195;8\\xc7\\x94\\xc7\\xe6>\\xe3\\xa0\\x1c\\x9ao\\xdb4\\x80\\x96\\xd9\\xf1.\\x9a~U<\\x1c\\x9f\\xcb\\x1cW7\\xaa%\\xd3j)\"\\xe9\\x97.\\xbff\\nJ`\\x91\\x82z\\x8e\\xb8\\xaet\\xc8\\xc0\\x0f\\xf422N2\\xdf\\xd2\\xa9\\xc8\\x98\\xc4\\xf4\\x17\\xd54\\x8f2\\xdc\\x07\\xbbp3\\x96\\x08q\\xd0\\xf1\\xce*\\x19\\xb5\\x8bpm\\xbc\\xad\\x06\\xf5\\xc8s\\x9f0\\x85\\\\~\\x05\\xbfZ\\xe2\\x10_2FS@\\xd4\\xd8z\\x84b\\x0f\\xe5\\xc5ZK}i\\x8f\\x1e\\x1e\\xb9\\x07\\xdc\\x01\\xff\\x00\\xa1\\x1cR\\xe6\\x1f)\\xd0>\\xb1u\\xf6\\xcb\\xa24=?f\\xdc\\x81\\xb8\\xef\\xed\\xd4\\xf3\\xfa\\n\\x8d\\xf5}Kc\\xaa\\xe9\\xfa\"\\x03\\xbb\\x92\\xa4\\x9f\\xcf?\\xd2\\xb3\\x17N\\xd7\\t\\x19\\xb4\\xb6_\\xab\\x8f\\xe9\\x9a\\xb1\\xfd\\x91\\xa9m;\\xb5\\x8d1x\\xcf\\xcaX\\xfe\\x98\\x14\\xae;\"\\xb3\\xde\\xea\\xc5H\\xfe\\xd9=s\\xf7G\\xe9\\x91\\x9a\\xa0\\xd2\\xdc\\x1b\\xc8]\\xb5\\x8b\\x82\\xc3\\x18m\\xd8#\\xe9\\x8f\\xe9M\\xb8\\x83\\xcb\\xbc\\xd5\\xa33+\\x14\\x94\\r\\xc0{f\\xb5\\xb4\\xed6\\xdem\\x1eI\\x1e\\xf3S\\x07\\xedL\\xb8B\\x00\\xc0\\x03\\xdb4]\\x8e\\xc8\\xd1\\xd3\\xa7\\x96I5\\x18\\x9d#$C\\xbc?By\\x03\\x91\\xeb\\xcdk\\x04l\\x9c2\\x8e*\\x08\\xad\\xb4\\xcbX\\xdaO:\\xf0n]\\xb8,Y\\x9b\\xbe\\x00\\x15BMW\\x1a\\x8b\\xa4^\\r\\x95\\x8e$\\xe2F\\xf9\\x8e\\x0f\\x1c\\x00p}\\xbe\\x9e\\xb5ji\\x19\\xb8\\xb6\\xc7Km\\xab\\xcb\\x1e\\xa3\\xff\\x00\\x152\\xc0\\r\\xc3\\xa8E\\x1f.\\xce\\xd9\\xc795\\x9dqeg\\x1c\\x81[\\xe2,\\x11\\x8f\\xb2&\\xe4d\\xcezs\\xd7\\xa1<\\x8e;\\xd3\\xa7\\xd5u}\\x80\\r\\x0fE\\x8fz1\\\\e\\x9bo#?{\\xd7\\xa1\\xc0\\xac;\\x9f\\xb5\\x91l\\xf2X\\x84&0\\t\\'\\xe6b0rC19\\xc1\\xfc\\xbe\\x95\\x9c\\xa5r\\xe2\\x8d\\xa8,\\xb4\\x06\\xd4\\x9d\\x9f\\xe2=\\xb3&\\xf2\\x08c\\xb4\\xee\\xc7v8\\xef\\xedSl\\xf0\\n\\x80\\xaf\\xe2\\x0b\\xe7e\\x18,\\xab&\\x0f\\xd3\\x0b\\x8f\\xca\\xb9\\x12\\tg\\x02\\xdd\\x89\\xdc\\xc3\\x81\\x9f\\xf1\\xa4>hb<\\xbb\\xde?\\xd9\\xac\\xdb*\\xc6\\xe4\\x96\\x92\\xa9\\xba\\xc4\\x90\\xc9\\x9c\\xfd\\xe1\\x8c~uJ6\\x929#\"\\xf3QV\\x12\\x83\\xf2\\xbf\\xcaG~+M\\xaf\\x1c\\xe9\\xf7\\xff\\x00\\xf1&\\xb8\\xca\\xc0y\\x07 }N\\x069\\xacfui\\x98\\xe1A\\r\\x8e\\x98\\x1f\\x95D\\x1c\\xbb\\x1d5i\\xc1|.\\xe6\\xe4:\\x84\\xfb/\\x03\\xd9\\xc2\\xfb!\\x0cY\\x06\\x0e\\xde\\x9c\\xf3\\xeaE^7\\xd0\\xf9i\\xfe\\x8ftw/\\x1f(\\x19\\x1e\\xff\\x006z\\xfbW<\\x8a\\xadmp\\x83Rr@\\x04\\x829\\xc09\\xc0\\xe2\\xaf\\xddB\\xc5t4\\x8a\\xee]\\x91X7\\xcc\\xc0\\xe1\\x8bd\\x9001\\xd7\\xd6\\xb6\\xf6\\x8d#\\x95\\xd3W3\\xa5\\x9aYu\\rM\\xbe\\xd0\\xcaX\\x901\\xd9Go\\xa5j\\xd9\\\\\\x18\\xac\\xaf\\x11\\xdfPrn\\x0beNx\\xc0\\x1d\\xeb\\x01\\x0c\\x98\\x95\\xc4\\x19!2kEyKrS\\x04\\xa8&\\x88I\\x95(\\xa1d%\\xbcM\\x0c\\xfb\\xce>\\xd3\\x0b\\xe0\\xf5\\xf9@\\xff\\x00\\n\\xd8\\x1a\\x82m_\\xf8\\x93\\xcay\\xfe\\xf8\\x1f\\xd0\\xd6\\x0b\\x92%\\x88\\x07\\xe4\\xf4\\xe2\\xa5\\x01\\xb6.O8\\xaa\\x8c\\x99<\\xa8\\xdb\\xfe\\xd1\\x00\\x1f\\xf8\\xa6\\xa4?7\\xfc\\xf4\\xff\\x00\\xeckI&\\xb8\\x92\\xceW\\x8fH\\xd3\\xca\\xa8m\\xc1\\xd8\\xee\\xcf\\'\\x8a\\xe2\\xe5e\\x0fl1&z\\xd7a\\xa7\\xbe\\xcf\\x0f\\xea\\x19\\xb2$>\\xees\\xeb\\x91U\\t2%\\x14\\x89\\xddu!\\x15\\xd1\\xfe\\xca\\xd28Rs\\xbc\\xf3\\x8a]\\x9a\\xa6\\xe5\\xff\\x00A\\xd2FA=\\x0f\\x1f\\xad_ysk(\\xfb0\\xc9d\\xc6ww \\x7ftRy\\xb2\\x16S\\xe4\\x8f\\xbb\\x8e\\xa7\\xd4{U\\xdd\\x92gn\\xbc[\\x82$\\xd3-\\xb0vcgbx\\xac\\xad`0\\x83\\xc3<\\x1ee\\x98\\xfeX\\xadvvmN|\\x96\\xff\\x00\\x8f\\xabu\\xe3\\xa7Z\\xcc\\xd71\\x9f\\x05\\xfdn?M\\xb4\\xa4\\xf4\\x1cV\\xa76>\\xe1\\xe7\\xf8\\x8dtz0\\xfd\\xcf\\x8aG\\xac\\xb1\\xff\\x00#\\\\\\xe8\\xfb\\xb1\\xf3[\\x96go\\x81\\xfe/\\x1c\\xb0\\xfd\\xc4\\x80\\x1fO\\x97\\xff\\x00\\xafY\\xa7fh\\xd5\\xce\\xbcm\\xdb\\x16H\\x18$S\\x83/\\xf7{\\xd7\\x91\\xab\\xb8\\xbb\\xd3\\xd8\\xb9b\\xb2#\\xfc\\xc7 \\xe3\\x9a\\xe9\\x7f\\xb6\\xe6\\xff\\x00G\\x1f\\xf0\\x8c\\xda\\xe7o\\xfc\\xf58\\xfc\\xb0\\x7f\\x9d>ry\\x0e\\xc8\\xcb\\xfb\\xd6&\\x15 z\\xd3\\xc3\\xa1\\xf2\\xce\\xc5\\x19aTl\\xe4\\xf3\\xfc?\\xa2\\xca\\xd6\\xd1!tl\\xaa\\x9c\\xe3\\x0cG\\xf4\\xab>YX&$\\xae6\\x1a\\xa4K\\xb9\\xe6\\xe8F\\xf8j\\xe4\\x1f\\xf2\\x1a\\xf0\\xef_\\xf8\\xfd\\x8f\\xf9\\xd5(\\xfe\\xf4}~\\xe5^\\xb6\\xc7\\xf6\\xe7\\x87\\x7f\\xeb\\xf6?\\xe7Y\\xc7sFu9>b\\xf2~\\xfdp\\xac2\\x90\\x7f\\xb9^\\x80\\x17\\x90\\x7f\\xdb5\\xc0\\xe0\\xf9K\\xf7~\\xef\\xad]^\\x84S\\xeav:x?\\xf0\\x8exk\\xa7\\xfa\\x8f\\xeb]\\x05\\xbe\\x08l\\x95\\xf4\\xac\\x8d5G\\xfc#\\xde\\x1b\\xca\\xa7\\xfc{\\xff\\x00Z\\xd8\\xf3Qb\\x90\\x04^\\x95]\\t4T\"\\x86\\xdca\\\\\\xaeG\\xd2\\xaaI-\\xae\\xe7\\xfd\\xc37\\xcdYrJK\\xf3$\\x9c\\xd4%\\x80\\xb7\\xd4\\x1b\\x0cv\\xc2\\xcd\\x8fP\\x06h\\xe5\\x0b\\x9c\\xb6\\xa6S\\xfe\\x12\\xef\\x15c8\\xfbJc\\xfe\\xf9\\x15\\xb1c\\xf6\\xdf\\xf8Wz\\x9f\\xd9\\xddD\\xa7W`\\x0f\\x1c\\x02\\x06NO\\x03\\x1ds\\xf9s\\\\\\xe4\\xf2,\\x9a\\xd5\\xfc\\x9e\\\\\\xa3s)\\xc1\\xed\\xc0\\x15v\\xde\\xf2xl|\\xb4\\xb4\\x84\\xe6\\xe8\\xc8I\\'\\xb8\\x03\\x1d=\\xbdk4\\x8d\\x1b,\\r7\\\\\\x9a\\xf4\\xf9\\xfa\\x83\\xae!V\\x06G.\\x0bg\\xa6\\x01\\xeb\\xf8T\\xff\\x00\\xd9S\\xfd\\x82\\xdc7\\x88\\xb4\\xd4a#\\xb7\\xee\\xa1\\x1bp@\\x00q\\xb4\\xf3\\x8e\\xe4\\xfbc5VMOQ\"\\r\\xab\\xa7\\xc7\\x89\\x01$\\x00O\\x1d\\xbel\\xf5\\xf6\\xc1\\xac\\x9b\\x8b\\xcb\\x89\\'\\xbb\\xf35K\\xd22p\\x10\\x90\\x83\\xf0\\xff\\x00\\xf5\\xd4\\xe85r\\xe5\\xebiik`\\x90\\xc3+\\\\G\\x1f\\xcf*7\\xdd\\xc7\\xa1\\x18\\x1f^\\x0f\\x1dy\\xe6\\xa8\\xc24\\xbcHn&\\xd4\\x8b\\x18\\x89\\xf9\\x0eN@\\xc0\\x07#\\x8e~\\xb9\\x04r;g3~\\xe4.\\xc8\\x80\\xdf\\x92q\\xc9\\xfcz\\xd3\\x0fH~u\\xfb\\xbf\\x9f\\xbdCe$_[\\x99WK\\x8e4\\x82\\x08\\xf1\\xce\\xf8\\xf2\\xb2\\x1ffl\\xf27s\\x8f\\xff\\x00P\\xa0\\xd93LL\\xce\\xc4\\xb6I\\xdcrO\\xbeGZJ8\\xf5\\xa0v:\\r?g\\x91\\xe3M\\xc22\\xbfa\\xc1\\xc8\\xecs\\xfe\\x15B\\xe5\\xad\\xce\\xb5\\xc4\\xb1\\xa8TX\\xc8\\xc1\\xc1\\xc7\\xa7\\xe1Z\\xa4\\xd8}\\x8fZ\\x08\\xf6\\xd1\\xef\\x83\\x1fw\\x19#\\xeb\\xc5a.\\xe3=\\xb8\\xc3o\\x0f\\xb4\\x0c\\x1ei\\xc8\\x94h$@O;&\\xa1*e\\xb8\\xc7O\\xd7\\xadj\\x9b\\x8dE<9\\xe2`m4\\xb3\\x9b\\\\\\tP\\x95t\\xc9\\x038?^\\xde\\xb5F8\\xee\\x95\\xc6m\\\\\\x809P\\xdd?\\xadCw-\\xc9\\xd3cS%\\xd8Pv\\x80s\\xd0\\x90\\x7f\\xa59GAE\\xbb\\x93\\xe9\\x02\\xc4\\xdfkKq<{E\\x90\\n\\t\\xc1,H\\xfcx\\x00\\xd3\\to/<\\x12\\x17\\xa0\\xc6??z4\\xf8\\xa4\\x93D\\xf1J\\x86\\x84o\\xd5-W\\x96\\xc1\\x18\\x0c289\\x039<\\x0f\\xadl6\\x9dpnl\\x926\\x9eg6\\xae\\xcc\\x02\\x80\\x02\\xaf\\x07\\xf9\\xf1R\\x9d\\x8b\\xb9\\x87s\\x0c\\xd1k\\x10\\x89\"U;\\x11\\xc8\\xcep1\\x91O\\x04\\x14\\x18\\x90`\\xe7\\x06\\xae[\\x94\\x8b\\xc7P\\xfd\\xa7F\\xd7\\x06\\xc8\\xd8\\x14\\xd8\\x0b.\\xe5\\xe0\\xe1\\xb8\\xef\\x9f\\xca\\xb55\\x194\\x1f\\xf8E\\xbc\\x15\\x15\\xaa\\xa91\\xca\\xbb\\x8b!\\x12c\\x079$w<\\xfd\\xecg\\xb5L[Lg\\x1b \\x98Km\\xbaD?!9\\x1fZ\\xe94\\xdb\\x88\\xce\\x8f }N\\xd07\\xdb@\\x03\\xfd\\x9c\\x8c}y5\\xcdL\\xcc5;\\xde\\\\\\x80\\xea?J\\xb5\\xbe \\xaa\\r\\x9c\\xdc*\\xf3\\xc7\\xa5k\\x17f\\xd9\\x12WGQ-\\xf4+\\xad\\x98\\x99\\x18\\xaa\\xc0\\xacXu\\xdd\\x90zg\\xd2\\xa67\\xd6\\x81\\x1b\\xf7z\\x97N\\xea?\\xc75\\xc4\\xab\\x8f\\xb5\\\\6\\xd9x\\x00c\\xea\\x05L\\xed\\x19\\x8e0#\\xbf_\\x9cg\\x91\\x8e\\x9fZ\\xa5=\\x19\\x0e\\x1a\\x9b\\x9al\\xc1\\xafu\\xa0\\xcd\\x83&\\xad\\x04\\x9fV-\\x93V5\\xac\\x19<\\x17\\xed\\x0c\\xc7\\xf3\\xdb\\\\\\xd5\\xb4\\x86=OEr\\xf2\\xe1\\'V\\'\\x1c\\x12\\x08#$g\\x1f\\xaf\\xd2\\xb4\\xf5\\x0b\\xb4\\x99t2-\\x90m\\x85\\xc7\\r\\x91\\xcf\\xbf\\x1e\\x9e\\x94\\xb9\\xbd\\xd2\\xb9u3\\xc7\\xdeS\\x93\\xe9ZqH\\x07\\xc3\\xff\\x00\\x89\\xbfw&m\\xbcv\\x07\\x02\\xb2\\xc1]\\x8d\\xf3\\x1e\\x84\\xd6\\\\\\x87\\xfd\\'Q\\xc3737\\xf3\\xa9\\xe6\\x1d\\x87g\\xef\\xd3?\\xbd\\xcd(\\xfb\\x87\\x93M\\xeex\\xefR\\xcaG\\xa1i\\xd2\\x95\\xf0\\x9f\\x82\\xd7g\\x1fe$\\xfe$\\x9a\\xb9$\\xacm\\xee\\xb9\\x18\\xf2\\xce+\\x9a\\xb7\\xbd\\xb4]\\x17@C\\x06\\xaaJ\\xda\\xa88\\x03\\x1f\\xccS\\xda\\xfa6K\\xc5\\x1a}\\xe0\\xcc$\\x0c\\xf1\\xcdt\\xa9+\\x18\\xc9;\\x99\\nW\\xe4\\xf9\\x97\\xa5\\\\\\xb6\\xc7\\xf6\\xcf\\x87\\x8eG\\xfc}\\xa7\\xf3\\xac\\xc5\\xff\\x00Z\\xdf\\xba\\xefZPm\\xfe\\xd8\\xd0\\xfe^|\\xe5\\xac\\x96\\xe5\\xb4u\\xe5\\xbeIN\\x7f\\x80\\x8a\\xe1\\xb3\\xf2?=\\x8dv\\r\\x9f.\\x7f\\xa1\\xae<\\x0c\\xa1\\xfa\\x8f\\xebZT\"\\x9fS\\xb6\\xb1|xw\\xc3\\xa3\\x03\\x9bj\\xbb2:[\\xe9\\x85\\xa6\\xb5\\xfd\\xe4,\\xcb\\x86\\xec:\\xff\\x00J\\xc6\\xb58\\xd0\\xb4\\x1f\\x98\\xff\\x00\\xc7\\xb8\\xa9\\xdd\\xc9\\x8d\\x01\\xe7\\x1c\\xd5[DM\\xc7\\x12|\\xc3\\xc7|T\\x83\\x05\\\\\\x14R\\n\\xe0\\x83\\xd0\\xfdk>G\\x95V\\x12!\\x12\\x0f9\\x17\\x05\\x8a\\xb0\\xc9\\xc7\\x07\\x07\\xfaT\\xe8e(\\xb9xT\\xe3?(\\xce?\\x13\\x81\\xf9\\xa8\\xab\\xb9,\\xe6\\xee\\x96%\\xf1\\x0e\\xa8\\xab\\x19\\n$\\x18\\x03\\xa0\\xe0t\\xad\\x9d:\\xd2\\xc2]2\\xf1\\xe4\\xb2\\x99\\x8a\\xde\\xb2}\\xe2\\x060\\x0fc\\xefY7y> \\xbc\\x04\\xe7f\\xd5\\xc9\\xc6O\\x19\\xe4\\x802y\\xeak\\xa0\\xd2\\x0e4M_\\xa7\\xfc\\x84\\x9f\\xafO\\xba\\xb5\\x82\\xdc\\xd5\\xecCum\\x107\\x89m\\xe0\\x00\\xcd\\xe4\\xe7\\xcc\\x92C\\xb5O\\xb0f\\xf9\\x88\\xeb\\xd3\\x15\\xc6L\\xb3-\\xc6\\xa0\\x1a\\x02\\n\\xceQ\\xb0:\\x1f\\xc3\\x8f\\xca\\xbb\\rJ\\xfdR\\x10\\xb0k\\xd0\\xf9\\x82C\\xb8\\x05\\xc8\\x03\\x1e\\xa4c\\xf0\\xaeZk\\x9b\\x89-\\xad\\x83,g\\x12\\x02\\xc4`n9$d\\x0cz\\xd6rH\\xa8\\xb6 \\xb5\\xb8\\xfb#\\xb9\\x9a\\xc9?\\xd1\\x9aM\\xae\\xdc\\x95\\x1f\\x9f\\xa7\\xa5R\\x18\\xf9~c\\xd2\\x90\\xf5\\\\\\xbb\\x9e;\\x9eiUY\\x88\\x01A8\\'\\xadN\\x85\\x87\\xaf\\'\\xad\\x1d\\xcf&\\x97\\x9c7\"\\x8c\\x9fU\\xa0\\r\\x99\\x9e6\\xb7\\x8fo\\xd9I\\xff\\x00dc\\x07\\xb5fF\\xf2}\\xaf\\x95\\x8f!\\xb9 \\x9a\\xd6A9\\x92\\xecI\\xa5@@\\xb6v\\xe59$c\\x03\\xf1\\xaa\\x16\\xeb\\x13_k\\x84\\xc36\\x088\\xdb\\x8e3\\xf5\\xabh\\xce*\\xc8\\xba%\\x98G\\x01\\x17\\x97\\'\\xf7\\xbd\\n\\xee\\xfe\\x99\\xfdj\\x0b\\xb9\\x9d\\xac,U\\x8d\\xb9\\xfd\\xfa\\xb7\\x03\\x1d\\x8f\\xb9\\xa9vZm\\x05uI\\x860zz\\xfd*\\x95\\xda2\\xcd\\xa6\\x832\\x1c\\x82zS\\x95\\xc6\\xb764\\x9c\\x8b\\'\\xe1\\xfemT\\xf7\\xec\\xa0U\\xdb\\xbb\\x8b\\x84\\xb9V\\x8e\\xfat\\xff\\x00Fd;X\\xaeU\\x8e\\x08\\xfck.\\xc5\\x99t\\xbd?\\xf7S`\\xb3\\x9c\\xe4z\\xfeu$\\xf9y$_5G\\xc8\\xbc\\xfbd\\xd4(\\xeaS*Aqr\\x9a\\xc6\\x95!\\xb9\\xbc%Y9.yU\\xc7\\xcaq\\xc9\\x07\\x15\\xb3yye=\\xed\\x8b\\xae\\x89\\xa5[\\x91\\x01\\x0c\\x10\\xfd\\xe2X\\x92y\\x03\\x9e}\\xfau\\xaej$\\x94\\xdd_\\xa8\\xb8r\\x17=N\\x05Nc\\x98\\x08\\xf3j\\x7f\\x03N*\\xc1\"\\xb1\\xf9\\xbc@FN\\r\\xf0\\x1d{g\\x9a\\xd21\\xa1l\\xf9\\x92\\xf5\\xec;\\n\\xc8O\\xf8\\xfe_\\x99\\x87\\xef[\\xa7\\x07\\xf3\\xadi\\x0c\\xc1!+e\\x1b\\x12\\xe7\\xb1\\xcd8\\xb1I\\x14\\xd4\\'\\xf6\\x85\\xd0\\xf3\"\\xc3\\x03\\xcfz\\x9ax\\xd4i\\xf7\\xcd\\xe7O\\xd0u_\\xf6\\x85G\\x01\\x1fol\\xb3\\x1eI\\xc6\\xde\\x8d\\xf9\\x7fZ.Zo*\\xf9~\\xc3\\x08]\\xc3\\r\\x8f\\xfe\\xb9\\xa1=\\x01\\xadI-\\x136w\\xa7t`\\x8b\\x8czdc\\xd6\\x9b2\\xb2\\xddA\\xf2@\\x14\\x90F:R\\xc3\\x91\\xa1\\xdc\\xfe\\xe8\\x9d\\xd2K\\xcf\\xa7\\x15\\x1c\\x871h\\x80\\xc8\\xdc\\xc4y\\x19\\xcew\\x1a\\x1b\\xd1\\r-X\\xd0\\xcb\\x8f\\xf5\\xb6\\xfd{\\x1a\\xa0\\xc7\\xf7\\xb2\\xf5\\xfb\\xc6\\xaeygy\\xe4}\\xd2j\\x91\\xfb\\xcd\\xf5\\xa8\\xb8\\xc7\\x83\\xf2\\x8f\\xa5G\\xdd\\xb8\\xa5\\x1d\\x1a\\x93\\xd7\\xebH\\x0b\\xeb\\xfe\\xa2\\xdb\\xf7r\\x13\\xe5.0)\\xec\\x1dU\\x0f\\x93x\\xb9\\xe3%x\\xad+\\x88\\xd9n\\xbc\\x13\\x8dP\\xa9k\\x15Q\\x9e\\xaaT`~ukVf\\x1an\\x90\\x04\\x84\\x03y\\xca\\x91\\xc1\\xc0\\xe2\\xb4\\xe5\\xdc\\x8emL1\\x82\\xe3\\xa1\\xf9GJ\\xb6\\xaeV\\xe3J##\\x171\\xf3\\x8fC\\x9a\\xa8X\\x04\\x84l~Pt\\x15#\\x80n\\xbc>>\\xd3r\\xbb\\xddA\\xe3$r9\\x157\\xd4\\xbb\\x1d\\xfby^]\\xdf\\xee\\xc7\\xfa\\xa6\\xae\\x0f#\\x07\\xe5\\xe7\\x15\\xd2\\xc9.\\xcb\\xaf\\x03C\\xf6\\xdc\\x83o rO$\\x04\\xc2\\x9f\\xc4\\xf3\\\\\\xa217W#\\x12\\xfd\\xcf\\xcb\\xff\\x00\\xd7\\x8a\\xd2oc8#\\xb9\\xb4X\\xbf\\xe1\\x1e\\xf0\\xa6c\\xcemT\\xd5\\x86K}\\xcb\\x88G\\xe7\\\\\\xeb\\xdd\\xc6\\xbe\\x0c\\xb0\\tz\\x04\\x9eR\\xae\\x06A\\x18<\\xf3\\xf4\\xadsy\\xa6u\\xfe\\xd3\\x8b\\xbf\\xf0\\x9f\\xf0\\xad\\x14\\x91\\rjK\"C\\xe4\\xdb~\\xeb\\xfe_ \\xef\\xfe\\xd8\\xa9BG\\xb8\\x80\\xbdV\\xb3\\r\\xf5\\x93\\xd9\\xd9\\xfe\\xfc\\x0c\\xdcFXmn6\\xb0=q\\x8e\\x82\\x9eo\\xec76$\\xb8\\'#\\x90\\xbe\\xbdi\\xf3!r\\xb3\\x0e\\xff\\x00\\x0b\\xe2o\\x11b\\x19\\x0e%A\\x80y\\xfb\\xa2\\xaeY\\rI\\xf4=DEug\\t\\xfe\\xd0\\'s\\x1c\\x9f\\xbb\\x8c`\\xa9\\x1f\\x8eF?Z\\xcc\\xba\\x92\\'\\xd7\\xb5wV\\xb8\\xda\\xd2\\xa9\\x1c{\\x01W\\xac\\x18\\x08n\\xd9\\xbc_\\x0c*\\'q\\xb3*2\\x08\\xeb\\xcf5\\x8c]\\xd9\\xa7C2\\xe6\\rHI\\xac\\xb4\\x88\\xcc\\xbe{3H\\xcd\\x80z\\xf3\\xdb\\xafn+-\\xc1\\x0c\\x80\\xc9\\t\\x05T\\xfc\\xb9\\xc7O\\xa0\\xad\\x9b\\xcf\\xec\\xff\\x00:\\x16o\\x14k3\\xbb\\x02\\xc4\\xa2\\x0cq\\x8c\\x0cdc\\x8f\\xaf\\xaf\\xd6\\xa7\\x97a\\xf6Ff\\xbc\\x94\\x92\\x01\\xc2\\xb0,\\x14\\xf6\\xe0\\x11\\x9crI\\xc7\\xd0T\\xc9\\x14\\x99\\x99\\xdc\\xe0T\\xc7g\\x99\\xf2\\x891\\xb4u\\xee{\\xd2\\xba\\xed\\x92Q\\x80\\x08|\\x91\\x9c\\x90*3\\x9c\\xae\\x0b\\xe3mAW\\x14t\\x97\\xf7*y\\x1c\\xe7\\xa5;\\x8c\\x7f\\xabC\\xf8\\xd2q\\x8e\\xad\\xd2\\xa3\\xe3\\'\\xe64\\xc0\\xb4\\xb7W 7\\xef\\xa4\\xe8\\x7f\\x8a\\x92\\x19\\xca\\x1b\\xbf\\xf4X\\xdb{\\x02w`\\xf4\\xfc?\\xadU\\xc3w\\x86A\\xf8Sq\\xcf\\xde4\\xae\\xc2\\xc8\\xd5\\x17i\\xb5\\xc1\\xd3-\\xb9F\\x03h\\xc7\\xaf\\xbe;\\xfaT\\x173,\\x93\\xda\\x1f\\x95B\\xc5\\x8eO|\\xfb\\n\\xa3\\x8aJ|\\xec\\\\\\xa6\\xdc\\x12\\xda\\xae\\x9fn\\xbfm\\x00\\x84\\xe7 \\x0ejm\\xd0\\x17\\x94\\xfd\\xa6\\xd4\\x9e\\x07\\x075\\xcfR\\xfet)\\r\\xa3N\\xdf\\x81\\xe2F\\xdcG\\x1c~\\xb4K$\\x86\\t\\x0f\\x9a\\xf8\\x17!W\\x1d{\\xf3Y\\xb9 \\x7f\\xac\\x93\\xf3\\xa5\\xdd&?\\xd7\\xcb\\xf9\\xd0\\xe4$\\x8b\\xd6~W\\xf6\\x9a\\x96\\xbf\\x85\\x00\\x89\\xb9*NO\\xe1\\x93\\xfaU\\xed\\xea\\x04y\\xb9\\x88d\\x9e\\xb9\\xc5b\\x87l\\x8c\\x18\\xff\\x00*q\\x95\\xca\\xc7\\x94\\x88\\xe0\\xf1Deb\\x99\\xa1ls}\\xe2\"\\x1b\\xfeZ\\x0c\\x1eq\\xc9\\xa2\\xed\\x90\\xd9(\\x13\\xc4O\\xda\\x00#\\xf3\\xaaQM\\xb1\\xa7\\xc5\\xbb\\x1c\\x90O>\\x9f\\x85$\\x92D\\xcd\\x9f\\xb2\\xca\\xa7~s\\xbb5\\\\\\xc4\\xd8\\xd3\\x8b\\x8f\\x0f\\xc0<\\xcf\\xbc[\\x8c\\xfb\\xe2\\xab6\\xed\\x9e\\x12\\x1b\\xc6\\r\\xbfO\\xc4\\xf3B\\xcfn4\\xfbU\\xcd\\xce\\xe5B\\x07\\xca1\\xc9\\xa6o\\x8b\\xed\\x1e\\x1b\\xff\\x00H\\x8b\\to\\x83\\xdb\\x9a\\x1b\\xd0e\\xb2\\x07\\x95q\\xff\\x00\\\\\\x98\\xd6/\\xf1t\\xef[N\\xf1\\x9b]G\\x17V\\xc7\\xfd\\x1d\\xfa7\\xb5c\\xe0\\xfc\\xdf+u\\xa9\\x00?u\\xbe\\x94\\xd1\\xd4q\\xde\\x9d\\xd9\\xf84\\x83\\xef\\xc7\\xfe\\xf5!\\x9d]\\xee\\xef\\xedO\\x87\\xc0\\\\\\xc61\\x17\\xf7\\xb9\\x1c\\x8e\\x7f\\x11\\xc5Q\\xd5e\\x91\\xb57L\\xc3\\xb1n\\x9c(\\x03\\xa1\\x18\\x07\\xf5\\xad\\x1b\\xd6S\\xad|:\\xcbFq-\\xcf\\xf2\\x15\\x85twja\\xbc\\xc6\\xfd\\xe5\\xcc\\x8f\\xff\\x00}\\x1c\\xd6\\xd2\\xeaf\\x87>\\xe0m\\xc1n\\xae\\xbd\\xa9\\xf3\\xb0]O\\xc2\\x87\\x0f\\xf2L\\x1b\\x03\\xafQ\\xfe\\x14\\xc93\\xf6\\x8b\\x0f\\xdfL\\x7f\\xd3#^\\x7f\\x1aK\\x9e5}\\x1b\\x97\\xfb\\xa8z{\\xd6e\\x9a\\x93\\x9biu/\\x0b8\\r\\xf3$\\x8a\\xdf6\\x08\\xdb\\xd35\\x8a\\xae\\xe2}K\\xef\\x93\\xb8\\x81\\x9e\\x99\\xa9\\xd5\\xc8\\xd4\\xb4\\x93\\x96\\xe1\\xe4?\\x99\\xa8\\xa3\\x19\\xbb\\xf1\\x07/\\x81>x\\xeb\\xd4\\xf4\\xa7&LQ#$\\x83F\\xd2\\x9c\\xad\\x99\\ru\\x81\\x82s\\x9f\\xca\\xad\\xc9\\x15\\xca\\xea\\x161\\xf9\\x11\\x83\\xf6W`FH\\xc0\\xfc;S\\\\\\x9f\\xf8D\\xbc\\x1b\\xfb\\xc9\\x0f\\xfcM\\x1f\\x19\\x18\\x1d\\xebR\\xe2e_\\x12\\x92\\xd3\\xc6\\x02\\xe8R\\x0e\\xa7\\x00\\x9c\\xf5\\xaa\\xe5\\xd0W\\xd4\\xc8\\x8d%\\x1a=\\x94\\x9fk\\xd3B\\xb5\\xe6\\xc1\\x92\\xc0\\xe4\\xf5\\xed\\xf8\\xe6\\x8d\\x92\\x8b\\xef\\x11\\x02\\x96\\xff\\x00\\xbb#\\'q+\\x9fn*X\\xe5\\xb6\\xff\\x00\\x84{\\xc1\\xd10RN\\xab\\xbd\\xb2\\xb9\\xda\\x01\\xf4\\xf7\\x15^^5\\xcf\\x89\\xbf4\\xc0}\\xaaq\\xf2\\x9es\\xbf\\x8a\\x9b\\x14\\x80g\\xedW\\ne\\x83\\x84\\xdd\\xc7\\xeb\\xe9W\"\\xe1n\\x13\\xcd\\xb6\\x1f\\xbfF\\'\\x1f1\\x07\\xb0n\\xa3>\\xd8\\xfa\\xd6x\\xdd\\xe7x\\x83\\x0cx\\xb5\\\\n\\xfa\\x0c\\xff\\x00Z\\xb5\\x14\\xdb?\\xe12\\x06\\x19\\x8b\\xb5\\x9aF\\x08=\\t\\x1c\\xd4\\xde\\xc1k\\x90_%\\xa2\\xdfB#\\xbbb~`\\xc0\\xf6\\xee\\xb8\\xcf=8\\xe75R\\x18\\xee\\xa4\\x96\\xf4%\\xbc\\xe7\\xe6\\x04\\xe3\\xa0\\xc7\\xaf\\xe3Kt\\xe1\\xf5\\x8b\\xe6\\xf2\\xdcnH\\xf8=\\xbeQR\\xdaI2\\xbd\\xd8O\\xb4o{\\x98\\xb6\\xed\\xc7Q\\x9e\\xb9\\xf5\\xcd\\x17\\xb8\\xc8\\x9dd\\x8e\\xfe\\xe8\\x182\\xcb3\\xaf@F\\xe0pj&\\xdd\\xe6>L`\\x91\\x92\\x00\\xad\\x07\\x92\\xe1\\xbc\\xc5}^\\xe5\\xbfzX\\xe5\\xbag\\x8e\\x0f^\\x87\\xa0\\xac\\xe2\\xa4!9\\x1f\\xeb\\x08\\xfa\\xf5\\xa4\\x03\\xf9\\xda\\xa7\\xcb\\xe0\\xf1\\xd3\\x82E e\\xda\\xbf\\xe8\\x93\\x9f}\\xd49\\x97\\x18-.\\x11\\xc8\\x03\\xfb\\xb9\\xff\\x00\\xf5T{\\x9b\\x9f\\xdf\\xca(\\x02Bd\\xda\\xe3\\xed3t\\xe7\\x9a\\x14\\xc8\\x11q;\\x01\\xe9\\x9a\\x0f\\xddjQ\\xf7S\\xe9AV\\x02d\\xc7>O\\xfd\\xf2?\\xc2\\xa3=G\\x0b\\xd7\\xd3\\x14\\xf3\\xf7z\\xf7\\xa6\\x7f\\x1c\\x7fZb\\xb0\\xec\\x0e?\\xd1-\\xfaz\\x9f\\xf1\\xa4 m\\xff\\x00\\x8fx\\x87\\xd2\\xa5\\xf4\\xfaS\\x1b\\xa0\\xa4;\\n\\x82\\xdb\\xca;\\xae/\\x81\\xdd\\xd8q\\x8a\\x19m\\xb6>\\xdb\\xdb\\x8c\\xe3\\xa1Z\\x8b\\xf2\\xa5\\x18\\xcd\\x02\\x10(\\xc3\\xfc\\xf8\\xfc(\\xda2>\\x7f\\xd2\\x97\\x8fA\\xd6\\x8e=\\x07Z\\x04&\\xd3\\x86\\xe5zz\\xd2\\x15\\xc0\\x1c\\xadH\\xb8\\xdby\\xd7\\x94\\x03\\xf5\\x14\\x87\\x1b\\xd3\\xafJ,1\\x98\\xbf\\xe7\\xda\\x83\\x8f7\\xc4\\xb9\\'\\x86\\x87\\xb6{U@\\xf2\\x05\\xbf\\x1bW\\xe6#9\\xf6\\xa52\\x12u/\\xdd\\x8f\\x9fo\\xe9E\\xc0I\\xb1\\xf6\\xeb\\x9e\\x7f\\xbb\\xdb\\xda\\x9d\\x16\\xc0\\xaa\\xc6r\\x08\\xbd\\x8f\\x80\\x0eq\\xceO\\xe1\\xc5F\\xed\\xbay\\x0e:\\x91J\\x9b|\\xe8\\xf2F7\\x83@\\x12\\x93\\xf3\\xdfr~\\xee9\\xfc(\\x04\\xed\\x87\\xfd\\xc7\\xfe\\xb5\\x16F\\x1f\\xf7\\xab\\xd4Q\\x96\\xfd\\xdf\\x03\\xa1\\xa0\\t\\xc1B\\x98\\xe3\\xe6\\x93\\'\\xf0\\xa4\\xd8\\xad\\x93\\xbcrMD\\x0e\\x04\\x1ct\\xcf\\xebN\\x0e\\x02 \\xdb@\\xc6\\x9c\\xed\\xfb\\xa3\\xad/8_\\x94~t\\x84\\x8c/\\xdf\\xebN\\xca\\xe0}\\xff\\x00\\xca\\x81\\x8d9\\xcfAM\\x19\\xf3b\\xe0t\\xa7\\x920\\x7f\\xd7t\\xa6\\xa9\\xfd\\xeaq\\xdb\\xb5\\x00?\\x9e>_\\xd6\\x9as\\xb8|\\xb4\\xfc\\x9c\\x9f\\xf4i\\xff\\x00\\xcf\\xe1Ll\\xe5?v\\xe2\\x80\\x13\\xd7\\x8a(\\xc3`~\\xeeO\\xca\\x8c\\x1cs\\x1b~4\\x08)?\\x88}*@\\xb2\\x94\\\\Z\\xdd\\x11\\xec8\\xa4+ ^me\\x1e\\xf8\\xa0\\x00\\x7f\\xa9\\xba\\xe1\\xbf\\xd7\\'\\xf24\\xd3\\xf7\\xd7\\x83\\xde\\xa5\\t.\\xc4\\xe2,g\\xfb\\xe3\\xfci\\x85H\\x9b\\x19L\\xee\\xc7Z`&FS\\x83\\xd6\\x8c\\xf3\\xde\\xa6\\xf2\\xdb|y\\xb8\\xb5\\x1c\\xf4\\xe7\\xfc)\\xaa\\xbf5\\xd03F\\x02\\xb0\\xf5\\xa0\\x06\\x93\\xfe\\x89q\\xef8?\\x90?\\xe3P\\x9e\\xa3\\xdb\\x8a\\x99\\xd0\\xacd\\xeeO\\xbej\\x1f\\xee\\xf4\\xa0\\x03\\xf8O\\xd6\\x90\\x7f\\xacO\\xad/jE\\xfb\\xe9\\xf5\\xa4\\xc4Jz\\xd3\\xd7\\x1fk\\xb6\\xfd\\xe68\\xa6\\x1f\\xbc\\x9cT\\x89\\xff\\x00!\\x08>QM\\x03\\x1e\\xe1\\x0c\\x96@]g,\\xd9\\xe9\\xc7\\xe5Q\\x95\\x1fm\\x94\\t\\xb8\\xd9\\xd6\\xac\\x1f,\\xdf\\xe9#h\\xc6\\\\\\x9e=\\xaa\"\\x00\\xbd\\xbf\\x18\\xfe\\x01\\xdb\\xd8S\\x01\\x8aq;\\x9c\\x7f\\x01\\xa7F\\x0f\\xd9\\xb5#\\x95\\xe8\\xc2\\x98>\\xfc\\x9f\\xee\\xd3\\xe3+\\xf6k\\xc1\\x81\\x9f\\x9b\\xb7lR\\x022\\x0e\\xcb\\x1eW\\x04\\x7f\\x85Y|\\xf9\\xba\\xaf\\x03\\xfeA\\xed\\xfdj\\x12\\x064_\\x94d\\xc6?\\xa5K&E\\xd6\\xa8<\\xc1\\xff\\x00\\x1e\\xa6\\x98\\x08\\x98\\xfb>\\x8600nG\\xf34\\xe0\\x07\\xd9|O\\xc2\\xf1s\\x81\\xf2\\xe7\\xbd6<\\xf9Z\\x0f?\\xf2\\xf2\\x95\"\\x86\\xfe\\xce\\xf1\\x7f?\\xf2\\xf7\\xfdi\\x00\\x10\\xa1\\xbcj6\\x0f\\xf5\\xa8:{\\xd3\\x19G\\xda5\\xff\\x00\\xdc1\\xff\\x00KP8\\xe9\\xc8\\xa90\\x7f\\xe2\\xb9\\xf9\\xbf\\xe5\\xe9?\\x99\\xa3\\xe5\\x07\\xc4\\xbf\\xbd\\x19:\\x94x\\xff\\x00\\xbe\\xa9Xe\\x19\\x80\\x17wc\\xcb#\\x12t\\xc7J#]\\xd7\\x10.:\\xb8\\x14\\xf9\\xf1\\xfd\\xa5\\x7f\\x87\\x04y\\x83\\xf9Qn3\\xaa\\xe9|\\x9f\\xf5\\xc2\\x8b\\x00\\x9b?qr\\xd8<2~\\xaaM!U\\x128/(\\xfd\\xd8\\xc6{\\x9cU\\x8d\\xa0\\xd9j\\x9f1\\xe1\\xa3\\x1f\\xf8\\xe9\\xa3fn.\\xc1\\x00\\xff\\x00\\xa2)\\x1c\\xf4\\xe1i\\xd8\\n\\xbe\\x9c\\x9a9\\xfe\\xf1\\xa91\\xf2\\xdb\\xfc\\xab\\xfe\\xa0\\xd3pp>U\\xe9H\\tX\\x0f\\xb5X\\x0c\\x1cq\\xde\\xa4e_:\\x1e*6?\\xf11\\xed\\xd6\\xa5\\x7f\\xf8\\xf8\\xb6\\xe9\\xd1j\\x90\\x85\\x91W\\xec\\xf3\\x9c\\x0e\\x82\\xa9\\xaf\\xde\\x9f*>\\xe7\\xa5]\\x9b\\xfe=\\xa4\\xff\\x00xU5\\xff\\x00\\x97\\x8fr)\\x01e\\x07)\\xfe\\xed6o\\xbb\\xa7\\x8c\\xf5-\\xfd)\\xeb\\xfe\\xb1\\xba\\xfd\\xda\\x8ac\\xfe\\x91e\\xc9\\xfb\\xb4\\x01eK\\xf9m\\x99\\xe6\\xfb\\xc7\\xbdT\\x94\\x9f2O\\x99\\x8f\\x06\\xad(\\xc41\\xf3T\\xe5\\xc7\\xda\\x1b\\x9e\\xd4\\x01>1eg\\xc7\\xf0\\xd1\\'\\xfcx\\xd9\\xff\\x00\\xd7AN8\\xfb5\\xa8\\xc8\\xec\\x7fJ\\x8eC\\xfb\\x9d0n\\xf4\\xa6\\x04\\xb1\\x8f\\x95O\\xfb\"\\xa0\\xeb\\xa9\\xb7\\x1f\\xf2\\xda\\xa6B\\x02\\x9ej\\x01\\x8f\\xed\\t\\x0f\\xcd\\xfe\\xb5\\xa8\\x02\\xc9\\xff\\x00[g\\xeeZ\\xa1\\x1dn\\xfd\\xeeM<\\xb7\\xef!W\\xef\\xd3\\xa1\\xaa\\xdf\\xc4x\\x15 8\\xfd\\xdf\\xc2\\x9a\\xbfxS\\x8f\\xdd\\x1f\\xee\\xd3W\\xef\\x8e\\xb4\\x0c\\x90}\\xe5\\xe3\\xbdH\\xbf\\xf1\\xfb\\xd7\\xf8\\r7\\x8c\\x8e\\x1b\\xa5\\x00\\x9c\\xb7Zb%\\xe9sm\\xcf\\xf0\\x9a\\x8f?\\xbe\\xbd\\xf7\\x19\\xa6\\xf3\\x9e\\xf4\\xa0\\x1c\\xfd\\xda\\x00_\\xe3\\xb9\\xff\\x00v\\x9c\\x98\\xfb-\\xd7#\\xa3Sp\\xdf7\\xee\\xdb\\xf2\\xa5\\xc3\\xe3\\xfdS\\xfeT\\x00\\xfe<\\xfd\\x13\\x91\\xf7E:C\\xfe\\x93\\xac\\x1c\\x7f\\xcb/\\xeaEE\\xb5\\xf8\\xf9q\\xcf\\xae(\\xda\\x7fy\\xfe\\x93\\x1fO^\\xd4\\x01n\\r\\xb8\\xf0\\xd9,\\xa3\\x17q\\xf5\\xe9\\xde\\x95\\x1e\\x1f\\xec\\xbf\\x14\\x82\\xd1\\xfc\\xd7\\x81\\x86~\\xa3\\xff\\x00\\xafT\\xf6\\xfc\\xaa~\\xd0\\x98\\xe9\\xde\\x9b\\x88\\xf0\\xff\\x00\\xbd\\xe8}(\\x02\\xee\\xf81\\xe3o\\xde\\x8f\\x9e\\xe5\\npz\\x03\\xcdA)\\x8c\\xcf\\xad\\x912\\xf3|\\xc4\\x0fQ\\x9a\\x8f\\x11\\xec\\x9b\\x99\\xb8\"\\x80S\\xe7\\xff\\x00G\\x7f\\xbe\\x07Z`B\\xc3\\x12\\x1f\\xde\\x03\\xefRB\\xc5om[`;d\\x07\\xad#\\xe3\\xcc\\x90}\\x9cpi\\xa8N\\xf3\\xf7>\\xf7\\xa5 \\'\\x0c|\\xbb\\xa1\\x8e\\x08O\\xd1H\\xfe\\xb4\\xf0e\\xf3\\xd4\\xef\\x8f\\xe6\\x8c/\\x03\\xd0c\\xfaT9m\\xb2|\\xdf\\xdd\\xfeT\\xf8\\xcb\\t\\x07-\\xf7\\x08\\xfeT\\\\\\rx-.\\xe4\\xb4\\x9c\\xa5\\x9c\\xec\\x12\\xc9\\xcfN\\x83\\x04\\xff\\x00Z\\xa5\\xe5\\xb0\\x04\\x7fg\\xdcpOj\\xea\\xb4}PA\\x15\\xda\\xff\\x00d\\t3n\\xd9\\xc7Q\\xb7\\'?OZ\\xcd\\x9a\\xf9\\x9bQ\\xd5\\xd8Gd\\x03\\\\3`t\\x195\\r\\xb2\\xd29\\xb2G\\xda\\xee\\x0f\\x9a0rzT\\x85\\xe3\\xf3\\xa2;\\x9b\\x80*\\xbf4\\xb8?\\xdd5d\\x12\\xc8\\xea\\xc8>\\xf7Z\\x8c\\x10\\x15\\x86\\xd6\\xfb\\xc2\\x8d\\xad\\xfd\\xc6\\xa7\\x04n~Z\\x00]\\xfc\\x1f\\x91\\xba\\xfa\\xd3\\x19\\xb3\"\\x9d\\xbd\\xa9\\xfb\\x0f9\\x921\\xcf\\xad&\\xd5\\xe3\\xfd\"\\x1a\\x00n\\xf7\\xe3\\x81M%\\x8b\\x83\\xf2\\xf4\\xa9q\\x1f\\xfc\\xf5\\x94\\xf3\\xe9HL!\\x94bl\\xfd1@\\r\\xcbq\\xf3R|\\xd9\\xfb\\xed\\xf9\\xd4\\xbf\\xbb\\xff\\x00\\x9eQ\\xf5\\xee\\xd4\\x99>l@ZDs\\xed@\\x11\\xf3\\xcf&\\x97\\x07\\xfb\\x8dS\\xed\\xb8\\xe3\\xfd\\x0f\\x03\\x1dp\\x051\\x0c\\xad4\\x83\\xedq\\x8c)\\xeaq@\\x0c\\xda\\xdf\\xf3\\xc9\\xe9v\\xb7\\xf7O\\xe3S\\xbc`Ar\\xc6\\xf2N#8\\xfc\\xaa8\\xd8\\x08\\xad\\xbee9\\x04\\xf2\\x07\\\\\\xfd)\\x81\\x19Q\\x8f\\xf5\\x96\\xe3\\xf1\\xa8\\xf03\\xfe\\xba*|\\xc72[\\xfd\\xdf\\xb8{T#\\xee\\xb5H\\xc5?t\\xf0)\\xd1\\x00gN\\x9d\\r0\\xfd\\xd3R\\xc2\\x1c\\xce\\xf8\\x1f\\xc0M%\\xb8\\x12\\x9d\\xa1\\xae\\xfeH\\xf8\\xdb\\xda\\xa3\\x0c\\xdb\\xff\\x00\\xd5C\\xc7\\xb5I\\xb6C=\\xfe!\\xfe5\\xc9\\xa6*\\x93qr8\\xe8j\\x84\\x1b\\x9f\\xcc\\x1f2t\\xf4\\xa4\\r&\\xf7\\xfd\\xeb~\\x15(C\\xf6\\xa7\\\\\\x8f\\xf5Y\\xa4E\\xcd\\xd5\\xe8\\xcfBh\\x02<\\xbf\\xfaG\\xef\\xa5\\xe0z\\xd2\\x0c\\xf9o\\xf37z\\x9c \\xf2\\xf5\\xaf\\xf6w\\x0f\\xd2\\x91U\\x7f\\xb3&;}h\\xb0\\x11\\x0f\\xf8\\xf8\\xb1\\xe0t\\x06\\x95\\xb3\\xbfS\\xe3\\xb0\\xa9\\xb6\\x0f\\xed=\\x18c\\xfe]\\xc1\\xfet\\xf7\\x00\\x7f\\xc2Jp8H\\xa8\\xb0\\\\\\xae\\xbd4\\xfe\\x1f\\xfdo\\xf4\\xa6\\x00\\xde\\\\\\x9f\\xb8ly\\xa0f\\xaf\\xa8\\xf9|\\x1f\\xf7y\\x1f\\xfb-2,\\x7ff\\xc9\\xc7\\xfc\\xc5\\x13\\xf9\\x8av\\x0b\\x95v\\x9c\\xea_#q0\\xfet\\xf0\\xaf\\xba\\xe7\\xe4o\\xf8\\xfdQ\\xfc\\xea\\xd0\\xc6\\xdf\\x15|\\xa7\\xfeB\\x8b\\xff\\x00\\xa1R\\xaf\\xfc|j\\xbc\\x7f\\xcc}?\\x99\\xa2\\xc2\\xb9\\x9f(\"\\xf6\\xe0\\x10r\\x08\\xa5\\x84f\\xf2\\xccds:\\x8f\\xce\\x9fs\\xff\\x00!mG\\xfd\\xff\\x00\\xe9I\\x07\\xfc\\x7f\\xd8r?\\xe3\\xe53J\\xda\\x8c\\x90 \\xd9w\\xf3\\x1f\\xf50\\x9f\\xcd\\t\\xa5\\xf9CG\\xf7\\xb9\\xb3c\\xf4;\\x01\\x15(\\n\\x1f_Ss\\x10+\\x12\\x8c\\x83\\xe8\\xa4b\\x9cUq\\xe1\\x8e\\x0f\\xcdd\\xff\\x00\\xa2\\x81\\xfd)\\x81[v\\x13N?7(s\\xf5\\xc9\\xa6\\x12\\xdb\\x9f\\x96\\xebVY\\\\\\xe9\\xfa8X\\x01?l\\x90\\x0cu\\xceM5|\\xcd\\x87\\xfd\\x16\\x0e\\x1d\\x87>\\xb9\\xa9c\"V\\xca\\xcb\\xf2@1\\xedN\\xf9\\xb6\\x8f\\xdf\\xbf\\xe0\\xb55\\xa2)\\xb5\\x9c\\x94_\\xf5\\xc4~\\x82\\xafm@?\\xd5\\xaf\\x03\\x15I2Y\\x8c\\xed \\xd9\\xfb\\xfb\\x91\\xc0<\\xf1RF\\x92\\x18\"?fc\\x90y&\\x96\\xeb\\x1fn#\\x03\\x88\\x94\\x7f:\\xbf\\x08\\xc6\\x9f\\xa6\\xf4\\xff\\x00R\\r$\\xb5\\x1d\\xca\\xe2&\\xca\\xff\\x00\\xc7\\xb8\\xe9U\\x91\\t\\xd4o\\x87\\x9c\\xc3\\x08\\xdc\\xd6\\xbf\\xa7N\\xa2\\xa8[\\xe7\\xed\\xda\\xd1\\xff\\x00=j\\xac+\\x92\\x88\\xa2\\xc9\\xcf\\xda\\x0f9\\xe7>\\xb5Co\\xfcN\"\\x18\\xe3\\xed\\x83\\xf9\\xd6\\xce\\x0f\\xf7\\xba\\x1a\\xc8\\x8b\\x9db\\x0eO\\xfc}\\x1a$\\x82\\xe6\\xae\\xd5\\x03\\x84Q\\xc7j\\xa1 c\\xad\\x80:\\xaaV\\x8e8\\x1c\\x9e\\x95IA\\xff\\x00\\x84\\x8bR\\xf9\\x9b\\x883\\xd7\\xd8P\\xd0\\x93%\\x1b\\x85\\x9e\\xa7\\x97R|\\xa3\\xdf5R\\xd3\\x1em\\xff\\x00\\xcb\\xfc\\x1e\\x95\\xa3/\\xfcxj\\xdc\\x9f\\xf5\\x0e\\x7fJ\\xa5f\\x06u_\\xbb\\xd5?\\xad;j\\t\\xe8O(_\\xb0j?$\\\\FqD\\x00\\x0b\\x0b,#e\\xa3\\x06\\x9dq\\x8f\\xec\\xcdC\\xee\\xfd\\xc5\\xfeb\\xa4\\x8c\\x81a\\xa6\\x0c\\x0f\\xf8\\xf7QE\\x82\\xe6]\\xde~\\xddm\\xc1\\xff\\x00\\x8fq\\xfc\\xcdT\\x1d\\x1e\\xad]\\x9f\\xf8\\x99\\xbf\\x1d#\\x02\\xaa\\x8f\\xbb\\xf8\\xd6mjR\\x03\\xf7G\\xd6\\xaeY\\xe3\\xedw\\xdf\\xf5\\xec\\x7f\\x98\\xaag\\xa1\\xfa\\xd5\\xdb?\\xf5\\xda\\x87?\\xf2\\xcc\\x7f:#\\xb82\\xdcX\\xfbO\\x8a8\\xff\\x00\\x97\\xaf\\xf1\\xaa\\xf0\\xff\\x00\\xc8OY\\xe3\\xf8\\x9b\\xf9\\xd4\\xd0\\xe7~\\xb7\\xcf\\xfc\\xbe5Co\\x9f\\xb6k\\x1f\\x8f\\xf5\\xad\\x19$\\x83\\xfeB\\xb7\\xfc\\xff\\x00\\xcb\\xb2\\xd4p\\xff\\x00\\xc7\\xe6\\xb1\\xfe\\xff\\x00\\xf5\\xa9\\xd4\\x7f\\xc4\\xd3\\\\\\xe0\\xfd\\xc8\\xff\\x00\\x95En?\\xd2u\\xcf\\xf7\\xbf\\xc6\\x98\\x00\\xff\\x00\\x8fo\\x14\\xf1\\xff\\x00-d\\xfeT\\xc5\\x1f\\xf1\"\\x9b\\x8f\\xe1?\\xce\\xa6!\\x85\\x87\\x8ar\\x8c3q)\\x19\\xf4\\xa5\\x89Ch\\x90\\x8d\\xe4d7oBi \\x18G\\xfcN\\xb4N?\\xe5\\xd7\\xfci%\\x1f/\\x8cN\\x0f\\xfc\\xb1\\xa7\\x9f\\xf9\\x184\\x9eO\\x16\\xbf\\xd0\\xd4\\xb7\\x1b\\x7f\\xb35_\\xdd\\xa0\\xc8_\\xe6([\\x00\\xd5G+\\xe1\\x13\\xe5\\xb6<\\x9e\\x7f\\xef\\x9a\\x8e\\xdd\\x0bX\\x7f\\xaf\\xc7\\xfcLCt\\xf4\\xc5hE\\x8f\\xb1\\xe9\\x9d?\\xd4\\'\\xf2\\xaa\\xf6g\\xfe%\\x92\\xf2\\xbf\\xf1\\xf0\\xdf\\xca\\x9a@G\\x08S/\\x89A\\x0f\\xff\\x00\\x1f\\xd9\\xe3\\xd8\\xd3\\xe1\\t\\xf6\\xaf\\x13\\x12\\x07\\xfc\\x84\\x89\\x19\\xedKlW\\xcd\\xf1>q\\xff\\x00!\\x06\\xa2\\x0c}\\xa3\\xc5_{\\xfeB\\r\\xfc\\xe8\\x03.\\xe0\\x93\\xabj]>\\xf8\\xfeT\\x90\\x9c]\\xd8\\x9c\\x1e.\\xa3\\xcf\\xe7Kq\\x8f\\xedmO\\xaf\\xdf\\x1f\\xca\\x99\\x10\\x1ej\\x12W\\x8b\\x84\\xcf\\xd3\\x9c\\xd6Or\\x8b\\x12\\x957\\xba\\xb1\\x12\\x906\\xaf\\xf2\\xa5I\\x187\\x87\\xb1\\x11\\x1bC\\xf4<\\x9c\\xd32\\xbe~\\xa0H\\r\\xe9\\xcfj\\x8f-\\xb3O\\xed\\x95?\\xca\\x98\\x16\\x15\\xa4U\\xb3\\xc4\\xb6\\xe7\\x17\\x84\\xa8=s\\xcd&\\xf97\\\\|\\xeb\\xfe\\xb9\\xcfN\\xf9\\xa8C\\x1f\"\\xddq\\xd2\\xe07\\xe5Q\\x93\\xf3I\\xf2\\xff\\x00\\x11\\xa0f\\xad\\xa8\\xff\\x00\\x89e\\xaf\\xbb\\xb1\\xfdj\\xd7\\xb6j\\x08s\\xfd\\x9d\\xa6u\\xff\\x00US~=kH\\xa37\\xb9\\x8ds\\xff\\x00!K\\xff\\x00\\xf8\\x08\\xfd+]1\\xf6k\\x11\\xe9\\x02\\xff\\x00*\\xc6\\x97\\x9dGR\\xf7\\x99\\xabh\\x9eH\\xe3\\x8e)Gv9\\x0e\\xe3\\x1fCTl\\xc7\\xee\\xf53\\x8e\\xb2 \\xabLO\\xd9\\xef\\x8e?\\xe5\\x8bU[\\\\\\xfd\\x8e\\xe4\\xfa\\xceO\\xe8*\\x9e\\xe2/\\x0e\\x83\\x91\\xd8\\xd6=\\xb6?\\xb4l\\xf9\\xec\\xc7\\xf45\\xa6\\xdf\\xea/9\\xff\\x00\\x96MY\\x96\\xbf\\xf1\\xfcz\\xf1\\x0bT\\xcbp\\x8e\\xc6\\xbeG\\x1f/R*\\x8c\\'\\xfe\\'>\"?\\xed\\x1f\\xe7W=\\x7f\\xde&\\xa9[\\xf3q\\xaf\\x7f\\xd7U\\xfe\\xb4\\xde\\xe0\\xb6,N\\x7f\\xe2]\\xa9\\xfc\\xdd#\\xaa\\xf6\\x9f\\xea\\xb5\\x0e\\x9f\\xeb*K\\x8f\\xf9\\x06\\xdd\\xf3\\xfd\\xdf\\xe6*;\\\\\\xfd\\x8e\\xe3\\xfe\\xbb\\x9f\\xe4)u\\x05\\xb1-\\xc9\\xff\\x00\\x89u\\xd0\\xcfWZ\\x95\\x7f\\xd4\\xdbr~\\xe0\\xfeUZ\\xe7?bA\\xc73\\xad\\\\\\xda\\xdbW\\xe4=)\\x81\\x91s\\xff\\x00!;\\xef\\xf8\\x0f\\xf2\\xaa\\xfd\\xbf\\x1a\\x9a|\\xff\\x00ij<\\x1f\\xbfP\\xf6Z\\xcd\\xeeZ\\x1az\\x8a\\xd0\\xb2\\xfb\\xda\\x97N\\x8bY\\xe7\\xef-i\\xd9\\x03\\xb3T9O\\xbe\\x9f\\xc4\\x05(\\xee\\x12\\xd8\\x9e\\x11\\x88o\\xf2X\\x13r\\xe4\\x02;U{l\\xf9\\xda\\xbf\\xcb\\xfc@\\x7f:\\xd2\\xc9\\xdb\\xfe\\xad\\x0fNv\\xff\\x00Z\\xce\\xb4\\xe9\\xa9u\\xfe\\x0f\\xebZ\\xb5\\xa9\\x05\\xb0\\xa8%\\x9d\\x809`\\xb9\\xfc*\\xad\\xb7\\xfa\\xddk\\x8f\\xf9h?\\x99\\xab\\xde\\x9dz\\x7f\\x85P\\xb5\\xc7\\xfcM?\\xdf_\\xebC\\xdc\\x16\\xc5\\x89\\xb1\\xfd\\x9b\\xa8\\xf4\\xff\\x00UIo\\xff\\x00 \\xdd?\\x9f\\xe1n\\xde\\xf4O\\xff\\x00 \\xdb\\xff\\x00\\xf7\\x05,\\x1f\\xf1\\xe5a\\xf3\\xafC\\xfdi\\xf5\\x02\\x13\\x9f\\xf8H-:\\x7f\\xa8?\\xc8\\xd4\\x97\\x1f\\xf2\\x0e\\xbc\\xe0rW\\xf9\\x8ag\\xfc\\xcc1\\xf2\\xa7\\xfd\\x1cS\\xeeC\\xfd\\x82o\\x91\\xba\\xaf_\\xadJ\\xd8d\\xc8\\xdf\\xe8\\x96##\\xfdJ\\xff\\x00*\\xafk\\xff\\x00 \\xf1\\xcf\\xfc\\xb6?\\xd2\\x95_\\xfd\\x1a\\x0cC+\\x1f$g\\x1c\\x0e\\x9e\\xa7\\x8a\\x8a\\x10M\\xaab\\xe1\\x80\\xf3\\x0f\\x00d\\xfet_`\\x1f\\tP\\xba\\xe6fA\\xfe\\x96\\xff\\x00SK\\x11\\x7f3\\\\\\xda\\x8a\\x7f\\xd2\\x9b\\xa9\\xe0sQBF\\xedG*\\xe4\\x89\\xf1\\x93N\\x84\\x9d\\xda\\xc7\\xccy\\xbajW\\x1d\\x8aSg\\xfbF\\xfb%3\\xbb\\xb5$`\\x19P`s:\\n%9\\xbf\\xbc\\xe4\\xfd\\xea#8\\x9e\\x03\\x9f\\xf9xJ\\x8e\\xa3-H\\x01\\xbb\\xd5\\xbe|m\\x89\\x7f\\x1a\\x80n#N\\x1b\\xff\\x00\\x88\\x81VH\\xcd\\xe6\\xacwc6\\xe0\\xe6\\xa2\\x01vhM\\xb7\\xac\\x87\\'\\x14\\xc0\\x8c)\\n\\x0f\\x96\\x0f\\xfaX\\x1di\\x8d\\xfe\\xb6\\x7f\\x93\\x1f9\\xe35?>[\\xf1\\x9f\\xf4\\xee\\rD\\xff\\x00\\xf1\\xf1s\\x99ns\\xbc\\xf7\\xa2\\xc0k&E\\xb5\\x90\\xc1\\xe2%\\x14\\xec\\xf29\\xa6\\x03\\xc5)?\\xbb\\x9b\\xd9\\t\\xadH2:\\xea)\\xefv?\\x9dl\\xd6<\\\\\\xeaZ\\x7f\\xbc\\xc6\\xb6;\\xfe4\\xa29\\x11J\\x7f\\xd0\\xef\\xff\\x00\\xeb\\x9e?:e\\xb0\\xff\\x00\\x89t\\x1e\\xee\\xc7\\xf5\\xa5\\xb8?\\xf1/\\xbc\\x19<\\x95\\x15$\\x1eW\\xf6n\\x9b\\x98\\xa5\\xce\\xcc\\x9c{\\xd1\\xd4]\\x02S\\xfe\\x83\\xa9\\xff\\x00\\xd7\\x06\\xfeUB\\xd0\\x13uy\\xd3\\xfe=\\xcf\\x7fz\\xbdq\\xe5\\xff\\x00f_\\x90\\xd3}\\xda\\xa9j>}S\\xa7\\xdd\\x1f\\xce\\x93\\xdc\\x16\\xc6\\x8e\\x0e_\\x83\\xeb\\xfa\\xd5+P|\\x9b\\xf3\\xcf3b\\xaez\\xfc\\xc6\\x9c\\x0f\\x1f\\xea \\xabkQ6S\\xb9#\\xfb9\\xc7\\x97\\xd6\\xe1{\\xd3\\xed<\\xbf\\xec\\xe5\\xcc\\xae3+\\x1ae\\xd9_\\xb1\\xdb\\x80\\x84f\\x7f\\xe8j[`\\xbf\\xd9v?\\xbePIn\\x0f\\xd6\\xa5n>\\x84\\xed\\x1cl\\xa8<\\xe8\\x1b\\r\\x903\\xceh*\\xc1\\x97\\xf7M\\xd7\\xb5)\\x8d\\xf0~T\\xfc)\\xa0\\xb8#\\xf7\\xb3\\x0eG\\x15B0\\xe6$\\xea:\\x9f-\\xfe\\xb9\\xaa?\\xf9\\xe7O\\x90\\x93}\\xa9\\x1e9\\x99\\x8f\\xebL\\xfe\\xe5`j\\x86\\x9f\\xbc+F\\xd3\\xfe=\\xef\\xf8\\xff\\x00\\x96\\x82\\xb3\\x8fo\\xa5jY\\x8f\\xf4\\x1b\\xae?\\xe5\\xb9\\xfeB\\x9c7\\x13\\xd8\\xb6I\\x0b1\\x04\\xfd\\xc3T\\xad?\\xd5\\xdfr\\x7f\\xd6-]o\\xf8\\xf6\\xbe\\xe3\\xfeY\\xb5T\\xb4\\x1f\\xe8\\xf7g\\x1f\\xf2\\xd7\\x15\\xa3\\xdc\\x85\\xb1pt\\x1f\\x85R\\xb4\\xff\\x00U}\\xc7\\xf1\\xadYw\\x84,\\xa3\\xcfRv\\x91\\x85\\x19?\\x95T\\xb7\\xf3|\\xab\\xcd\\xbeH\\x1eoV\\xff\\x00\\n\\x1e\\xe0X\\xb8\\xcf\\xf6e\\xf0\\xda\\xdd\\x13\\xf9\\x8aH\\x9e1gj1+\\x1f/\\x90\\xa2\\xa2\\x9d?\\xd0\\xaeX\\xdc\\xce\\xc4\\x11\\xd4\\xf1\\xc9\\xf4\\xabQ\\x17[\\x1d/\\x96\\xc7\\x92\\xbd\\xba\\xf1He_\\x9c\\xeb/\\xf3l>_\\xd6\\x9dp\\x8a,eo\\xb4\\x16;\\xd7\\x92\\xdc\\xfeT\\x06_\\xf8H\\xaf\\x89\\x89q\\xe4t\\x1fAN\\xb9\\xf2\\x7f\\xb3\\xfeS.L\\x8bIl2\\x7f\\x9cZ.m\\x9c\\xfe\\xe3\\xae:qU\\xad\\xcc\\x7f\\xd9\\xc9\\xc5\\xc6|\\xc6\\xe88\\xa9\\xbe\\x7f\\xb3K\\x89&\\xc7\\x95\\xcf\\xe5Q[g\\xec\\x11q\\x11\\xf9\\x9b\\xa8\\xe6\\x80!\\x84g\\xed\\xc7{\\x7f\\xc7\\xc1\\x1d>\\x94D\\xc8$\\xd4\\xf2\\xf2\\x0f\\xf4\\x96\\xedR\\xdb\\xff\\x00\\xab\\xd4\\xf8\\xff\\x00\\x97\\xb3I\\t\\xc2j\\x9d\\x7f\\xe3\\xf0\\xd1`\\xb9FB\\r\\xed\\xd6\\x08\\xfb\\xde\\x94\\xd4\\xdd\\xbc\\x10:J\\xb4\\xf9q\\xf6\\xab\\xcc\\x15\\xff\\x00Y\\xda\\x92/\\xbe\\x83{\\xf3p\\x9d\\xea:\\x8c\\x9f\\x7f\\xef.3\\x0cd\\x98F}\\x055Y7h\\xff\\x004\\xd9\\x12\\x8e\\xfcb\\xac\\xe3\\x17\\xf7\\x83-\\xff\\x00\\x1e\\xcb\\xd7\\xebU\\x86<\\x8d\\x1b\\xf7Q\\xff\\x00\\xac^G\\xe3T\\x03\\xb7\\x0f.\\xe7\\xf7\\xab\\xff\\x00\\x1f\\xe0\\x8e=\\x08\\xa8$f\\xfbL\\xff\\x00*\\xf64\\xf2\\x17\\xf7\\xfc\\xc9\\x9f8\\x7fO\\xf1\\xa8\\xdbw\\x98\\xdc\\xc3\\xd0\\x1f\\xce\\x90\\xcd\\x8f\\xca\\x9a\\xe7\\x16\\xb7\\xe7\\xfe\\x98\\xb5[\\xfd\\xc9?z>\\x9d\\xba\\xd5k\\x85\"\\xc3P \\x8cm\\x15\\xab23-\\xff\\x00\\xe4%k\\xfe\\xe15\\xb0\\xa0\\x1d\\xd9\\x9fnG\\x1cVU\\xb0\\xff\\x00M\\xb88\\xe9\\x01\\xad\\x1c\\xf2x\\xeeiD\\xa9\\x13\\xf9}?|\\xbf\\x95!F\\x18\\xf9sQ\\x03\\xc0\\xf9\\xc0\\xe6\\xa6\\x126\\x17)\\x9a\\xa2J79\\xfb\\x05\\xc6A\\xe5\\xc0\\xa6Z\\x0f\\xdd_\\x1fV\\x0b\\xf9T\\x97\\x8c\\x86\\xd2\\xd7\\x11>~\\xd0:\\xd2\\xd9\\x84\\xfe\\xcf\\x9b3\\x10|\\xe3\\xfc\\x85K\\xf8\\x87\\xd0\\xb1\\xebG\\xaf4\\xf2\\xbc\\x7f\\xaf\\xa6a\\xf2\\xdf\\xbb\\xaa\\x11F\\xef\\xfdV\\x9f\\xcf\\xf1\\x93\\xf9T\\xf0\\xff\\x00\\xc7\\x86\\x9d\\xf3\\x9f\\xf5uZ\\xec\\x9d\\xdag?\\xc2\\xdf\\xd2\\xadF?\\xd0\\xb4\\xdf\\xfa\\xe0\\xb5+v>\\x84\\x9c\\xf1\\xfb\\xe7\\xa9\\x03\\xb6\\x00*\\xb5\\x1e>a\\xc5;\\xa68\\xee*\\x84a7\\xfa\\xfb\\xae\\x07\\xfa\\xc6\\xfet\\xdfO\\xad.>\\x9d)?\\x11X\\x1a\\x8d?x~\\x15\\xa7l\\xc8\\xbaq&h\\xc7\\xef\\x9b\\xa9\\xac\\xc3\\xd4V\\xad\\xaa\\xc6,\\xe1cm\\x03\\x12\\xc7\\xad8\\xee)\\x0fy\\x18\\xdb]m\\xb2\\x98\\x8f,\\xe4\\xb7\\x02\\xa0\\xb7@\\xd6\\xd3\\x13qp\\x07\\x9aF\\xd58\\xfdj\\xfc\\xa5\\x0e\\x9f\\xab~\\xe8\\x8f\\xdc1\\xfd*\\x0bD\\xce\\x9e\\xc7\\xccQ\\xfb\\xe6\\xe2\\xad\\xeeOB]\\xb1-\\xb5\\xe6\"\\x88~\\xe9\\xbe\\xb5^\\xd3\\xfe<\\xee\\xf8?\\xeb\\xcf\\xf2\\x15jT\\x7f\\xb2j?/\\xfc\\xbb\\xbf\\xf2\\xaa\\xb6\\xdf\\xf1\\xe5/_\\xf8\\xf8?\\xd2\\x87\\xb8\\x0e\\xb9\\xff\\x00\\x90|\\xdf(\\xe6E\\xa9\\xa3b\\xb6Zw\\xcc\\xa7\\xfd\\x1d?\\x95V\\xba\\xcf\\xd8\\x8f\\xce\\x7f\\xd6\\n\\x9d?\\xe3\\xd6\\xcb\\xe5?\\xea\\x05\\x00V\\x1f6\\xb9\\xaa\\xe7g\\xfa\\x91\\xfc\\x85:\\xe4\\x7f\\xa0\\xf4\\x1f\\xebq\\xd7\\xebH\\x9f\\xf2\\x1c\\xd6y\\xff\\x00\\x96_\\xe1Ku\\x8f\\xb0\\xaf_\\xf8\\xf8\\xff\\x00\\x1aKa\\x96\\x0f\\xfcz\\xcb\\xc1\\xff\\x00R}\\xaa\\x1bs\\xff\\x00\\x12\\xcbQ\\x86\\xea\\xdd\\xe9\\xc5\\xd7\\xec\\xd2\\xf0\\xe4\\xf9g\\x81\\xd6\\xa2\\x84f\\xca\\x0f\\xdfI\\xb7$\\x85\\x1f\\xd6\\x9a\\x06\\x10\\x12#\\xbf\\x02\\x079\\xb9\\' \\xf1\\xf9\\xd1\\n\\x82o\\xb3\\x9f\\xf8\\xf8<\\x0e\\x94\\xb6\\xf8\\xf2ox\\x1f\\xf1\\xf6i!8\\x8bP<\\xff\\x00\\xc7\\xf1\\x1f\\x9d (\\xcb\\xff\\x00!\\x0b\\xee\\x07\\xdf\\xa2?\\xf5\\xd1\\xf5\\xff\\x00\\x8f\\x88\\xff\\x00\\x9d,\\xdf\\xf1\\xff\\x00\\xa8u\\xff\\x00YD\\x7f\\xeb!\\xfb\\xbf\\xf1\\xf3\\x1f\\xf5\\xa8\\xea2\\xd1\\xff\\x00\\x8f\\xa6\\xe7\\xad\\xacc\\xf5\\xa8\\x86|\\x9d\\'\\x8e\\x93\\xa7\\xf35\\'>\\x7f\\xfd\\xb0^\\xd8\\xfe1L\\\\\\xec\\xd1\\xfa\\xff\\x00\\xaeO\\xfd\\x08\\xd5\\x00\\xdf\\xf9f\\xdf/\\xf1\\x0f\\xfd\\x96\\x98\\xff\\x00\\xeb\\xa6\\xf9j^6L\\x08\\xe3+\\x9f\\xd0SK7\\x997\\x1f\\xc6h\\x03K\\x8c\\x8e\\x9f\\x85Ep\\xcf\\xfd\\x990\\xdeH,\\xb59^\\x7f\\xd6\\'J\\xa7r\\x1f\\xec\\xb6\\xd9A\\xcc\\xe2\\xad\\xec@\\x96g\\x13j\\xa7`?\"\\xd6\\x97\\xee\\x08\\xcf\\xca\\x0f\\xd6\\xb2\\xed\\xbf\\xd4^\\x9c\\x7f\\x10\\xab_\\xc5\\xd0~T\\xa3\\xb0\\xe5\\xb96\\xd5/\\xc4\\xf2\\x1f\\xc3\\xfa\\xd3H|\\x9e\\x87\\xe9H3\\x85\\xe7\\x8f\\xae*ue\\xf9\\x7ft:U\\x08\\xcb\\xba\\xce\\xdb\\x11\\x83\\xfcF\\xa6\\xb7\\xff\\x00\\x8f+n:\\x96?\\xad6\\xf4\\x83.\\x9b\\xf3\\x0e#j\\xb5\\x02\\x0f\\xec\\xbd?\\xfd\\xd3\\xdf\\xde\\xa7\\xa8\\xde\\xc3\\xb2\\xd8O\\xdf\\xcb\\xf9\\xd3\\xd4\\x9c\\xb6djiV\\x08I1\\xe3\\xdc\\xd5v\\x96,\\xe0\\x16c\\xe8\\xb5D\\x90^\\x10n\\xac@)\\x8f#?\\xad_\\x1e@\\xb3\\xb4\\xcd\\xca\\xae\"\\x1d\\xeb&Vst\\x99\\xb7\\xdav\\x81\\xef\\x8a\\xba\\xb1 h\\xc9\\xda\\xe7h\\xfb\\xdc\\x8f\\xca\\xa6\\xe5Xw\\x99\\x96`\\x96\\xb7.s\\xd7\\x18\\x1f\\x9d5\\x96\\xe8\\xc3s\\xba\\xe7`\\x08\\xc7\\n3\\x9f\\xc6\\xad\\x86\\xc2\\xa8\\xfb2\\x81\\xed\\xc7\\xe9M\\x91\\xe3\\xfb\\x0e\\xad\\xfb\\xc7\\xff\\x00\\x8fg\\xe0\\x8fj`\\x8c\\x0f\\xefu\\xa3\\xbd\\'g\\xfa\\xd2\\xff\\x00\\x11\\xfaV%\\x8d?\\xd2\\xb6-\\x88\\xfe\\xcb\\xb0\\xfa\\xb7\\xf3\\xacs\\xde\\xb5\\xe0\\x07\\xfb;N\\xfb\\x98\\xd8\\x7f\\x9dTw\\x14\\x89&#\\xfb?S\\x19\\xff\\x00\\x96F\\xa3\\xb6\\xcf\\xf6|X\\x91\\x87\\xce{\\xd2\\xce\\x07\\xf6}\\xf9\\xe7\\xee\\x8f\\xe7E\\xbf\\xfc\\x83\\xad~f\\xea\\xdd:\\xf5\\xaa[\\x93\\xd0\\x95\\xf7\\xfd\\x8fT&\\xe5\\xcf\\xfa;\\x0f\\xd0\\xd46\\xb9\\xfe\\xcfo\\xbd\\xfe\\xb9\\xaaY\\x7f\\xe4\\x1f\\xaap\\x07\\xeeZ\\xa2\\xb7\\xcf\\xd8\\x07\\x1f\\xf2\\xd5\\xbb\\x8aa\\xd0m\\xce~\\xc8>n<\\xf1S\\xaf\\xfa\\x9b\\x0f\\xdfE\\xfe\\xa5p\\rW\\xb9\\xdemP\\x18\\xc0\\xfd\\xf8?\\x86\\rH7\\x98\\xed\\xb1\\x10Q\\x81\\xf3\\x1eO\\xe0(\\x02\\x00q\\xabk\\x19y\\xb9B\\x06\\x06s\\xd3\\xa5-\\xc1\\x93\\xec\\xd0f%_\\xdf\\x01\\xcf\\xde\\xef\\xd6\\x96\\x11\\xff\\x00\\x13]hy\\x8eq\\x19\\xe4\\xf5\\xa5\\xba\\xff\\x00\\x8fX:\\x7f\\xc7\\xc8\\xfe\\xb4\\x96\\xc3\\'eAi|\\x02\\x00<\\x96\\xfeF\\xa3\\x87\\xfeA\\xd6\\x1c\\xff\\x00z\\x9e\\xe4y:\\x98\\xe3?ecPE\\x9f\\xb2\\xf8\\x7f\\xfe\\xba\\xb9\\xfc\\xb3@\\x0c\\x89\\xb1m\\x0f^u\\xc2\\xae\\x14\\x18o\\x9e\\xaa\\xda\\x904\\xcb~:\\xc8\\xc6\\xad\\x19 \\t\\x93p\\xb4!=\\xc8\\xca0V\\xfd\\xd1\\xa6\\xf3\\x81\\xf3\\xd3M\\xc3\\xb3\\x11\\x1d\\x8c\\xcc}{S|\\xab\\xa69{\\xe0\\xa3\\x18\\xc2\\x8ei\\\\\\n\\x97$\\x1b\\xa8\\x7fz\\xb8\\xf2?Z\\x99\\x1e\\xe7\\xec\\xd6\\xca\\x96\\xc3\\x84\\x03q\\x18\\xaa\\x97\\x08\\xab{*\\x82\\xdftu5\\xac\\x15\\xc5\\xbd\\xaf\\xc8\\xdcF\\xbd>\\x94\\x8a \\x11\\xe6D2\\xea\\x17-\\xec:U\\xd4\\x11\\x05\\x01-\\xed\\x80\\xe9\\xd2\\xa0\\xcf\\xbbR\\x13\\xc8\\xe0\\xfeuD\\xb2\\x8d\\xc0\\x1f\\xdb\\xe4m\\xc7\\xef#\\x1f\\xa5j\\x18\\xdb\\xe6\\xc3\\xa9\\xe2\\xb1\\xd8\\x9f\\xed\\xb5\\xf9\\xb3\\xfe\\x96\\x9f\\xd2\\xb5|\\xc6\\xc2\\x9f-\\x07\\x1f\\x9dJe44\\x82\\x08\\xccR\\x8f\\xc2\\xa1\\x95\\xbf\\xd0\\xb5\\x0f\\x98\\x7f\\xab5hJ\\xe7w\\xfa:~#\\x8a\\xab9\\'N\\xd4\\xf3\\x19\\x1f/\\xb56##\\xb0\\xfaQ\\xdb\\xa7zO_\\xad/\\xf0\\xb5d\\x8bC;\\xb5nE\\x9f\\xec\\xdd7\\xe6\\x8f\\xfd_CX}\\xcdn\\xc5\\xff\\x00\\x1eZo\\xca\\x7f\\xd4/j\\xb8\\x13\"\\x1b\\x83\\xff\\x00\\x12\\xfb\\x91\\xf6yFq\\xf4\\xa7\\xc3\\xff\\x00\\x1e\\x16_2t?\\xce\\x9bq\\xbb\\xec\\r\\x87S\\xfb\\xc1\\xd3\\xb526ckl\\x16\\xd18\\x04\\x16n\\x83\\xfcj\\x85\\xd0|\\xfeg\\xd9\\xe6\\x1f\\xe8\\x981\\x9e\\xa7\\x9a\\x8e#/\\xd9b\\x028\\xc7\\xcc~f\\xe9K*\\x01gxL\\xb2\\xb1\\xc0\\xe7\\xb5In\\x07\\xf6u\\x96e\\\\e\\xbf\\x9d%\\xb8\\x15\\xe7P-\\xad\\xce\\xf9\\x8b\\x19\\xba\\x9e\\x9d*\\xf8<\\'\\xdc<\\n\\xa9u\\xfe\\xa2\\xc7\\x83\\xcc\\xa7\\xf9T\\xf9\\xc4\\xb6\\x03#\\x969\\xfd(\\x1a!\\x88\\xff\\x00\\xc4\\xd7\\xc4\\x1c\\x7f\\x11\\xfet\\xc9\\xcel4\\xb3\\x95\\xff\\x00Z:})#\\xcf\\xdb\\xbcO\\xf3\\x90ry\\xf4\\xa6HG\\xf6v\\x91\\xff\\x00]O>\\xa6\\x8b\\x85\\x89\\xdf\\x1en\\xb8r\\xdcY5$Dy^\\x1e\\x1b\\x8fY;}h\\x7f\\xbf\\xe2/\\xbf\\xff\\x00\\x1e\\xa6\\x92?\\xb9\\xe1\\x9e\\xbf\\xf2\\xd7\\xfa\\xd2\\x19\\x14j>\\xcf\\xa6\\x9c\\x0f\\xf8\\xff\\x00\\xfe\\x94\\xe8\\xbf\\xd4Zp?\\xe4\\'\\xfd\\r\\x11\\xff\\x00\\xc7\\xb6\\x97\\xff\\x00_\\xdf\\xd2\\x91\\x0e\"\\x8b\\x9eE\\xd1a\\xc5\\x00V\\x9b\\xfe?\\xb5\\x0e?\\xe5\\xa9\\xa23\\x87\\x7f|\\x0f\\xce\\xa4\\x95\\xbey@^rI5\\x00\\xe8\\xdf1\\xea*z\\x8c\\x99\\xdb\\r/\\xfdse\\xfdj1\\xd7\\xa8\\xe2J0y\\xeb\\xd6\\x9c:\\xa0\\xf2\\xcfSL\\x06\\xff\\x00\\x13\\xe3\\xe9O\\xca\\xd1\\x81\\xc7=\\x08\\'\\xf3\\xa9\\x02\\x92\\x91c\\x1ft\\n\\x00\\xd3l(\\xf9\\xa4\\x87\\x1fZ\\xcc\\x9d\\x91\\xae#;\\xdc\\x81\\x1e*\\xf2\\xdb\\xc7\\xb8\\x17\\xb9\\x95\\xcf\\xa7j\\xa3r\\x10_N\\xa24\\x00\"\\x0e>\\x95n\\xe4\"x\\xd6\\xec\\xd9\\xdb\\xedh\\xd51\\xd7vMH\\xb0\\xc2\\x19\\xc9y\\\\\\xfb\\x8a\\x9e(O\\xd8,10\\xe6\\x15\\xe3\\xf0\\xa5 \\x8e<\\x8e\\x9e\\xd4$\\x02\\xae@L4`zR\\x99\\x1f|#\\xcbNq\\x9ezS?\\x13\\xd2\\x93#\\x8f\\x98\\xd3\\x03:\\xe4\\x8f\\xed\\x8b\\xec8\\xff\\x00X\\x05o\\x8d\\xb8o\\xde\\x0e\\xa6\\xb9\\xc6\\xff\\x00\\x90\\x93\\xf5\\xe6\\xe0V\\x91\\'/\\xfb\\xc65)\\x8e\\xc5\\xe2#\"O\\xdd\\xaf_Za\\x89~l\\\\\\x1f\\xa7\\xd6\\xaae\\xbf\\xdb\\xc5=pW\\xfds\\x0e\\x0f\\x14\\xee+\\x19\\xd8\\x1f\\xdbrr\\x9f\\xf1\\xf4Ei\\x11\\xcew\\xaf\\xe7Y\\xb1\\xf3\\xad\\xa9\\xf5\\x9d\\xff\\x00\\xad_em\\xc7,)DlS\\xb7p\\xc30\\xfat\\xa8\\xa7\\xdf\\xfd\\x9bs\\xfb\\xd59e\\xfet\\xfd\\xbc\\x7f\\xadN\\x9dqQ\\\\\\x11\\xfd\\x9eF\\x0f\\xde\\x1d\\xe8`\\x8c\\xce\\xcb\\xf8Q\\xde\\x81\\xd7\\xa5\\'s\\xf5\\xa8-\\x08\\x7f\\xa5k#\\xb7\\xd9\\xec\\xd4&\\xe2\\x10s\\xd1\\x7f\\x13Y_\\x85n a\\x05\\xb8\\xc48\\xd8:S\\x81,\\xa7p$\\x16\\xcaZ\\xe0\\x93\\xe6\\xe3\\x03\\xa5[\\x8b\\x1fa\\xd3\\xbfx\\x7f\\xd4\\xaf\\x18\\xaa\\xd7X\\xfb-\\xb7\\xee\\xdc~\\xf8T\\xe0\\xe3O\\xb2>b\\x1f\\xdd-R\\xdcO`\\xb8\\xff\\x00\\x90m\\xef\\xee\\xd7\\xaa\\xf4\\xfa\\x8alG\\x1aM\\xbf\\xcc\\x7f\\xd4\\x9aK\\x8f\\xf8\\xf0\\x93\\xf7C\\xef/\\xf3\\xa6\\xfc\\xdf\\xd8\\xf68\\x95?\\xd5\\xaey\\xed@!\\x97\\x19\\xfb6\\x8a~\\\\\\x16=*f\\x03\\xed\\xfa\\x7f\\'\\x19<\\x11\\xc6sU\\xe6\\xdb\\xff\\x00\\x121\\xba>\\x0f\\xf8U\\x87?\\xf10\\xd1\\xfeiz0\\xa0\\x08\"#\\xed>(\\xfb\\xfd[\\xa7\\xd6\\x98\\xf9\\xfb\\x0e\\x83\\xf3\\x1f\\xf5\\xc7\\xadI\\x0f\\xfc|\\xf8\\x98\\xe7\\xfeZ\\x1f\\xebLo\\xf8\\xf2\\xf0\\xc7\\x07\\xfda\\xa4\\x04\\xcf\\xf7\\xfcG\\xf2\\xe3\\xfd\\x08\\x7f#Q\\xa7\\xfa\\xbf\\x0f|\\xc7\\x84\\x92\\x9e\\xff\\x00\\xeb\\xf5\\xfe\\x0f6\\xaa)\\x83w\\x93`\\xbbFUN(\\x01\\xa9\\x9f\\xb3B\\x08a\\x89\\x89\\xcd\\x00\\x8d\\xb0\\x1e?\\xe3\\xe7\\x07\\xe9I\\x95\\xfb5\\xa3`\\x7f\\xc7\\xd7\\x1c\\xfaUl\\xb7\\x96\\x83\\'\\x1b\\xb3@\\xc6\\xb9\\xcc\\xd2\\x1c\\xb7ZA\\xf7\\xbbR\\x9cf\\x95s\\xbd\\xb0;T\\x8cw;\\xbe\\xe8\\xc94\\xe2p\\x83\\xe6\\x1e\\x94\\xf0\\x00l\\x00y\\x8d\\x8f\\xe4)UA]@a\\xbf\\xd6S\\x00\\xf9\\xbc\\xd99 \\x18\\x8f8\\xa8\\x81\\x18_\\x9d\\xff\\x00*\\xb0c\\xfd\\xd9\\xc4\\xef\\xd2\\xa1\\xd9.O\\xcb\\x1d\\x16\\x15\\xcd\\xad\\xf1\\xe4\\x12_5\\x8dpG\\xf6\\x8e\\xa5\\xf3uz\\xbcs\\xb8pzVkg\\xeds\\x0c\\xff\\x00\\xcb\\xc1\\xfeuNBQ:\\x14\\xe2\\xda\\xd3\\xf7\\x91\\xf1\\x1a\\xf7\\xf6\\xa7\\x16M\\xb1\\xfe\\xfd:\\xe3\\xebT2~_\\x98}\\xd1FO\\xaa\\xd3\\xbe\\x81b\\xcb\\xac^X\"H\\xb3\\xecj\\x0e\\xfdE\\';O=\\xe9\\xc0|\\x8d\\xcfA\\x9a@d\\xaf\\xfc\\x84\\x93\\x91\\xfe\\xbf5\\xa6\\x19\\x0b\\x01\\xe7\\x03\\xc5g\\xc3\\xff\\x00![O\\x979g8\\xfc\\rj\\xb0Bc\\x06\\xde!\\xf8sJ(\\x18\\xbf6\\x13\\n\\x84b\\x9a:\\xc9\\xbboC\\x8e)X0\\x11m\\x9d\\xcf\\xb1\\xe6\\xa2\\xdc\\xfbd&>@\"\\xa8E\\x18?\\xe4,9\\x1d^\\xb53\\x82\\xbf*\\xf4\\xed\\xd6\\xb2\\xed\\xbf\\xe3\\xf5\\xfeo\\xf9fj\\xec\\x85\\x04R\\xe6r8\\xed\\xd6\\x94F\\xc9\\xb0\\x9b\\x98\\x92\\x07\\xd7\\x8f\\xd6\\xaa\\\\\\x98\\xfe\\xcd\\x18\\xf3c\\xff\\x00X)\\xa8\\xb2\\x14m\\xa2TRFKrO\\xd0T3\\xaa,6\\xf8\\xdcI\\x90\\xf2z\\xd0\\xd8$V=G\\x06\\x93\\xb1\\xa3\\x1d9\\x14v\\xfcj\\n\\x1b\\xe9\\xd6\\xb7\\xb27\\x01\\xb8\\xaeI\\xac%\\xff\\x00Y\\x0fO\\xbe+^C\\x8b\\xbb\\x1e\\x0e\\x004\\xe2\\xec\\x84\\xc8\\xee\\xc0\\x10Xp\\xbf\\xeb\\r,\\x84}\\x8fL\\x1eF2\\x883\\xf8TW$\\xf9z\\x7f\\xfb\\xe6\\xa7\\x90\\x9f\\xb0Y\\x0f1FY\\x7f\\xcei\\x8a\\xc3\\'\\x0e4\\xd8\\xc1\\x98\\x12$\\\\\\xd2\\xb1#J\\xb1\\xfd\\xdb}\\xc5\\xe3\\xd6\\xa2\\x9cJ-\\xa1\\xcc\\x8b\\x8f0|\\xbbz~4\\xf7\\xdd\\xfd\\x91\\x08\\xc8\\xc6\\xd8\\xe8\\x18\\xc9\\xf6\\x19\\xf4,\\x15\\xf7\\xfd*\\xc3\\x825\\x1d\\x17\\xa7\\xdc\\x93\\x15\\x04\\xd87z\\x1f\\xc9\\x8f\\x9f\\xfa\\x8a\\x90\\x86\\xfe\\xd0\\xd3\\xf0[\\xfdK\\x9ab#\\x87\\xfdw\\x89:\\xfd\\xef\\xf1\\xa6\\xb0?e\\xf0\\xe7\\xb1&\\x88\\xcb\\x07\\xd5\\xbf\\xda\\x93\\x1f\\xce\\x90\\xed\\x02\\xccl<\\x90>\\x94\\x0cs\\x13\\xba\\xe5\\xb6\\x8f\\xb8\\x0f\\xe5L.\\x00\\xd3\\x8f\\x947lc\\xf9\\xd3dd\\x12\\xdf\\x05\\xd8A\\x88.j\\x0e\\xcb\\xc8\\xe9R\\xd8X9\\xc2\\xf2(\\xa3\\xf0\\xa7(\\xcbt\\xe6\\x90\\xc6\\x7f\\x10\\xfaS\\x94\\x90g\\xe3\\xd3\\xf9\\xd3\\x98\\x80\\xa4`R &-@\\x04$\\x95\\x1f\\xce\\x9a\\x02\\xce\\x18^\\xe9\\xff\\x00\\xbb?\\xeb$\\xa9\\xb07>!l\\xe7&\\xa5\\x00d\\xf5\\xa6\\xb7O\\xba\\xbdj\\xacM\\xc8\\xc9\\xe5\\x7fv\\xd4\\x99?\\xf3\\xc9\\xff\\x00:_N\\x1a\\x8a\\x00\\x9f\\xb7QYC\\xfe?b\\xe9\\xfe\\xbe\\xb50\\xfeT\\xc7\\xb6\\xd3Y\\xb1\\x00u\\x0b!\\x8f\\xf9kHf\\x8e9\\xe9R*\\x8d\\xae|\\xc2~jvGO+<\\x9e\\xa2\\x8d\\xa3\\x93\\x95\\x1fN\\x95I\\x13qy\\xe3\\xe5S\\xf4\\xa6\\xb7\\xfc{\\xddq\\x8cD\\xc6\\x9d\\x9f\\xbd\\xc2\\x9a\\x8e_\\xf8\\xf1\\xd4\\xfe\\x7f\\xf9`\\xdc~\\x14\\x01\\x9dm\\xff\\x00!\\x18zp\\x8ckX\\x8e\\x9c\\x1e\\x95\\x99k\\xff\\x00\\x1f\\x97?/\\xfc\\xbb\\xb5h1P\\x1c\\x97\\xc0\\xcd(\\x8eC\\xb8\\xec\\xc2\\xa1y\"6\\xf7Y\\x9a#\\x85#\\xa7z\\x8c\\xc8\\xecp\\x96\\xe4\\xf6\\xcfo\\xc4\\xd3Z,Z^\\xb3O\\xb9\\x84-\\xc6>Q\\xc1\\xa7pEH\\x95\\xcc\\xa0+\\x1c\\xfa\\x9e\\x00\\xad\\x05\\x88++\\x1d\\xae}O8\\xfc*\\xb5\\xaf\\x12jG\\r\\xf7G\\xd3\\xad_\\xc7\\x1fy\\xbf\\x0e\\x94\\xa2\\x02\\x168\\x1c\\x8f\\xa8\\xebTn\\x8ayzw\\r\\xf7\\x8fZ\\xbf\\xcf\\x03\\xe5m9\\xff\\x00\\x96\\xa2\\xb4Yq\\x7f\\x16Ny\\xe9\\x8a\\xcf\\x8b\\xfe?4\\xfeO\\xfa\\xf5\\xfeu\\xa2W7\\xcc\\x0b\\x920)\\xa1\\x10\\xdc\\x15\\xff\\x00\\x89o\\xcc\\x7f\\x8b\\xbf\\xd2\\xa4\\x94\\xff\\x00\\xa2G\\x82y\\x99j\\t\\x95\\x04\\xd6\\x00(\\xef\\xde\\xadN\\x17\\xec\\xf6|\\x8enTu\\xa6\\x04\\x13\\xe7\\xc8\\xb6\\xe4\\xfd\\xf1RI\\xb7\\xfb:\\xdf\\x93\\x9cG\\xfd)\\xb7\\x00l\\xb3\\xc1\\xff\\x00\\x96\\x9e\\x94\\xb2\\x87\\xfb5\\xa7\\xca~\\xfa\\xd0\\x010\\xff\\x00\\x89\\x86\\x87\\xf3/\\xfa\\xc0\\x7fZW\\'\\xedHw\\x8e\"\\xc51\\xb6\\x99\\x13\\xe49QG\\xfc\\xb7\\x84m\\x1f\\xea\\xcbS\\x10\\x83ak\\x8f\\x98\\xf0\\xb95\\x0b\\x91\\xe5\\xe9_\\xbdb|\\xba@\\xc4%\\xe6\\x14rME\\xdf\\xa0\\xa9l`z7Z;\\x8e\\xbd(\\xcf\\xca\\xd5 ^\\xbdrM!\\x88\\x07\\xce:\\xe7\\x15:\\x81\\xe6Z\\x8c7.)\\x06\\x01A\\xcei\\xc9\\x93\\x1c\\x1c\\xff\\x00\\xcbri\\x81^A\\xfe\\x97q\\xc1\\xe1\\xb1S\\xdb\\x0f\\xf4\\x8b\\xee?\\xe5\\x9d@\\xff\\x00\\xf1\\xf4\\xfc\\xff\\x00\\xcbJ\\x9a\\xdf\\xfe>5\\x1e\\x1b\\xee\\xd0\\xb7\\x02\\xf7f\\xfa\\xd4d\\xf3JO#\\x83\\xd2\\x9az\\x8a\\xb2B\\x8aN\\xc7\\xebK\\xce\\x05\\x00K q\\x1d\\xf9\\xe0\\r\\x84Vt8\\xfe\\xd0\\xb28\\'\\x86?\\xa5\\x14T\\xbd\\xc6\\x8d}\\xc8wci\\xe4\\xf0zR\\x10r\\x0f\\x9a\\xdfN\\xd4QT\\x89\\x0c\\x9f\\x9b\\xe5\\x1f\\x85W\\x9d\\xbf\\xd1Xl\\x1f7\\x1cQE\\x0ch\\xa5\\x11\\x90K0UbJ\\xe2\\xad\\x88\\x98\\xba\\xf9\\x92\\xc8}\\x87O\\xc6\\x8a) e\\xacF\\x15@X\\x87\\x1cb\\xa1\\x9bw\\xf6~\\xa5\\xcf\\xf0w\\xebE\\x14\\xc1\\x10Z\\xf4\\xd4x?}\\x7f\\xadY\\x91\\xb1\\x01>\\xc0\\n(\\xa4\\xb6\\x0e\\xa4\\x8aO\\x97\\x17)\\xca\\xe6\\xb3\\xee\\xc9\\xf3l?vF\\x10\\xd1E\\x0f`[\\x94\\xbdx\\xa3\\xf8zQEAC\\xe1\\xff\\x00\\x8f\\xeb\\x0f\\xfa\\xec*\\xfe\\xdf\\xf8\\x9c0\\x05?\\xe3\\xdf\\n\\xd8\\x008\\x06\\x86bV,\\x91\\xd0\\x01\\xf5\\xa2\\x8ac\"b\\xc2{1\\xbf\\xde\\x98\\xed\\xfb\\xf2Ct\\x8f\\x14QR\\xc0\\x8b\\xd6\\x8cu\\xe6\\x8a)\\x0cr\\x8f\\x9b\\xde\\xacm\\x01T\\xe0d\\xd1ER\\x01Wq\\x8a\\xc4\\xed\\x1cHO\\xf3\\xa20~\\xcf\\x18\\xe3\\xeff\\x8a(\\x11]\\xc1\\x17\\x0cr:f\\xa6\\x87\\x86\\x9c\\xe7\\xef-\\x14R\\x19g#kq\\xde\\x99\\xdc\\xd1E1\\n;\\xf3F94QL\\x0f\\xff\\xd9'}\n" 651 | ] 652 | } 653 | ], 654 | "source": [ 655 | "# Print EXIF tags and values\n", 656 | "import piexif\n", 657 | "\n", 658 | "exif_dict = piexif.load(image.info.get('exif', b''))\n", 659 | "print(exif_dict)\n", 660 | "\n", 661 | "# Update orientation to 5 (Mirrored and rotated 90° counterclockwise)\n", 662 | "# Tag 274 refers to the 'Orientation' tag in EXIF\n", 663 | "exif_dict[\"0th\"][piexif.ImageIFD.Orientation] = 5\n", 664 | "\n", 665 | "# Insert the modified EXIF data back into the image\n", 666 | "exif_bytes = piexif.dump(exif_dict)\n", 667 | "image.save('./temp/GP_PXL_20240926_003004774_with_updated_exif.jpg', exif=exif_bytes)" 668 | ] 669 | }, 670 | { 671 | "cell_type": "markdown", 672 | "metadata": {}, 673 | "source": [ 674 | "# Image Loading" 675 | ] 676 | }, 677 | { 678 | "cell_type": "code", 679 | "execution_count": 78, 680 | "metadata": {}, 681 | "outputs": [], 682 | "source": [ 683 | "import cv2\n", 684 | "from PIL import Image\n", 685 | "\n", 686 | "# Load using OpenCV\n", 687 | "# OpenCV loads images in BGR\n", 688 | "image_cv = cv2.imread('./data/PXL_20241002_015409987.NIGHT.jpg')\n", 689 | "image_swapped = image_cv[:, :, ::-1] # BGR to RGB\n", 690 | "\n", 691 | "# Load using Pillow\n", 692 | "# pillow loads images in RGB\n", 693 | "image_pil = Image.open('./data/PXL_20241002_015409987.NIGHT.jpg')" 694 | ] 695 | }, 696 | { 697 | "cell_type": "code", 698 | "execution_count": null, 699 | "metadata": {}, 700 | "outputs": [], 701 | "source": [] 702 | } 703 | ], 704 | "metadata": { 705 | "kernelspec": { 706 | "display_name": "cv_workshop", 707 | "language": "python", 708 | "name": "python3" 709 | }, 710 | "language_info": { 711 | "codemirror_mode": { 712 | "name": "ipython", 713 | "version": 3 714 | }, 715 | "file_extension": ".py", 716 | "mimetype": "text/x-python", 717 | "name": "python", 718 | "nbconvert_exporter": "python", 719 | "pygments_lexer": "ipython3", 720 | "version": "3.11.10" 721 | } 722 | }, 723 | "nbformat": 4, 724 | "nbformat_minor": 2 725 | } 726 | -------------------------------------------------------------------------------- /5-Oct/installation.txt: -------------------------------------------------------------------------------- 1 | conda create -n cv_workshop python=3.11 2 | conda activate cv_workshop -------------------------------------------------------------------------------- /5-Oct/requirements.txt: -------------------------------------------------------------------------------- 1 | pillow 2 | opencv-python 3 | piexif 4 | matplotlib 5 | seaborn -------------------------------------------------------------------------------- /6-Oct/DL_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Binary Classification with pytorch\n", 8 | "\n", 9 | "DATASET : https://www.kaggle.com/datasets/erdemtaha/cancer-data" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 50, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import pandas as pd" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 51, 24 | "metadata": {}, 25 | "outputs": [ 26 | { 27 | "name": "stdout", 28 | "output_type": "stream", 29 | "text": [ 30 | "Index(['id', 'diagnosis', 'radius_mean', 'texture_mean', 'perimeter_mean',\n", 31 | " 'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean',\n", 32 | " 'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean',\n", 33 | " 'radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se',\n", 34 | " 'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se',\n", 35 | " 'fractal_dimension_se', 'radius_worst', 'texture_worst',\n", 36 | " 'perimeter_worst', 'area_worst', 'smoothness_worst',\n", 37 | " 'compactness_worst', 'concavity_worst', 'concave points_worst',\n", 38 | " 'symmetry_worst', 'fractal_dimension_worst', 'Unnamed: 32'],\n", 39 | " dtype='object')\n", 40 | "====================\n", 41 | "\n", 42 | "RangeIndex: 569 entries, 0 to 568\n", 43 | "Data columns (total 33 columns):\n", 44 | " # Column Non-Null Count Dtype \n", 45 | "--- ------ -------------- ----- \n", 46 | " 0 id 569 non-null int64 \n", 47 | " 1 diagnosis 569 non-null object \n", 48 | " 2 radius_mean 569 non-null float64\n", 49 | " 3 texture_mean 569 non-null float64\n", 50 | " 4 perimeter_mean 569 non-null float64\n", 51 | " 5 area_mean 569 non-null float64\n", 52 | " 6 smoothness_mean 569 non-null float64\n", 53 | " 7 compactness_mean 569 non-null float64\n", 54 | " 8 concavity_mean 569 non-null float64\n", 55 | " 9 concave points_mean 569 non-null float64\n", 56 | " 10 symmetry_mean 569 non-null float64\n", 57 | " 11 fractal_dimension_mean 569 non-null float64\n", 58 | " 12 radius_se 569 non-null float64\n", 59 | " 13 texture_se 569 non-null float64\n", 60 | " 14 perimeter_se 569 non-null float64\n", 61 | " 15 area_se 569 non-null float64\n", 62 | " 16 smoothness_se 569 non-null float64\n", 63 | " 17 compactness_se 569 non-null float64\n", 64 | " 18 concavity_se 569 non-null float64\n", 65 | " 19 concave points_se 569 non-null float64\n", 66 | " 20 symmetry_se 569 non-null float64\n", 67 | " 21 fractal_dimension_se 569 non-null float64\n", 68 | " 22 radius_worst 569 non-null float64\n", 69 | " 23 texture_worst 569 non-null float64\n", 70 | " 24 perimeter_worst 569 non-null float64\n", 71 | " 25 area_worst 569 non-null float64\n", 72 | " 26 smoothness_worst 569 non-null float64\n", 73 | " 27 compactness_worst 569 non-null float64\n", 74 | " 28 concavity_worst 569 non-null float64\n", 75 | " 29 concave points_worst 569 non-null float64\n", 76 | " 30 symmetry_worst 569 non-null float64\n", 77 | " 31 fractal_dimension_worst 569 non-null float64\n", 78 | " 32 Unnamed: 32 0 non-null float64\n", 79 | "dtypes: float64(31), int64(1), object(1)\n", 80 | "memory usage: 146.8+ KB\n", 81 | "None\n", 82 | "====================\n", 83 | " id diagnosis radius_mean texture_mean perimeter_mean area_mean \\\n", 84 | "0 842302 M 17.99 10.38 122.80 1001.0 \n", 85 | "1 842517 M 20.57 17.77 132.90 1326.0 \n", 86 | "2 84300903 M 19.69 21.25 130.00 1203.0 \n", 87 | "3 84348301 M 11.42 20.38 77.58 386.1 \n", 88 | "4 84358402 M 20.29 14.34 135.10 1297.0 \n", 89 | "\n", 90 | " smoothness_mean compactness_mean concavity_mean concave points_mean \\\n", 91 | "0 0.11840 0.27760 0.3001 0.14710 \n", 92 | "1 0.08474 0.07864 0.0869 0.07017 \n", 93 | "2 0.10960 0.15990 0.1974 0.12790 \n", 94 | "3 0.14250 0.28390 0.2414 0.10520 \n", 95 | "4 0.10030 0.13280 0.1980 0.10430 \n", 96 | "\n", 97 | " ... texture_worst perimeter_worst area_worst smoothness_worst \\\n", 98 | "0 ... 17.33 184.60 2019.0 0.1622 \n", 99 | "1 ... 23.41 158.80 1956.0 0.1238 \n", 100 | "2 ... 25.53 152.50 1709.0 0.1444 \n", 101 | "3 ... 26.50 98.87 567.7 0.2098 \n", 102 | "4 ... 16.67 152.20 1575.0 0.1374 \n", 103 | "\n", 104 | " compactness_worst concavity_worst concave points_worst symmetry_worst \\\n", 105 | "0 0.6656 0.7119 0.2654 0.4601 \n", 106 | "1 0.1866 0.2416 0.1860 0.2750 \n", 107 | "2 0.4245 0.4504 0.2430 0.3613 \n", 108 | "3 0.8663 0.6869 0.2575 0.6638 \n", 109 | "4 0.2050 0.4000 0.1625 0.2364 \n", 110 | "\n", 111 | " fractal_dimension_worst Unnamed: 32 \n", 112 | "0 0.11890 NaN \n", 113 | "1 0.08902 NaN \n", 114 | "2 0.08758 NaN \n", 115 | "3 0.17300 NaN \n", 116 | "4 0.07678 NaN \n", 117 | "\n", 118 | "[5 rows x 33 columns]\n" 119 | ] 120 | } 121 | ], 122 | "source": [ 123 | "cancer_df = pd.read_csv('./data/Cancer_Data.csv')\n", 124 | "\n", 125 | "print(cancer_df.columns)\n", 126 | "\n", 127 | "print(\"=\"*20)\n", 128 | "\n", 129 | "print(cancer_df.info())\n", 130 | "\n", 131 | "print(\"=\"*20)\n", 132 | "\n", 133 | "print(cancer_df.head())" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 52, 139 | "metadata": {}, 140 | "outputs": [ 141 | { 142 | "name": "stdout", 143 | "output_type": "stream", 144 | "text": [ 145 | "diagnosis\n", 146 | "B 357\n", 147 | "M 212\n", 148 | "Name: count, dtype: int64\n" 149 | ] 150 | } 151 | ], 152 | "source": [ 153 | "diagnosis_counts = cancer_df['diagnosis'].value_counts()\n", 154 | "\n", 155 | "print(diagnosis_counts)" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 53, 161 | "metadata": {}, 162 | "outputs": [], 163 | "source": [ 164 | "# Drop unnecessary columns\n", 165 | "cancer_df = cancer_df.drop(columns=['id', 'Unnamed: 32'])\n", 166 | "\n", 167 | "# Convert diagnosis to binary: Malignant (M) = 1, Benign (B) = 0\n", 168 | "cancer_df['diagnosis'] = cancer_df['diagnosis'].map({'M': 1, 'B': 0})\n", 169 | "\n", 170 | "\n", 171 | "# Split features and target\n", 172 | "X = cancer_df.drop(columns=['diagnosis'])\n", 173 | "y = cancer_df['diagnosis']" 174 | ] 175 | }, 176 | { 177 | "cell_type": "markdown", 178 | "metadata": {}, 179 | "source": [ 180 | "# Scaling Vs Normalization\n", 181 | "\n", 182 | "\n", 183 | "#### Scaling\n", 184 | "Scaling refers to resizing the range of features to ensure they are on a similar scale.\n", 185 | "\n", 186 | "ex : Min-Max Scaling, Range 0 - 1\n", 187 | "\n", 188 | "X_scaled = (X - Xmin)/(X_max - X_min)\n", 189 | "\n", 190 | "We should use scaling when distances between points matter (e.g., KNN, gradient descent-based algorithms like neural networks).\n", 191 | "\n", 192 | "#### Normalization\n", 193 | "\n", 194 | "Normally, different features have different measurments which makes comparison difficult. If we dont standardize then one could dominate the calculations in machine learning models so we need a common scale.\n", 195 | "\n", 196 | "\n", 197 | "\n", 198 | "Normalization refers to rescaling the data so that it has a mean of 0 and a standard deviation of 1.\n", 199 | "\n", 200 | "We apply this for each column seperately and is also called Z-score normalization or standardization and both are statistical technique.\n", 201 | "\n", 202 | "Mean 0: \n", 203 | "- The mean (or average) is a measure of the central tendency of your data. It tells you where the \"center\" of your data is.\n", 204 | "\n", 205 | "- Now, if the mean is 0, it simply means that the center of the data has been shifted to zero. After standardization, the values will be centered around 0, which makes comparisons easier between features that were originally on different scales.\n", 206 | "\n", 207 | "Standard Deviation 1:\n", 208 | "\n", 209 | "- The standard deviation tells you how \"spread out\" or \"spread around\" the values are from the mean.\n", 210 | "\n", 211 | "- A high standard deviation means the data points are widely spread out, and a low standard deviation means they are closely packed around the mean.\n", 212 | "\n", 213 | "- Scaling needs to be done on all features so that the spread or variability of the data is standardized to be 1 unit so most of the data is within 1 standard deviation from the mean.\n", 214 | "\n", 215 | "- If the standard deviation is 1, it means that most of your data points lie within one unit (1) away from the mean in both directions. +1 and -1.\n", 216 | "\n", 217 | "- Data points much higher or lower than the average will now be expressed in multiples of standard deviation\n", 218 | "\n", 219 | "- In short Standard deviation will give us the unit of 1 SD\n", 220 | "\n", 221 | "\n", 222 | "A = 100\n", 223 | "B = 200\n", 224 | "C = 300\n", 225 | "\n", 226 | "Mean = 200\n", 227 | "\n", 228 | "SD = 100 = 1 unit\n", 229 | "\n", 230 | "A = -1\n", 231 | "B = 0 \n", 232 | "C = +1\n", 233 | "\n", 234 | "Mu = mean\n", 235 | "Sigma = Standard Deviation\n", 236 | "\n", 237 | "X_norm = (X - Mu)/(Sigma)\n", 238 | "\n", 239 | "We should use Normalization when you need to center the data for algorithms sensitive to feature distribution and in algorithms that assume normally distributed data." 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": 54, 245 | "metadata": {}, 246 | "outputs": [], 247 | "source": [ 248 | "from sklearn.model_selection import train_test_split\n", 249 | "from sklearn.preprocessing import StandardScaler\n", 250 | "\n", 251 | "\n", 252 | "# Normalize the features\n", 253 | "scaler = StandardScaler()\n", 254 | "X = scaler.fit_transform(X)\n", 255 | "\n", 256 | "# Train-Test split\n", 257 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)" 258 | ] 259 | }, 260 | { 261 | "cell_type": "markdown", 262 | "metadata": {}, 263 | "source": [ 264 | "# Pytorch Implementation" 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": 55, 270 | "metadata": {}, 271 | "outputs": [], 272 | "source": [ 273 | "import torch\n", 274 | "\n", 275 | "# Convert data to PyTorch tensors\n", 276 | "X_train_tensor = torch.tensor(X_train, dtype=torch.float32)\n", 277 | "y_train_tensor = torch.tensor(y_train.values, dtype=torch.float32)\n", 278 | "X_test_tensor = torch.tensor(X_test, dtype=torch.float32)\n", 279 | "y_test_tensor = torch.tensor(y_test.values, dtype=torch.float32)" 280 | ] 281 | }, 282 | { 283 | "cell_type": "code", 284 | "execution_count": 56, 285 | "metadata": {}, 286 | "outputs": [], 287 | "source": [ 288 | "from torch.utils.data import DataLoader, TensorDataset\n", 289 | "\n", 290 | "# Create Datasets and DataLoaders\n", 291 | "train_dataset = TensorDataset(X_train_tensor, y_train_tensor)\n", 292 | "test_dataset = TensorDataset(X_test_tensor, y_test_tensor)\n", 293 | "\n", 294 | "train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)\n", 295 | "test_loader = DataLoader(test_dataset, batch_size=32)" 296 | ] 297 | }, 298 | { 299 | "cell_type": "markdown", 300 | "metadata": {}, 301 | "source": [ 302 | "# Define Neural Network" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": 110, 308 | "metadata": {}, 309 | "outputs": [], 310 | "source": [ 311 | "import torch.nn as nn\n", 312 | "\n", 313 | "# Define the Neural Network\n", 314 | "class CancerNN(nn.Module):\n", 315 | " def __init__(self):\n", 316 | " super(CancerNN, self).__init__()\n", 317 | " self.fc1 = nn.Linear(30, 60) # 30 input features\n", 318 | " self.fc2 = nn.Linear(60, 80)\n", 319 | " self.fc3 = nn.Linear(80, 100)\n", 320 | " self.fc4 = nn.Linear(100, 140)\n", 321 | " self.fc5 = nn.Linear(140, 180)\n", 322 | " self.fc6 = nn.Linear(180, 150)\n", 323 | " self.fc7 = nn.Linear(150, 100)\n", 324 | " self.fc8 = nn.Linear(100, 50)\n", 325 | " self.fc9 = nn.Linear(50, 25)\n", 326 | " self.fc10 = nn.Linear(25, 1)\n", 327 | "\n", 328 | " self.dropout = nn.Dropout(0.3) # 30% dropout\n", 329 | " \n", 330 | " self.sigmoid = nn.Sigmoid()\n", 331 | " \n", 332 | " def forward(self, x):\n", 333 | " x = torch.relu(self.fc1(x))\n", 334 | " x = torch.relu(self.fc2(x))\n", 335 | " x = self.dropout(x)\n", 336 | " x = torch.relu(self.fc3(x))\n", 337 | " x = self.dropout(x)\n", 338 | " x = torch.relu(self.fc4(x))\n", 339 | " x = self.dropout(x)\n", 340 | " x = torch.relu(self.fc5(x))\n", 341 | " x = self.dropout(x)\n", 342 | " x = torch.relu(self.fc6(x))\n", 343 | " x = torch.relu(self.fc7(x))\n", 344 | " x = self.dropout(x)\n", 345 | " x = torch.relu(self.fc8(x))\n", 346 | " x = torch.relu(self.fc9(x))\n", 347 | " x = self.sigmoid(self.fc10(x))\n", 348 | " return x" 349 | ] 350 | }, 351 | { 352 | "cell_type": "code", 353 | "execution_count": 111, 354 | "metadata": {}, 355 | "outputs": [], 356 | "source": [ 357 | "import torch.optim as optim\n", 358 | "\n", 359 | "\n", 360 | "model = CancerNN()\n", 361 | "criterion = nn.BCELoss() # Binary Cross Entropy Loss for binary classification\n", 362 | "optimizer = optim.Adam(model.parameters(), lr=0.001)" 363 | ] 364 | }, 365 | { 366 | "cell_type": "markdown", 367 | "metadata": {}, 368 | "source": [ 369 | "# Model Training" 370 | ] 371 | }, 372 | { 373 | "cell_type": "code", 374 | "execution_count": 112, 375 | "metadata": {}, 376 | "outputs": [], 377 | "source": [ 378 | "# Training loop\n", 379 | "def train_model(model, train_loader, criterion, optimizer, epochs=20):\n", 380 | " for epoch in range(epochs):\n", 381 | " model.train()\n", 382 | " running_loss = 0.0\n", 383 | " for inputs, labels in train_loader:\n", 384 | " labels = labels.unsqueeze(1) # Add extra dimension to match the output shape\n", 385 | " \n", 386 | " # Zero the parameter gradients\n", 387 | " optimizer.zero_grad()\n", 388 | " \n", 389 | " # Forward pass\n", 390 | " outputs = model(inputs)\n", 391 | " loss = criterion(outputs, labels)\n", 392 | " \n", 393 | " # Backward pass and optimize\n", 394 | " loss.backward()\n", 395 | " optimizer.step()\n", 396 | " \n", 397 | " running_loss += loss.item()\n", 398 | " \n", 399 | " print(f\"Epoch {epoch+1}/{epochs}, Loss: {running_loss/len(train_loader)}\")" 400 | ] 401 | }, 402 | { 403 | "cell_type": "code", 404 | "execution_count": 114, 405 | "metadata": {}, 406 | "outputs": [ 407 | { 408 | "name": "stdout", 409 | "output_type": "stream", 410 | "text": [ 411 | "Epoch 1/40, Loss: 0.019494118033132207\n", 412 | "Epoch 2/40, Loss: 0.016874866977256413\n", 413 | "Epoch 3/40, Loss: 0.01692330846368956\n", 414 | "Epoch 4/40, Loss: 0.02063424336180712\n", 415 | "Epoch 5/40, Loss: 0.018473613409635922\n", 416 | "Epoch 6/40, Loss: 0.028236609891367455\n", 417 | "Epoch 7/40, Loss: 0.013339226328146955\n", 418 | "Epoch 8/40, Loss: 0.013308964054643487\n", 419 | "Epoch 9/40, Loss: 0.009473637649110363\n", 420 | "Epoch 10/40, Loss: 0.012111873558023945\n", 421 | "Epoch 11/40, Loss: 0.008035031586769038\n", 422 | "Epoch 12/40, Loss: 0.009589212402988778\n", 423 | "Epoch 13/40, Loss: 0.00990314887991796\n", 424 | "Epoch 14/40, Loss: 0.008422938295795272\n", 425 | "Epoch 15/40, Loss: 0.008679076153202913\n", 426 | "Epoch 16/40, Loss: 0.007736642136417989\n", 427 | "Epoch 17/40, Loss: 0.006733869685558602\n", 428 | "Epoch 18/40, Loss: 0.007286096458938118\n", 429 | "Epoch 19/40, Loss: 0.008429793988276894\n", 430 | "Epoch 20/40, Loss: 0.007987880826897727\n", 431 | "Epoch 21/40, Loss: 0.01974105026856705\n", 432 | "Epoch 22/40, Loss: 0.07783818114403403\n", 433 | "Epoch 23/40, Loss: 0.019392247829152134\n", 434 | "Epoch 24/40, Loss: 0.014759206362699236\n", 435 | "Epoch 25/40, Loss: 0.00987585813345504\n", 436 | "Epoch 26/40, Loss: 0.009437947591656363\n", 437 | "Epoch 27/40, Loss: 0.009122792789359362\n", 438 | "Epoch 28/40, Loss: 0.0077098788930015875\n", 439 | "Epoch 29/40, Loss: 0.007297254516712807\n", 440 | "Epoch 30/40, Loss: 0.006434118729278755\n", 441 | "Epoch 31/40, Loss: 0.004682757074680877\n", 442 | "Epoch 32/40, Loss: 0.004618447924582369\n", 443 | "Epoch 33/40, Loss: 0.0029523978442284717\n", 444 | "Epoch 34/40, Loss: 0.0038240595330981163\n", 445 | "Epoch 35/40, Loss: 0.0038406427004717006\n", 446 | "Epoch 36/40, Loss: 0.004058057620975812\n", 447 | "Epoch 37/40, Loss: 0.0038119425976768538\n", 448 | "Epoch 38/40, Loss: 0.004871876123571943\n", 449 | "Epoch 39/40, Loss: 0.006465061269880816\n", 450 | "Epoch 40/40, Loss: 0.014370577528954907\n" 451 | ] 452 | } 453 | ], 454 | "source": [ 455 | "train_model(model, train_loader, criterion, optimizer, epochs=40)" 456 | ] 457 | }, 458 | { 459 | "cell_type": "markdown", 460 | "metadata": {}, 461 | "source": [ 462 | "# Model Evaluation" 463 | ] 464 | }, 465 | { 466 | "cell_type": "code", 467 | "execution_count": 115, 468 | "metadata": {}, 469 | "outputs": [], 470 | "source": [ 471 | "# Evaluation function\n", 472 | "def evaluate_model(model, test_loader):\n", 473 | " model.eval()\n", 474 | " correct = 0\n", 475 | " total = 0\n", 476 | " with torch.no_grad():\n", 477 | " for inputs, labels in test_loader:\n", 478 | " labels = labels.unsqueeze(1)\n", 479 | " outputs = model(inputs)\n", 480 | " predicted = (outputs > 0.5).float() # Sigmoid output to binary\n", 481 | " total += labels.size(0)\n", 482 | " correct += (predicted == labels).sum().item()\n", 483 | " \n", 484 | " accuracy = correct / total\n", 485 | " print(f\"Test Accuracy: {accuracy * 100:.2f}%\")" 486 | ] 487 | }, 488 | { 489 | "cell_type": "code", 490 | "execution_count": 116, 491 | "metadata": {}, 492 | "outputs": [ 493 | { 494 | "name": "stdout", 495 | "output_type": "stream", 496 | "text": [ 497 | "Test Accuracy: 97.37%\n" 498 | ] 499 | } 500 | ], 501 | "source": [ 502 | "# Evaluate the model\n", 503 | "evaluate_model(model, test_loader)" 504 | ] 505 | }, 506 | { 507 | "cell_type": "markdown", 508 | "metadata": {}, 509 | "source": [ 510 | "# Saving the prediction in dataframe" 511 | ] 512 | }, 513 | { 514 | "cell_type": "code", 515 | "execution_count": 117, 516 | "metadata": {}, 517 | "outputs": [], 518 | "source": [ 519 | "cancer_df_f = pd.read_csv('./data/Cancer_Data.csv')" 520 | ] 521 | }, 522 | { 523 | "cell_type": "code", 524 | "execution_count": 118, 525 | "metadata": {}, 526 | "outputs": [], 527 | "source": [ 528 | "X = cancer_df_f.drop(columns=['Unnamed: 32'])\n", 529 | "\n", 530 | "features = X.drop(columns=['id', 'diagnosis']).columns\n", 531 | "scaler = StandardScaler()\n", 532 | "X_scaled = scaler.fit_transform(X[features])\n", 533 | "\n", 534 | "X_tensor = torch.tensor(X_scaled, dtype=torch.float32)" 535 | ] 536 | }, 537 | { 538 | "cell_type": "markdown", 539 | "metadata": {}, 540 | "source": [ 541 | "Set the model in evaluation mode\n" 542 | ] 543 | }, 544 | { 545 | "cell_type": "code", 546 | "execution_count": 119, 547 | "metadata": {}, 548 | "outputs": [ 549 | { 550 | "data": { 551 | "text/plain": [ 552 | "CancerNN(\n", 553 | " (fc1): Linear(in_features=30, out_features=60, bias=True)\n", 554 | " (fc2): Linear(in_features=60, out_features=80, bias=True)\n", 555 | " (fc3): Linear(in_features=80, out_features=100, bias=True)\n", 556 | " (fc4): Linear(in_features=100, out_features=140, bias=True)\n", 557 | " (fc5): Linear(in_features=140, out_features=180, bias=True)\n", 558 | " (fc6): Linear(in_features=180, out_features=150, bias=True)\n", 559 | " (fc7): Linear(in_features=150, out_features=100, bias=True)\n", 560 | " (fc8): Linear(in_features=100, out_features=50, bias=True)\n", 561 | " (fc9): Linear(in_features=50, out_features=25, bias=True)\n", 562 | " (fc10): Linear(in_features=25, out_features=1, bias=True)\n", 563 | " (dropout): Dropout(p=0.3, inplace=False)\n", 564 | " (sigmoid): Sigmoid()\n", 565 | ")" 566 | ] 567 | }, 568 | "execution_count": 119, 569 | "metadata": {}, 570 | "output_type": "execute_result" 571 | } 572 | ], 573 | "source": [ 574 | "# evaluation mode\n", 575 | "model.eval()\n" 576 | ] 577 | }, 578 | { 579 | "cell_type": "code", 580 | "execution_count": 120, 581 | "metadata": {}, 582 | "outputs": [], 583 | "source": [ 584 | "with torch.no_grad(): # Diable gradient calculation, we dont want to update the weights\n", 585 | " output = model(X_tensor)\n", 586 | " predictions = torch.sigmoid(output).numpy() # Apply sigmoid to get probabilities\n", 587 | " predicted_labels = (predictions > 0.5).astype(int)" 588 | ] 589 | }, 590 | { 591 | "cell_type": "code", 592 | "execution_count": 121, 593 | "metadata": {}, 594 | "outputs": [], 595 | "source": [ 596 | "cancer_df_f['predicted'] = predicted_labels\n", 597 | "\n", 598 | "cancer_df_f['predicted'] = cancer_df_f['predicted'].replace({1: 'M', 0: 'B'})" 599 | ] 600 | }, 601 | { 602 | "cell_type": "code", 603 | "execution_count": 122, 604 | "metadata": {}, 605 | "outputs": [ 606 | { 607 | "data": { 608 | "text/html": [ 609 | "
\n", 610 | "\n", 623 | "\n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | "
iddiagnosisradius_meantexture_meanperimeter_meanarea_meansmoothness_meancompactness_meanconcavity_meanconcave points_mean...perimeter_worstarea_worstsmoothness_worstcompactness_worstconcavity_worstconcave points_worstsymmetry_worstfractal_dimension_worstUnnamed: 32predicted
0842302M17.9910.38122.801001.00.118400.277600.30010.14710...184.602019.00.16220.66560.71190.26540.46010.11890NaNM
1842517M20.5717.77132.901326.00.084740.078640.08690.07017...158.801956.00.12380.18660.24160.18600.27500.08902NaNM
284300903M19.6921.25130.001203.00.109600.159900.19740.12790...152.501709.00.14440.42450.45040.24300.36130.08758NaNM
384348301M11.4220.3877.58386.10.142500.283900.24140.10520...98.87567.70.20980.86630.68690.25750.66380.17300NaNM
484358402M20.2914.34135.101297.00.100300.132800.19800.10430...152.201575.00.13740.20500.40000.16250.23640.07678NaNM
\n", 773 | "

5 rows × 34 columns

\n", 774 | "
" 775 | ], 776 | "text/plain": [ 777 | " id diagnosis radius_mean texture_mean perimeter_mean area_mean \\\n", 778 | "0 842302 M 17.99 10.38 122.80 1001.0 \n", 779 | "1 842517 M 20.57 17.77 132.90 1326.0 \n", 780 | "2 84300903 M 19.69 21.25 130.00 1203.0 \n", 781 | "3 84348301 M 11.42 20.38 77.58 386.1 \n", 782 | "4 84358402 M 20.29 14.34 135.10 1297.0 \n", 783 | "\n", 784 | " smoothness_mean compactness_mean concavity_mean concave points_mean \\\n", 785 | "0 0.11840 0.27760 0.3001 0.14710 \n", 786 | "1 0.08474 0.07864 0.0869 0.07017 \n", 787 | "2 0.10960 0.15990 0.1974 0.12790 \n", 788 | "3 0.14250 0.28390 0.2414 0.10520 \n", 789 | "4 0.10030 0.13280 0.1980 0.10430 \n", 790 | "\n", 791 | " ... perimeter_worst area_worst smoothness_worst compactness_worst \\\n", 792 | "0 ... 184.60 2019.0 0.1622 0.6656 \n", 793 | "1 ... 158.80 1956.0 0.1238 0.1866 \n", 794 | "2 ... 152.50 1709.0 0.1444 0.4245 \n", 795 | "3 ... 98.87 567.7 0.2098 0.8663 \n", 796 | "4 ... 152.20 1575.0 0.1374 0.2050 \n", 797 | "\n", 798 | " concavity_worst concave points_worst symmetry_worst \\\n", 799 | "0 0.7119 0.2654 0.4601 \n", 800 | "1 0.2416 0.1860 0.2750 \n", 801 | "2 0.4504 0.2430 0.3613 \n", 802 | "3 0.6869 0.2575 0.6638 \n", 803 | "4 0.4000 0.1625 0.2364 \n", 804 | "\n", 805 | " fractal_dimension_worst Unnamed: 32 predicted \n", 806 | "0 0.11890 NaN M \n", 807 | "1 0.08902 NaN M \n", 808 | "2 0.08758 NaN M \n", 809 | "3 0.17300 NaN M \n", 810 | "4 0.07678 NaN M \n", 811 | "\n", 812 | "[5 rows x 34 columns]" 813 | ] 814 | }, 815 | "execution_count": 122, 816 | "metadata": {}, 817 | "output_type": "execute_result" 818 | } 819 | ], 820 | "source": [ 821 | "cancer_df_f.head()" 822 | ] 823 | }, 824 | { 825 | "cell_type": "code", 826 | "execution_count": 123, 827 | "metadata": {}, 828 | "outputs": [], 829 | "source": [ 830 | "diagnosis_vs_predicted = cancer_df_f[['diagnosis', 'predicted']]" 831 | ] 832 | }, 833 | { 834 | "cell_type": "code", 835 | "execution_count": 124, 836 | "metadata": {}, 837 | "outputs": [ 838 | { 839 | "data": { 840 | "text/html": [ 841 | "
\n", 842 | "\n", 855 | "\n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | " \n", 873 | " \n", 874 | " \n", 875 | " \n", 876 | " \n", 877 | " \n", 878 | " \n", 879 | " \n", 880 | " \n", 881 | " \n", 882 | " \n", 883 | " \n", 884 | " \n", 885 | " \n", 886 | " \n", 887 | " \n", 888 | " \n", 889 | " \n", 890 | " \n", 891 | " \n", 892 | " \n", 893 | " \n", 894 | " \n", 895 | " \n", 896 | " \n", 897 | " \n", 898 | " \n", 899 | " \n", 900 | " \n", 901 | " \n", 902 | " \n", 903 | " \n", 904 | " \n", 905 | " \n", 906 | " \n", 907 | " \n", 908 | " \n", 909 | " \n", 910 | " \n", 911 | " \n", 912 | " \n", 913 | " \n", 914 | " \n", 915 | " \n", 916 | " \n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \n", 922 | " \n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | "
diagnosispredicted
0MM
1MM
2MM
3MM
4MM
5MM
6MM
7MM
8MM
9MM
10MM
11MM
12MM
13MM
14MM
15MM
16MM
17MM
18MM
19BB
20BB
21BB
22MM
23MM
24MM
25MM
26MM
27MM
28MM
29MM
\n", 1016 | "
" 1017 | ], 1018 | "text/plain": [ 1019 | " diagnosis predicted\n", 1020 | "0 M M\n", 1021 | "1 M M\n", 1022 | "2 M M\n", 1023 | "3 M M\n", 1024 | "4 M M\n", 1025 | "5 M M\n", 1026 | "6 M M\n", 1027 | "7 M M\n", 1028 | "8 M M\n", 1029 | "9 M M\n", 1030 | "10 M M\n", 1031 | "11 M M\n", 1032 | "12 M M\n", 1033 | "13 M M\n", 1034 | "14 M M\n", 1035 | "15 M M\n", 1036 | "16 M M\n", 1037 | "17 M M\n", 1038 | "18 M M\n", 1039 | "19 B B\n", 1040 | "20 B B\n", 1041 | "21 B B\n", 1042 | "22 M M\n", 1043 | "23 M M\n", 1044 | "24 M M\n", 1045 | "25 M M\n", 1046 | "26 M M\n", 1047 | "27 M M\n", 1048 | "28 M M\n", 1049 | "29 M M" 1050 | ] 1051 | }, 1052 | "execution_count": 124, 1053 | "metadata": {}, 1054 | "output_type": "execute_result" 1055 | } 1056 | ], 1057 | "source": [ 1058 | "diagnosis_vs_predicted.head(30)" 1059 | ] 1060 | }, 1061 | { 1062 | "cell_type": "code", 1063 | "execution_count": 125, 1064 | "metadata": {}, 1065 | "outputs": [ 1066 | { 1067 | "name": "stderr", 1068 | "output_type": "stream", 1069 | "text": [ 1070 | "C:\\Users\\monal\\AppData\\Local\\Temp\\ipykernel_8036\\2229412889.py:4: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`\n", 1071 | " y_true = diagnosis_vs_predicted['diagnosis'].replace({'M': 1, 'B': 0})\n", 1072 | "C:\\Users\\monal\\AppData\\Local\\Temp\\ipykernel_8036\\2229412889.py:5: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`\n", 1073 | " y_pred = diagnosis_vs_predicted['predicted'].replace({'M': 1, 'B': 0})\n" 1074 | ] 1075 | } 1076 | ], 1077 | "source": [ 1078 | "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n", 1079 | "import matplotlib.pyplot as plt\n", 1080 | "\n", 1081 | "y_true = diagnosis_vs_predicted['diagnosis'].replace({'M': 1, 'B': 0})\n", 1082 | "y_pred = diagnosis_vs_predicted['predicted'].replace({'M': 1, 'B': 0})" 1083 | ] 1084 | }, 1085 | { 1086 | "cell_type": "code", 1087 | "execution_count": 126, 1088 | "metadata": {}, 1089 | "outputs": [], 1090 | "source": [ 1091 | "cm = confusion_matrix(y_true, y_pred)" 1092 | ] 1093 | }, 1094 | { 1095 | "cell_type": "code", 1096 | "execution_count": 127, 1097 | "metadata": {}, 1098 | "outputs": [ 1099 | { 1100 | "data": { 1101 | "image/png": "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CAhASEiIxqEzkSIiIiJ5BEFmIqVZ1966deteedzY2BgrVqzAihUrCi3j5uaGvXv3anTdgnCMFBEREZGW2CJFRERE8iiE3E3O+XqKiRQRERHJU8JjpMoS/Y2ciIiIqJSxRYqIiIjk0dHK5vqIiRQRERHJw649IiIiItIUW6SIiIhIHnbtEREREWmpHHftMZEiIiIiecpxi5T+poBEREREpYwtUkRERCQPu/aIiIiItMSuPSIiIiLSFFukiIiISCaZXXt63K7DRIqIiIjkYdceEREREWmKLVJEREQkjyDInLWnvy1STKSIiIhInnK8/IH+Rk5ERERUytgiRURERPKU48HmTKSIiIhInnLctcdEioiIiOQpxy1S+psCEhEREZUytkgRERGRPOzaIyIiItISu/aIiIiISFNskSIiIiJZBEGAUE5bpJhIERERkSzlOZFi1x4RERGRltgiRURERPII/7/JOV9PMZEiIiIiWdi1R0REREQaY4sUERERyVKeW6SYSBEREZEsTKSIiIiItFSeEymOkSIiIiLSElukiIiISB4uf0BERESkHXbtEREREZHG2CJFREREsggCZLZI6S6WksZEioiIiGQRILNrT48zKXbtEREREWmJLVJEREQkS3kebM5EioiIiOQpx8sfsGuPiIiISEtskSIiIiJ5ZHbtiezaIyIiovJK7hgpeTP+ShcTKSIiIpKlPCdSHCNFREREemXevHl4++23YWFhAQcHB3Tt2hXR0dFqZVq1aiUleHnbsGHD1MrExcXBz88PpqamcHBwwPjx4/H8+XONYmGLFBEREclTwrP2jh49iqCgILz99tt4/vw5Pv/8c7Rv3x5Xr16FmZmZVG7IkCEICQmRXpuamkp/z87Ohp+fH5ycnHDq1CkkJCSgf//+qFChAubOnVvkWJhIERERkSwl3bW3f/9+tddhYWFwcHDAuXPn0KJFC2m/qakpnJycCqzjwIEDuHr1Kn777Tc4OjqiXr16mDVrFiZOnIiZM2fCyMioSLGwa4+IiIjKhOTkZLUtIyOjSOclJSUBAGxsbNT2b968GXZ2dqhVqxYmT56MtLQ06VhkZCRq164NR0dHaZ+vry+Sk5Nx5cqVIsfMFikiIiKSRVctUq6urmr7Z8yYgZkzZ77y3JycHIwePRpNmzZFrVq1pP0fffQR3Nzc4OLigosXL2LixImI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uLm5Yfv27TAxMZERiebYIkVERETy6GiwuUqlUtsKS6ReZmVlherVqyMmJgZOTk7IzMzEkydP1Mrcu3evwDFVcjGRIiIiIr2WmpqK2NhYODs7o2HDhqhQoQIOHTokHY+OjkZcXBx8fHx0fm127REREZEsJT1rb9y4cejcuTPc3Nxw9+5dzJgxAwYGBujbty8sLS0xaNAgjB07FjY2NlCpVBgxYgR8fHx0PmMPYCJFREREcsl8RIymOdidO3fQt29fPHz4EPb29mjWrBl+//132NvbAwAWL14MhUKBHj16ICMjA76+vli5cqWMAAvHRIqIiIj0ytatW1953NjYGCtWrMCKFSuKPRYmUkRERCRLeX7WHhMpIiIikqccZ1KctUdERESkJbZIERERkSyl8ay9soKJFBEREckiyJy1J2vGXylj1x4RERGRltgiRURERLKU47HmTKSIiIhIpnKcSTGRIiIiIlnK82BzjpEiIiIi0hJbpIiIiEgWATJn7ekskpLHRIqIiIhkKcdDpNi1R0RERKQttkgRERGRLOV5QU4mUkRERCRT+e3cY9ceERERkZbYIkVERESysGuPiIiISEvlt2OPXXtEREREWmOLFBEREcnCrj0iIiIiLZXnZ+0xkSIiIiJ5yvEgKY6RIiIiItISW6SIiIhIlnLcIMVEioiIiOQpz4PN2bVHREREpCW2SBEREZEsnLVHREREpK1yPEiKXXtEREREWmKLFBEREclSjhukmEgRERGRPJy1R0REREQaY4sUERERySRv1p4+d+4xkSIiIiJZ2LVHRERERBpjIkVERESkJXbtERERkSzluWuPiRQRERHJUp4fEcOuPSIiIiItsUWKiIiIZGHXHhEREZGWyvMjYti1R0RERKQltkgRERGRPOW4SYqJFBEREcnCWXtEREREpDG2SBEREZEsnLVHREREpKVyPESKiRQRERHJVI4zKY6RIiIiItISW6SIiIhIlvI8a4+JFBEREcnCweZELxFFEQCQkpxcypEQFZ/s9KelHQJRscnOSAPw37/nxSlZ5u8KueeXJiZSVKCUlBQAQNXKrqUcCRERyZGSkgJLS8tiqdvIyAhOTk6opoPfFU5OTjAyMtJBVCVLEEsiVSW9k5OTg7t378LCwgKCPre56pHk5GS4uroiPj4eKpWqtMMh0jl+xkuWKIpISUmBi4sLFIri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", 1102 | "text/plain": [ 1103 | "
" 1104 | ] 1105 | }, 1106 | "metadata": {}, 1107 | "output_type": "display_data" 1108 | } 1109 | ], 1110 | "source": [ 1111 | "disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Benign (B)', 'Malignant (M)'])\n", 1112 | "disp.plot(cmap=plt.cm.Blues)\n", 1113 | "plt.title(\"Confusion Matrix: Diagnosis vs Predicted\")\n", 1114 | "plt.show()" 1115 | ] 1116 | }, 1117 | { 1118 | "cell_type": "code", 1119 | "execution_count": null, 1120 | "metadata": {}, 1121 | "outputs": [], 1122 | "source": [] 1123 | }, 1124 | { 1125 | "cell_type": "code", 1126 | "execution_count": null, 1127 | "metadata": {}, 1128 | "outputs": [], 1129 | "source": [] 1130 | } 1131 | ], 1132 | "metadata": { 1133 | "kernelspec": { 1134 | "display_name": "cv_workshop", 1135 | "language": "python", 1136 | "name": "python3" 1137 | }, 1138 | "language_info": { 1139 | "codemirror_mode": { 1140 | "name": "ipython", 1141 | "version": 3 1142 | }, 1143 | "file_extension": ".py", 1144 | "mimetype": "text/x-python", 1145 | "name": "python", 1146 | "nbconvert_exporter": "python", 1147 | "pygments_lexer": "ipython3", 1148 | "version": "3.11.10" 1149 | } 1150 | }, 1151 | "nbformat": 4, 1152 | "nbformat_minor": 2 1153 | } 1154 | -------------------------------------------------------------------------------- /6-Oct/data/images/car/car_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/car/car_1.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/car/car_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/car/car_10.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/car/car_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/car/car_2.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/car/car_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/car/car_3.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/car/car_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/car/car_4.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/car/car_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/car/car_5.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/car/car_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/car/car_6.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/car/car_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/car/car_7.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/car/car_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/car/car_8.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/car/car_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/car/car_9.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/dog/dog_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/dog/dog_1.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/dog/dog_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/dog/dog_10.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/dog/dog_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/dog/dog_2.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/dog/dog_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/dog/dog_3.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/dog/dog_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/dog/dog_4.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/dog/dog_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/dog/dog_5.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/dog/dog_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/dog/dog_6.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/dog/dog_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/dog/dog_7.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/dog/dog_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/dog/dog_8.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/dog/dog_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/dog/dog_9.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/person/person_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/person/person_1.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/person/person_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/person/person_10.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/person/person_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/person/person_2.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/person/person_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/person/person_3.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/person/person_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/person/person_4.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/person/person_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/person/person_5.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/person/person_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/person/person_6.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/person/person_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/person/person_7.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/person/person_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/person/person_8.jpg -------------------------------------------------------------------------------- /6-Oct/data/images/person/person_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Monalsingh/KN-CV-Workshop/52657bd245756e1a88bcd9516b2b14109e3b86f6/6-Oct/data/images/person/person_9.jpg -------------------------------------------------------------------------------- /6-Oct/requirements.txt: -------------------------------------------------------------------------------- 1 | torch 2 | pandas 3 | scikit-learn 4 | torchvision -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KN-CV-Workshop --------------------------------------------------------------------------------