openmicroscopy/bioformats — pull request #1358 by rleigh-dundee (2014-09-26 21:41:46+00:00)
Title: C++: Add TIFF strip and tile reading

- Add logic to read arbitrary strips and tiles
- Find minimal set of tiles covering the requested region
- Copy data into pixel buffer using the most optimal strategy available
- This PR aims for correctness; further performance improvements are likely possible
- Should cope with any requested image size, and will split up tile reads and buffer copies to accomodate

- The test PNG image added in the previous PR is generating a set of TIFF images using a variety of different strip and tile sizes, intended to test all possible combinations and edge cases
- The PNG will be loaded into a pixel buffer and will be compared with the loaded TIFF pixel buffer and compared for equality (note: the 9D pixel buffer is compared logically, not in the storage order, so interleaving does not affect the comparison)
- If any TIFF file fails to compare with the reference PNG, this will result in test failure

--------

Testing: Should be covered by the unit tests. If any tests fail, a representation of the observed image and expected test image will be displayed rendered in glorious 5 colour greyscale which should hopefully indicate what's wrong. (A small terminal font helps!)

```
▒▒▓▓▒░ ░░▒░░ ░▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒░░ ░░░░ ▒▒▒▒▒ ░▒▒░ ░▒▒▒░ ░░▒▒▒▒▒▒▒▒▒▒░ ░░▒▒░ ░▒▒░ ░░ ░▓▓▓▒ ▒▓▒▒░ ░▒▒▓▓▓▒░ ░▒▓▒░ ▒▓▓▒░ ░
░▒▓▓▒░ ░▒▒▒░░ ░▒▒▒▒▒▒░░░░░░░▒▒▒▒▒▒▒░ ░░▒▒░ ░▒▒▒▒░ ░░░ ░▒▒▒░ ░░▒▒▒▒▒▒▒▒▒▒░░ ░▒▒▒░ ░░░░ ▒▓▓▒ ▒▓▓▓▒ ░▒▓▓▓▒▓▓▓░ ▒▓▓▓░ ▒▒▒▒
▒▒▓▓▒░ ▒▒▒▒░ ░▒▒▒░░ ░░▒▒░░ ░▒▒▒░ ▒▒▓▒▒ ░░░ ░▒▒▒░ ░░ ░░░░ ░░░░ ░ ░▒▒▒░ ░░░ ░▒▒▒ ▒▓▓▓▒ ░▒▓▓▓▒▒▒▓▓▒░ ░▒▓▓▓░ ▒▒▒░
▒▓▓▒░ ░▒▒▒▒░ ░░░░ ░▒▒▓▒▒▒░ ░░░ ░▒▒▒▒░ ░▒▓▓▒ ░░ ░▒▒▒░ ░░░ ░░ ░░░ ░▒▒▒░ ░░ ░▒▒░ ░▓▓▓▓░ ░░ ░▒▓▓▓▓▓▓▓▓▒░ ░░░ ░▓▓▓▒░ ░▒░
▒▓▒▒ ░▒▓▓▒▒ ░ ░ ▒▓▓▓▓▓▓▓▒▒ ░▒▒▒▒░ ░▒▓▓ ░▒▒░ ░▒▒░ ▒▒▒▒▒░ ░░░░ ░▒▒░ ░░ ░░ ▒▓▓▓░ ░▒▒▒ ░▒▒▒▒▒▒▒▒▒░ ░▒▒░ ░▓▓▓▒░ ░░
▒▒▒░ ▒▒▓▓▒░ ░░░ ▒▓▓▓▓▓▓▓▓▓▓▒ ░░ ░▒▒▓▒▒ ▒▒▓ ░░▒░ ░▒▒▒░ ▒▒▒▓▒▒▒▒ ░░▒▒░ ░▒▒░ ░░ ░▓▓▓▒ ▒▓▓▒ ░░ ░▒▒▒▒ ░▒▓▓▒ ░
▒▒░ ░▒▓▓▒▒ ░▒▒░ ░▓▓▓▓▓▓▓▓▓▓▓▒░ ░░░░ ░▒▓▓▒░ ░▒▓ ░░░ ░▒▒▒░ ░▒▒▓▓▓▒▒▒░ ░▒▒▒░ ░▒░ ░▒░ ▒▓▓▒ ▒▓▓▓░ ▒▓▓▓▒░ ░▒▓▓▒ ░▒▒▒░ ░░
▒▒░ ▒▓▓▓▒░ ░▒▒▒░ ▒▓▓▓▓▓▓▓▓▓▓▓▓▒░ ░░▒▒░ ▒▓▓▓▒░ ▒▒ ░░░ ░▒▒▒░ ░▒▒▒▓▓▒▒▒░ ░▒▒▒░ ░░░░ ░▒▒░ ░▒▒▒ ▒▓▓▓▒ ▒▓▒▒▒▓▓░ ▒▓▓▓▒ ░▒▒░ ░▒░
▒░ ░▒▓▓▒░ ░▒▒▒▒░ ░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░ ░▒▒▒▒░ ░▒▓▓▒▒ ░▒ ░ ░▒▒▒▒░ ░░░ ░▒▒▒▒▒▒░ ░░ ▒▒▒▒░ ░░ ▒▒▒ ░░ ░░░ ░▓▓▓▓░ ░░ ▒▓▒▒▒▒▓▒ ▒▓▓▓▒ ░░░ ░▒▒
░ ▒▒▓▒▒ ░▒▒▓▒▒░ ░▒▓▓▓▓▓▓▓▓▓▒▒▒░ ░▒▒▓▒░ ▒▓▓▓▒░ ▒ ░▒▒▒░ ░░░░ ░░░░░ ░░░░ ░▒▒▒░ ▒▒░ ░░░ ░▒▓▓▓░ ░▒▒░ ▒▓▒▒▒▒▓▒ ░▒▒░ ▒▓▓▓░ ░ ░░ ░▒▓
░ ░▒▓▓▒░ ▒▒▓▓▒░ ░░░░░░░░░░░░░░ ░▒▓▓▓▒ ░▒▓▓▒░ ░ ░░▒▒░ ░▒▒▒░ ░░░░ ░░▒▒░ ░▒▒▒░ ▓▒ ░▒▒░ ▒▓▓▓░ ░▒▓▓░ ░▓▓▒▓▓▒░ ░▒▓▒░ ░▒▓▓▒ ░▒▒ ▒▓
▒▒▒▒░ ░▒▓▓▓▒░ ░░ ░░░░ ░░ ▒▒▓▓▒▒ ▒▒▓▓▒ ░ ░░░░ ░▒▒▒░ ▒▒▒▒▒▒░ ░▒▒▒░ ░▒▒░ ░░ ▓▒ ▒▒▒ ░▒▒▒░ ▒▓▓▓▒ ░▒▒▒▒░ ░▒▓▓▓░ ░▒▓▒░ ░▒▒░ ░▓
░▒▒▒▒ ▒▓▓▓▒░ ░░░░░ ░▒▓▓▓▓▒▒ ░░░░ ░▒▓▓▓▒░ ░▒▓▓▒░ ░░ ░░░ ░▒▒▒▒░ ░▒▒▓▓▒▒░ ▒▒▒▒░ ░░░ ░░░ ▒ ▒▒▒░ ░░ ░░▒░ ▒▓▓▓▒░ ░▒▒░░ ░▒▓▓▓▓░ ░▒▒░ ░░ ░▒▓▒ ▓
░▒▒▒░ ░▒▓▓▒▒ ▒▒▒░░ ░▓▓▓▓▓▓▓▓▒ ░▒▒▒░ ▒▓▓▓▓▒ ░▒▒▒░ ░░░ ▒▒▒▒░ ░▒▓▓▓▓▒░ ░▒▒▒▒ ░░ ░▒░ ▒ ░▒▓▒ ░▒░ ░ ▒▓▓▓▒░ ▒▓▓▓▓▒░ ░▒▓▓▓▒ ░░░ ░▒▒ ▒▓▓░ ▒
░░▒▒░ ▒▓▓▓▒░ ▒▒▒▒░ ▒▓▓▓▓▓▓▓▓▒░ ░▒▒▒▒░ ▒▓▓▓▒░ ▒▒▒▒░ ▒▒░ ░ ░▒▒▒░ ░░░ ░▒▓▓▓▓▒░ ░▒░ ░▒▒▒░ ░░░ ░▒▒ ░ ▒▓▓░ ░▒▒░ ░▒▓▓▒░ ▓▒▒▒▒▓░ ▒▓▓▓░ ░▒▒░ ░▓▓▒ ░
░▒▒░ ░▒▓▓▒░ ░▒▓▒▒░ ▒▓▓▓▓▓▓▓▓▒ ░▒▓▓▓▒ ░▒▓▓▒░ ░▒▒▒░ ▒▒ ░░ ░▒▒░ ░▒▒▒░ ▒▒▓▓▒▒ ░▒▒▒░ ▒▒▒░ ░░░ ░▒▒ ░▓▓▒ ▒▓▒░ ▒▓▓▒ ░▒░ ▓▒▒▒▒▓ ░▒▒ ▒▓▓▒ ░ ░▒▓▒ ▓▓▓░
░░░░ ▒▒▓▒▒ ░▒▓▓▓▒ ▒▓▓▓▓▓▓▓▓▒ ▒▓▓▓▓░ ▒▓▓▓▒ ░▒▒░ ▒░ ░▒░ ░▒░ ░▒▒▒▒░ ▒▒▒▒ ░▒▒▒▒░ ░▒▒░ ░▒░ ▒▒ ▒▓▓▒ ░▓▓▒ ░░░ ░▒▒▒ ▒▓▓▓ ▒▒▒▒▒▒ ▓▓▓▒ ░▒▓▒░ ░▒░ ▒▓▓▒ ▒▓▓▒
░░░░ ░▒▒▒▒░ ▒▓▓▓▒░ ░░░ ░▓▓▓▓▓▓▓▓░ ░▒░ ░▒▓▓▓▒ ░▒▓▓▒░ ░░░░ ▒░ ▒▒░ ░ ░░ ░▒▒▒▒▒░ ░░░░ ░▒▒▒▒▒░ ░░░ ░░ ░▒▒ ░▒ ▒▓▓░ ▒▓▓░ ░▒▒░ ░▒░ ░▓▒▒▓░░▓▒▒▓░░▓▒▒▓▒ ░▒▒ ░▒▒░ ▒▓▓▓ ░▓▓▓
░░░ ░▒▒▒░ ░▒▓▓▓▒░ ░▒▒▒░ ░▓▓▓▓▓▓▒ ░▒▓▒░ ▒▓▓▓▓░ ▒▒▒▒░ ░░░ ▒░ ░▒▒░ ░░░ ▒▒▒▒▒▒░░░░░░░░▒▒▒▒▒▒ ░░░ ░▒▒░ ░▒ ░▓▓▒ ░▓▓▒ ▒▓▒░ ▒▓▒▒▒▓ ▓▓▓▓ ▒▒▒▒▒▒ ░░ ░▒▓▒ ▓▓▓░ ▓▓▓░
░░ ░▒▒▒░ ▒▓▓▓▓▒ ▒▓▓▓▒░ ▒▓▓▓▓▒ ▒▓▓▓▒ ▒▓▓▓▓▒ ░▒▒▒░ ░░ ▒ ▒▒▒░ ░▒▒░ ░▒▒▒▒▒░░▒▒▒▒▒▒░░▒▒▒▒▒░ ░▒▒░ ░▒▒▒ ▒ ▒▓▓░ ▒▓▓▒ ▒▓▓▒ ░ ▒▓▒▒▒▓░▒▓▓▒░▓▒▒▒▒▒ ░░ ▒▓▓▒ ▒▓▓▒ ▒▓▓▒
░ ░░▒░ ░▒▓▓▓▒░ ░▓▓▓▓▓▒░ ░▒▒▒ ▒▓▓▓▓▓░ ░▒▓▓▓▒░ ░▒▒░░ ▒ ░▒▒▒ ░▒▒░ ░░░ ░▒▒▒▒▒▒ ░░░ ░ ░▒▒░ ▒▒▒ ▒ ▒▓▓ ░▓▓▓░ ▓▓▓▒ ▒▒░ ░▓▓▓▓▓▒▒▒▒▒▒▓▓▒▓▓▒ ░▒▒░ ▒▓▓▓ ░▓▓▓ ░▓▓▒
░░░ ▒▒▓▓▒▒ ▒▓▓▓▓▓▓▒░░░░░░▒▓▓▓▓▓▓▒ ▒▓▓▓▒▒ ░░░░ ░ ░▒▒░ ░▒▒▒ ░░ ░ ░░ ░▒▒▒▒░ ░ ░ ░░░ ▒▒▒░ ▒▒▒░ ░ ▓▓▒ ▒▓▓▒ ▒▓▓▓ ▒▓▒░ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░▓▓▒ ░▓▓▓░ ▓▓▓░ ▒▓▓
░░░ ░▒▒▒▒▒░ ▒▓▓▓▓▓▓▓▓▒▒▒▒▒▓▓▓▓▓▓▓▒ ░▒▒▓▒▒░ ░░░ ░ ▒▒▒░ ▒▒▒░ ░▒░ ▒▒▒▒ ▒▒▒▒ ▒▒▒░ ░▒░ ▒▒▒░ ░▒▒▒ ░ ▓▓░ ▒▓▓░ ▓▓▓▒ ░▓▓▓░ ░░░ ░▒▓▓▒░ ░░ ░▓▓▓░ ▒▓▓▒ ▒▓▓▒ ▒▓▓
░░ ░▒▒▒░ ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░ ░▒▒▒▒░ ▒▒▒ ▒▒▒░ ░▒▒░ ░▒▓▓▓▒ ▒▒▒▒ ▒▓▓▓▒░ ░▒▒░ ░▒▒▒ ▒▒▒ ▓▒ ▓▓▓ ░▓▓▓░ ▒▓▓▒░ ░▒▒▓▓▓▒░ ▒▓▓▒ ░▒▓▓▒▒▒▒░ ░▓▓▓▒ ░▓▓▓ ▓▓▒ ░▓▓
░░ ░░░░ ░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒░ ░░░░ ░▒▒▒ ░▒▒▒ ▒▒▒░ ░▒▓▓▓▒ ░▒▒░ ▒▓▓▓▒░ ░▒▒▒ ▒▒▒░ ▒▒▒░ ▓▒ ░▓▓▒ ▒▓▓▒ ▒▓▓▓░ ░▒▒▓▓▒▒▒▓ ▒▓▓▒ ▓▒▒▒▓▓▒▒░ ▒▓▓▓░ ▒▓▓▒ ▒▓▓░ ▒▓
░░░░ ░░░░ ░░▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒░░░ ░░░ ░▒▒░ ▒▒▒▒ ░▒▒▒ ░░ ░▒▓▓▓▒░░▒▒░░▒▓▓▓▒░ ░░ ▒▒▒░ ▒▒▒░ ▒▒▒░ ▓░ ▒▓▓░ ▓▓▓░ ▓▓▓▒ ░░░▒▓▒▒▒▓░▒▓▓░░▓▒▒▒▓▒▒░░░ ▒▓▓▒ ░▓▓▒ ░▓▓░ ▒▒
░░░ ░░░░░ ░░░░ ░░▒▓▓▓▓▓▒▒░░ ░░░ ░░░░░ ░░ ▒▒▒░ ▒▒▒░ ▒▒▒░ ░▒▒ ░░ ▒▓▓▓▒░░▒▒░░▓▓▓▓▒ ░░ ▒▒░ ░▒▒▒ ░▒▒▒ ░▒▒▒ ▒░ ▒▓▒ ░▓▓▒ ▒▓▓▒ ▒▒ ░▓▒▒▒▒▒▒▓▓░▒▒▒▒▒▓░ ░▒▒ ▓▓▓░ ▓▓▓░ ▒▓▒ ░▒
░░░░ ░░▒▒░░ ░▒▒▒▒░ ░░▒░░ ░▒▓▒▒░ ░░░░ ░▒▒▒░░ ░░░░░░ ░░░ ▒▒▒ ▒▒▒ ░▒▒▒░ ▒▒▒ ▒▒░ ▒▓▓▒░░▒▒░░▒▓▓▒ ░▒▒ ▒▒▒ ░▒▒▒ ░▒▒▒ ░▒▒▒ ▒ ▓▓▒ ▒▓▓▒ ▓▓▓░ ▓▓▒ ░▒░░▓▒▒▒░░▓▓░▒▒▒▒▓ ░▒ ▒▓▓ ▒▓▓▓ ▒▓▓▒ ▒▓▒ ▒
░░░░ ░▒▒▒░░░▒▒▓▓▒▒░░▒▓▓▓▓▒ ░▒░░ ▒▓▓▓▓▒░░▒▒▒▒▒▒░░░░▒▒░░ ░░░░ ▒▒▒ ░▒▒▒ ▒▒▓▒ ▒▓▓▒ ░▒▓▒ ▒▒▓▒ ░▒▒░ ▒▓▒░ ▒▓▒░░▒▓▒▒ ▒▓▒░ ▒▒▒░ ▒▒▒ ▒ ░▓▓▒ ▓▓▓░▒▓▒▓ ▓▒▒▓ ▓▒▓░▒▒▒▓░▒▓▓░░▓▒▒░░▓▓▓ ▓▒▒▒ ▓▓▓░░▓▓▒ ░▓▒ ▒
░░░░░ ░░▒▒▒░░░▒▓▓▓▓▒░▒▓▓▓▓▓▓▒ ▒▓▓▓▓▓▓▒░▒▓▓▓▓▒░░░▒▒▒▒░ ░░░░ ▒▒▒ ░▒▒▒ ▒▓▓▒ ▒▓▓▓░▒▓▓▓▒ ▒▒▒ ▒▒▒▒ ▒▒▒ ▒▓▓▓▒░▓▓▓▒ ▒▓▓▒ ▒▒▒░ ▒▒▒ ▒ ░▓▓░ ▓▓▓ ▓▒▒▓░▓▒▒▓░▒▒▒▓ ▓▓▓ ▒▓▓▒ ▓▓▓ ▓▒▒▓ ▓▒▒▓ ▓▒▓▒ ▓▓▒ ░▒▒░ ▒
░░░░░ ░▒▒▒▒░░▒▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓░ ▒▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▒░░▒▒▒▒░ ░░░░ ▒▒▒ ░▒▒▒ ▒▓▓▒ ▒▓▓▓░▒▓▓▓▒ ░▒░ ▒▒▒▒ ░▒░░▒▓▓▓▒░▓▓▓▒ ▒▓▓▒ ▒▒▒░ ▒▒▒ ▒ ░▓▓░░▓▓▓ ▓▒▒▒▒▒▒▒▓▒▒▒▒▒▒░▓▒ ▓▒▒▒ ▓▓░▒▒▒▒▒░▓▒▒▒░▓▒▒▓ ▒▓▓ ░▒▒░ ░
░░░░░ ░▒▒▒▒░░▒▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▒ ▒▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▒░░▒▒▒▒░ ░░░░ ░▒▒▒ ▒▒▒▒ ▒▓▓▒ ▒▓▓▓░▒▓▓▓▓░ ░░ ▒▓▒▒ ░░ ▒▓▓▓▓▒░▓▓▓▒ ▒▓▓▒ ▒▒▒░ ▒▒▒ ▒ ▒▓▓░░▓▓▒ ▓▒▒▒▒▒▒▒▓▒▒▒▒▒▓ ▓▒ ▓▒▒▓ ▒▓ ▓▒▒▒▒▒▓▒▒▒▒▒▒▒▓ ▒▓▓░░▒▒░ ░
░░░░░ ░▒▒▒▒░░▒▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▒ ▒▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▒░░▒▒▒▒░ ░░░░ ░▒▒▒ ▒▒▒▒ ▒▓▓▒ ▒▓▓▓░▒▓▓▓▓░ ░░ ▒▓▒▒ ░░ ▒▓▓▓▓▒░▓▓▓▒ ▒▓▓▒ ▒▒▒░ ▒▒▒ ▒ ▒▓▓░░▓▓▒ ▓▒▒▒▒▒▒▒▓▒▒▒▒▒▓ ▓▒ ▓▒▒▓ ▒▓ ▓▒▒▒▒▒▓▒▒▒▒▒▒▒▓ ▒▓▓░░▒▒░ ░
░░░░░ ░▒▒▒▒░░▒▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓░ ▒▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▒░░▒▒▒▒░ ░░░░ ▒▒▒ ░▒▒▒ ▒▓▓▒ ▒▓▓▓░▒▓▓▓▒ ░▒░ ▒▒▒▒ ░▒░░▒▓▓▓▒░▓▓▓▒ ▒▓▓▒ ▒▒▒░ ▒▒▒ ▒ ░▓▓░░▓▓▓ ▓▒▒▒▒▒▒▒▓▒▒▒▒▒▒░▓▒ ▓▒▒▒ ▓▓░▒▒▒▒▒░▓▒▒▒░▓▒▒▓ ▒▓▓ ░▒▒░ ░
░░░░░ ░░▒▒▒░░░▒▓▓▓▓▒░▒▓▓▓▓▓▓▒ ▒▓▓▓▓▓▓▒░▒▓▓▓▓▒░░░▒▒▒▒░ ░░░░ ▒▒▒ ░▒▒▒ ▒▓▓▒ ▒▓▓▓░▒▓▓▓▒ ▒▒▒ ▒▒▒▒ ▒▒▒ ▒▓▓▓▒░▓▓▓▒ ▒▓▓▒ ▒▒▒░ ▒▒▒ ▒ ░▓▓░ ▓▓▓ ▓▒▒▓░▓▒▒▓░▒▒▒▓ ▓▓▓ ▒▓▓▒ ▓▓▓ ▓▒▒▓ ▓▒▒▓ ▓▒▓▒ ▓▓▒ ░▒▒░ ▒
░░░░ ░▒▒▒░░░▒▒▓▓▒▒░░▒▓▓▓▓▒ ░▒░░ ▒▓▓▓▓▒░░▒▒▒▒▒▒░░░░▒▒░░ ░░░░ ▒▒▒ ░▒▒▒ ▒▒▓▒ ▒▓▓▒ ░▒▓▒ ▒▒▓▒ ░▒▒░ ▒▓▒░ ▒▓▒░░▒▓▒▒ ▒▓▒░ ▒▒▒░ ▒▒▒ ▒ ░▓▓▒ ▓▓▓░▒▓▒▓ ▓▒▒▓ ▓▒▓░▒▒▒▓░▒▓▓░░▓▒▒░░▓▓▓ ▓▒▒▒ ▓▓▓░░▓▓▒ ░▓▒ ▒
░░░░ ░░▒▒░░ ░▒▒▒▒░ ░░▒░░ ░▒▓▒▒░ ░░░░ ░▒▒▒░░ ░░░░░░ ░░░ ▒▒▒ ▒▒▒ ░▒▒▒░ ▒▒▒ ▒▒░ ▒▓▓▒░░▒▒░░▒▓▓▒ ░▒▒ ▒▒▒ ░▒▒▒ ░▒▒▒ ░▒▒▒ ▒ ▓▓▒ ▒▓▓▒ ▓▓▓░ ▓▓▒ ░▒░░▓▒▒▒░░▓▓░▒▒▒▒▓ ░▒ ▒▓▓ ▒▓▓▓ ▒▓▓▒ ▒▓▒ ▒
░░░ ░░░░░ ░░░░ ░░▒▓▓▓▓▓▒▒░░ ░░░ ░░░░░ ░░ ▒▒▒░ ▒▒▒░ ▒▒▒░ ░▒▒ ░░ ▒▓▓▓▒░░▒▒░░▓▓▓▓▒ ░░ ▒▒░ ░▒▒▒ ░▒▒▒ ░▒▒▒ ▒░ ▒▓▒ ░▓▓▒ ▒▓▓▒ ▒▒ ░▓▒▒▒▒▒▒▓▓░▒▒▒▒▒▓░ ░▒▒ ▓▓▓░ ▓▓▓░ ▒▓▒ ░▒
░░░░ ░░░░ ░░▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒░░░ ░░░ ░▒▒░ ▒▒▒▒ ░▒▒▒ ░░ ░▒▓▓▓▒░░▒▒░░▒▓▓▓▒░ ░░ ▒▒▒░ ▒▒▒░ ▒▒▒░ ▓░ ▒▓▓░ ▓▓▓░ ▓▓▓▒ ░░░▒▓▒▒▒▓░▒▓▓░░▓▒▒▒▓▒▒░░░ ▒▓▓▒ ░▓▓▒ ░▓▓░ ▒▒
░░ ░░░░ ░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒░ ░░░░ ░▒▒▒ ░▒▒▒ ▒▒▒░ ░▒▓▓▓▒ ░▒▒░ ▒▓▓▓▒░ ░▒▒▒ ▒▒▒░ ▒▒▒░ ▓▒ ░▓▓▒ ▒▓▓▒ ▒▓▓▓░ ░▒▒▓▓▒▒▒▓ ▒▓▓▒ ▓▒▒▒▓▓▒▒░ ▒▓▓▓░ ▒▓▓▒ ▒▓▓░ ▒▓
░░ ░▒▒▒░ ▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░ ░▒▒▒▒░ ▒▒▒ ▒▒▒░ ░▒▒░ ░▒▓▓▓▒ ▒▒▒▒ ▒▓▓▓▒░ ░▒▒░ ░▒▒▒ ▒▒▒ ▓▒ ▓▓▓ ░▓▓▓░ ▒▓▓▒░ ░▒▒▓▓▓▒░ ▒▓▓▒ ░▒▓▓▒▒▒▒░ ░▓▓▓▒ ░▓▓▓ ▓▓▒ ░▓▓
░░░ ░▒▒▒▒▒░ ▒▓▓▓▓▓▓▓▓▒▒▒▒▒▓▓▓▓▓▓▓▒ ░▒▒▓▒▒░ ░░░ ░ ▒▒▒░ ▒▒▒░ ░▒░ ▒▒▒▒ ▒▒▒▒ ▒▒▒░ ░▒░ ▒▒▒░ ░▒▒▒ ░ ▓▓░ ▒▓▓░ ▓▓▓▒ ░▓▓▓░ ░░░ ░▒▓▓▒░ ░░ ░▓▓▓░ ▒▓▓▒ ▒▓▓▒ ▒▓▓
░░░ ▒▒▓▓▒▒ ▒▓▓▓▓▓▓▒░░░░░░▒▓▓▓▓▓▓▒ ▒▓▓▓▒▒ ░░░░ ░ ░▒▒░ ░▒▒▒ ░░ ░ ░░ ░▒▒▒▒░ ░ ░ ░░░ ▒▒▒░ ▒▒▒░ ░ ▓▓▒ ▒▓▓▒ ▒▓▓▓ ▒▓▒░ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░▓▓▒ ░▓▓▓░ ▓▓▓░ ▒▓▓
░ ░░▒░ ░▒▓▓▓▒░ ░▓▓▓▓▓▒░ ░▒▒▒ ▒▓▓▓▓▓░ ░▒▓▓▓▒░ ░▒▒░░ ▒ ░▒▒▒ ░▒▒░ ░░░ ░▒▒▒▒▒▒ ░░░ ░ ░▒▒░ ▒▒▒ ▒ ▒▓▓ ░▓▓▓░ ▓▓▓▒ ▒▒░ ░▓▓▓▓▓▒▒▒▒▒▒▓▓▒▓▓▒ ░▒▒░ ▒▓▓▓ ░▓▓▓ ░▓▓▒
░░ ░▒▒▒░ ▒▓▓▓▓▒ ▒▓▓▓▒░ ▒▓▓▓▓▒ ▒▓▓▓▒ ▒▓▓▓▓▒ ░▒▒▒░ ░░ ▒ ▒▒▒░ ░▒▒░ ░▒▒▒▒▒░░▒▒▒▒▒▒░░▒▒▒▒▒░ ░▒▒░ ░▒▒▒ ▒ ▒▓▓░ ▒▓▓▒ ▒▓▓▒ ░ ▒▓▒▒▒▓░▒▓▓▒░▓▒▒▒▒▒ ░░ ▒▓▓▒ ▒▓▓▒ ▒▓▓▒
░░░ ░▒▒▒░ ░▒▓▓▓▒░ ░▒▒▒░ ░▓▓▓▓▓▓▒ ░▒▓▒░ ▒▓▓▓▓░ ▒▒▒▒░ ░░░ ▒░ ░▒▒░ ░░░ ▒▒▒▒▒▒░░░░░░░░▒▒▒▒▒▒ ░░░ ░▒▒░ ░▒ ░▓▓▒ ░▓▓▒ ▒▓▒░ ▒▓▒▒▒▓ ▓▓▓▓ ▒▒▒▒▒▒ ░░ ░▒▓▒ ▓▓▓░ ▓▓▓░
░░░░ ░▒▒▒▒░ ▒▓▓▓▒░ ░░░ ░▓▓▓▓▓▓▓▓░ ░▒░ ░▒▓▓▓▒ ░▒▓▓▒░ ░░░░ ▒░ ▒▒░ ░ ░░ ░▒▒▒▒▒░ ░░░░ ░▒▒▒▒▒░ ░░░ ░░ ░▒▒ ░▒ ▒▓▓░ ▒▓▓░ ░▒▒░ ░▒░ ░▓▒▒▓░░▓▒▒▓░░▓▒▒▓▒ ░▒▒ ░▒▒░ ▒▓▓▓ ░▓▓▓
░░░░ ▒▒▓▒▒ ░▒▓▓▓▒ ▒▓▓▓▓▓▓▓▓▒ ▒▓▓▓▓░ ▒▓▓▓▒ ░▒▒░ ▒░ ░▒░ ░▒░ ░▒▒▒▒░ ▒▒▒▒ ░▒▒▒▒░ ░▒▒░ ░▒░ ▒▒ ▒▓▓▒ ░▓▓▒ ░░░ ░▒▒▒ ▒▓▓▓ ▒▒▒▒▒▒ ▓▓▓▒ ░▒▓▒░ ░▒░ ▒▓▓▒ ▒▓▓▒
░▒▒░ ░▒▓▓▒░ ░▒▓▒▒░ ▒▓▓▓▓▓▓▓▓▒ ░▒▓▓▓▒ ░▒▓▓▒░ ░▒▒▒░ ▒▒ ░░ ░▒▒░ ░▒▒▒░ ▒▒▓▓▒▒ ░▒▒▒░ ▒▒▒░ ░░░ ░▒▒ ░▓▓▒ ▒▓▒░ ▒▓▓▒ ░▒░ ▓▒▒▒▒▓ ░▒▒ ▒▓▓▒ ░ ░▒▓▒ ▓▓▓░
░░▒▒░ ▒▓▓▓▒░ ▒▒▒▒░ ▒▓▓▓▓▓▓▓▓▒░ ░▒▒▒▒░ ▒▓▓▓▒░ ▒▒▒▒░ ▒▒░ ░ ░▒▒▒░ ░░░ ░▒▓▓▓▓▒░ ░▒░ ░▒▒▒░ ░░░ ░▒▒ ░ ▒▓▓░ ░▒▒░ ░▒▓▓▒░ ▓▒▒▒▒▓░ ▒▓▓▓░ ░▒▒░ ░▓▓▒ ░
░▒▒▒░ ░▒▓▓▒▒ ▒▒▒░░ ░▓▓▓▓▓▓▓▓▒ ░▒▒▒░ ▒▓▓▓▓▒ ░▒▒▒░ ░░░ ▒▒▒▒░ ░▒▓▓▓▓▒░ ░▒▒▒▒ ░░ ░▒░ ▒ ░▒▓▒ ░▒░ ░ ▒▓▓▓▒░ ▒▓▓▓▓▒░ ░▒▓▓▓▒ ░░░ ░▒▒ ▒▓▓░ ▒
░▒▒▒▒ ▒▓▓▓▒░ ░░░░░ ░▒▓▓▓▓▒▒ ░░░░ ░▒▓▓▓▒░ ░▒▓▓▒░ ░░ ░░░ ░▒▒▒▒░ ░▒▒▓▓▒▒░ ▒▒▒▒░ ░░░ ░░░ ▒ ▒▒▒░ ░░ ░░▒░ ▒▓▓▓▒░ ░▒▒░░ ░▒▓▓▓▓░ ░▒▒░ ░░ ░▒▓▒ ▓
▒▒▒▒░ ░▒▓▓▓▒░ ░░ ░░░░ ░░ ▒▒▓▓▒▒ ▒▒▓▓▒ ░ ░░░░ ░▒▒▒░ ▒▒▒▒▒▒░ ░▒▒▒░ ░▒▒░ ░░ ▓▒ ▒▒▒ ░▒▒▒░ ▒▓▓▓▒ ░▒▒▒▒░ ░▒▓▓▓░ ░▒▓▒░ ░▒▒░ ░▓
░ ░▒▓▓▒░ ▒▒▓▓▒░ ░░░░░░░░░░░░░░ ░▒▓▓▓▒ ░▒▓▓▒░ ░ ░░▒▒░ ░▒▒▒░ ░░░░ ░░▒▒░ ░▒▒▒░ ▓▒ ░▒▒░ ▒▓▓▓░ ░▒▓▓░ ░▓▓▒▓▓▒░ ░▒▓▒░ ░▒▓▓▒ ░▒▒ ▒▓
░ ▒▒▓▒▒ ░▒▒▓▒▒░ ░▒▓▓▓▓▓▓▓▓▓▒▒▒░ ░▒▒▓▒░ ▒▓▓▓▒░ ▒ ░▒▒▒░ ░░░░ ░░░░░ ░░░░ ░▒▒▒░ ▒▒░ ░░░ ░▒▓▓▓░ ░▒▒░ ▒▓▒▒▒▒▓▒ ░▒▒░ ▒▓▓▓░ ░ ░░ ░▒▓
▒░ ░▒▓▓▒░ ░▒▒▒▒░ ░▒▓▓▓▓▓▓▓▓▓▓▓▓▒░ ░▒▒▒▒░ ░▒▓▓▒▒ ░▒ ░ ░▒▒▒▒░ ░░░ ░▒▒▒▒▒▒░ ░░ ▒▒▒▒░ ░░ ▒▒▒ ░░ ░░░ ░▓▓▓▓░ ░░ ▒▓▒▒▒▒▓▒ ▒▓▓▓▒ ░░░ ░▒▒
▒▒░ ▒▓▓▓▒░ ░▒▒▒░ ▒▓▓▓▓▓▓▓▓▓▓▓▓▒░ ░░▒▒░ ▒▓▓▓▒░ ▒▒ ░░░ ░▒▒▒░ ░▒▒▒▓▓▒▒▒░ ░▒▒▒░ ░░░░ ░▒▒░ ░▒▒▒ ▒▓▓▓▒ ▒▓▒▒▒▓▓░ ▒▓▓▓▒ ░▒▒░ ░▒░
▒▒░ ░▒▓▓▒▒ ░▒▒░ ░▓▓▓▓▓▓▓▓▓▓▓▒░ ░░░░ ░▒▓▓▒░ ░▒▓ ░░░ ░▒▒▒░ ░▒▒▓▓▓▒▒▒░ ░▒▒▒░ ░▒░ ░▒░ ▒▓▓▒ ▒▓▓▓░ ▒▓▓▓▒░ ░▒▓▓▒ ░▒▒▒░ ░░
▒▒▒░ ▒▒▓▓▒░ ░░░ ▒▓▓▓▓▓▓▓▓▓▓▒ ░░ ░▒▒▓▒▒ ▒▒▓ ░░▒░ ░▒▒▒░ ▒▒▒▓▒▒▒▒ ░░▒▒░ ░▒▒░ ░░ ░▓▓▓▒ ▒▓▓▒ ░░ ░▒▒▒▒ ░▒▓▓▒ ░
▒▓▒▒ ░▒▓▓▒▒ ░ ░ ▒▓▓▓▓▓▓▓▒▒ ░▒▒▒▒░ ░▒▓▓ ░▒▒░ ░▒▒░ ▒▒▒▒▒░ ░░░░ ░▒▒░ ░░ ░░ ▒▓▓▓░ ░▒▒▒ ░▒▒▒▒▒▒▒▒▒░ ░▒▒░ ░▓▓▓▒░ ░░
▒▓▓▒░ ░▒▒▒▒░ ░░░░ ░▒▒▓▒▒▒░ ░░░ ░▒▒▒▒░ ░▒▓▓▒ ░░ ░▒▒▒░ ░░░ ░░ ░░░ ░▒▒▒░ ░░ ░▒▒░ ░▓▓▓▓░ ░░ ░▒▓▓▓▓▓▓▓▓▒░ ░░░ ░▓▓▓▒░ ░▒░
▒▒▓▓▒░ ▒▒▒▒░ ░▒▒▒░░ ░░▒▒░░ ░▒▒▒░ ▒▒▓▒▒ ░░░ ░▒▒▒░ ░░ ░░░░ ░░░░ ░ ░▒▒▒░ ░░░ ░▒▒▒ ▒▓▓▓▒ ░▒▓▓▓▒▒▒▓▓▒░ ░▒▓▓▓░ ▒▒▒░
░▒▓▓▒░ ░▒▒▒░░ ░▒▒▒▒▒▒░░░░░░░▒▒▒▒▒▒▒░ ░░▒▒░ ░▒▒▒▒░ ░░░ ░▒▒▒░ ░░▒▒▒▒▒▒▒▒▒▒░░ ░▒▒▒░ ░░░░ ▒▓▓▒ ▒▓▓▓▒ ░▒▓▓▓▒▓▓▓░ ▒▓▓▓░ ▒▒▒▒
▒▒▓▓▒░ ░░▒░░ ░▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒░░ ░░░░ ▒▒▒▒▒ ░▒▒░ ░▒▒▒░ ░░▒▒▒▒▒▒▒▒▒▒░ ░░▒▒░ ░▒▒░ ░░ ░▓▓▓▒ ▒▓▒▒░ ░▒▒▓▓▓▒░ ░▒▓▒░ ▒▓▓▒░ ░

```